/* { dg-do run } */ /* { dg-options "-O2 --save-temps" } */ extern void abort (void); int z; int negs_si_test1 (int a, int b, int c) { int d = -b; /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+" } } */ if (d < 0) return a + c; z = d; return b + c + d; } int negs_si_test3 (int a, int b, int c) { int d = -(b) << 3; /* { dg-final { scan-assembler "negs\tw\[0-9\]+, w\[0-9\]+, lsl 3" } } */ if (d == 0) return a + c; z = d; return b + c + d; } typedef long long s64; s64 zz; s64 negs_di_test1 (s64 a, s64 b, s64 c) { s64 d = -b; /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+" } } */ if (d < 0) return a + c; zz = d; return b + c + d; } s64 negs_di_test3 (s64 a, s64 b, s64 c) { s64 d = -(b) << 3; /* { dg-final { scan-assembler "negs\tx\[0-9\]+, x\[0-9\]+, lsl 3" } } */ if (d == 0) return a + c; zz = d; return b + c + d; } int main () { int x; s64 y; x = negs_si_test1 (2, 12, 5); if (x != 7) abort (); x = negs_si_test1 (1, 2, 32); if (x != 33) abort (); x = negs_si_test3 (13, 14, 5); if (x != -93) abort (); x = negs_si_test3 (15, 21, 2); if (x != -145) abort (); y = negs_di_test1 (0x20202020ll, 0x65161611ll, 0x42434243ll); if (y != 0x62636263ll) abort (); y = negs_di_test1 (0x1010101010101ll, 0x123456789abcdll, 0x5555555555555ll); if (y != 0x6565656565656ll) abort (); y = negs_di_test3 (0x62523781ll, 0x64234978ll, 0x12345123ll); if (y != 0xfffffffd553d4edbll) abort (); y = negs_di_test3 (0x763526268ll, 0x101010101ll, 0x222222222ll); if (y != 0xfffffffb1b1b1b1bll) abort (); return 0; }