From: Tamar Christina Date: Mon, 2 Oct 2023 10:51:10 +0000 (+0100) Subject: AArch64: Fix scalar xorsign lowering X-Git-Tag: basepoints/gcc-15~5776 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=f2b23a59cbe46a7839811cbeb962c2081b329b73;p=thirdparty%2Fgcc.git AArch64: Fix scalar xorsign lowering In GCC-9 our scalar xorsign pattern broke and we didn't notice it because the testcase was not strong enough. With this commit 8d2d39587d941a40f25ea0144cceb677df115040 is the first bad commit commit 8d2d39587d941a40f25ea0144cceb677df115040 Author: Segher Boessenkool Date: Mon Oct 22 22:23:39 2018 +0200 combine: Do not combine moves from hard registers combine started introducing useless moves on hard registers, when one of the arguments to our scalar xorsign is a hardreg we get an additional move inserted. This leads to combine forming an AND with the immediate inside and using the superflous move to do the r->w move, instead of what we wanted before which was for the `and` to be a vector and and have reload pick the right alternative. To fix this the patch just forces the use of the vector version directly and so combine has no chance to mess it up. gcc/ChangeLog: * config/aarch64/aarch64-simd.md (xorsign3): Renamed to.. (@xorsign3): ...This. * config/aarch64/aarch64.md (xorsign3): Renamed to... (@xorsign3): ..This and emit vectors directly * config/aarch64/iterators.md (VCONQ): Add SF and DF. gcc/testsuite/ChangeLog: * gcc.target/aarch64/xorsign.c: --- diff --git a/gcc/config/aarch64/aarch64-simd.md b/gcc/config/aarch64/aarch64-simd.md index f67eb70577d0..e955691f1be8 100644 --- a/gcc/config/aarch64/aarch64-simd.md +++ b/gcc/config/aarch64/aarch64-simd.md @@ -500,7 +500,7 @@ } ) -(define_expand "xorsign3" +(define_expand "@xorsign3" [(match_operand:VHSDF 0 "register_operand") (match_operand:VHSDF 1 "register_operand") (match_operand:VHSDF 2 "register_operand")] diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 6d0f072a9dd6..f76c63b6355e 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -6978,31 +6978,18 @@ ;; EOR v0.8B, v0.8B, v3.8B ;; -(define_expand "xorsign3" +(define_expand "@xorsign3" [(match_operand:GPF 0 "register_operand") (match_operand:GPF 1 "register_operand") (match_operand:GPF 2 "register_operand")] "TARGET_SIMD" { - - machine_mode imode = 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) - 1; - emit_move_insn (mask, GEN_INT (trunc_int_for_mode (HOST_WIDE_INT_M1U << bits, - imode))); - - emit_insn (gen_and3 (op2x, mask, - lowpart_subreg (imode, operands[2], - mode))); - emit_insn (gen_xor3 (op1x, - lowpart_subreg (imode, operands[1], - mode), - op2x)); + rtx tmp = gen_reg_rtx (mode); + rtx op1 = lowpart_subreg (mode, operands[1], mode); + rtx op2 = lowpart_subreg (mode, operands[2], mode); + emit_insn (gen_xorsign3 (mode, tmp, op1, op2)); emit_move_insn (operands[0], - lowpart_subreg (mode, op1x, imode)); + lowpart_subreg (mode, tmp, mode)); DONE; } ) diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 9398d7130444..2451d8c2cd8e 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -1428,7 +1428,8 @@ (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") diff --git a/gcc/testsuite/gcc.target/aarch64/xorsign.c b/gcc/testsuite/gcc.target/aarch64/xorsign.c index 22c5829449d9..dfb7ba7f1405 100644 --- a/gcc/testsuite/gcc.target/aarch64/xorsign.c +++ b/gcc/testsuite/gcc.target/aarch64/xorsign.c @@ -79,8 +79,9 @@ check_l_neg_rev (long double x, long double y) 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\]?" } } */