;; EOR v0.8B, v0.8B, v3.8B
;;
-(define_expand "xorsign<mode>3"
+(define_expand "@xorsign<mode>3"
[(match_operand:GPF 0 "register_operand")
(match_operand:GPF 1 "register_operand")
(match_operand:GPF 2 "register_operand")]
"TARGET_SIMD"
{
-
- machine_mode imode = <V_INT_EQUIV>mode;
- rtx mask = gen_reg_rtx (imode);
- rtx op1x = gen_reg_rtx (imode);
- rtx op2x = gen_reg_rtx (imode);
-
- int bits = GET_MODE_BITSIZE (<MODE>mode) - 1;
- emit_move_insn (mask, GEN_INT (trunc_int_for_mode (HOST_WIDE_INT_M1U << bits,
- imode)));
-
- emit_insn (gen_and<v_int_equiv>3 (op2x, mask,
- lowpart_subreg (imode, operands[2],
- <MODE>mode)));
- emit_insn (gen_xor<v_int_equiv>3 (op1x,
- lowpart_subreg (imode, operands[1],
- <MODE>mode),
- op2x));
+ rtx tmp = gen_reg_rtx (<VCONQ>mode);
+ rtx op1 = lowpart_subreg (<VCONQ>mode, operands[1], <MODE>mode);
+ rtx op2 = lowpart_subreg (<VCONQ>mode, operands[2], <MODE>mode);
+ emit_insn (gen_xorsign3 (<VCONQ>mode, tmp, op1, op2));
emit_move_insn (operands[0],
- lowpart_subreg (<MODE>mode, op1x, imode));
+ lowpart_subreg (<MODE>mode, tmp, <VCONQ>mode));
DONE;
}
)
(V4HF "V8HF") (V8HF "V8HF")
(V2SF "V4SF") (V4SF "V4SF")
(V2DF "V2DF") (SI "V4SI")
- (HI "V8HI") (QI "V16QI")])
+ (HI "V8HI") (QI "V16QI")
+ (SF "V4SF") (DF "V2DF")])
;; Half modes of all vector modes.
(define_mode_attr VHALF [(V8QI "V4QI") (V16QI "V8QI")
return __builtin_copysignl (-1.0, y) * x;
}
-/* { dg-final { scan-assembler "\[ \t\]?eor\[ \t\]?" } } */
-/* { dg-final { scan-assembler "\[ \t\]?and\[ \t\]?" } } */
+/* { dg-final { scan-assembler-times {eor\tv[0-9]+\.16b, v[0-9]+\.16b, v[0-9]+\.16b} 8 } } */
+/* { dg-final { scan-assembler-times {and\tv[0-9]+\.16b, v[0-9]+\.16b, v[0-9]+\.16b} 8 } } */
/* { dg-final { scan-assembler-not "copysign" } } */
+/* { dg-final { scan-assembler-not "fmov" } } */
/* { dg-final { scan-assembler-not "\[ \t\]?orr\[ \t\]?" } } */
/* { dg-final { scan-assembler-not "\[ \t\]?fmul\[ \t\]?" } } */