This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH, AArch64] Negate with Compare instruction
- From: "Hurugalawadi, Naveen" <Naveen dot Hurugalawadi at caviumnetworks dot com>
- To: "gcc-patches at gcc dot gnu dot org" <gcc-patches at gcc dot gnu dot org>
- Date: Fri, 19 Apr 2013 11:41:50 +0000
- Subject: [PATCH, AArch64] Negate with Compare instruction
Hi,
Please find attached the patch that implements Negate with Carry
instruction for aarch64 target.
Please review the same and let me know if there should be any
modifications in the patch.
Build and tested on aarch64-thunder-elf (using Cavium's internal
simulator). No new regressions.
Thanks,
Naveen
gcc/
2013-04-19 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
* config/aarch64/aarch64.md (*ngc<mode>): New pattern.
(*ngcsi_uxtw): New pattern.
gcc/testsuite/
2013-04-19 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
* gcc.target/aarch64/ngc.c: New.
diff -uprN NCDtools/thunder/gits/gcc/gcc-orig/config/aarch64/aarch64.md NCDtools/thunder/gits/gcc/gcc/config/aarch64/aarch64.md
--- NCDtools/thunder/gits/gcc/gcc-orig/config/aarch64/aarch64.md 2013-04-17 16:17:44.629473441 +0530
+++ NCDtools/thunder/gits/gcc/gcc/config/aarch64/aarch64.md 2013-04-19 16:54:06.485549302 +0530
@@ -1876,6 +1876,27 @@
(set_attr "mode" "SI")]
)
+(define_insn "*ngc<mode>"
+ [(set (match_operand:GPI 0 "register_operand" "=r")
+ (minus:GPI (neg:GPI (ltu:GPI (reg:CC CC_REGNUM) (const_int 0)))
+ (match_operand:GPI 1 "register_operand" "r")))]
+ ""
+ "ngc\\t%<w>0, %<w>1"
+ [(set_attr "v8type" "adc")
+ (set_attr "mode" "<MODE>")]
+)
+
+(define_insn "*ngcsi_uxtw"
+ [(set (match_operand:DI 0 "register_operand" "=r")
+ (zero_extend:DI
+ (minus:SI (neg:SI (ltu:SI (reg:CC CC_REGNUM) (const_int 0)))
+ (match_operand:SI 1 "register_operand" "r"))))]
+ ""
+ "ngc\\t%w0, %w1"
+ [(set_attr "v8type" "adc")
+ (set_attr "mode" "SI")]
+)
+
(define_insn "*neg<mode>2_compare0"
[(set (reg:CC_NZ CC_REGNUM)
(compare:CC_NZ (neg:GPI (match_operand:GPI 1 "register_operand" "r"))
diff -uprN NCDtools/thunder/gits/gcc/gcc-orig/testsuite/gcc.target/aarch64/ngc.c NCDtools/thunder/gits/gcc/gcc/testsuite/gcc.target/aarch64/ngc.c
--- NCDtools/thunder/gits/gcc/gcc-orig/testsuite/gcc.target/aarch64/ngc.c 1970-01-01 05:30:00.000000000 +0530
+++ NCDtools/thunder/gits/gcc/gcc/testsuite/gcc.target/aarch64/ngc.c 2013-04-19 16:48:44.457544465 +0530
@@ -0,0 +1,67 @@
+/* { dg-do run } */
+/* { dg-options "-O2 --save-temps -fno-inline" } */
+
+extern void abort (void);
+typedef unsigned int u32;
+
+u32
+ngc_si (u32 a, u32 b, u32 c, u32 d)
+{
+ /* { dg-final { scan-assembler "ngc\tw\[0-9\]+, w\[0-9\]+\n" } } */
+ a = -b - (c < d);
+ return a;
+}
+
+typedef unsigned long long u64;
+
+u64
+ngc_si_tst (u64 a, u32 b, u32 c, u32 d)
+{
+ /* { dg-final { scan-assembler "ngc\tw\[0-9\]+, w\[0-9\]+\n" } } */
+ a = -b - (c < d);
+ return a;
+}
+
+u64
+ngc_di (u64 a, u64 b, u64 c, u64 d)
+{
+ /* { dg-final { scan-assembler "ngc\tx\[0-9\]+, x\[0-9\]+\n" } } */
+ a = -b - (c < d);
+ return a;
+}
+
+int
+main ()
+{
+ int x;
+ u64 y;
+
+ x = ngc_si (29, 4, 5, 4);
+ if (x != -4)
+ abort ();
+
+ x = ngc_si (1024, 2, 20, 13);
+ if (x != -2)
+ abort ();
+
+ y = ngc_si_tst (0x130000029ll, 32, 50, 12);
+ if (y != 0xffffffe0)
+ abort ();
+
+ y = ngc_si_tst (0x5000500050005ll, 21, 2, 14);
+ if (y != 0xffffffea)
+ abort ();
+
+ y = ngc_di (0x130000029ll, 0x320000004ll, 0x505050505ll, 0x123123123ll);
+ if (y != 0xfffffffcdffffffc)
+ abort ();
+
+ y = ngc_di (0x5000500050005ll,
+ 0x2111211121112ll, 0x0000000002020ll, 0x1414575046477ll);
+ if (y != 0xfffdeeedeeedeeed)
+ abort ();
+
+ return 0;
+}
+
+/* { dg-final { cleanup-saved-temps } } */