x86: Support vector __bf16 type
gcc/ChangeLog: * config/i386/i386-expand.cc (ix86_expand_sse_movcc): Handle vector BFmode. (ix86_expand_vector_init_duplicate): Support vector BFmode. (ix86_expand_vector_init_one_nonzero): Ditto. (ix86_expand_vector_init_one_var): Ditto. (ix86_expand_vector_init_concat): Ditto. (ix86_expand_vector_init_interleave): Ditto. (ix86_expand_vector_init_general): Ditto. (ix86_expand_vector_init): Ditto. (ix86_expand_vector_set_var): Ditto. (ix86_expand_vector_set): Ditto. (ix86_expand_vector_extract): Ditto. * config/i386/i386.cc (classify_argument): Add BF vector modes. (function_arg_64): Ditto. (ix86_gimplify_va_arg): Ditto. (ix86_get_ssemov): Ditto. * config/i386/i386.h (VALID_AVX256_REG_MODE): Add BF vector modes. (VALID_AVX512F_REG_MODE): Ditto. (host_detect_local_cpu): Ditto. (VALID_SSE2_REG_MODE): Ditto. * config/i386/i386.md: Add BF vector modes. (MODE_SIZE): Ditto. (ssemodesuffix): Add bf suffix for BF vector modes. (ssevecmode): Ditto. * config/i386/sse.md (VMOVE): Adjust for BF vector modes. (VI12HFBF_AVX512VL): Ditto. (V_256_512): Ditto. (VF_AVX512HFBF16): Ditto. (VF_AVX512BWHFBF16): Ditto. (VIHFBF): Ditto. (avx512): Ditto. (VIHFBF_256): Ditto. (VIHFBF_AVX512BW): Ditto. (VI2F_256_512):Ditto. (V8_128):Ditto. (V16_256): Ditto. (V32_512): Ditto. (sseinsnmode): Ditto. (sseconstm1): Ditto. (sseintmodesuffix): New mode_attr. (avx512fmaskmode): Ditto. (avx512fmaskmodelower): Ditto. (ssedoublevecmode): Ditto. (ssehalfvecmode): Ditto. (ssehalfvecmodelower): Ditto. (ssescalarmode): Add vector BFmode mapping. (ssescalarmodelower): Ditto. (ssexmmmode): Ditto. (ternlogsuffix): Ditto. (ssescalarsize): Ditto. (sseintprefix): Ditto. (i128): Ditto. (xtg_mode): Ditto. (bcstscalarsuff): Ditto. (<avx512>_blendm<mode>): New define_insn for BFmode. (<avx512>_store<mode>_mask): Ditto. (vcond_mask_<mode><avx512fmaskmodelower>): Ditto. (vec_set<mode>_0): New define_insn for BF vector set. (V8BFH_128): New mode_iterator for BFmode. (avx512fp16_mov<mode>): Ditto. (vec_set<mode>): New define_insn for BF vector set. (@vec_extract_hi_<mode>): Ditto. (@vec_extract_lo_<mode>): Ditto. (vec_set_hi_<mode>): Ditto. (vec_set_lo_<mode>): Ditto. (*vec_extract<mode>_0): New define_insn_and_split for BF vector extract. (*vec_extract<mode>): New define_insn. (VEC_EXTRACT_MODE): Add BF vector modes. (PINSR_MODE): Add V8BF. (sse2p4_1): Ditto. (pinsr_evex_isa): Ditto. (<sse2p4_1>_pinsr<ssemodesuffix>): Adjust to support insert for V8BFmode. (pbroadcast_evex_isa): Add BF vector modes. (AVX2_VEC_DUP_MODE): Ditto. (VEC_INIT_MODE): Ditto. (VEC_INIT_HALF_MODE): Ditto. (avx2_pbroadcast<mode>): Adjust to support BF vector mode broadcast. (avx2_pbroadcast<mode>_1): Ditto. (<avx512>_vec_dup<mode>_1): Ditto. (<mask_codefor><avx512>_vec_dup_gpr<mode><mask_name>): Ditto. gcc/testsuite/ChangeLog: * g++.target/i386/vect-bfloat16-1.C: New test. * gcc.target/i386/vect-bfloat16-1.c: New test. * gcc.target/i386/vect-bfloat16-2a.c: New test. * gcc.target/i386/vect-bfloat16-2b.c: New test. * gcc.target/i386/vect-bfloat16-typecheck_1.c: New test. * gcc.target/i386/vect-bfloat16-typecheck_2.c: New test.
This commit is contained in:
parent
2e80388983
commit
6910cad55f
11 changed files with 950 additions and 119 deletions
|
@ -4064,6 +4064,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
|
|||
case E_V16QImode:
|
||||
case E_V8HImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V4SImode:
|
||||
case E_V2DImode:
|
||||
case E_V1TImode:
|
||||
|
@ -4084,6 +4085,7 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
|
|||
case E_V32QImode:
|
||||
case E_V16HImode:
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V8SImode:
|
||||
case E_V4DImode:
|
||||
if (TARGET_AVX2)
|
||||
|
@ -4102,6 +4104,9 @@ ix86_expand_sse_movcc (rtx dest, rtx cmp, rtx op_true, rtx op_false)
|
|||
case E_V32HFmode:
|
||||
gen = gen_avx512bw_blendmv32hf;
|
||||
break;
|
||||
case E_V32BFmode:
|
||||
gen = gen_avx512bw_blendmv32bf;
|
||||
break;
|
||||
case E_V16SImode:
|
||||
gen = gen_avx512f_blendmv16si;
|
||||
break;
|
||||
|
@ -15008,6 +15013,7 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, machine_mode mode,
|
|||
|
||||
case E_V8HImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
if (TARGET_AVX2)
|
||||
return ix86_vector_duplicate_value (mode, target, val);
|
||||
|
||||
|
@ -15092,6 +15098,7 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, machine_mode mode,
|
|||
|
||||
case E_V16HImode:
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V32QImode:
|
||||
if (TARGET_AVX2)
|
||||
return ix86_vector_duplicate_value (mode, target, val);
|
||||
|
@ -15112,6 +15119,7 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, machine_mode mode,
|
|||
|
||||
case E_V32HImode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V64QImode:
|
||||
if (TARGET_AVX512BW)
|
||||
return ix86_vector_duplicate_value (mode, target, val);
|
||||
|
@ -15119,6 +15127,7 @@ ix86_expand_vector_init_duplicate (bool mmx_ok, machine_mode mode,
|
|||
{
|
||||
machine_mode hvmode = (mode == V32HImode ? V16HImode
|
||||
: mode == V32HFmode ? V16HFmode
|
||||
: mode == V32BFmode ? V16BFmode
|
||||
: V32QImode);
|
||||
rtx x = gen_reg_rtx (hvmode);
|
||||
|
||||
|
@ -15232,6 +15241,18 @@ ix86_expand_vector_init_one_nonzero (bool mmx_ok, machine_mode mode,
|
|||
use_vector_set = TARGET_AVX512FP16 && one_var == 0;
|
||||
gen_vec_set_0 = gen_vec_setv32hf_0;
|
||||
break;
|
||||
case E_V8BFmode:
|
||||
use_vector_set = TARGET_AVX512FP16 && one_var == 0;
|
||||
gen_vec_set_0 = gen_vec_setv8bf_0;
|
||||
break;
|
||||
case E_V16BFmode:
|
||||
use_vector_set = TARGET_AVX512FP16 && one_var == 0;
|
||||
gen_vec_set_0 = gen_vec_setv16bf_0;
|
||||
break;
|
||||
case E_V32BFmode:
|
||||
use_vector_set = TARGET_AVX512FP16 && one_var == 0;
|
||||
gen_vec_set_0 = gen_vec_setv32bf_0;
|
||||
break;
|
||||
case E_V32HImode:
|
||||
use_vector_set = TARGET_AVX512FP16 && one_var == 0;
|
||||
gen_vec_set_0 = gen_vec_setv32hi_0;
|
||||
|
@ -15386,6 +15407,8 @@ ix86_expand_vector_init_one_var (bool mmx_ok, machine_mode mode,
|
|||
/* FALLTHRU */
|
||||
case E_V8HFmode:
|
||||
case E_V16HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V4DFmode:
|
||||
case E_V8SFmode:
|
||||
case E_V8SImode:
|
||||
|
@ -15469,6 +15492,9 @@ ix86_expand_vector_init_concat (machine_mode mode,
|
|||
case E_V32HFmode:
|
||||
half_mode = V16HFmode;
|
||||
break;
|
||||
case E_V32BFmode:
|
||||
half_mode = V16BFmode;
|
||||
break;
|
||||
case E_V16SImode:
|
||||
half_mode = V8SImode;
|
||||
break;
|
||||
|
@ -15484,6 +15510,9 @@ ix86_expand_vector_init_concat (machine_mode mode,
|
|||
case E_V16HFmode:
|
||||
half_mode = V8HFmode;
|
||||
break;
|
||||
case E_V16BFmode:
|
||||
half_mode = V8BFmode;
|
||||
break;
|
||||
case E_V8SImode:
|
||||
half_mode = V4SImode;
|
||||
break;
|
||||
|
@ -15642,6 +15671,15 @@ ix86_expand_vector_init_interleave (machine_mode mode,
|
|||
second_imode = V2DImode;
|
||||
third_imode = VOIDmode;
|
||||
break;
|
||||
case E_V8BFmode:
|
||||
gen_load_even = gen_vec_interleave_lowv8bf;
|
||||
gen_interleave_first_low = gen_vec_interleave_lowv4si;
|
||||
gen_interleave_second_low = gen_vec_interleave_lowv2di;
|
||||
inner_mode = BFmode;
|
||||
first_imode = V4SImode;
|
||||
second_imode = V2DImode;
|
||||
third_imode = VOIDmode;
|
||||
break;
|
||||
case E_V8HImode:
|
||||
gen_load_even = gen_vec_setv8hi;
|
||||
gen_interleave_first_low = gen_vec_interleave_lowv4si;
|
||||
|
@ -15667,15 +15705,18 @@ ix86_expand_vector_init_interleave (machine_mode mode,
|
|||
for (i = 0; i < n; i++)
|
||||
{
|
||||
op = ops [i + i];
|
||||
if (inner_mode == HFmode)
|
||||
if (inner_mode == HFmode || inner_mode == BFmode)
|
||||
{
|
||||
rtx even, odd;
|
||||
/* Use vpuncklwd to pack 2 HFmode. */
|
||||
op0 = gen_reg_rtx (V8HFmode);
|
||||
even = lowpart_subreg (V8HFmode, force_reg (HFmode, op), HFmode);
|
||||
odd = lowpart_subreg (V8HFmode,
|
||||
force_reg (HFmode, ops[i + i + 1]),
|
||||
HFmode);
|
||||
/* Use vpuncklwd to pack 2 HFmode or BFmode. */
|
||||
machine_mode vec_mode =
|
||||
(inner_mode == HFmode) ? V8HFmode : V8BFmode;
|
||||
op0 = gen_reg_rtx (vec_mode);
|
||||
even = lowpart_subreg (vec_mode,
|
||||
force_reg (inner_mode, op), inner_mode);
|
||||
odd = lowpart_subreg (vec_mode,
|
||||
force_reg (inner_mode, ops[i + i + 1]),
|
||||
inner_mode);
|
||||
emit_insn (gen_load_even (op0, even, odd));
|
||||
}
|
||||
else
|
||||
|
@ -15824,6 +15865,10 @@ ix86_expand_vector_init_general (bool mmx_ok, machine_mode mode,
|
|||
half_mode = V8HFmode;
|
||||
goto half;
|
||||
|
||||
case E_V16BFmode:
|
||||
half_mode = V8BFmode;
|
||||
goto half;
|
||||
|
||||
half:
|
||||
n = GET_MODE_NUNITS (mode);
|
||||
for (i = 0; i < n; i++)
|
||||
|
@ -15852,6 +15897,11 @@ half:
|
|||
half_mode = V16HFmode;
|
||||
goto quarter;
|
||||
|
||||
case E_V32BFmode:
|
||||
quarter_mode = V8BFmode;
|
||||
half_mode = V16BFmode;
|
||||
goto quarter;
|
||||
|
||||
quarter:
|
||||
n = GET_MODE_NUNITS (mode);
|
||||
for (i = 0; i < n; i++)
|
||||
|
@ -15891,6 +15941,7 @@ quarter:
|
|||
/* FALLTHRU */
|
||||
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
|
||||
n = GET_MODE_NUNITS (mode);
|
||||
for (i = 0; i < n; i++)
|
||||
|
@ -15994,7 +16045,8 @@ ix86_expand_vector_init (bool mmx_ok, rtx target, rtx vals)
|
|||
if (inner_mode == QImode
|
||||
|| inner_mode == HImode
|
||||
|| inner_mode == TImode
|
||||
|| inner_mode == HFmode)
|
||||
|| inner_mode == HFmode
|
||||
|| inner_mode == BFmode)
|
||||
{
|
||||
unsigned int n_bits = n_elts * GET_MODE_SIZE (inner_mode);
|
||||
scalar_mode elt_mode = inner_mode == TImode ? DImode : SImode;
|
||||
|
@ -16078,7 +16130,8 @@ ix86_expand_vector_set_var (rtx target, rtx val, rtx idx)
|
|||
/* 512-bits vector byte/word broadcast and comparison only available
|
||||
under TARGET_AVX512BW, break 512-bits vector into two 256-bits vector
|
||||
when without TARGET_AVX512BW. */
|
||||
if ((mode == V32HImode || mode == V32HFmode || mode == V64QImode)
|
||||
if ((mode == V32HImode || mode == V32HFmode || mode == V32BFmode
|
||||
|| mode == V64QImode)
|
||||
&& !TARGET_AVX512BW)
|
||||
{
|
||||
gcc_assert (TARGET_AVX512F);
|
||||
|
@ -16099,6 +16152,12 @@ ix86_expand_vector_set_var (rtx target, rtx val, rtx idx)
|
|||
extract_hi = gen_vec_extract_hi_v32hf;
|
||||
extract_lo = gen_vec_extract_lo_v32hf;
|
||||
}
|
||||
else if (mode == V32BFmode)
|
||||
{
|
||||
half_mode = V16BFmode;
|
||||
extract_hi = gen_vec_extract_hi_v32bf;
|
||||
extract_lo = gen_vec_extract_lo_v32bf;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_mode = V32QImode;
|
||||
|
@ -16155,6 +16214,15 @@ ix86_expand_vector_set_var (rtx target, rtx val, rtx idx)
|
|||
case E_V32HFmode:
|
||||
cmp_mode = V32HImode;
|
||||
break;
|
||||
case E_V8BFmode:
|
||||
cmp_mode = V8HImode;
|
||||
break;
|
||||
case E_V16BFmode:
|
||||
cmp_mode = V16HImode;
|
||||
break;
|
||||
case E_V32BFmode:
|
||||
cmp_mode = V32HImode;
|
||||
break;
|
||||
default:
|
||||
gcc_unreachable ();
|
||||
}
|
||||
|
@ -16192,7 +16260,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
|
|||
bool use_vec_merge = false;
|
||||
bool blendm_const = false;
|
||||
rtx tmp;
|
||||
static rtx (*gen_extract[7][2]) (rtx, rtx)
|
||||
static rtx (*gen_extract[8][2]) (rtx, rtx)
|
||||
= {
|
||||
{ gen_vec_extract_lo_v32qi, gen_vec_extract_hi_v32qi },
|
||||
{ gen_vec_extract_lo_v16hi, gen_vec_extract_hi_v16hi },
|
||||
|
@ -16200,9 +16268,10 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
|
|||
{ gen_vec_extract_lo_v4di, gen_vec_extract_hi_v4di },
|
||||
{ gen_vec_extract_lo_v8sf, gen_vec_extract_hi_v8sf },
|
||||
{ gen_vec_extract_lo_v4df, gen_vec_extract_hi_v4df },
|
||||
{ gen_vec_extract_lo_v16hf, gen_vec_extract_hi_v16hf }
|
||||
{ gen_vec_extract_lo_v16hf, gen_vec_extract_hi_v16hf },
|
||||
{ gen_vec_extract_lo_v16bf, gen_vec_extract_hi_v16bf }
|
||||
};
|
||||
static rtx (*gen_insert[7][2]) (rtx, rtx, rtx)
|
||||
static rtx (*gen_insert[8][2]) (rtx, rtx, rtx)
|
||||
= {
|
||||
{ gen_vec_set_lo_v32qi, gen_vec_set_hi_v32qi },
|
||||
{ gen_vec_set_lo_v16hi, gen_vec_set_hi_v16hi },
|
||||
|
@ -16211,6 +16280,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
|
|||
{ gen_vec_set_lo_v8sf, gen_vec_set_hi_v8sf },
|
||||
{ gen_vec_set_lo_v4df, gen_vec_set_hi_v4df },
|
||||
{ gen_vec_set_lo_v16hf, gen_vec_set_hi_v16hf },
|
||||
{ gen_vec_set_lo_v16bf, gen_vec_set_hi_v16bf },
|
||||
};
|
||||
int i, j, n;
|
||||
machine_mode mmode = VOIDmode;
|
||||
|
@ -16379,6 +16449,7 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
|
|||
|
||||
case E_V8HImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V2HImode:
|
||||
use_vec_merge = TARGET_SSE2;
|
||||
break;
|
||||
|
@ -16402,18 +16473,20 @@ ix86_expand_vector_set (bool mmx_ok, rtx target, rtx val, int elt)
|
|||
goto half;
|
||||
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
/* For ELT == 0, vec_setv8hf_0 can save 1 vpbroadcastw. */
|
||||
if (TARGET_AVX2 && elt != 0)
|
||||
{
|
||||
mmode = SImode;
|
||||
gen_blendm = gen_avx2_pblendph_1;
|
||||
gen_blendm = ((mode == E_V16HFmode) ? gen_avx2_pblendph_1
|
||||
: gen_avx2_pblendbf_1);
|
||||
blendm_const = true;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
half_mode = V8HFmode;
|
||||
j = 6;
|
||||
half_mode = ((mode == E_V16HFmode) ? V8HFmode : V8BFmode);
|
||||
j = ((mode == E_V16HFmode) ? 6 : 7);
|
||||
n = 8;
|
||||
goto half;
|
||||
}
|
||||
|
@ -16505,6 +16578,13 @@ half:
|
|||
gen_blendm = gen_avx512bw_blendmv32hf;
|
||||
}
|
||||
break;
|
||||
case E_V32BFmode:
|
||||
if (TARGET_AVX512BW)
|
||||
{
|
||||
mmode = SImode;
|
||||
gen_blendm = gen_avx512bw_blendmv32bf;
|
||||
}
|
||||
break;
|
||||
case E_V32HImode:
|
||||
if (TARGET_AVX512BW)
|
||||
{
|
||||
|
@ -16712,6 +16792,7 @@ ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
|
|||
|
||||
case E_V8HImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V2HImode:
|
||||
use_vec_extr = TARGET_SSE2;
|
||||
break;
|
||||
|
@ -16878,26 +16959,32 @@ ix86_expand_vector_extract (bool mmx_ok, rtx target, rtx vec, int elt)
|
|||
return;
|
||||
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
if (TARGET_AVX512BW)
|
||||
{
|
||||
tmp = gen_reg_rtx (V16HFmode);
|
||||
tmp = (mode == E_V32HFmode
|
||||
? gen_reg_rtx (V16HFmode)
|
||||
: gen_reg_rtx (V16BFmode));
|
||||
if (elt < 16)
|
||||
emit_insn (gen_vec_extract_lo_v32hf (tmp, vec));
|
||||
emit_insn (maybe_gen_vec_extract_lo (mode, tmp, vec));
|
||||
else
|
||||
emit_insn (gen_vec_extract_hi_v32hf (tmp, vec));
|
||||
emit_insn (maybe_gen_vec_extract_hi (mode, tmp, vec));
|
||||
ix86_expand_vector_extract (false, target, tmp, elt & 15);
|
||||
return;
|
||||
}
|
||||
break;
|
||||
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
if (TARGET_AVX)
|
||||
{
|
||||
tmp = gen_reg_rtx (V8HFmode);
|
||||
tmp = (mode == E_V16HFmode
|
||||
? gen_reg_rtx (V8HFmode)
|
||||
: gen_reg_rtx (V8BFmode));
|
||||
if (elt < 8)
|
||||
emit_insn (gen_vec_extract_lo_v16hf (tmp, vec));
|
||||
emit_insn (maybe_gen_vec_extract_lo (mode, tmp, vec));
|
||||
else
|
||||
emit_insn (gen_vec_extract_hi_v16hf (tmp, vec));
|
||||
emit_insn (maybe_gen_vec_extract_hi (mode, tmp, vec));
|
||||
ix86_expand_vector_extract (false, target, tmp, elt & 7);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -2463,6 +2463,7 @@ classify_argument (machine_mode mode, const_tree type,
|
|||
case E_V8SImode:
|
||||
case E_V32QImode:
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V16HImode:
|
||||
case E_V4DFmode:
|
||||
case E_V4DImode:
|
||||
|
@ -2474,6 +2475,7 @@ classify_argument (machine_mode mode, const_tree type,
|
|||
case E_V8DFmode:
|
||||
case E_V16SFmode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V8DImode:
|
||||
case E_V16SImode:
|
||||
case E_V32HImode:
|
||||
|
@ -2492,6 +2494,7 @@ classify_argument (machine_mode mode, const_tree type,
|
|||
case E_V16QImode:
|
||||
case E_V8HImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V2DFmode:
|
||||
case E_V2DImode:
|
||||
classes[0] = X86_64_SSE_CLASS;
|
||||
|
@ -2947,6 +2950,7 @@ pass_in_reg:
|
|||
/* FALLTHRU */
|
||||
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V8SFmode:
|
||||
case E_V8SImode:
|
||||
case E_V64QImode:
|
||||
|
@ -2954,6 +2958,7 @@ pass_in_reg:
|
|||
case E_V16SImode:
|
||||
case E_V8DImode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V16SFmode:
|
||||
case E_V8DFmode:
|
||||
case E_V32QImode:
|
||||
|
@ -2966,6 +2971,7 @@ pass_in_reg:
|
|||
case E_V4SImode:
|
||||
case E_V2DImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V4SFmode:
|
||||
case E_V2DFmode:
|
||||
if (!type || !AGGREGATE_TYPE_P (type))
|
||||
|
@ -3190,6 +3196,7 @@ pass_in_reg:
|
|||
case E_V4SImode:
|
||||
case E_V2DImode:
|
||||
case E_V8HFmode:
|
||||
case E_V8BFmode:
|
||||
case E_V4SFmode:
|
||||
case E_V2DFmode:
|
||||
if (!type || !AGGREGATE_TYPE_P (type))
|
||||
|
@ -3210,9 +3217,11 @@ pass_in_reg:
|
|||
case E_V16SImode:
|
||||
case E_V8DImode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V16SFmode:
|
||||
case E_V8DFmode:
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V8SFmode:
|
||||
case E_V8SImode:
|
||||
case E_V32QImode:
|
||||
|
@ -3273,6 +3282,7 @@ function_arg_64 (const CUMULATIVE_ARGS *cum, machine_mode mode,
|
|||
break;
|
||||
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V8SFmode:
|
||||
case E_V8SImode:
|
||||
case E_V32QImode:
|
||||
|
@ -3280,6 +3290,7 @@ function_arg_64 (const CUMULATIVE_ARGS *cum, machine_mode mode,
|
|||
case E_V4DFmode:
|
||||
case E_V4DImode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V16SFmode:
|
||||
case E_V16SImode:
|
||||
case E_V64QImode:
|
||||
|
@ -4748,6 +4759,7 @@ ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
|
|||
switch (nat_mode)
|
||||
{
|
||||
case E_V16HFmode:
|
||||
case E_V16BFmode:
|
||||
case E_V8SFmode:
|
||||
case E_V8SImode:
|
||||
case E_V32QImode:
|
||||
|
@ -4755,6 +4767,7 @@ ix86_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p,
|
|||
case E_V4DFmode:
|
||||
case E_V4DImode:
|
||||
case E_V32HFmode:
|
||||
case E_V32BFmode:
|
||||
case E_V16SFmode:
|
||||
case E_V16SImode:
|
||||
case E_V64QImode:
|
||||
|
@ -5430,7 +5443,7 @@ ix86_get_ssemov (rtx *operands, unsigned size,
|
|||
switch (type)
|
||||
{
|
||||
case opcode_int:
|
||||
if (scalar_mode == E_HFmode)
|
||||
if (scalar_mode == E_HFmode || scalar_mode == E_BFmode)
|
||||
opcode = (misaligned_p
|
||||
? (TARGET_AVX512BW ? "vmovdqu16" : "vmovdqu64")
|
||||
: "vmovdqa64");
|
||||
|
@ -5450,6 +5463,7 @@ ix86_get_ssemov (rtx *operands, unsigned size,
|
|||
switch (scalar_mode)
|
||||
{
|
||||
case E_HFmode:
|
||||
case E_BFmode:
|
||||
if (evex_reg_p)
|
||||
opcode = (misaligned_p
|
||||
? (TARGET_AVX512BW
|
||||
|
|
|
@ -1011,7 +1011,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
|
|||
#define VALID_AVX256_REG_MODE(MODE) \
|
||||
((MODE) == V32QImode || (MODE) == V16HImode || (MODE) == V8SImode \
|
||||
|| (MODE) == V4DImode || (MODE) == V2TImode || (MODE) == V8SFmode \
|
||||
|| (MODE) == V4DFmode || (MODE) == V16HFmode)
|
||||
|| (MODE) == V4DFmode || (MODE) == V16HFmode || (MODE) == V16BFmode)
|
||||
|
||||
#define VALID_AVX256_REG_OR_OI_MODE(MODE) \
|
||||
(VALID_AVX256_REG_MODE (MODE) || (MODE) == OImode)
|
||||
|
@ -1026,7 +1026,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
|
|||
#define VALID_AVX512F_REG_MODE(MODE) \
|
||||
((MODE) == V8DImode || (MODE) == V8DFmode || (MODE) == V64QImode \
|
||||
|| (MODE) == V16SImode || (MODE) == V16SFmode || (MODE) == V32HImode \
|
||||
|| (MODE) == V4TImode || (MODE) == V32HFmode)
|
||||
|| (MODE) == V4TImode || (MODE) == V32HFmode || (MODE) == V32BFmode)
|
||||
|
||||
#define VALID_AVX512F_REG_OR_XI_MODE(MODE) \
|
||||
(VALID_AVX512F_REG_MODE (MODE) || (MODE) == XImode)
|
||||
|
@ -1035,7 +1035,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
|
|||
((MODE) == V2DImode || (MODE) == V2DFmode || (MODE) == V16QImode \
|
||||
|| (MODE) == V4SImode || (MODE) == V4SFmode || (MODE) == V8HImode \
|
||||
|| (MODE) == TFmode || (MODE) == V1TImode || (MODE) == V8HFmode \
|
||||
|| (MODE) == TImode)
|
||||
|| (MODE) == V8BFmode || (MODE) == TImode)
|
||||
|
||||
#define VALID_AVX512FP16_REG_MODE(MODE) \
|
||||
((MODE) == V8HFmode || (MODE) == V16HFmode || (MODE) == V32HFmode \
|
||||
|
@ -1044,6 +1044,7 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
|
|||
#define VALID_SSE2_REG_MODE(MODE) \
|
||||
((MODE) == V16QImode || (MODE) == V8HImode || (MODE) == V2DFmode \
|
||||
|| (MODE) == V8HFmode || (MODE) == V4HFmode || (MODE) == V2HFmode \
|
||||
|| (MODE) == V8BFmode \
|
||||
|| (MODE) == V4QImode || (MODE) == V2HImode || (MODE) == V1SImode \
|
||||
|| (MODE) == V2DImode || (MODE) == V2QImode || (MODE) == DFmode \
|
||||
|| (MODE) == HFmode || (MODE) == BFmode)
|
||||
|
@ -1095,8 +1096,9 @@ extern const char *host_detect_local_cpu (int argc, const char **argv);
|
|||
|| (MODE) == V4DImode || (MODE) == V8SFmode || (MODE) == V4DFmode \
|
||||
|| (MODE) == V2TImode || (MODE) == V8DImode || (MODE) == V64QImode \
|
||||
|| (MODE) == V16SImode || (MODE) == V32HImode || (MODE) == V8DFmode \
|
||||
|| (MODE) == V16SFmode || (MODE) == V32HFmode || (MODE) == V16HFmode \
|
||||
|| (MODE) == V8HFmode)
|
||||
|| (MODE) == V16SFmode \
|
||||
|| (MODE) == V32HFmode || (MODE) == V16HFmode || (MODE) == V8HFmode \
|
||||
|| (MODE) == V32BFmode || (MODE) == V16BFmode || (MODE) == V8BFmode)
|
||||
|
||||
#define X87_FLOAT_MODE_P(MODE) \
|
||||
(TARGET_80387 && ((MODE) == SFmode || (MODE) == DFmode || (MODE) == XFmode))
|
||||
|
|
|
@ -1114,7 +1114,8 @@
|
|||
(V2DF "16") (V4DF "32") (V8DF "64")
|
||||
(V4SF "16") (V8SF "32") (V16SF "64")
|
||||
(V8HF "16") (V16HF "32") (V32HF "64")
|
||||
(V4HF "8") (V2HF "4")])
|
||||
(V4HF "8") (V2HF "4")
|
||||
(V8BF "16") (V16BF "32") (V32BF "64")])
|
||||
|
||||
;; Double word integer modes as mode attribute.
|
||||
(define_mode_attr DWI [(QI "HI") (HI "SI") (SI "DI") (DI "TI") (TI "OI")])
|
||||
|
@ -1258,8 +1259,8 @@
|
|||
(define_mode_attr ssemodesuffix
|
||||
[(HF "sh") (SF "ss") (DF "sd")
|
||||
(V32HF "ph") (V16SF "ps") (V8DF "pd")
|
||||
(V16HF "ph") (V8SF "ps") (V4DF "pd")
|
||||
(V8HF "ph") (V4SF "ps") (V2DF "pd")
|
||||
(V16HF "ph") (V16BF "bf") (V8SF "ps") (V4DF "pd")
|
||||
(V8HF "ph") (V8BF "bf") (V4SF "ps") (V2DF "pd")
|
||||
(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")
|
||||
(V32QI "b") (V16HI "w") (V8SI "d") (V4DI "q")
|
||||
(V64QI "b") (V32HI "w") (V16SI "d") (V8DI "q")])
|
||||
|
@ -1269,7 +1270,7 @@
|
|||
|
||||
;; SSE vector mode corresponding to a scalar mode
|
||||
(define_mode_attr ssevecmode
|
||||
[(QI "V16QI") (HI "V8HI") (SI "V4SI") (DI "V2DI") (HF "V8HF") (SF "V4SF") (DF "V2DF")])
|
||||
[(QI "V16QI") (HI "V8HI") (SI "V4SI") (DI "V2DI") (HF "V8HF") (BF "V8BF") (SF "V4SF") (DF "V2DF")])
|
||||
(define_mode_attr ssevecmodelower
|
||||
[(QI "v16qi") (HI "v8hi") (SI "v4si") (DI "v2di") (SF "v4sf") (DF "v2df")])
|
||||
|
||||
|
|
|
@ -232,6 +232,7 @@
|
|||
(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI
|
||||
(V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX") V1TI
|
||||
(V32HF "TARGET_AVX512F") (V16HF "TARGET_AVX") V8HF
|
||||
(V32BF "TARGET_AVX512F") (V16BF "TARGET_AVX") V8BF
|
||||
(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
|
||||
(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") V2DF])
|
||||
|
||||
|
@ -263,10 +264,11 @@
|
|||
[V64QI (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
|
||||
V32HI (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")])
|
||||
|
||||
(define_mode_iterator VI12HF_AVX512VL
|
||||
(define_mode_iterator VI12HFBF_AVX512VL
|
||||
[V64QI (V16QI "TARGET_AVX512VL") (V32QI "TARGET_AVX512VL")
|
||||
V32HI (V16HI "TARGET_AVX512VL") (V8HI "TARGET_AVX512VL")
|
||||
V32HF (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")])
|
||||
V32HF (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")
|
||||
V32BF (V16BF "TARGET_AVX512VL") (V8BF "TARGET_AVX512VL")])
|
||||
|
||||
;; Same iterator, but without supposed TARGET_AVX512BW
|
||||
(define_mode_iterator VI12_AVX512VLBW
|
||||
|
@ -309,10 +311,10 @@
|
|||
|
||||
;; All 256bit and 512bit vector modes
|
||||
(define_mode_iterator V_256_512
|
||||
[V32QI V16HI V16HF V8SI V4DI V8SF V4DF
|
||||
[V32QI V16HI V16HF V16BF V8SI V4DI V8SF V4DF
|
||||
(V64QI "TARGET_AVX512F") (V32HI "TARGET_AVX512F") (V32HF "TARGET_AVX512F")
|
||||
(V16SI "TARGET_AVX512F") (V8DI "TARGET_AVX512F") (V16SF "TARGET_AVX512F")
|
||||
(V8DF "TARGET_AVX512F")])
|
||||
(V32BF "TARGET_AVX512F") (V16SI "TARGET_AVX512F") (V8DI "TARGET_AVX512F")
|
||||
(V16SF "TARGET_AVX512F") (V8DF "TARGET_AVX512F")])
|
||||
|
||||
;; All vector float modes
|
||||
(define_mode_iterator VF
|
||||
|
@ -435,6 +437,13 @@
|
|||
(define_mode_iterator VF_AVX512FP16
|
||||
[V32HF V16HF V8HF])
|
||||
|
||||
(define_mode_iterator VF_AVX512HFBF16
|
||||
[(V32HF "TARGET_AVX512FP16") (V16HF "TARGET_AVX512FP16")
|
||||
(V8HF "TARGET_AVX512FP16") V32BF V16BF V8BF])
|
||||
|
||||
(define_mode_iterator VF_AVX512BWHFBF16
|
||||
[V32HF V16HF V8HF V32BF V16BF V8BF])
|
||||
|
||||
(define_mode_iterator VF_AVX512FP16VL
|
||||
[V32HF (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")])
|
||||
|
||||
|
@ -447,13 +456,14 @@
|
|||
(V4DI "TARGET_AVX") V2DI])
|
||||
|
||||
;; All vector integer and HF modes
|
||||
(define_mode_iterator VIHF
|
||||
(define_mode_iterator VIHFBF
|
||||
[(V16SI "TARGET_AVX512F") (V8DI "TARGET_AVX512F")
|
||||
(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX") V16QI
|
||||
(V32HI "TARGET_AVX512BW") (V16HI "TARGET_AVX") V8HI
|
||||
(V8SI "TARGET_AVX") V4SI
|
||||
(V4DI "TARGET_AVX") V2DI
|
||||
(V32HF "TARGET_AVX512BW") (V16HF "TARGET_AVX") V8HF])
|
||||
(V32HF "TARGET_AVX512BW") (V16HF "TARGET_AVX") V8HF
|
||||
(V32BF "TARGET_AVX512BW") (V16BF "TARGET_AVX") V8BF])
|
||||
|
||||
(define_mode_iterator VI_AVX2
|
||||
[(V64QI "TARGET_AVX512BW") (V32QI "TARGET_AVX2") V16QI
|
||||
|
@ -676,6 +686,7 @@
|
|||
(V4SI "avx512vl") (V8SI "avx512vl") (V16SI "avx512f")
|
||||
(V2DI "avx512vl") (V4DI "avx512vl") (V8DI "avx512f")
|
||||
(V8HF "avx512fp16") (V16HF "avx512vl") (V32HF "avx512bw")
|
||||
(V8BF "avx512vl") (V16BF "avx512vl") (V32BF "avx512bw")
|
||||
(V4SF "avx512vl") (V8SF "avx512vl") (V16SF "avx512f")
|
||||
(V2DF "avx512vl") (V4DF "avx512vl") (V8DF "avx512f")])
|
||||
|
||||
|
@ -786,7 +797,7 @@
|
|||
;; All 128 and 256bit vector integer modes
|
||||
(define_mode_iterator VI_128_256 [V16QI V8HI V4SI V2DI V32QI V16HI V8SI V4DI])
|
||||
;; All 256bit vector integer and HF modes
|
||||
(define_mode_iterator VIHF_256 [V32QI V16HI V8SI V4DI V16HF])
|
||||
(define_mode_iterator VIHFBF_256 [V32QI V16HI V8SI V4DI V16HF V16BF])
|
||||
|
||||
;; Various 128bit vector integer mode combinations
|
||||
(define_mode_iterator VI12_128 [V16QI V8HI])
|
||||
|
@ -813,12 +824,12 @@
|
|||
(define_mode_iterator VI4_256_8_512 [V8SI V8DI])
|
||||
(define_mode_iterator VI_AVX512BW
|
||||
[V16SI V8DI (V32HI "TARGET_AVX512BW") (V64QI "TARGET_AVX512BW")])
|
||||
(define_mode_iterator VIHF_AVX512BW
|
||||
(define_mode_iterator VIHFBF_AVX512BW
|
||||
[V16SI V8DI (V32HI "TARGET_AVX512BW") (V64QI "TARGET_AVX512BW")
|
||||
(V32HF "TARGET_AVX512BW")])
|
||||
(V32HF "TARGET_AVX512BW") (V32BF "TARGET_AVX512BW")])
|
||||
|
||||
;; Int-float size matches
|
||||
(define_mode_iterator VI2F_256_512 [V16HI V32HI V16HF V32HF])
|
||||
(define_mode_iterator VI2F_256_512 [V16HI V32HI V16HF V32HF V16BF V32BF])
|
||||
(define_mode_iterator VI4F_128 [V4SI V4SF])
|
||||
(define_mode_iterator VI8F_128 [V2DI V2DF])
|
||||
(define_mode_iterator VI4F_256 [V8SI V8SF])
|
||||
|
@ -863,9 +874,9 @@
|
|||
(V8SF "TARGET_AVX512VL") (V4DF "TARGET_AVX512VL")
|
||||
V16SF V8DF])
|
||||
|
||||
(define_mode_iterator V8_128 [V8HI V8HF])
|
||||
(define_mode_iterator V16_256 [V16HI V16HF])
|
||||
(define_mode_iterator V32_512 [V32HI V32HF])
|
||||
(define_mode_iterator V8_128 [V8HI V8HF V8BF])
|
||||
(define_mode_iterator V16_256 [V16HI V16HF V16BF])
|
||||
(define_mode_iterator V32_512 [V32HI V32HF V32BF])
|
||||
|
||||
;; Mapping from float mode to required SSE level
|
||||
(define_mode_attr sse
|
||||
|
@ -910,6 +921,7 @@
|
|||
(V8SF "V8SF") (V4DF "V4DF")
|
||||
(V4SF "V4SF") (V2DF "V2DF")
|
||||
(V8HF "TI") (V16HF "OI") (V32HF "XI")
|
||||
(V8BF "TI") (V16BF "OI") (V32BF "XI")
|
||||
(TI "TI")])
|
||||
|
||||
(define_mode_attr sseintvecinsnmode
|
||||
|
@ -926,16 +938,17 @@
|
|||
[(V64QI "BC") (V32HI "BC") (V16SI "BC") (V8DI "BC") (V4TI "BC")
|
||||
(V32QI "BC") (V16HI "BC") (V8SI "BC") (V4DI "BC") (V2TI "BC")
|
||||
(V16QI "BC") (V8HI "BC") (V4SI "BC") (V2DI "BC") (V1TI "BC")
|
||||
(V32HF "BF") (V16SF "BF") (V8DF "BF")
|
||||
(V16HF "BF") (V8SF "BF") (V4DF "BF")
|
||||
(V8HF "BF") (V4SF "BF") (V2DF "BF")])
|
||||
(V32HF "BF") (V32BF "BF") (V16SF "BF") (V8DF "BF")
|
||||
(V16HF "BF") (V16BF "BF") (V8SF "BF") (V4DF "BF")
|
||||
(V8HF "BF") (V8BF "BF") (V4SF "BF") (V2DF "BF")])
|
||||
|
||||
;; SSE integer instruction suffix for various modes
|
||||
(define_mode_attr sseintmodesuffix
|
||||
[(V16QI "b") (V8HI "w") (V4SI "d") (V2DI "q")
|
||||
(V32QI "b") (V16HI "w") (V8SI "d") (V4DI "q")
|
||||
(V64QI "b") (V32HI "w") (V16SI "d") (V8DI "q")
|
||||
(V8HF "w") (V16HF "w") (V32HF "w")])
|
||||
(V8HF "w") (V16HF "w") (V32HF "w")
|
||||
(V8BF "w") (V16BF "w") (V32BF "w")])
|
||||
|
||||
;; Mapping of vector modes to corresponding mask size
|
||||
(define_mode_attr avx512fmaskmode
|
||||
|
@ -944,6 +957,7 @@
|
|||
(V16SI "HI") (V8SI "QI") (V4SI "QI")
|
||||
(V8DI "QI") (V4DI "QI") (V2DI "QI")
|
||||
(V32HF "SI") (V16HF "HI") (V8HF "QI")
|
||||
(V32BF "SI") (V16BF "HI") (V8BF "QI")
|
||||
(V16SF "HI") (V8SF "QI") (V4SF "QI")
|
||||
(V8DF "QI") (V4DF "QI") (V2DF "QI")])
|
||||
|
||||
|
@ -958,6 +972,7 @@
|
|||
(V16SI "hi") (V8SI "qi") (V4SI "qi")
|
||||
(V8DI "qi") (V4DI "qi") (V2DI "qi")
|
||||
(V32HF "si") (V16HF "hi") (V8HF "qi")
|
||||
(V32BF "si") (V16BF "hi") (V8BF "qi")
|
||||
(V16SF "hi") (V8SF "qi") (V4SF "qi")
|
||||
(V8DF "qi") (V4DF "qi") (V2DF "qi")])
|
||||
|
||||
|
@ -973,9 +988,9 @@
|
|||
|
||||
;; Mapping of vector float modes to an integer mode of the same size
|
||||
(define_mode_attr sseintvecmode
|
||||
[(V32HF "V32HI") (V16SF "V16SI") (V8DF "V8DI")
|
||||
(V16HF "V16HI") (V8SF "V8SI") (V4DF "V4DI")
|
||||
(V8HF "V8HI") (V4SF "V4SI") (V2DF "V2DI")
|
||||
[(V32HF "V32HI") (V32BF "V32HI") (V16SF "V16SI") (V8DF "V8DI")
|
||||
(V16HF "V16HI") (V16BF "V16HI") (V8SF "V8SI") (V4DF "V4DI")
|
||||
(V8HF "V8HI") (V8BF "V8HI") (V4SF "V4SI") (V2DF "V2DI")
|
||||
(V16SI "V16SI") (V8DI "V8DI")
|
||||
(V8SI "V8SI") (V4DI "V4DI")
|
||||
(V4SI "V4SI") (V2DI "V2DI")
|
||||
|
@ -998,9 +1013,9 @@
|
|||
(V16HF "OI") (V8HF "TI")])
|
||||
|
||||
(define_mode_attr sseintvecmodelower
|
||||
[(V32HF "v32hi") (V16SF "v16si") (V8DF "v8di")
|
||||
(V16HF "v16hi") (V8SF "v8si") (V4DF "v4di")
|
||||
(V8HF "v8hi") (V4SF "v4si") (V2DF "v2di")
|
||||
[(V32HF "v32hi") (V32BF "v32hi") (V16SF "v16si") (V8DF "v8di")
|
||||
(V16HF "v16hi") (V16BF "v16hi") (V8SF "v8si") (V4DF "v4di")
|
||||
(V8HF "v8hi") (V8BF "v8hi") (V4SF "v4si") (V2DF "v2di")
|
||||
(V8SI "v8si") (V4DI "v4di")
|
||||
(V4SI "v4si") (V2DI "v2di")
|
||||
(V16HI "v16hi") (V8HI "v8hi")
|
||||
|
@ -1014,7 +1029,8 @@
|
|||
(V16SF "V32SF") (V8DF "V16DF")
|
||||
(V8SF "V16SF") (V4DF "V8DF")
|
||||
(V4SF "V8SF") (V2DF "V4DF")
|
||||
(V32HF "V64HF") (V16HF "V32HF") (V8HF "V16HF")])
|
||||
(V32HF "V64HF") (V16HF "V32HF") (V8HF "V16HF")
|
||||
(V32BF "V64BF") (V16BF "V32BF") (V8BF "V16BF")])
|
||||
|
||||
;; Mapping of vector modes to a vector mode of half size
|
||||
;; instead of V1DI/V1DF, DI/DF are used for V2DI/V2DF although they are scalar.
|
||||
|
@ -1025,7 +1041,8 @@
|
|||
(V16SF "V8SF") (V8DF "V4DF")
|
||||
(V8SF "V4SF") (V4DF "V2DF")
|
||||
(V4SF "V2SF") (V2DF "DF")
|
||||
(V32HF "V16HF") (V16HF "V8HF") (V8HF "V4HF")])
|
||||
(V32HF "V16HF") (V16HF "V8HF") (V8HF "V4HF")
|
||||
(V32BF "V16BF") (V16BF "V8BF") (V8BF "V4BF")])
|
||||
|
||||
(define_mode_attr ssehalfvecmodelower
|
||||
[(V64QI "v32qi") (V32HI "v16hi") (V16SI "v8si") (V8DI "v4di") (V4TI "v2ti")
|
||||
|
@ -1034,7 +1051,8 @@
|
|||
(V16SF "v8sf") (V8DF "v4df")
|
||||
(V8SF "v4sf") (V4DF "v2df")
|
||||
(V4SF "v2sf")
|
||||
(V32HF "v16hf") (V16HF "v8hf") (V8HF "v4hf")])
|
||||
(V32HF "v16hf") (V16HF "v8hf") (V8HF "v4hf")
|
||||
(V32BF "v16bf") (V16BF "v8bf") (V8BF "v4bf")])
|
||||
|
||||
;; Mapping of vector modes to vector hf modes of conversion.
|
||||
(define_mode_attr ssePHmode
|
||||
|
@ -1085,6 +1103,7 @@
|
|||
(V16SI "SI") (V8SI "SI") (V4SI "SI")
|
||||
(V8DI "DI") (V4DI "DI") (V2DI "DI")
|
||||
(V32HF "HF") (V16HF "HF") (V8HF "HF")
|
||||
(V32BF "BF") (V16BF "BF") (V8BF "BF")
|
||||
(V16SF "SF") (V8SF "SF") (V4SF "SF")
|
||||
(V8DF "DF") (V4DF "DF") (V2DF "DF")
|
||||
(V4TI "TI") (V2TI "TI")])
|
||||
|
@ -1096,6 +1115,7 @@
|
|||
(V16SI "si") (V8SI "si") (V4SI "si")
|
||||
(V8DI "di") (V4DI "di") (V2DI "di")
|
||||
(V32HF "hf") (V16HF "hf") (V8HF "hf")
|
||||
(V32BF "bf") (V16BF "bf") (V8BF "bf")
|
||||
(V16SF "sf") (V8SF "sf") (V4SF "sf")
|
||||
(V8DF "df") (V4DF "df") (V2DF "df")
|
||||
(V4TI "ti") (V2TI "ti")])
|
||||
|
@ -1107,6 +1127,7 @@
|
|||
(V16SI "V4SI") (V8SI "V4SI") (V4SI "V4SI")
|
||||
(V8DI "V2DI") (V4DI "V2DI") (V2DI "V2DI")
|
||||
(V32HF "V8HF") (V16HF "V8HF") (V8HF "V8HF")
|
||||
(V32BF "V8BF") (V16BF "V8BF") (V8BF "V8BF")
|
||||
(V16SF "V4SF") (V8SF "V4SF") (V4SF "V4SF")
|
||||
(V8DF "V2DF") (V4DF "V2DF") (V2DF "V2DF")])
|
||||
|
||||
|
@ -1128,6 +1149,7 @@
|
|||
(V16SF "d") (V8SF "d") (V4SF "d")
|
||||
(V32HI "d") (V16HI "d") (V8HI "d")
|
||||
(V32HF "d") (V16HF "d") (V8HF "d")
|
||||
(V32BF "d") (V16BF "d") (V8BF "d")
|
||||
(V64QI "d") (V32QI "d") (V16QI "d")])
|
||||
|
||||
;; Number of scalar elements in each vector type
|
||||
|
@ -1153,6 +1175,7 @@
|
|||
(V32HI "16") (V16HI "16") (V8HI "16")
|
||||
(V16SI "32") (V8SI "32") (V4SI "32")
|
||||
(V32HF "16") (V16HF "16") (V8HF "16")
|
||||
(V32BF "16") (V16BF "16") (V8BF "16")
|
||||
(V16SF "32") (V8SF "32") (V4SF "32")
|
||||
(V8DF "64") (V4DF "64") (V2DF "64")])
|
||||
|
||||
|
@ -1164,9 +1187,9 @@
|
|||
(V4SI "p") (V4SF "")
|
||||
(V8SI "p") (V8SF "")
|
||||
(V16SI "p") (V16SF "")
|
||||
(V16QI "p") (V8HI "p") (V8HF "p")
|
||||
(V32QI "p") (V16HI "p") (V16HF "p")
|
||||
(V64QI "p") (V32HI "p") (V32HF "p")])
|
||||
(V16QI "p") (V8HI "p") (V8HF "p") (V8BF "p")
|
||||
(V32QI "p") (V16HI "p") (V16HF "p") (V16BF "p")
|
||||
(V64QI "p") (V32HI "p") (V32HF "p") (V32BF "p")])
|
||||
|
||||
;; SSE prefix for integer and HF vector comparison.
|
||||
(define_mode_attr ssecmpintprefix
|
||||
|
@ -1219,7 +1242,8 @@
|
|||
;; i128 for integer vectors and TARGET_AVX2, f128 otherwise.
|
||||
;; i64x4 or f64x4 for 512bit modes.
|
||||
(define_mode_attr i128
|
||||
[(V16HF "%~128") (V32HF "i64x4") (V16SF "f64x4") (V8SF "f128")
|
||||
[(V16HF "%~128") (V32HF "i64x4") (V16BF "%~128") (V32BF "i64x4")
|
||||
(V16SF "f64x4") (V8SF "f128")
|
||||
(V8DF "f64x4") (V4DF "f128")
|
||||
(V64QI "i64x4") (V32QI "%~128") (V32HI "i64x4") (V16HI "%~128")
|
||||
(V16SI "i64x4") (V8SI "%~128") (V8DI "i64x4") (V4DI "%~128")])
|
||||
|
@ -1245,17 +1269,18 @@
|
|||
(V16SI "d") (V8SI "d") (V4SI "d")
|
||||
(V8DI "q") (V4DI "q") (V2DI "q")
|
||||
(V32HF "w") (V16HF "w") (V8HF "w")
|
||||
(V32BF "w") (V16BF "w") (V8BF "w")
|
||||
(V16SF "ss") (V8SF "ss") (V4SF "ss")
|
||||
(V8DF "sd") (V4DF "sd") (V2DF "sd")])
|
||||
|
||||
;; Tie mode of assembler operand to mode iterator
|
||||
(define_mode_attr xtg_mode
|
||||
[(V16QI "x") (V8HI "x") (V4SI "x") (V2DI "x")
|
||||
(V8HF "x") (V4SF "x") (V2DF "x")
|
||||
(V8HF "x") (V8BF "x") (V4SF "x") (V2DF "x")
|
||||
(V32QI "t") (V16HI "t") (V8SI "t") (V4DI "t")
|
||||
(V16HF "t") (V8SF "t") (V4DF "t")
|
||||
(V16HF "t") (V16BF "t") (V8SF "t") (V4DF "t")
|
||||
(V64QI "g") (V32HI "g") (V16SI "g") (V8DI "g")
|
||||
(V32HF "g") (V16SF "g") (V8DF "g")])
|
||||
(V32HF "g") (V32BF "g") (V16SF "g") (V8DF "g")])
|
||||
|
||||
;; Half mask mode for unpacks
|
||||
(define_mode_attr HALFMASKMODE
|
||||
|
@ -1553,10 +1578,10 @@
|
|||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn "<avx512>_blendm<mode>"
|
||||
[(set (match_operand:VF_AVX512FP16 0 "register_operand" "=v,v")
|
||||
(vec_merge:VF_AVX512FP16
|
||||
(match_operand:VF_AVX512FP16 2 "nonimmediate_operand" "vm,vm")
|
||||
(match_operand:VF_AVX512FP16 1 "nonimm_or_0_operand" "0C,v")
|
||||
[(set (match_operand:VF_AVX512BWHFBF16 0 "register_operand" "=v,v")
|
||||
(vec_merge:VF_AVX512BWHFBF16
|
||||
(match_operand:VF_AVX512BWHFBF16 2 "nonimmediate_operand" "vm,vm")
|
||||
(match_operand:VF_AVX512BWHFBF16 1 "nonimm_or_0_operand" "0C,v")
|
||||
(match_operand:<avx512fmaskmode> 3 "register_operand" "Yk,Yk")))]
|
||||
"TARGET_AVX512BW"
|
||||
"@
|
||||
|
@ -1595,9 +1620,9 @@
|
|||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn "<avx512>_store<mode>_mask"
|
||||
[(set (match_operand:VI12HF_AVX512VL 0 "memory_operand" "=m")
|
||||
(vec_merge:VI12HF_AVX512VL
|
||||
(match_operand:VI12HF_AVX512VL 1 "register_operand" "v")
|
||||
[(set (match_operand:VI12HFBF_AVX512VL 0 "memory_operand" "=m")
|
||||
(vec_merge:VI12HFBF_AVX512VL
|
||||
(match_operand:VI12HFBF_AVX512VL 1 "register_operand" "v")
|
||||
(match_dup 0)
|
||||
(match_operand:<avx512fmaskmode> 2 "register_operand" "Yk")))]
|
||||
"TARGET_AVX512BW"
|
||||
|
@ -4513,14 +4538,18 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_mode_iterator VF_AVX512HFBFVL
|
||||
[V32HF (V16HF "TARGET_AVX512VL") (V8HF "TARGET_AVX512VL")
|
||||
V32BF (V16BF "TARGET_AVX512VL") (V8BF "TARGET_AVX512VL")])
|
||||
|
||||
(define_expand "vcond<mode><sseintvecmodelower>"
|
||||
[(set (match_operand:VF_AVX512FP16VL 0 "register_operand")
|
||||
(if_then_else:VF_AVX512FP16VL
|
||||
[(set (match_operand:VF_AVX512HFBFVL 0 "register_operand")
|
||||
(if_then_else:VF_AVX512HFBFVL
|
||||
(match_operator 3 ""
|
||||
[(match_operand:<sseintvecmode> 4 "vector_operand")
|
||||
(match_operand:<sseintvecmode> 5 "vector_operand")])
|
||||
(match_operand:VF_AVX512FP16VL 1 "general_operand")
|
||||
(match_operand:VF_AVX512FP16VL 2 "general_operand")))]
|
||||
(match_operand:VF_AVX512HFBFVL 1 "general_operand")
|
||||
(match_operand:VF_AVX512HFBFVL 2 "general_operand")))]
|
||||
"TARGET_AVX512FP16"
|
||||
{
|
||||
bool ok = ix86_expand_int_vcond (operands);
|
||||
|
@ -4552,10 +4581,10 @@
|
|||
"TARGET_AVX512F")
|
||||
|
||||
(define_expand "vcond_mask_<mode><avx512fmaskmodelower>"
|
||||
[(set (match_operand:VI12HF_AVX512VL 0 "register_operand")
|
||||
(vec_merge:VI12HF_AVX512VL
|
||||
(match_operand:VI12HF_AVX512VL 1 "nonimmediate_operand")
|
||||
(match_operand:VI12HF_AVX512VL 2 "nonimm_or_0_operand")
|
||||
[(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand")
|
||||
(vec_merge:VI12HFBF_AVX512VL
|
||||
(match_operand:VI12HFBF_AVX512VL 1 "nonimmediate_operand")
|
||||
(match_operand:VI12HFBF_AVX512VL 2 "nonimm_or_0_operand")
|
||||
(match_operand:<avx512fmaskmode> 3 "register_operand")))]
|
||||
"TARGET_AVX512BW")
|
||||
|
||||
|
@ -10747,7 +10776,7 @@
|
|||
(const_string "HF")
|
||||
(const_string "TI")))
|
||||
(set (attr "enabled")
|
||||
(cond [(and (not (match_test "<MODE>mode == V8HFmode"))
|
||||
(cond [(and (not (match_test "<MODE>mode == V8HFmode || <MODE>mode == V8BFmode"))
|
||||
(eq_attr "alternative" "2"))
|
||||
(symbol_ref "false")
|
||||
]
|
||||
|
@ -10809,11 +10838,13 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_insn "avx512fp16_movsh"
|
||||
[(set (match_operand:V8HF 0 "register_operand" "=v")
|
||||
(vec_merge:V8HF
|
||||
(match_operand:V8HF 2 "register_operand" "v")
|
||||
(match_operand:V8HF 1 "register_operand" "v")
|
||||
(define_mode_iterator V8BFH_128 [V8HF V8BF])
|
||||
|
||||
(define_insn "avx512fp16_mov<mode>"
|
||||
[(set (match_operand:V8BFH_128 0 "register_operand" "=v")
|
||||
(vec_merge:V8BFH_128
|
||||
(match_operand:V8BFH_128 2 "register_operand" "v")
|
||||
(match_operand:V8BFH_128 1 "register_operand" "v")
|
||||
(const_int 1)))]
|
||||
"TARGET_AVX512FP16"
|
||||
"vmovsh\t{%2, %1, %0|%0, %1, %2}"
|
||||
|
@ -10996,9 +11027,9 @@
|
|||
DONE;
|
||||
})
|
||||
|
||||
(define_expand "vec_setv8hf"
|
||||
[(match_operand:V8HF 0 "register_operand")
|
||||
(match_operand:HF 1 "register_operand")
|
||||
(define_expand "vec_set<mode>"
|
||||
[(match_operand:V8BFH_128 0 "register_operand")
|
||||
(match_operand:<ssescalarmode> 1 "register_operand")
|
||||
(match_operand 2 "vec_setm_sse41_operand")]
|
||||
"TARGET_SSE"
|
||||
{
|
||||
|
@ -11726,7 +11757,7 @@
|
|||
(set_attr "length_immediate" "1")
|
||||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn_and_split "vec_extract_lo_<mode>"
|
||||
(define_insn_and_split "@vec_extract_lo_<mode>"
|
||||
[(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=v,v,m")
|
||||
(vec_select:<ssehalfvecmode>
|
||||
(match_operand:V32_512 1 "nonimmediate_operand" "v,m,v")
|
||||
|
@ -11768,7 +11799,7 @@
|
|||
(set_attr "prefix" "evex")
|
||||
(set_attr "mode" "XI")])
|
||||
|
||||
(define_insn "vec_extract_hi_<mode>"
|
||||
(define_insn "@vec_extract_hi_<mode>"
|
||||
[(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=vm")
|
||||
(vec_select:<ssehalfvecmode>
|
||||
(match_operand:V32_512 1 "register_operand" "v")
|
||||
|
@ -11788,7 +11819,7 @@
|
|||
(set_attr "prefix" "evex")
|
||||
(set_attr "mode" "XI")])
|
||||
|
||||
(define_insn_and_split "vec_extract_lo_<mode>"
|
||||
(define_insn_and_split "@vec_extract_lo_<mode>"
|
||||
[(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=v,m")
|
||||
(vec_select:<ssehalfvecmode>
|
||||
(match_operand:V16_256 1 "nonimmediate_operand" "vm,v")
|
||||
|
@ -11802,7 +11833,7 @@
|
|||
[(set (match_dup 0) (match_dup 1))]
|
||||
"operands[1] = gen_lowpart (<ssehalfvecmode>mode, operands[1]);")
|
||||
|
||||
(define_insn "vec_extract_hi_<mode>"
|
||||
(define_insn "@vec_extract_hi_<mode>"
|
||||
[(set (match_operand:<ssehalfvecmode> 0 "nonimmediate_operand" "=xm,vm,vm")
|
||||
(vec_select:<ssehalfvecmode>
|
||||
(match_operand:V16_256 1 "register_operand" "x,v,v")
|
||||
|
@ -11944,20 +11975,20 @@
|
|||
;; NB: *vec_extract<mode>_0 must be placed before *vec_extracthf.
|
||||
;; Otherwise, it will be ignored.
|
||||
(define_insn_and_split "*vec_extract<mode>_0"
|
||||
[(set (match_operand:HF 0 "nonimmediate_operand" "=v,m,r")
|
||||
(vec_select:HF
|
||||
(match_operand:VF_AVX512FP16 1 "nonimmediate_operand" "vm,v,m")
|
||||
[(set (match_operand:<ssescalarmode> 0 "nonimmediate_operand" "=v,m,r")
|
||||
(vec_select:<ssescalarmode>
|
||||
(match_operand:VF_AVX512HFBF16 1 "nonimmediate_operand" "vm,v,m")
|
||||
(parallel [(const_int 0)])))]
|
||||
"TARGET_AVX512FP16 && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
|
||||
"TARGET_AVX512F && !(MEM_P (operands[0]) && MEM_P (operands[1]))"
|
||||
"#"
|
||||
"&& reload_completed"
|
||||
[(set (match_dup 0) (match_dup 1))]
|
||||
"operands[1] = gen_lowpart (HFmode, operands[1]);")
|
||||
"operands[1] = gen_lowpart (<ssescalarmode>mode, operands[1]);")
|
||||
|
||||
(define_insn "*vec_extracthf"
|
||||
[(set (match_operand:HF 0 "register_sse4nonimm_operand" "=?r,m,x,v")
|
||||
(vec_select:HF
|
||||
(match_operand:V8HF 1 "register_operand" "v,v,0,v")
|
||||
(define_insn "*vec_extract<mode>"
|
||||
[(set (match_operand:HFBF 0 "register_sse4nonimm_operand" "=?r,m,x,v")
|
||||
(vec_select:HFBF
|
||||
(match_operand:<ssevecmode> 1 "register_operand" "v,v,0,v")
|
||||
(parallel
|
||||
[(match_operand:SI 2 "const_0_to_7_operand")])))]
|
||||
"TARGET_SSE2"
|
||||
|
@ -11992,6 +12023,7 @@
|
|||
(V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
|
||||
(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI
|
||||
(V32HF "TARGET_AVX512BW") (V16HF "TARGET_AVX") V8HF
|
||||
(V32BF "TARGET_AVX512BW") (V16BF "TARGET_AVX") V8BF
|
||||
(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
|
||||
(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") V2DF
|
||||
(V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX")])
|
||||
|
@ -18097,17 +18129,17 @@
|
|||
|
||||
;; Modes handled by pinsr patterns.
|
||||
(define_mode_iterator PINSR_MODE
|
||||
[(V16QI "TARGET_SSE4_1") V8HI V8HF
|
||||
[(V16QI "TARGET_SSE4_1") V8HI V8HF V8BF
|
||||
(V4SI "TARGET_SSE4_1")
|
||||
(V2DI "TARGET_SSE4_1 && TARGET_64BIT")])
|
||||
|
||||
(define_mode_attr sse2p4_1
|
||||
[(V16QI "sse4_1") (V8HI "sse2") (V8HF "sse2")
|
||||
(V4SI "sse4_1") (V2DI "sse4_1")])
|
||||
(V8BF "sse2") (V4SI "sse4_1") (V2DI "sse4_1")])
|
||||
|
||||
(define_mode_attr pinsr_evex_isa
|
||||
[(V16QI "avx512bw") (V8HI "avx512bw") (V8HF "avx512bw")
|
||||
(V4SI "avx512dq") (V2DI "avx512dq")])
|
||||
(V8BF "avx512bw") (V4SI "avx512dq") (V2DI "avx512dq")])
|
||||
|
||||
;; sse4_1_pinsrd must come before sse2_loadld since it is preferred.
|
||||
(define_insn "<sse2p4_1>_pinsr<ssemodesuffix>"
|
||||
|
@ -25193,11 +25225,12 @@
|
|||
(V32HI "avx512bw") (V16HI "avx512bw") (V8HI "avx512bw")
|
||||
(V16SI "avx512f") (V8SI "avx512f") (V4SI "avx512f")
|
||||
(V8DI "avx512f") (V4DI "avx512f") (V2DI "avx512f")
|
||||
(V32HF "avx512bw") (V16HF "avx512bw") (V8HF "avx512bw")])
|
||||
(V32HF "avx512bw") (V16HF "avx512bw") (V8HF "avx512bw")
|
||||
(V32BF "avx512bw") (V16BF "avx512bw") (V8BF "avx512bw")])
|
||||
|
||||
(define_insn "avx2_pbroadcast<mode>"
|
||||
[(set (match_operand:VIHF 0 "register_operand" "=x,v")
|
||||
(vec_duplicate:VIHF
|
||||
[(set (match_operand:VIHFBF 0 "register_operand" "=x,v")
|
||||
(vec_duplicate:VIHFBF
|
||||
(vec_select:<ssescalarmode>
|
||||
(match_operand:<ssexmmmode> 1 "nonimmediate_operand" "xm,vm")
|
||||
(parallel [(const_int 0)]))))]
|
||||
|
@ -25210,10 +25243,10 @@
|
|||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn "avx2_pbroadcast<mode>_1"
|
||||
[(set (match_operand:VIHF_256 0 "register_operand" "=x,x,v,v")
|
||||
(vec_duplicate:VIHF_256
|
||||
[(set (match_operand:VIHFBF_256 0 "register_operand" "=x,x,v,v")
|
||||
(vec_duplicate:VIHFBF_256
|
||||
(vec_select:<ssescalarmode>
|
||||
(match_operand:VIHF_256 1 "nonimmediate_operand" "m,x,m,v")
|
||||
(match_operand:VIHFBF_256 1 "nonimmediate_operand" "m,x,m,v")
|
||||
(parallel [(const_int 0)]))))]
|
||||
"TARGET_AVX2"
|
||||
"@
|
||||
|
@ -25589,10 +25622,10 @@
|
|||
(set_attr "mode" "V4DF")])
|
||||
|
||||
(define_insn "<avx512>_vec_dup<mode>_1"
|
||||
[(set (match_operand:VIHF_AVX512BW 0 "register_operand" "=v,v")
|
||||
(vec_duplicate:VIHF_AVX512BW
|
||||
[(set (match_operand:VIHFBF_AVX512BW 0 "register_operand" "=v,v")
|
||||
(vec_duplicate:VIHFBF_AVX512BW
|
||||
(vec_select:<ssescalarmode>
|
||||
(match_operand:VIHF_AVX512BW 1 "nonimmediate_operand" "v,m")
|
||||
(match_operand:VIHFBF_AVX512BW 1 "nonimmediate_operand" "v,m")
|
||||
(parallel [(const_int 0)]))))]
|
||||
"TARGET_AVX512F"
|
||||
"@
|
||||
|
@ -25622,8 +25655,8 @@
|
|||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn "<avx512>_vec_dup<mode><mask_name>"
|
||||
[(set (match_operand:VI12HF_AVX512VL 0 "register_operand" "=v")
|
||||
(vec_duplicate:VI12HF_AVX512VL
|
||||
[(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand" "=v")
|
||||
(vec_duplicate:VI12HFBF_AVX512VL
|
||||
(vec_select:<ssescalarmode>
|
||||
(match_operand:<ssexmmmode> 1 "nonimmediate_operand" "vm")
|
||||
(parallel [(const_int 0)]))))]
|
||||
|
@ -25658,8 +25691,8 @@
|
|||
(set_attr "mode" "<sseinsnmode>")])
|
||||
|
||||
(define_insn "<mask_codefor><avx512>_vec_dup_gpr<mode><mask_name>"
|
||||
[(set (match_operand:VI12HF_AVX512VL 0 "register_operand" "=v,v")
|
||||
(vec_duplicate:VI12HF_AVX512VL
|
||||
[(set (match_operand:VI12HFBF_AVX512VL 0 "register_operand" "=v,v")
|
||||
(vec_duplicate:VI12HFBF_AVX512VL
|
||||
(match_operand:<ssescalarmode> 1 "nonimmediate_operand" "vm,r")))]
|
||||
"TARGET_AVX512BW"
|
||||
"@
|
||||
|
@ -25759,7 +25792,7 @@
|
|||
[(V8SF "ss") (V4DF "sd") (V8SI "ss") (V4DI "sd")])
|
||||
;; Modes handled by AVX2 vec_dup patterns.
|
||||
(define_mode_iterator AVX2_VEC_DUP_MODE
|
||||
[V32QI V16QI V16HI V8HI V8SI V4SI V16HF V8HF])
|
||||
[V32QI V16QI V16HI V8HI V8SI V4SI V16HF V8HF V16BF V8BF])
|
||||
|
||||
(define_insn "*vec_dup<mode>"
|
||||
[(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,v")
|
||||
|
@ -26522,6 +26555,7 @@
|
|||
(V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
|
||||
(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX") V2DI
|
||||
(V32HF "TARGET_AVX512F") (V16HF "TARGET_AVX") V8HF
|
||||
(V32BF "TARGET_AVX512F") (V16BF "TARGET_AVX") V8BF
|
||||
(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
|
||||
(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX") (V2DF "TARGET_SSE2")
|
||||
(V4TI "TARGET_AVX512F") (V2TI "TARGET_AVX")])
|
||||
|
@ -26534,6 +26568,7 @@
|
|||
(V16SI "TARGET_AVX512F") (V8SI "TARGET_AVX") V4SI
|
||||
(V8DI "TARGET_AVX512F") (V4DI "TARGET_AVX")
|
||||
(V32HF "TARGET_AVX512F") (V16HF "TARGET_AVX") V8HF
|
||||
(V32BF "TARGET_AVX512F") (V16BF "TARGET_AVX") V8BF
|
||||
(V16SF "TARGET_AVX512F") (V8SF "TARGET_AVX") V4SF
|
||||
(V8DF "TARGET_AVX512F") (V4DF "TARGET_AVX")
|
||||
(V4TI "TARGET_AVX512F")])
|
||||
|
|
13
gcc/testsuite/g++.target/i386/vect-bfloat16-1.C
Normal file
13
gcc/testsuite/g++.target/i386/vect-bfloat16-1.C
Normal file
|
@ -0,0 +1,13 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512fp16 -mavx512vl -O2" } */
|
||||
/* { dg-final { scan-assembler-times "vpblendmw" 1 } } */
|
||||
|
||||
typedef short v8hi __attribute__((vector_size(16)));
|
||||
typedef __bf16 v8bf __attribute__((vector_size(16)));
|
||||
|
||||
v8bf
|
||||
foo (v8hi a, v8hi b, v8bf c, v8bf d)
|
||||
{
|
||||
return a > b ? c : d;
|
||||
}
|
||||
|
30
gcc/testsuite/gcc.target/i386/vect-bfloat16-1.c
Normal file
30
gcc/testsuite/gcc.target/i386/vect-bfloat16-1.c
Normal file
|
@ -0,0 +1,30 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512fp16 -O2" } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpbroadcastw" 1 { target { ! ia32 } } } } */
|
||||
/* { dg-final { scan-assembler-times "vpblendw" 1 { target { ! ia32 } } } } */
|
||||
/* { dg-final { scan-assembler-times "vmovsh" 1 { target { ! ia32 } } } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpinsrw" 2 { target ia32 } } } */
|
||||
#include <immintrin.h>
|
||||
|
||||
typedef __bf16 __v8bf __attribute__ ((__vector_size__ (16)));
|
||||
typedef __bf16 __m128bf16 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
__m128bf16
|
||||
__attribute__ ((noinline, noclone))
|
||||
foo1 (__m128bf16 a, __bf16 f)
|
||||
{
|
||||
__v8bf x = (__v8bf) a;
|
||||
x[2] = f;
|
||||
return (__m128bf16) x;
|
||||
}
|
||||
|
||||
__m128bf16
|
||||
__attribute__ ((noinline, noclone))
|
||||
foo2 (__m128bf16 a, __bf16 f)
|
||||
{
|
||||
__v8bf x = (__v8bf) a;
|
||||
x[0] = f;
|
||||
return (__m128bf16) x;
|
||||
}
|
121
gcc/testsuite/gcc.target/i386/vect-bfloat16-2a.c
Normal file
121
gcc/testsuite/gcc.target/i386/vect-bfloat16-2a.c
Normal file
|
@ -0,0 +1,121 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512fp16 -O2" } */
|
||||
|
||||
typedef __bf16 v8bf __attribute__ ((__vector_size__ (16)));
|
||||
typedef __bf16 v16bf __attribute__ ((__vector_size__ (32)));
|
||||
typedef __bf16 v32bf __attribute__ ((__vector_size__ (64)));
|
||||
|
||||
#define VEC_EXTRACT(V,S,IDX) \
|
||||
S \
|
||||
__attribute__((noipa)) \
|
||||
vec_extract_##V##_##IDX (V v) \
|
||||
{ \
|
||||
return v[IDX]; \
|
||||
}
|
||||
|
||||
#define VEC_SET(V,S,IDX) \
|
||||
V \
|
||||
__attribute__((noipa)) \
|
||||
vec_set_##V##_##IDX (V v, S s) \
|
||||
{ \
|
||||
v[IDX] = s; \
|
||||
return v; \
|
||||
}
|
||||
|
||||
v8bf
|
||||
vec_init_v8bf (__bf16 a1, __bf16 a2, __bf16 a3, __bf16 a4,
|
||||
__bf16 a5, __bf16 a6, __bf16 a7, __bf16 a8)
|
||||
{
|
||||
return __extension__ (v8bf) {a1, a2, a3, a4, a5, a6, a7, a8};
|
||||
}
|
||||
|
||||
v16bf
|
||||
vec_init_v16bf (__bf16 a1, __bf16 a2, __bf16 a3, __bf16 a4,
|
||||
__bf16 a5, __bf16 a6, __bf16 a7, __bf16 a8,
|
||||
__bf16 a9, __bf16 a10, __bf16 a11, __bf16 a12,
|
||||
__bf16 a13, __bf16 a14, __bf16 a15, __bf16 a16)
|
||||
{
|
||||
return __extension__ (v16bf) {a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16};
|
||||
}
|
||||
|
||||
v32bf
|
||||
vec_init_v32bf (__bf16 a1, __bf16 a2, __bf16 a3, __bf16 a4,
|
||||
__bf16 a5, __bf16 a6, __bf16 a7, __bf16 a8,
|
||||
__bf16 a9, __bf16 a10, __bf16 a11, __bf16 a12,
|
||||
__bf16 a13, __bf16 a14, __bf16 a15, __bf16 a16,
|
||||
__bf16 a17, __bf16 a18, __bf16 a19, __bf16 a20,
|
||||
__bf16 a21, __bf16 a22, __bf16 a23, __bf16 a24,
|
||||
__bf16 a25, __bf16 a26, __bf16 a27, __bf16 a28,
|
||||
__bf16 a29, __bf16 a30, __bf16 a31, __bf16 a32)
|
||||
{
|
||||
return __extension__ (v32bf) {a1, a2, a3, a4, a5, a6, a7, a8,
|
||||
a9, a10, a11, a12, a13, a14, a15, a16,
|
||||
a17, a18, a19, a20, a21, a22, a23, a24,
|
||||
a25, a26, a27, a28, a29, a30, a31, a32};
|
||||
}
|
||||
|
||||
v8bf
|
||||
vec_init_dup_v8bf (__bf16 a1)
|
||||
{
|
||||
return __extension__ (v8bf) {a1, a1, a1, a1, a1, a1, a1, a1};
|
||||
}
|
||||
|
||||
v16bf
|
||||
vec_init_dup_v16bf (__bf16 a1)
|
||||
{
|
||||
return __extension__ (v16bf) {a1, a1, a1, a1, a1, a1, a1, a1,
|
||||
a1, a1, a1, a1, a1, a1, a1, a1};
|
||||
}
|
||||
|
||||
v32bf
|
||||
vec_init_dup_v32bf (__bf16 a1)
|
||||
{
|
||||
return __extension__ (v32bf) {a1, a1, a1, a1, a1, a1, a1, a1,
|
||||
a1, a1, a1, a1, a1, a1, a1, a1,
|
||||
a1, a1, a1, a1, a1, a1, a1, a1,
|
||||
a1, a1, a1, a1, a1, a1, a1, a1};
|
||||
}
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpunpcklwd" 28 } } */
|
||||
/* { dg-final { scan-assembler-times "vpunpckldq" 14 } } */
|
||||
/* { dg-final { scan-assembler-times "vpunpcklqdq" 7 } } */
|
||||
|
||||
VEC_EXTRACT (v8bf, __bf16, 0);
|
||||
VEC_EXTRACT (v8bf, __bf16, 4);
|
||||
VEC_EXTRACT (v16bf, __bf16, 0);
|
||||
VEC_EXTRACT (v16bf, __bf16, 3);
|
||||
VEC_EXTRACT (v16bf, __bf16, 8);
|
||||
VEC_EXTRACT (v16bf, __bf16, 15);
|
||||
VEC_EXTRACT (v32bf, __bf16, 0);
|
||||
VEC_EXTRACT (v32bf, __bf16, 5);
|
||||
VEC_EXTRACT (v32bf, __bf16, 8);
|
||||
VEC_EXTRACT (v32bf, __bf16, 14);
|
||||
VEC_EXTRACT (v32bf, __bf16, 16);
|
||||
VEC_EXTRACT (v32bf, __bf16, 24);
|
||||
VEC_EXTRACT (v32bf, __bf16, 28);
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$8" 2 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$6" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$14" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$10" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$12" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vextract" 9 } } */
|
||||
|
||||
VEC_SET (v8bf, __bf16, 4);
|
||||
VEC_SET (v16bf, __bf16, 3);
|
||||
VEC_SET (v16bf, __bf16, 8);
|
||||
VEC_SET (v16bf, __bf16, 15);
|
||||
VEC_SET (v32bf, __bf16, 5);
|
||||
VEC_SET (v32bf, __bf16, 8);
|
||||
VEC_SET (v32bf, __bf16, 14);
|
||||
VEC_SET (v32bf, __bf16, 16);
|
||||
VEC_SET (v32bf, __bf16, 24);
|
||||
VEC_SET (v32bf, __bf16, 28);
|
||||
/* { dg-final { scan-assembler-times "vpbroadcastw" 13 { target { ! ia32 } } } } */
|
||||
/* { dg-final { scan-assembler-times "vpblendw" 4 { target { ! ia32 } } } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpbroadcastw" 12 { target ia32 } } } */
|
||||
/* { dg-final { scan-assembler-times "vpblendw" 3 { target ia32 } } } */
|
||||
/* { dg-final { scan-assembler-times "vpinsrw" 1 { target ia32 } } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpblendd" 3 } } */
|
22
gcc/testsuite/gcc.target/i386/vect-bfloat16-2b.c
Normal file
22
gcc/testsuite/gcc.target/i386/vect-bfloat16-2b.c
Normal file
|
@ -0,0 +1,22 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512f -mno-avx512bw -O2" } */
|
||||
|
||||
#include "vect-bfloat16-2a.c"
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpunpcklwd" 28 } } */
|
||||
/* { dg-final { scan-assembler-times "vpunpckldq" 14 } } */
|
||||
/* { dg-final { scan-assembler-times "vpunpcklqdq" 7 } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$8" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$6" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vpsrldq\[\t ]*\\\$14" 1 } } */
|
||||
/* { dg-final { scan-assembler-times "vextract" 2 } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpbroadcastw" 7 { target { ! ia32 } } } } */
|
||||
/* { dg-final { scan-assembler-times "vpblendw" 4 { target { ! ia32 } } } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpbroadcastw" 6 { target ia32 } } } */
|
||||
/* { dg-final { scan-assembler-times "vpblendw" 3 { target ia32 } } } */
|
||||
/* { dg-final { scan-assembler-times "vpinsrw" 63 { target ia32 } } } */
|
||||
|
||||
/* { dg-final { scan-assembler-times "vpblendd" 3 } } */
|
258
gcc/testsuite/gcc.target/i386/vect-bfloat16-typecheck_1.c
Normal file
258
gcc/testsuite/gcc.target/i386/vect-bfloat16-typecheck_1.c
Normal file
|
@ -0,0 +1,258 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512fp16 -O2" } */
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
typedef __bf16 __v8bf __attribute__ ((__vector_size__ (16)));
|
||||
typedef __bf16 __m128bf16 __attribute__ ((__vector_size__ (16), __may_alias__));
|
||||
|
||||
__bf16 glob_bfloat;
|
||||
__m128bf16 glob_bfloat_vec;
|
||||
|
||||
__m256 is_a_float_vec;
|
||||
__m128 is_a_float_pair;
|
||||
|
||||
__m128h *float_ptr;
|
||||
__m128h is_a_float16_vec;
|
||||
|
||||
__v8si is_an_int_vec;
|
||||
__v4si is_an_int_pair;
|
||||
__v8hi is_a_short_vec;
|
||||
|
||||
int is_an_int;
|
||||
short is_a_short_int;
|
||||
float is_a_float;
|
||||
float is_a_float16;
|
||||
double is_a_double;
|
||||
|
||||
__m128bf16 footest (__m128bf16 vector0)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
__m128bf16 vector1_1;
|
||||
__m128bf16 vector1_2 = glob_bfloat_vec;
|
||||
__m128bf16 vector1_3 = is_a_float_vec; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__m256'} }*/
|
||||
__m128bf16 vector1_4 = is_an_int_vec; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__v8si'} } */
|
||||
__m128bf16 vector1_5 = is_a_float16_vec; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__m128h'} } */
|
||||
__m128bf16 vector1_6 = is_a_float_pair; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__m128'} } */
|
||||
__m128bf16 vector1_7 = is_an_int_pair; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__v4si'} } */
|
||||
__m128bf16 vector1_8 = is_a_short_vec; /* { dg-error {incompatible types when initializing type '__m128bf16' {aka '__vector\(8\) __bf16'} using type '__v8hi'} } */
|
||||
|
||||
__v8si initi_1_1 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__v8si' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
__m256 initi_1_2 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m256' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
__m128h initi_1_3 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m128h' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
__m128 initi_1_4 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m128' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
__v4si initi_1_5 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__v4si' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
__v4hi initi_1_6 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__v4hi' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
|
||||
__m128bf16 vector2_1 = {};
|
||||
__m128bf16 vector2_2 = { glob_bfloat };
|
||||
__m128bf16 vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
|
||||
__m128bf16 vector2_4 = { 0 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m128bf16 vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
|
||||
__v8si initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m256 initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m128h initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m128 initi_2_4 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__v4si initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__v4hi initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
|
||||
/* Assignments to/from vectors. */
|
||||
|
||||
glob_bfloat_vec = glob_bfloat_vec;
|
||||
glob_bfloat_vec = 0; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type 'int'} } */
|
||||
glob_bfloat_vec = 0.1; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type 'double'} } */
|
||||
glob_bfloat_vec = is_a_float_vec; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__m256'} } */
|
||||
glob_bfloat_vec = is_an_int_vec; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__v8si'} } */
|
||||
glob_bfloat_vec = is_a_float16_vec; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__m128h'} } */
|
||||
glob_bfloat_vec = is_a_float_pair; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__m128'} } */
|
||||
glob_bfloat_vec = is_an_int_pair; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__v4si'} } */
|
||||
glob_bfloat_vec = is_a_short_vec; /* { dg-error {incompatible types when assigning to type '__m128bf16' {aka '__vector\(8\) __bf16'} from type '__v8hi'} } */
|
||||
|
||||
is_an_int_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__v8si' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
is_a_float_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m256' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
is_a_float16_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m128h' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
is_a_float_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m128' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
is_an_int_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__v4si' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
is_a_short_vec = glob_bfloat_vec;/* { dg-error {incompatible types when assigning to type '__v8hi' from type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
|
||||
/* Assignments to/from elements. */
|
||||
|
||||
vector2_3[0] = glob_bfloat;
|
||||
vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = 0; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
|
||||
glob_bfloat = vector2_3[0];
|
||||
is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
|
||||
/* Compound literals. */
|
||||
|
||||
(__m128bf16) {};
|
||||
|
||||
(__m128bf16) { 0 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
(__m128bf16) { 0.1 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
(__m128bf16) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m256'} } */
|
||||
(__m128bf16) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__v8si'} } */
|
||||
(__m128bf16) { is_a_float_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m128'} } */
|
||||
(__m128bf16) { is_an_int_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__v4si'} } */
|
||||
(__m128bf16) { is_a_float16_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m128h'} } */
|
||||
(__m128bf16) { is_a_short_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__v8hi'} } */
|
||||
|
||||
(__m128bf16) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
(__v8si) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
(__m256) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'float' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
(__v4si) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
(__m256h) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '_Float16' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
(__v8hi) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'short int' using type '__m128bf16' {aka '__vector\(8\) __bf16'}} } */
|
||||
|
||||
/* Casting. */
|
||||
|
||||
(void) glob_bfloat_vec;
|
||||
(__m128bf16) glob_bfloat_vec;
|
||||
|
||||
(__bf16) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(short) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type '__m128bf16' {aka '__vector\(8\) __bf16'} to type 'short int' which has different size} } */
|
||||
(int) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type '__m128bf16' {aka '__vector\(8\) __bf16'} to type 'int' which has different size} } */
|
||||
(_Float16) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(float) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(double) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
|
||||
(__v8si) glob_bfloat_vec; /* { dg-error {cannot convert a value of type '__m128bf16' {aka '__vector\(8\) __bf16'} to vector type '__vector\(8\) int' which has different size} } */
|
||||
(__m256) glob_bfloat_vec; /* { dg-error {cannot convert a value of type '__m128bf16' {aka '__vector\(8\) __bf16'} to vector type '__vector\(8\) float' which has different size} } */
|
||||
(__m128h) glob_bfloat_vec;
|
||||
(__v4si) glob_bfloat_vec;
|
||||
(__m128) glob_bfloat_vec;
|
||||
(__v8hi) glob_bfloat_vec;
|
||||
|
||||
(__m128bf16) is_an_int_vec; /* { dg-error {cannot convert a value of type '__v8si' to vector type '__vector\(8\) __bf16' which has different size} } */
|
||||
(__m128bf16) is_a_float_vec; /* { dg-error {cannot convert a value of type '__m256' to vector type '__vector\(8\) __bf16' which has different size} } */
|
||||
(__m128bf16) is_a_float16_vec;
|
||||
(__m128bf16) is_an_int_pair;
|
||||
(__m128bf16) is_a_float_pair;
|
||||
(__m128bf16) is_a_short_vec;
|
||||
(__m128bf16) is_a_double; /* { dg-error {cannot convert value to a vector} } */
|
||||
|
||||
/* Arrays and Structs. */
|
||||
|
||||
typedef __m128bf16 array_type[2];
|
||||
extern __m128bf16 extern_array[];
|
||||
|
||||
__m128bf16 array[2];
|
||||
__m128bf16 zero_length_array[0];
|
||||
__m128bf16 empty_init_array[] = {};
|
||||
typedef __m128bf16 some_other_type[is_an_int];
|
||||
|
||||
struct struct1 {
|
||||
__m128bf16 a;
|
||||
};
|
||||
|
||||
union union1 {
|
||||
__m128bf16 a;
|
||||
};
|
||||
|
||||
/* Addressing and dereferencing. */
|
||||
|
||||
__m128bf16 *bfloat_ptr = &vector0;
|
||||
vector0 = *bfloat_ptr;
|
||||
|
||||
/* Pointer assignment. */
|
||||
|
||||
__m128bf16 *bfloat_ptr2 = bfloat_ptr;
|
||||
__m128bf16 *bfloat_ptr3 = array;
|
||||
|
||||
/* Pointer arithmetic. */
|
||||
|
||||
++bfloat_ptr;
|
||||
--bfloat_ptr;
|
||||
bfloat_ptr++;
|
||||
bfloat_ptr--;
|
||||
bfloat_ptr += 1;
|
||||
bfloat_ptr -= 1;
|
||||
bfloat_ptr - bfloat_ptr2;
|
||||
bfloat_ptr = &bfloat_ptr3[0];
|
||||
bfloat_ptr = &bfloat_ptr3[1];
|
||||
|
||||
/* Simple comparison. */
|
||||
vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
is_a_float_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > 0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
0 == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > 0.1; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
0.1 == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
is_an_int_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
/* Pointer comparison. */
|
||||
|
||||
bfloat_ptr == &vector0;
|
||||
bfloat_ptr != &vector0;
|
||||
bfloat_ptr < &vector0;
|
||||
bfloat_ptr <= &vector0;
|
||||
bfloat_ptr > &vector0;
|
||||
bfloat_ptr >= &vector0;
|
||||
bfloat_ptr == bfloat_ptr2;
|
||||
bfloat_ptr != bfloat_ptr2;
|
||||
bfloat_ptr < bfloat_ptr2;
|
||||
bfloat_ptr <= bfloat_ptr2;
|
||||
bfloat_ptr > bfloat_ptr2;
|
||||
bfloat_ptr >= bfloat_ptr2;
|
||||
|
||||
/* Conditional expressions. */
|
||||
|
||||
0 ? vector0 : vector0;
|
||||
0 ? vector0 : is_a_float_vec; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? is_a_float_vec : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : is_a_float16_vec; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? is_a_float16_vec : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : 0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? 0 : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? 0.1 : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : 0.1; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? bfloat_ptr : bfloat_ptr2;
|
||||
0 ? bfloat_ptr : float_ptr; /* { dg-warning {pointer type mismatch in conditional expression} } */
|
||||
0 ? float_ptr : bfloat_ptr; /* { dg-warning {pointer type mismatch in conditional expression} } */
|
||||
|
||||
vector0 ? vector0 : vector0; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? is_a_float16_vec : vector0; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? vector0 : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? is_a_float16_vec : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} } */
|
||||
|
||||
/* Unary operators. */
|
||||
|
||||
+vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
-vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
~vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
!vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
*vector0; /* { dg-error {invalid type argument of unary '\*'} } */
|
||||
__real vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
__imag vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
++vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
--vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0++; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0--; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
/* Binary arithmetic operations. */
|
||||
|
||||
vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
return vector0;
|
||||
}
|
||||
|
248
gcc/testsuite/gcc.target/i386/vect-bfloat16-typecheck_2.c
Normal file
248
gcc/testsuite/gcc.target/i386/vect-bfloat16-typecheck_2.c
Normal file
|
@ -0,0 +1,248 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-mavx512fp16 -O2" } */
|
||||
|
||||
#include <immintrin.h>
|
||||
|
||||
typedef __bf16 __v16bf __attribute__ ((__vector_size__ (32)));
|
||||
typedef __bf16 __m256bf16 __attribute__ ((__vector_size__ (32), __may_alias__));
|
||||
|
||||
__bf16 glob_bfloat;
|
||||
__m256bf16 glob_bfloat_vec;
|
||||
|
||||
__m256 is_a_float_vec;
|
||||
|
||||
__m256h *float_ptr;
|
||||
__m256h is_a_float16_vec;
|
||||
|
||||
__v8si is_an_int_vec;
|
||||
__m256i is_a_long_int_pair;
|
||||
__v16hi is_a_short_vec;
|
||||
|
||||
int is_an_int;
|
||||
short is_a_short_int;
|
||||
float is_a_float;
|
||||
float is_a_float16;
|
||||
double is_a_double;
|
||||
|
||||
__m256bf16 footest (__m256bf16 vector0)
|
||||
{
|
||||
/* Initialisation */
|
||||
|
||||
__m256bf16 vector1_1;
|
||||
__m256bf16 vector1_2 = glob_bfloat_vec;
|
||||
__m256bf16 vector1_3 = is_a_float_vec; /* { dg-error {incompatible types when initializing type '__m256bf16' {aka '__vector\(16\) __bf16'} using type '__m256'} } */
|
||||
__m256bf16 vector1_4 = is_an_int_vec; /* { dg-error {incompatible types when initializing type '__m256bf16' {aka '__vector\(16\) __bf16'} using type '__v8si'} } */
|
||||
__m256bf16 vector1_5 = is_a_float16_vec; /* { dg-error {incompatible types when initializing type '__m256bf16' {aka '__vector\(16\) __bf16'} using type '__m256h'} } */
|
||||
__m256bf16 vector1_7 = is_a_long_int_pair; /* { dg-error {incompatible types when initializing type '__m256bf16' {aka '__vector\(16\) __bf16'} using type '__m256i'} } */
|
||||
__m256bf16 vector1_8 = is_a_short_vec; /* { dg-error {incompatible types when initializing type '__m256bf16' {aka '__vector\(16\) __bf16'} using type '__v16hi'} } */
|
||||
|
||||
__v8si initi_1_1 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__v8si' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
__m256 initi_1_2 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m256' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
__m256h initi_1_3 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m256h' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
__m256i initi_1_5 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__m256i' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
__v16hi initi_1_6 = glob_bfloat_vec; /* { dg-error {incompatible types when initializing type '__v16hi' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
|
||||
__m256bf16 vector2_1 = {};
|
||||
__m256bf16 vector2_2 = { glob_bfloat };
|
||||
__m256bf16 vector2_3 = { glob_bfloat, glob_bfloat, glob_bfloat, glob_bfloat };
|
||||
__m256bf16 vector2_4 = { 0 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_5 = { 0.1 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_6 = { is_a_float16 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_7 = { is_a_float }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_8 = { is_an_int }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_9 = { is_a_short_int }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
__m256bf16 vector2_10 = { 0.0, 0, is_a_short_int, is_a_float }; /* { dg-error "invalid conversion to type '__bf16'" } */
|
||||
|
||||
__v8si initi_2_1 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m256 initi_2_2 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m256h initi_2_3 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__m256i initi_2_5 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
__v16hi initi_2_6 = { glob_bfloat }; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
|
||||
/* Assignments to/from vectors. */
|
||||
|
||||
glob_bfloat_vec = glob_bfloat_vec;
|
||||
glob_bfloat_vec = 0; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type 'int'} } */
|
||||
glob_bfloat_vec = 0.1; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type 'double'} } */
|
||||
glob_bfloat_vec = is_a_float_vec; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type '__m256'} } */
|
||||
glob_bfloat_vec = is_an_int_vec; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type '__v8si'} } */
|
||||
glob_bfloat_vec = is_a_float16_vec; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type '__m256h'} } */
|
||||
glob_bfloat_vec = is_a_long_int_pair; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type '__m256i'} } */
|
||||
glob_bfloat_vec = is_a_short_vec; /* { dg-error {incompatible types when assigning to type '__m256bf16' {aka '__vector\(16\) __bf16'} from type '__v16hi'} } */
|
||||
|
||||
is_an_int_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__v8si' from type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
is_a_float_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m256' from type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
is_a_float16_vec = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m256h' from type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
is_a_long_int_pair = glob_bfloat_vec; /* { dg-error {incompatible types when assigning to type '__m256i' from type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
is_a_short_vec = glob_bfloat_vec;/* { dg-error {incompatible types when assigning to type '__v16hi' from type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
|
||||
/* Assignments to/from elements. */
|
||||
|
||||
vector2_3[0] = glob_bfloat;
|
||||
vector2_3[0] = is_an_int; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_short_int; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_float; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = is_a_float16; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = 0; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
vector2_3[0] = 0.1; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
|
||||
glob_bfloat = vector2_3[0];
|
||||
is_an_int = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_short_int = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_float = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
is_a_float16 = vector2_3[0]; /* { dg-error {invalid conversion from type '__bf16'} } */
|
||||
|
||||
/* Compound literals. */
|
||||
|
||||
(__m256bf16) {};
|
||||
|
||||
(__m256bf16) { 0 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
(__m256bf16) { 0.1 }; /* { dg-error {invalid conversion to type '__bf16'} } */
|
||||
(__m256bf16) { is_a_float_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m256'} } */
|
||||
(__m256bf16) { is_an_int_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__v8si'} } */
|
||||
(__m256bf16) { is_a_long_int_pair }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m256i'} } */
|
||||
(__m256bf16) { is_a_float16_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m256h'} } */
|
||||
(__m256bf16) { is_a_short_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__v16hi'} } */
|
||||
|
||||
(__m256bf16) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '__bf16' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
(__v8si) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'int' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
(__m256) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'float' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
(__m256i) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'long long int' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
(__m256h) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type '_Float16' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
(__v16hi) { glob_bfloat_vec }; /* { dg-error {incompatible types when initializing type 'short int' using type '__m256bf16' {aka '__vector\(16\) __bf16'}} } */
|
||||
|
||||
/* Casting. */
|
||||
|
||||
(void) glob_bfloat_vec;
|
||||
(__m256bf16) glob_bfloat_vec;
|
||||
|
||||
(__bf16) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(short) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type '__m256bf16' {aka '__vector\(16\) __bf16'} to type 'short int' which has different size} } */
|
||||
(int) glob_bfloat_vec; /* { dg-error {cannot convert a vector of type '__m256bf16' {aka '__vector\(16\) __bf16'} to type 'int' which has different size} } */
|
||||
(_Float16) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(float) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
(double) glob_bfloat_vec; /* { dg-error {aggregate value used where a floating-point was expected} } */
|
||||
|
||||
(__v8si) glob_bfloat_vec;
|
||||
(__m256) glob_bfloat_vec;
|
||||
(__m256h) glob_bfloat_vec;
|
||||
(__m256i) glob_bfloat_vec;
|
||||
(__v16hi) glob_bfloat_vec;
|
||||
|
||||
(__m256bf16) is_an_int_vec;
|
||||
(__m256bf16) is_a_float_vec;
|
||||
(__m256bf16) is_a_float16_vec;
|
||||
(__m256bf16) is_a_long_int_pair;
|
||||
(__m256bf16) is_a_short_vec;
|
||||
|
||||
/* Arrays and Structs. */
|
||||
|
||||
typedef __m256bf16 array_type[2];
|
||||
extern __m256bf16 extern_array[];
|
||||
|
||||
__m256bf16 array[2];
|
||||
__m256bf16 zero_length_array[0];
|
||||
__m256bf16 empty_init_array[] = {};
|
||||
typedef __m256bf16 some_other_type[is_an_int];
|
||||
|
||||
struct struct1 {
|
||||
__m256bf16 a;
|
||||
};
|
||||
|
||||
union union1 {
|
||||
__m256bf16 a;
|
||||
};
|
||||
|
||||
/* Addressing and dereferencing. */
|
||||
|
||||
__m256bf16 *bfloat_ptr = &vector0;
|
||||
vector0 = *bfloat_ptr;
|
||||
|
||||
/* Pointer assignment. */
|
||||
|
||||
__m256bf16 *bfloat_ptr2 = bfloat_ptr;
|
||||
__m256bf16 *bfloat_ptr3 = array;
|
||||
|
||||
/* Pointer arithmetic. */
|
||||
|
||||
++bfloat_ptr;
|
||||
--bfloat_ptr;
|
||||
bfloat_ptr++;
|
||||
bfloat_ptr--;
|
||||
bfloat_ptr += 1;
|
||||
bfloat_ptr -= 1;
|
||||
bfloat_ptr - bfloat_ptr2;
|
||||
bfloat_ptr = &bfloat_ptr3[0];
|
||||
bfloat_ptr = &bfloat_ptr3[1];
|
||||
|
||||
/* Simple comparison. */
|
||||
vector0 > glob_bfloat_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
glob_bfloat_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > is_a_float_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
is_a_float_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > 0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
0 == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > 0.1; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
0.1 == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 > is_an_int_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
is_an_int_vec == vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
/* Pointer comparison. */
|
||||
|
||||
bfloat_ptr == &vector0;
|
||||
bfloat_ptr != &vector0;
|
||||
bfloat_ptr < &vector0;
|
||||
bfloat_ptr <= &vector0;
|
||||
bfloat_ptr > &vector0;
|
||||
bfloat_ptr >= &vector0;
|
||||
bfloat_ptr == bfloat_ptr2;
|
||||
bfloat_ptr != bfloat_ptr2;
|
||||
bfloat_ptr < bfloat_ptr2;
|
||||
bfloat_ptr <= bfloat_ptr2;
|
||||
bfloat_ptr > bfloat_ptr2;
|
||||
bfloat_ptr >= bfloat_ptr2;
|
||||
|
||||
/* Conditional expressions. */
|
||||
|
||||
0 ? vector0 : vector0;
|
||||
0 ? vector0 : is_a_float_vec; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? is_a_float_vec : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : is_a_float16_vec; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? is_a_float16_vec : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : 0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? 0 : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? 0.1 : vector0; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? vector0 : 0.1; /* { dg-error {type mismatch in conditional expression} } */
|
||||
0 ? bfloat_ptr : bfloat_ptr2;
|
||||
0 ? bfloat_ptr : float_ptr; /* { dg-warning {pointer type mismatch in conditional expression} } */
|
||||
0 ? float_ptr : bfloat_ptr; /* { dg-warning {pointer type mismatch in conditional expression} } */
|
||||
|
||||
vector0 ? vector0 : vector0; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? is_a_float16_vec : vector0; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? vector0 : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} } */
|
||||
vector0 ? is_a_float16_vec : is_a_float16_vec; /* { dg-error {used vector type where scalar is required} } */
|
||||
|
||||
/* Unary operators. */
|
||||
|
||||
+vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
-vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
~vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
!vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
*vector0; /* { dg-error {invalid type argument of unary '\*'} } */
|
||||
__real vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
__imag vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
++vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
--vector0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0++; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0--; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
/* Binary arithmetic operations. */
|
||||
|
||||
vector0 = glob_bfloat_vec + *bfloat_ptr; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + 0.1; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + 0; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
vector0 = glob_bfloat_vec + is_a_float_vec; /* { dg-error {operation not permitted on type '__bf16'} } */
|
||||
|
||||
return vector0;
|
||||
}
|
||||
|
Loading…
Add table
Reference in a new issue