1 /* Check that the cmp/pz instruction is generated as expected. */
2 /* { dg-do compile } */
3 /* { dg-options "-O1" } */
5 /* { dg-final { scan-assembler-times "shll" 1 } } */
6 /* { dg-final { scan-assembler-times "movt" 5 } } */
7 /* { dg-final { scan-assembler-times "rotcl" 1 } } */
8 /* { dg-final { scan-assembler-times "and" 3 } } */
9 /* { dg-final { scan-assembler-times "extu.b" 5 } } */
11 /* { dg-final { scan-assembler-times "cmp/pz" 27 { target { ! sh2a } } } } */
12 /* { dg-final { scan-assembler-times "addc" 4 { target { ! sh2a } } } } */
13 /* { dg-final { scan-assembler-times "subc" 16 { target { ! sh2a } } } } */
15 /* { dg-final { scan-assembler-times "cmp/pz" 25 { target { sh2a } } } } */
16 /* { dg-final { scan-assembler-times "addc" 6 { target { sh2a } } } } */
17 /* { dg-final { scan-assembler-times "subc" 14 { target { sh2a } } } } */
18 /* { dg-final { scan-assembler-times "bld" 2 { target { sh2a } } } } */
21 test_00 (unsigned char* a
)
23 /* 1x cmp/pz, 1x movt */
28 test_01 (unsigned char* a
)
30 /* 1x cmp/pz, 1x addc */
31 return a
[0] + (a
[0] < 128);
35 test_02 (unsigned char* a
)
37 /* 1x cmp/pz, 1x addc */
38 return a
[0] + ((a
[0] & 0x80) == 0);
42 test_03 (unsigned char* a
)
45 SH2A: 1x bld, 1x addc */
46 return a
[0] + (a
[0] > 127);
50 test_04 (unsigned char* a
)
53 SH2A: 1x bld, 1x addc */
54 return a
[0] + ((a
[0] & 0x80) != 0);
58 test_05 (unsigned char* a
, int b
, int c
)
68 test_06 (unsigned int a
)
70 /* 1x cmp/pz, 1x movt */
75 test_07 (unsigned short* a
)
82 test_08 (unsigned short* a
)
84 /* 1x cmp/pz, 1x addc */
85 return a
[0] + (a
[0] < 32768);
89 test_09 (unsigned int a
)
91 /* 1x cmp/pz, 1x movt */
96 test_10 (unsigned int a
, unsigned int b
)
98 /* 1x cmp/pz, 1x rotcl */
99 return (a
<< 1) | ((a
>> 31) ^ 1);
105 /* 1x cmp/pz, 1x subc */
112 /* 1x cmp/pz, 1x subc */
113 return 0xFFFFFFFF - (x
>> 31);
119 /* 1x cmp/pz, 1x subc, 1x add */
120 return ~(x
>> 31) << 1;
126 /* 1x cmp/pz, 1x subc */
127 return ~(x
>> 31) >> 1;
133 /* 1x cmp/pz, 1x subc */
134 return ~(x
>> 31) >> 31;
140 /* 1x cmp/pz, 1x subc, 1x and */
141 return ~(x
>> 31) & 0xFF000000;
147 /* 1x cmp/pz, 1x subc, 1x and */
148 return ~(x
>> 31) & 0x00FF0000;
154 /* 1x cmp/pz, 1x subc, 1x and */
155 return ~(x
>> 31) & 0x0000FF00;
161 /* 1x cmp/pz, 1x subc, 1x extu.b */
162 return ~(x
>> 31) & 0x000000FF;
166 test_20 (int x
, unsigned int y
, unsigned int z
)
169 return ~(x
>> 31) ? y
: z
;
175 /* 1x cmp/pz, 1x subc */
176 return x
>= 0 ? 0xFFFFFFFF : 0;
182 /* 1x cmp/pz, 1x movt */
183 return (x
>> 31) + 1;
189 /* 1x cmp/pz, 1x subc */
190 return x
< 0 ? x
+ 1 : x
;
194 test_24 (unsigned int x
)
196 /* 1x cmp/pz, 1x subc */
197 return x
& 0x80000000 ? x
+ 1 : x
;
201 test_25 (unsigned int x
)
203 /* 1x cmp/pz, 1x subc */
204 return x
>> 31 ? x
+ 1 : x
;
210 /* 1x cmp/pz, 1x subc */
211 return x
>> 31 ? x
+ 1 : x
;
215 test_27 (int x
, int y
, int z
)
217 /* 1x cmp/pz, 1x addc */
218 return 1 - ((x
>> 4) < 0) + z
;