| /* { dg-do run } */ |
| /* { dg-options "-O2 --save-temps -fno-inline" } */ |
| |
| extern void abort (void); |
| typedef long long s64; |
| |
| int |
| subs_ext (s64 a, int b, int c) |
| { |
| s64 d = a - b; |
| |
| if (d == 0) |
| return a + c; |
| else |
| return d; |
| } |
| |
| int |
| subs_shift_ext (s64 a, int b, int c) |
| { |
| s64 d = (a - ((s64)b << 3)); |
| |
| if (d == 0) |
| return a + c; |
| else |
| return d; |
| } |
| |
| int main () |
| { |
| int x; |
| s64 y; |
| |
| x = subs_ext (0x13000002ll, 41, 15); |
| if (x != (int)(0x13000002ll - 41)) |
| abort (); |
| |
| x = subs_ext (0x50505050ll, 0x50505050ll, 4); |
| if (x != (int)(0x50505050ll + 4)) |
| abort (); |
| |
| x = subs_ext (0x12121212121ll, 2, 14); |
| if (x != (int)(0x12121212121ll - 2)) |
| abort (); |
| |
| x = subs_shift_ext (0x123456789ll, 4, 12); |
| if (x != (int)(0x123456789ll - (4 << 3))) |
| abort (); |
| |
| x = subs_shift_ext (0x02020202ll << 3, 0x02020202ll, 8); |
| if (x != (int)(8 + (0x02020202ll << 3))) |
| abort (); |
| |
| x = subs_shift_ext (0x987987987987ll, 23, 41); |
| if (x != (int)(0x987987987987ll - (23 << 3))) |
| abort (); |
| |
| return 0; |
| } |
| |
| /* { dg-final { scan-assembler-times "subs\tx\[0-9\]+, x\[0-9\]+, w\[0-9\]+, sxtw" 2 } } */ |