1 /* Tests to check the utilization of the addc instruction in special cases.
2    If everything works as expected we won't see any movt instructions in
3    these cases.  */
4 /* { dg-do compile }  */
5 /* { dg-options "-O1" } */
6 
7 /* { dg-final { scan-assembler-times "addc" 36 } } */
8 /* { dg-final { scan-assembler-times "shll" 14 } } */
9 /* { dg-final { scan-assembler-times "add\tr" 12 } } */
10 /* { dg-final { scan-assembler-not "movt" } } */
11 
12 /* { dg-final { scan-assembler-times "add\t#1" 1 } } */
13 
14 /* { dg-final { scan-assembler-times "mov\t#-2" 1 { target { ! sh2a } } } } */
15 /* { dg-final { scan-assembler-times "and\tr" 1 { target { ! sh2a } } } } */
16 
17 /* { dg-final { scan-assembler-times "bclr\t#0" 1 { target { sh2a } } } } */
18 
19 /* { dg-final { scan-assembler-times "shlr" 22 { target { ! sh2a } } } } */
20 /* { dg-final { scan-assembler-not "shlr" { target { sh2a } } } } */
21 
22 int
test_000(int a,int c,int b,int d)23 test_000 (int a, int c, int b, int d)
24 {
25   // 1x shlr/bld, 1x addc
26   return a + (b & 1);
27 }
28 
29 int
test_001(int a,int c,int b,int d)30 test_001 (int a, int c, int b, int d)
31 {
32   // 1x shlr/bld, 1x addc
33   return a + b + (c & 1);
34 }
35 
36 int
test_002(int a,int c,int b,int d)37 test_002 (int a, int c, int b, int d)
38 {
39   // 1x shlr/bld, 1x add, 1x addc
40   return a + b + c + (d & 1);
41 }
42 
43 int
test_003(int a,int c,int b,int d)44 test_003 (int a, int c, int b, int d)
45 {
46   // 1x shlr/bld, 1x addc
47   return (b & 1) + a;
48 }
49 
50 int
test_004(int a,int c,int b,int d)51 test_004 (int a, int c, int b, int d)
52 {
53   // 1x shlr/bld, 1x addc
54   return a + (c & 1) + b;
55 }
56 
57 int
test_005(int a,int c,int b,int d)58 test_005 (int a, int c, int b, int d)
59 {
60   // 1x shlr/bld, 1x add, 1x addc
61   return a + b + (d & 1) + c;
62 }
63 
64 int
test_006(int a,int c,int b,int d)65 test_006 (int a, int c, int b, int d)
66 {
67   // 1x shlr/bld, 1x addc
68   return (c & 1) + a + b;
69 }
70 
71 int
test_007(int a,int c,int b,int d)72 test_007 (int a, int c, int b, int d)
73 {
74   // 1x shlr/bld, 1x add, 1x addc
75   return a + (d & 1) + b + c;
76 }
77 
78 int
test_008(int a,int c,int b,int d)79 test_008 (int a, int c, int b, int d)
80 {
81   // 1x shlr/bld, 1x add, 1x addc
82   return (d & 1) + a + b + c;
83 }
84 
85 int
test_009(int a,int c,int b,int d)86 test_009 (int a, int c, int b, int d)
87 {
88   // 1x shlr/bld, 1x addc
89   return a + b + (b & 1);
90 }
91 
92 int
test_010(int a,int c,int b,int d)93 test_010 (int a, int c, int b, int d)
94 {
95   // 1x shlr/bld, 1x addc
96   return a + (b & 1) + b;
97 }
98 
99 int
test_011(int a,int c,int b,int d)100 test_011 (int a, int c, int b, int d)
101 {
102   // 1x shlr/bld, 1x addc
103   return (b & 1) + a + b;
104 }
105 
106 int
test_012(int a,int c,int b,int d)107 test_012 (int a, int c, int b, int d)
108 {
109   // 1x shlr/bld, 1x add, 1x addc
110   return a + b + d + (b & 1);
111 }
112 
113 int
test_013(int a,int c,int b,int d)114 test_013 (int a, int c, int b, int d)
115 {
116   // 1x shlr/bld, 1x add, 1x addc
117   return a + d + (b & 1) + b;
118 }
119 
120 int
test_014(int a,int c,int b,int d)121 test_014 (int a, int c, int b, int d)
122 {
123   // 1x shlr/bld, 1x add, 1x addc
124   return a + (b & 1) + d + b;
125 }
126 
127 int
test_015(int a,int c,int b,int d)128 test_015 (int a, int c, int b, int d)
129 {
130   // 1x shlr/bld, 1x add, 1x addc
131   return (b & 1) + a + d + b;
132 }
133 
134 int
test_016(int a,int b,int c,int d)135 test_016 (int a, int b, int c, int d)
136 {
137   // non-SH2A: 1x add #1, 1x mov #-2, 1x and
138   // SH2A: 1x add #1, 1x bclr #0
139   return a + (a & 1);
140 }
141 
142 int
test_017(int a,int b,int c,int d)143 test_017 (int a, int b, int c, int d)
144 {
145   // 1x shlr/bld, 1x addc
146   return a + a + (a & 1);
147 }
148 
149 int
test_018(int a,int b,int c,int d)150 test_018 (int a, int b, int c, int d)
151 {
152   // 1x shlr/bld, 1x addc
153   return a + (a & 1) + a;
154 }
155 
156 int
test_019(int a,int b,int c,int d)157 test_019 (int a, int b, int c, int d)
158 {
159   // 1x shlr/bld, 1x addc
160   return (a & 1) + a + a;
161 }
162 
163 int
test_020(int a,int b,int c,int d)164 test_020 (int a, int b, int c, int d)
165 {
166   // 1x shlr/bld, 1x addc
167   return b + b + (a & 1);
168 }
169 
170 int
test_021(int a,int b,int c,int d)171 test_021 (int a, int b, int c, int d)
172 {
173   // 1x shlr/bld, 1x addc
174   return b + (a & 1) + b;
175 }
176 
177 int
test_022(int a,int b,int c,int d)178 test_022 (int a, int b, int c, int d)
179 {
180   // 1x shlr/bld, 1x addc
181   return (a & 1) + b + b;
182 }
183 
184 int
test_023(int a,int b,int c,int d)185 test_023 (int a, int b, int c, int d)
186 {
187   // 1x shll, 1x addc
188   return a + ((b >> 31) & 1);
189 }
190 
191 int
test_024(int a,int b,int c,int d)192 test_024 (int a, int b, int c, int d)
193 {
194   // 1x shll, 1x addc
195   return ((b >> 31) & 1) + a;
196 }
197 
198 int
test_025(int a,int b,int c,int d)199 test_025 (int a, int b, int c, int d)
200 {
201   // 1x shll, 1x addc
202   return ((a >> 31) & 1) + a;
203 }
204 
205 int
test_026(int a,int b,int c,int d)206 test_026 (int a, int b, int c, int d)
207 {
208   // 1x shll, 1x addc
209   return a + ((a >> 31) & 1);
210 }
211 
212 int
test_027(int a,int b,int c,int d)213 test_027 (int a, int b, int c, int d)
214 {
215   // 1x shll, 1x addc
216   return a + b + ((c >> 31) & 1);
217 }
218 
219 int
test_028(int a,int b,int c,int d)220 test_028 (int a, int b, int c, int d)
221 {
222   // 1x shll, 1x addc
223   return a + ((c >> 31) & 1) + b;
224 }
225 
226 int
test_029(int a,int b,int c,int d)227 test_029 (int a, int b, int c, int d)
228 {
229   // 1x shll, 1x addc
230   return ((c >> 31) & 1) + a + b;
231 }
232 
233 int
test_030(int a,int b,int c,int d)234 test_030 (int a, int b, int c, int d)
235 {
236   // 1x shll, 1x addc, 1x add
237   return a + b + c + ((d >> 31) & 1);
238 }
239 
240 int
test_031(int a,int b,int c,int d)241 test_031 (int a, int b, int c, int d)
242 {
243   // 1x shll, 1x addc, 1x add
244   return a + b + ((d >> 31) & 1) + c;
245 }
246 
247 int
test_032(int a,int b,int c,int d)248 test_032 (int a, int b, int c, int d)
249 {
250   // 1x shll, 1x addc, 1x add
251   return a + ((d >> 31) & 1) + b + c;
252 }
253 
254 int
test_033(int a,int b,int c,int d)255 test_033 (int a, int b, int c, int d)
256 {
257   // 1x shll, 1x addc, 1x add
258   return ((d >> 31) & 1) + a + b + c;
259 }
260 
261 int
test_034(int a,int b,int c,int d)262 test_034 (int a, int b, int c, int d)
263 {
264   // 1x shll, 1x addc
265   return a + a + ((d >> 31) & 1);
266 }
267 
268 int
test_035(int a,int b,int c,int d)269 test_035 (int a, int b, int c, int d)
270 {
271   // 1x shll, 1x addc
272   return a + ((d >> 31) & 1) + a;
273 }
274 
275 int
test_036(int a,int b,int c,int d)276 test_036 (int a, int b, int c, int d)
277 {
278   // 1x shll, 1x addc
279   return ((d >> 31) & 1) + a + a;
280 }
281