| /* Tests to check the utilization of the addc and subc instructions. |
| If everything works as expected we won't see any movt instructions in |
| these cases. */ |
| /* { dg-do compile } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-final { scan-assembler-times "addc" 4 } } */ |
| /* { dg-final { scan-assembler-times "subc" 5 } } */ |
| /* { dg-final { scan-assembler-times "movt" 1 } } */ |
| /* { dg-final { scan-assembler-times "sub\t" 1 } } */ |
| /* { dg-final { scan-assembler-times "neg\t" 2 } } */ |
| |
| int |
| test_000 (int* x, unsigned int c) |
| { |
| /* 1x addc */ |
| int s = 0; |
| unsigned int i; |
| for (i = 0; i < c; ++i) |
| s += ! (x[i] & 0x3000); |
| return s; |
| } |
| |
| int |
| test_001 (int* x, unsigned int c) |
| { |
| /* 1x subc */ |
| int s = 0; |
| unsigned int i; |
| for (i = 0; i < c; ++i) |
| s -= ! (x[i] & 0x3000); |
| return s; |
| } |
| |
| int |
| test_002 (int a, int b, int c) |
| { |
| /* 1x tst, 1x subc */ |
| return ((a & b) != 0) - c; |
| } |
| |
| int |
| test_003 (int a, int b, int c) |
| { |
| /* 1x tst, 1x movt, 1x sub */ |
| return ((a & b) == 0) - c; |
| } |
| |
| int |
| test_004 (int a, int b, int c) |
| { |
| /* 1x tst, 1x addc */ |
| return c - ((a & b) != 0); |
| } |
| |
| int |
| test_005 (int a, int b, int c) |
| { |
| /* 1x shll, 1x subc */ |
| int x = a < 0; |
| return c - (b + x); |
| } |
| |
| int |
| test_006 (int a, int b, int c) |
| { |
| /* 1x neg, 1x cmp/pl, 1x addc */ |
| int x = a > 0; |
| int y = b + x; |
| return y - c; |
| } |
| |
| int |
| test_007 (int a, int b, int c) |
| { |
| /* 1x add #-1, 1x cmp/eq, 1x addc */ |
| int x = a != 1; |
| int y = b - x; |
| return c + y; |
| } |
| |
| int |
| test_008 (int a, int b, int c) |
| { |
| /* 1x neg, 1x cmp/gt, 1x subc */ |
| int x = a > 1; |
| int y = b - x; |
| return c + y; |
| } |
| |
| int |
| test_009 (int a, int b, int c, int d) |
| { |
| /* 1x div0s, 1x subc */ |
| return c - d - (a < 0 != b < 0); |
| } |