Patchwork [AArch64] Negate with Compare instruction

login
register
mail settings
Submitter Hurugalawadi, Naveen
Date April 19, 2013, 11:41 a.m.
Message ID <c1cc5b8796434ffe9b7f8f9291af7850@SN2PR07MB029.namprd07.prod.outlook.com>
Download mbox | patch
Permalink /patch/237923/
State New
Headers show

Comments

Hurugalawadi, Naveen - April 19, 2013, 11:41 a.m.
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.
Richard Earnshaw - April 19, 2013, 2:06 p.m.
On 19/04/13 12:41, Hurugalawadi, Naveen wrote:
> 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/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" } } */

This and the preceding scan are the same pattern.  So if either passes 
you'll fail to detect a failure in the other.

R.

Patch

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 } } */