Message ID | c1cc5b8796434ffe9b7f8f9291af7850@SN2PR07MB029.namprd07.prod.outlook.com |
---|---|
State | New |
Headers | show |
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.
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 } } */