1 /* Verify that the SH2A clips and clipu instructions are generated as
2    expected.  */
3 /* { dg-do compile { target { sh2a } } }  */
4 /* { dg-options "-O2" } */
5 /* { dg-final { scan-assembler-times "clips.b" 2 } } */
6 /* { dg-final { scan-assembler-times "clips.w" 2 } } */
7 /* { dg-final { scan-assembler-times "clipu.b" 2 } } */
8 /* { dg-final { scan-assembler-times "clipu.w" 2 } } */
9 
10 static inline int
min(int a,int b)11 min (int a, int b)
12 {
13   return a < b ? a : b;
14 }
15 
16 static inline int
max(int a,int b)17 max (int a, int b)
18 {
19   return a < b ? b : a;
20 }
21 
22 int
test_00(int a)23 test_00 (int a)
24 {
25   /* 1x clips.b  */
26   return max (-128, min (127, a));
27 }
28 
29 int
test_01(int a)30 test_01 (int a)
31 {
32   /* 1x clips.b  */
33   return min (127, max (-128, a));
34 }
35 
36 int
test_02(int a)37 test_02 (int a)
38 {
39   /* 1x clips.w  */
40   return max (-32768, min (32767, a));
41 }
42 
43 int
test_03(int a)44 test_03 (int a)
45 {
46   /* 1x clips.w  */
47   return min (32767, max (-32768, a));
48 }
49 
50 unsigned int
test_04(unsigned int a)51 test_04 (unsigned int a)
52 {
53   /* 1x clipu.b  */
54   return a > 255 ? 255 : a;
55 }
56 
57 unsigned int
test_05(unsigned int a)58 test_05 (unsigned int a)
59 {
60   /* 1x clipu.b  */
61   return a >= 255 ? 255 : a;
62 }
63 
64 unsigned int
test_06(unsigned int a)65 test_06 (unsigned int a)
66 {
67   /* 1x clipu.w  */
68   return a > 65535 ? 65535 : a;
69 }
70 
71 unsigned int
test_07(unsigned int a)72 test_07 (unsigned int a)
73 {
74   /* 1x clipu.w  */
75   return a >= 65535 ? 65535 : a;
76 }
77 
78 void
test_08(unsigned short a,unsigned short b,unsigned int * r)79 test_08 (unsigned short a, unsigned short b, unsigned int* r)
80 {
81   /* Must not see a clip insn here -- it is not needed.  */
82   unsigned short x = a + b;
83   if (x > 65535)
84     x = 65535;
85   *r = x;
86 }
87