| /* Verify that the SH2A clips and clipu instructions are generated as |
| expected. */ |
| /* { dg-do compile { target { sh2a } } } */ |
| /* { dg-options "-O2" } */ |
| /* { dg-final { scan-assembler-times "clips.b" 2 } } */ |
| /* { dg-final { scan-assembler-times "clips.w" 2 } } */ |
| /* { dg-final { scan-assembler-times "clipu.b" 2 } } */ |
| /* { dg-final { scan-assembler-times "clipu.w" 2 } } */ |
| |
| static inline int |
| min (int a, int b) |
| { |
| return a < b ? a : b; |
| } |
| |
| static inline int |
| max (int a, int b) |
| { |
| return a < b ? b : a; |
| } |
| |
| int |
| test_00 (int a) |
| { |
| /* 1x clips.b */ |
| return max (-128, min (127, a)); |
| } |
| |
| int |
| test_01 (int a) |
| { |
| /* 1x clips.b */ |
| return min (127, max (-128, a)); |
| } |
| |
| int |
| test_02 (int a) |
| { |
| /* 1x clips.w */ |
| return max (-32768, min (32767, a)); |
| } |
| |
| int |
| test_03 (int a) |
| { |
| /* 1x clips.w */ |
| return min (32767, max (-32768, a)); |
| } |
| |
| unsigned int |
| test_04 (unsigned int a) |
| { |
| /* 1x clipu.b */ |
| return a > 255 ? 255 : a; |
| } |
| |
| unsigned int |
| test_05 (unsigned int a) |
| { |
| /* 1x clipu.b */ |
| return a >= 255 ? 255 : a; |
| } |
| |
| unsigned int |
| test_06 (unsigned int a) |
| { |
| /* 1x clipu.w */ |
| return a > 65535 ? 65535 : a; |
| } |
| |
| unsigned int |
| test_07 (unsigned int a) |
| { |
| /* 1x clipu.w */ |
| return a >= 65535 ? 65535 : a; |
| } |
| |
| void |
| test_08 (unsigned short a, unsigned short b, unsigned int* r) |
| { |
| /* Must not see a clip insn here -- it is not needed. */ |
| unsigned short x = a + b; |
| if (x > 65535) |
| x = 65535; |
| *r = x; |
| } |