Skip to content

Commit df0e57c

Browse files
Christophe LyonChristophe Lyon
authored andcommitted
arm: Fix vcond_mask expander for MVE (PR target/100757)
The problem in this PR is that we call VPSEL with a mask of vector type instead of HImode. This happens because operand 3 in vcond_mask is the pre-computed vector comparison and has vector type. This patch fixes it by implementing TARGET_VECTORIZE_GET_MASK_MODE, returning the appropriate VxBI mode when targeting MVE. In turn, this implies implementing vec_cmp<mode><MVE_vpred>, vec_cmpu<mode><MVE_vpred> and vcond_mask_<mode><MVE_vpred>, and we can move vec_cmp<mode><v_cmp_result>, vec_cmpu<mode><mode> and vcond_mask_<mode><v_cmp_result> back to neon.md since they are not used by MVE anymore. The new *<MVE_vpred> patterns listed above are implemented in mve.md since they are only valid for MVE. However this may make maintenance/comparison more painful than having all of them in vec-common.md. In the process, we can get rid of the recently added vcond_mve parameter of arm_expand_vector_compare. Compared to neon.md's vcond_mask_<mode><v_cmp_result> before my "arm: Auto-vectorization for MVE: vcmp" patch (r12-834), it keeps the VDQWH iterator added in r12-835 (to have V4HF/V8HF support), as well as the (!<Is_float_mode> || flag_unsafe_math_optimizations) condition which was not present before r12-834 although SF modes were enabled by VDQW (I think this was a bug). Using TARGET_VECTORIZE_GET_MASK_MODE has the advantage that we no longer need to generate vpsel with vectors of 0 and 1: the masks are now merged via scalar 'ands' instructions operating on 16-bit masks after converting the boolean vectors. In addition, this patch fixes a problem in arm_expand_vcond() where the result would be a vector of 0 or 1 instead of operand 1 or 2. Since we want to skip gcc.dg/signbit-2.c for MVE, we also add a new arm_mve effective target. Reducing the number of iterations in pr100757-3.c from 32 to 8, we generate the code below: float a[32]; float fn1(int d) { float c = 4.0f; for (int b = 0; b < 8; b++) if (a[b] != 2.0f) c = 5.0f; return c; } fn1: ldr r3, .L3+48 vldr.64 d4, .L3 // q2=(2.0,2.0,2.0,2.0) vldr.64 d5, .L3+8 vldrw.32 q0, [r3] // q0=a(0..3) adds r3, r3, gcc-mirror#16 vcmp.f32 eq, q0, q2 // cmp a(0..3) == (2.0,2.0,2.0,2.0) vldrw.32 q1, [r3] // q1=a(4..7) vmrs r3, P0 vcmp.f32 eq, q1, q2 // cmp a(4..7) == (2.0,2.0,2.0,2.0) vmrs r2, P0 @ movhi ands r3, r3, r2 // r3=select(a(0..3]) & select(a(4..7)) vldr.64 d4, .L3+16 // q2=(5.0,5.0,5.0,5.0) vldr.64 d5, .L3+24 vmsr P0, r3 vldr.64 d6, .L3+32 // q3=(4.0,4.0,4.0,4.0) vldr.64 d7, .L3+40 vpsel q3, q3, q2 // q3=vcond_mask(4.0,5.0) vmov.32 r2, q3[1] // keep the scalar max vmov.32 r0, q3[3] vmov.32 r3, q3[2] vmov.f32 s11, s12 vmov s15, r2 vmov s14, r3 vmaxnm.f32 s15, s11, s15 vmaxnm.f32 s15, s15, s14 vmov s14, r0 vmaxnm.f32 s15, s15, s14 vmov r0, s15 bx lr .L4: .align 3 .L3: .word 1073741824 // 2.0f .word 1073741824 .word 1073741824 .word 1073741824 .word 1084227584 // 5.0f .word 1084227584 .word 1084227584 .word 1084227584 .word 1082130432 // 4.0f .word 1082130432 .word 1082130432 .word 1082130432 This patch adds tests that trigger an ICE without this fix. The pr100757*.c testcases are derived from gcc.c-torture/compile/20160205-1.c, forcing the use of MVE, and using various types and return values different from 0 and 1 to avoid commonalization with boolean masks. In addition, since we should not need these masks, the tests make sure they are not present. Most of the work of this patch series was carried out while I was working at STMicroelectronics as a Linaro assignee. 2022-02-22 Christophe Lyon <[email protected]> PR target/100757 gcc/ * config/arm/arm-protos.h (arm_get_mask_mode): New prototype. (arm_expand_vector_compare): Update prototype. * config/arm/arm.cc (TARGET_VECTORIZE_GET_MASK_MODE): New. (arm_vector_mode_supported_p): Add support for VxBI modes. (arm_expand_vector_compare): Remove useless generation of vpsel. (arm_expand_vcond): Fix select operands. (arm_get_mask_mode): New. * config/arm/mve.md (vec_cmp<mode><MVE_vpred>): New. (vec_cmpu<mode><MVE_vpred>): New. (vcond_mask_<mode><MVE_vpred>): New. * config/arm/vec-common.md (vec_cmp<mode><v_cmp_result>) (vec_cmpu<mode><mode, vcond_mask_<mode><v_cmp_result>): Move to ... * config/arm/neon.md (vec_cmp<mode><v_cmp_result>) (vec_cmpu<mode><mode, vcond_mask_<mode><v_cmp_result>): ... here and disable for MVE. * doc/sourcebuild.texi (arm_mve): Document new effective-target. gcc/testsuite/ PR target/100757 * gcc.target/arm/simd/pr100757-2.c: New. * gcc.target/arm/simd/pr100757-3.c: New. * gcc.target/arm/simd/pr100757-4.c: New. * gcc.target/arm/simd/pr100757.c: New. * gcc.dg/signbit-2.c: Skip when targeting ARM/MVE. * lib/target-supports.exp (check_effective_target_arm_mve): New.
1 parent 91224cf commit df0e57c

File tree

12 files changed

+227
-130
lines changed

12 files changed

+227
-130
lines changed

gcc/config/arm/arm-protos.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,7 @@ extern void arm_init_cumulative_args (CUMULATIVE_ARGS *, tree, rtx, tree);
204204
extern bool arm_pad_reg_upward (machine_mode, tree, int);
205205
#endif
206206
extern int arm_apply_result_size (void);
207+
extern opt_machine_mode arm_get_mask_mode (machine_mode mode);
207208

208209
#endif /* RTX_CODE */
209210

@@ -380,7 +381,7 @@ extern void arm_emit_coreregs_64bit_shift (enum rtx_code, rtx, rtx, rtx, rtx,
380381
extern bool arm_fusion_enabled_p (tune_params::fuse_ops);
381382
extern bool arm_valid_symbolic_address_p (rtx);
382383
extern bool arm_validize_comparison (rtx *, rtx *, rtx *);
383-
extern bool arm_expand_vector_compare (rtx, rtx_code, rtx, rtx, bool, bool);
384+
extern bool arm_expand_vector_compare (rtx, rtx_code, rtx, rtx, bool);
384385
#endif /* RTX_CODE */
385386

386387
extern bool arm_gen_setmem (rtx *);

gcc/config/arm/arm.cc

Lines changed: 40 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -832,6 +832,9 @@ static const struct attribute_spec arm_attribute_table[] =
832832

833833
#undef TARGET_STACK_PROTECT_GUARD
834834
#define TARGET_STACK_PROTECT_GUARD arm_stack_protect_guard
835+
836+
#undef TARGET_VECTORIZE_GET_MASK_MODE
837+
#define TARGET_VECTORIZE_GET_MASK_MODE arm_get_mask_mode
835838

836839
/* Obstack for minipool constant handling. */
837840
static struct obstack minipool_obstack;
@@ -29286,7 +29289,8 @@ arm_vector_mode_supported_p (machine_mode mode)
2928629289

2928729290
if (TARGET_HAVE_MVE
2928829291
&& (mode == V2DImode || mode == V4SImode || mode == V8HImode
29289-
|| mode == V16QImode))
29292+
|| mode == V16QImode
29293+
|| mode == V16BImode || mode == V8BImode || mode == V4BImode))
2929029294
return true;
2929129295

2929229296
if (TARGET_HAVE_MVE_FLOAT
@@ -31085,7 +31089,7 @@ arm_split_atomic_op (enum rtx_code code, rtx old_out, rtx new_out, rtx mem,
3108531089
}
3108631090

3108731091
/* Return the mode for the MVE vector of predicates corresponding to MODE. */
31088-
machine_mode
31092+
opt_machine_mode
3108931093
arm_mode_to_pred_mode (machine_mode mode)
3109031094
{
3109131095
switch (GET_MODE_NUNITS (mode))
@@ -31094,24 +31098,20 @@ arm_mode_to_pred_mode (machine_mode mode)
3109431098
case 8: return V8BImode;
3109531099
case 4: return V4BImode;
3109631100
}
31097-
gcc_unreachable ();
31101+
return opt_machine_mode ();
3109831102
}
3109931103

3110031104
/* Expand code to compare vectors OP0 and OP1 using condition CODE.
3110131105
If CAN_INVERT, store either the result or its inverse in TARGET
3110231106
and return true if TARGET contains the inverse. If !CAN_INVERT,
3110331107
always store the result in TARGET, never its inverse.
3110431108

31105-
If VCOND_MVE, do not emit the vpsel instruction here, let arm_expand_vcond do
31106-
it with the right destination type to avoid emiting two vpsel, one here and
31107-
one in arm_expand_vcond.
31108-
3110931109
Note that the handling of floating-point comparisons is not
3111031110
IEEE compliant. */
3111131111

3111231112
bool
3111331113
arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
31114-
bool can_invert, bool vcond_mve)
31114+
bool can_invert)
3111531115
{
3111631116
machine_mode cmp_result_mode = GET_MODE (target);
3111731117
machine_mode cmp_mode = GET_MODE (op0);
@@ -31140,7 +31140,7 @@ arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
3114031140
and then store its inverse in TARGET. This avoids reusing
3114131141
TARGET (which for integer NE could be one of the inputs). */
3114231142
rtx tmp = gen_reg_rtx (cmp_result_mode);
31143-
if (arm_expand_vector_compare (tmp, code, op0, op1, true, vcond_mve))
31143+
if (arm_expand_vector_compare (tmp, code, op0, op1, true))
3114431144
gcc_unreachable ();
3114531145
emit_insn (gen_rtx_SET (target, gen_rtx_NOT (cmp_result_mode, tmp)));
3114631146
return false;
@@ -31176,36 +31176,22 @@ arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
3117631176
case NE:
3117731177
if (TARGET_HAVE_MVE)
3117831178
{
31179-
rtx vpr_p0;
31180-
if (vcond_mve)
31181-
vpr_p0 = target;
31182-
else
31183-
vpr_p0 = gen_reg_rtx (arm_mode_to_pred_mode (cmp_mode));
31184-
3118531179
switch (GET_MODE_CLASS (cmp_mode))
3118631180
{
3118731181
case MODE_VECTOR_INT:
31188-
emit_insn (gen_mve_vcmpq (code, cmp_mode, vpr_p0, op0, force_reg (cmp_mode, op1)));
31182+
emit_insn (gen_mve_vcmpq (code, cmp_mode, target,
31183+
op0, force_reg (cmp_mode, op1)));
3118931184
break;
3119031185
case MODE_VECTOR_FLOAT:
3119131186
if (TARGET_HAVE_MVE_FLOAT)
31192-
emit_insn (gen_mve_vcmpq_f (code, cmp_mode, vpr_p0, op0, force_reg (cmp_mode, op1)));
31187+
emit_insn (gen_mve_vcmpq_f (code, cmp_mode, target,
31188+
op0, force_reg (cmp_mode, op1)));
3119331189
else
3119431190
gcc_unreachable ();
3119531191
break;
3119631192
default:
3119731193
gcc_unreachable ();
3119831194
}
31199-
31200-
/* If we are not expanding a vcond, build the result here. */
31201-
if (!vcond_mve)
31202-
{
31203-
rtx zero = gen_reg_rtx (cmp_result_mode);
31204-
rtx one = gen_reg_rtx (cmp_result_mode);
31205-
emit_move_insn (zero, CONST0_RTX (cmp_result_mode));
31206-
emit_move_insn (one, CONST1_RTX (cmp_result_mode));
31207-
emit_insn (gen_mve_vpselq (VPSELQ_S, cmp_result_mode, target, one, zero, vpr_p0));
31208-
}
3120931195
}
3121031196
else
3121131197
emit_insn (gen_neon_vc (code, cmp_mode, target, op0, op1));
@@ -31217,23 +31203,8 @@ arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
3121731203
case GEU:
3121831204
case GTU:
3121931205
if (TARGET_HAVE_MVE)
31220-
{
31221-
rtx vpr_p0;
31222-
if (vcond_mve)
31223-
vpr_p0 = target;
31224-
else
31225-
vpr_p0 = gen_reg_rtx (arm_mode_to_pred_mode (cmp_mode));
31226-
31227-
emit_insn (gen_mve_vcmpq (code, cmp_mode, vpr_p0, op0, force_reg (cmp_mode, op1)));
31228-
if (!vcond_mve)
31229-
{
31230-
rtx zero = gen_reg_rtx (cmp_result_mode);
31231-
rtx one = gen_reg_rtx (cmp_result_mode);
31232-
emit_move_insn (zero, CONST0_RTX (cmp_result_mode));
31233-
emit_move_insn (one, CONST1_RTX (cmp_result_mode));
31234-
emit_insn (gen_mve_vpselq (VPSELQ_S, cmp_result_mode, target, one, zero, vpr_p0));
31235-
}
31236-
}
31206+
emit_insn (gen_mve_vcmpq (code, cmp_mode, target,
31207+
op0, force_reg (cmp_mode, op1)));
3123731208
else
3123831209
emit_insn (gen_neon_vc (code, cmp_mode, target,
3123931210
op0, force_reg (cmp_mode, op1)));
@@ -31244,23 +31215,8 @@ arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
3124431215
case LEU:
3124531216
case LTU:
3124631217
if (TARGET_HAVE_MVE)
31247-
{
31248-
rtx vpr_p0;
31249-
if (vcond_mve)
31250-
vpr_p0 = target;
31251-
else
31252-
vpr_p0 = gen_reg_rtx (arm_mode_to_pred_mode (cmp_mode));
31253-
31254-
emit_insn (gen_mve_vcmpq (swap_condition (code), cmp_mode, vpr_p0, force_reg (cmp_mode, op1), op0));
31255-
if (!vcond_mve)
31256-
{
31257-
rtx zero = gen_reg_rtx (cmp_result_mode);
31258-
rtx one = gen_reg_rtx (cmp_result_mode);
31259-
emit_move_insn (zero, CONST0_RTX (cmp_result_mode));
31260-
emit_move_insn (one, CONST1_RTX (cmp_result_mode));
31261-
emit_insn (gen_mve_vpselq (VPSELQ_S, cmp_result_mode, target, one, zero, vpr_p0));
31262-
}
31263-
}
31218+
emit_insn (gen_mve_vcmpq (swap_condition (code), cmp_mode, target,
31219+
force_reg (cmp_mode, op1), op0));
3126431220
else
3126531221
emit_insn (gen_neon_vc (swap_condition (code), cmp_mode,
3126631222
target, force_reg (cmp_mode, op1), op0));
@@ -31275,8 +31231,8 @@ arm_expand_vector_compare (rtx target, rtx_code code, rtx op0, rtx op1,
3127531231
rtx gt_res = gen_reg_rtx (cmp_result_mode);
3127631232
rtx alt_res = gen_reg_rtx (cmp_result_mode);
3127731233
rtx_code alt_code = (code == LTGT ? LT : LE);
31278-
if (arm_expand_vector_compare (gt_res, GT, op0, op1, true, vcond_mve)
31279-
|| arm_expand_vector_compare (alt_res, alt_code, op0, op1, true, vcond_mve))
31234+
if (arm_expand_vector_compare (gt_res, GT, op0, op1, true)
31235+
|| arm_expand_vector_compare (alt_res, alt_code, op0, op1, true))
3128031236
gcc_unreachable ();
3128131237
emit_insn (gen_rtx_SET (target, gen_rtx_IOR (cmp_result_mode,
3128231238
gt_res, alt_res)));
@@ -31296,40 +31252,36 @@ arm_expand_vcond (rtx *operands, machine_mode cmp_result_mode)
3129631252
{
3129731253
/* When expanding for MVE, we do not want to emit a (useless) vpsel in
3129831254
arm_expand_vector_compare, and another one here. */
31299-
bool vcond_mve=false;
3130031255
rtx mask;
3130131256

3130231257
if (TARGET_HAVE_MVE)
31303-
{
31304-
vcond_mve=true;
31305-
mask = gen_reg_rtx (arm_mode_to_pred_mode (cmp_result_mode));
31306-
}
31258+
mask = gen_reg_rtx (arm_mode_to_pred_mode (cmp_result_mode).require ());
3130731259
else
3130831260
mask = gen_reg_rtx (cmp_result_mode);
3130931261

3131031262
bool inverted = arm_expand_vector_compare (mask, GET_CODE (operands[3]),
31311-
operands[4], operands[5], true, vcond_mve);
31263+
operands[4], operands[5], true);
3131231264
if (inverted)
3131331265
std::swap (operands[1], operands[2]);
3131431266
if (TARGET_NEON)
3131531267
emit_insn (gen_neon_vbsl (GET_MODE (operands[0]), operands[0],
3131631268
mask, operands[1], operands[2]));
3131731269
else
3131831270
{
31319-
machine_mode cmp_mode = GET_MODE (operands[4]);
31320-
rtx vpr_p0 = mask;
31321-
rtx zero = gen_reg_rtx (cmp_mode);
31322-
rtx one = gen_reg_rtx (cmp_mode);
31323-
emit_move_insn (zero, CONST0_RTX (cmp_mode));
31324-
emit_move_insn (one, CONST1_RTX (cmp_mode));
31271+
machine_mode cmp_mode = GET_MODE (operands[0]);
31272+
3132531273
switch (GET_MODE_CLASS (cmp_mode))
3132631274
{
3132731275
case MODE_VECTOR_INT:
31328-
emit_insn (gen_mve_vpselq (VPSELQ_S, cmp_result_mode, operands[0], one, zero, vpr_p0));
31276+
emit_insn (gen_mve_vpselq (VPSELQ_S, cmp_mode, operands[0],
31277+
operands[1], operands[2], mask));
3132931278
break;
3133031279
case MODE_VECTOR_FLOAT:
3133131280
if (TARGET_HAVE_MVE_FLOAT)
31332-
emit_insn (gen_mve_vpselq_f (cmp_mode, operands[0], one, zero, vpr_p0));
31281+
emit_insn (gen_mve_vpselq_f (cmp_mode, operands[0],
31282+
operands[1], operands[2], mask));
31283+
else
31284+
gcc_unreachable ();
3133331285
break;
3133431286
default:
3133531287
gcc_unreachable ();
@@ -34251,4 +34203,15 @@ arm_mode_base_reg_class (machine_mode mode)
3425134203

3425234204
struct gcc_target targetm = TARGET_INITIALIZER;
3425334205

34206+
/* Implement TARGET_VECTORIZE_GET_MASK_MODE. */
34207+
34208+
opt_machine_mode
34209+
arm_get_mask_mode (machine_mode mode)
34210+
{
34211+
if (TARGET_HAVE_MVE)
34212+
return arm_mode_to_pred_mode (mode);
34213+
34214+
return default_get_mask_mode (mode);
34215+
}
34216+
3425434217
#include "gt-arm.h"

gcc/config/arm/mve.md

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10527,3 +10527,54 @@
1052710527
operands[1] = force_reg (<MODE>mode, operands[1]);
1052810528
}
1052910529
)
10530+
10531+
;; Expanders for vec_cmp and vcond
10532+
10533+
(define_expand "vec_cmp<mode><MVE_vpred>"
10534+
[(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
10535+
(match_operator:<MVE_VPRED> 1 "comparison_operator"
10536+
[(match_operand:MVE_VLD_ST 2 "s_register_operand")
10537+
(match_operand:MVE_VLD_ST 3 "reg_or_zero_operand")]))]
10538+
"TARGET_HAVE_MVE
10539+
&& (!<Is_float_mode> || flag_unsafe_math_optimizations)"
10540+
{
10541+
arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
10542+
operands[2], operands[3], false);
10543+
DONE;
10544+
})
10545+
10546+
(define_expand "vec_cmpu<mode><MVE_vpred>"
10547+
[(set (match_operand:<MVE_VPRED> 0 "s_register_operand")
10548+
(match_operator:<MVE_VPRED> 1 "comparison_operator"
10549+
[(match_operand:MVE_2 2 "s_register_operand")
10550+
(match_operand:MVE_2 3 "reg_or_zero_operand")]))]
10551+
"TARGET_HAVE_MVE"
10552+
{
10553+
arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
10554+
operands[2], operands[3], false);
10555+
DONE;
10556+
})
10557+
10558+
(define_expand "vcond_mask_<mode><MVE_vpred>"
10559+
[(set (match_operand:MVE_VLD_ST 0 "s_register_operand")
10560+
(if_then_else:MVE_VLD_ST
10561+
(match_operand:<MVE_VPRED> 3 "s_register_operand")
10562+
(match_operand:MVE_VLD_ST 1 "s_register_operand")
10563+
(match_operand:MVE_VLD_ST 2 "s_register_operand")))]
10564+
"TARGET_HAVE_MVE"
10565+
{
10566+
switch (GET_MODE_CLASS (<MODE>mode))
10567+
{
10568+
case MODE_VECTOR_INT:
10569+
emit_insn (gen_mve_vpselq (VPSELQ_S, <MODE>mode, operands[0],
10570+
operands[1], operands[2], operands[3]));
10571+
break;
10572+
case MODE_VECTOR_FLOAT:
10573+
emit_insn (gen_mve_vpselq_f (<MODE>mode, operands[0],
10574+
operands[1], operands[2], operands[3]));
10575+
break;
10576+
default:
10577+
gcc_unreachable ();
10578+
}
10579+
DONE;
10580+
})

gcc/config/arm/neon.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1394,6 +1394,45 @@
13941394
[(set_attr "type" "neon_qsub<q>")]
13951395
)
13961396

1397+
(define_expand "vec_cmp<mode><v_cmp_result>"
1398+
[(set (match_operand:<V_cmp_result> 0 "s_register_operand")
1399+
(match_operator:<V_cmp_result> 1 "comparison_operator"
1400+
[(match_operand:VDQWH 2 "s_register_operand")
1401+
(match_operand:VDQWH 3 "reg_or_zero_operand")]))]
1402+
"TARGET_NEON
1403+
&& (!<Is_float_mode> || flag_unsafe_math_optimizations)"
1404+
{
1405+
arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
1406+
operands[2], operands[3], false);
1407+
DONE;
1408+
})
1409+
1410+
(define_expand "vec_cmpu<mode><mode>"
1411+
[(set (match_operand:VDQIW 0 "s_register_operand")
1412+
(match_operator:VDQIW 1 "comparison_operator"
1413+
[(match_operand:VDQIW 2 "s_register_operand")
1414+
(match_operand:VDQIW 3 "reg_or_zero_operand")]))]
1415+
"TARGET_NEON"
1416+
{
1417+
arm_expand_vector_compare (operands[0], GET_CODE (operands[1]),
1418+
operands[2], operands[3], false);
1419+
DONE;
1420+
})
1421+
1422+
(define_expand "vcond_mask_<mode><v_cmp_result>"
1423+
[(set (match_operand:VDQWH 0 "s_register_operand")
1424+
(if_then_else:VDQWH
1425+
(match_operand:<V_cmp_result> 3 "s_register_operand")
1426+
(match_operand:VDQWH 1 "s_register_operand")
1427+
(match_operand:VDQWH 2 "s_register_operand")))]
1428+
"TARGET_NEON
1429+
&& (!<Is_float_mode> || flag_unsafe_math_optimizations)"
1430+
{
1431+
emit_insn (gen_neon_vbsl<mode> (operands[0], operands[3], operands[1],
1432+
operands[2]));
1433+
DONE;
1434+
})
1435+
13971436
;; Patterns for builtins.
13981437

13991438
; good for plain vadd, vaddq.

0 commit comments

Comments
 (0)