xref: /llvm-project/clang/test/Sema/arm_inline_asm_constraints.c (revision a59bffb5769557499fb86c28953bb7e755bedbe9)
1*a59bffb5SDavid Candler // REQUIRES: arm-registered-target
2*a59bffb5SDavid Candler 
3*a59bffb5SDavid Candler // RUN: %clang_cc1 -triple armv6 -verify=arm6 %s
4*a59bffb5SDavid Candler // RUN: %clang_cc1 -triple armv7 -verify=arm7 %s
5*a59bffb5SDavid Candler // RUN: %clang_cc1 -triple thumbv6 -verify=thumb1 %s
6*a59bffb5SDavid Candler // RUN: %clang_cc1 -triple thumbv7 -verify=thumb2 %s
7*a59bffb5SDavid Candler 
8*a59bffb5SDavid Candler // j: An immediate integer between 0 and 65535 (valid for MOVW) (ARM/Thumb2)
test_j(int i)9*a59bffb5SDavid Candler int test_j(int i) {
10*a59bffb5SDavid Candler   int res;
11*a59bffb5SDavid Candler   __asm("movw %0, %1;"
12*a59bffb5SDavid Candler         : [ result ] "=r"(res)
13*a59bffb5SDavid Candler         : [ constant ] "j"(-1), [ input ] "r"(i)
14*a59bffb5SDavid Candler         :);
15*a59bffb5SDavid Candler   // arm6-error@13 {{invalid input constraint 'j' in asm}}
16*a59bffb5SDavid Candler   // arm7-error@13 {{value '-1' out of range for constraint 'j'}}
17*a59bffb5SDavid Candler   // thumb1-error@13 {{invalid input constraint 'j' in asm}}
18*a59bffb5SDavid Candler   // thumb2-error@13 {{value '-1' out of range for constraint 'j'}}
19*a59bffb5SDavid Candler   __asm("movw %0, %1;"
20*a59bffb5SDavid Candler         : [ result ] "=r"(res)
21*a59bffb5SDavid Candler         : [ constant ] "j"(0), [ input ] "r"(i)
22*a59bffb5SDavid Candler         :);
23*a59bffb5SDavid Candler   // arm6-error@21 {{invalid input constraint 'j' in asm}}
24*a59bffb5SDavid Candler   // arm7-no-error
25*a59bffb5SDavid Candler   // thumb1-error@21 {{invalid input constraint 'j' in asm}}
26*a59bffb5SDavid Candler   // thumb2-no-error
27*a59bffb5SDavid Candler   __asm("movw %0, %1;"
28*a59bffb5SDavid Candler         : [ result ] "=r"(res)
29*a59bffb5SDavid Candler         : [ constant ] "j"(65535), [ input ] "r"(i)
30*a59bffb5SDavid Candler         :);
31*a59bffb5SDavid Candler   // arm6-error@29 {{invalid input constraint 'j' in asm}}
32*a59bffb5SDavid Candler   // arm7-no-error
33*a59bffb5SDavid Candler   // thumb1-error@29 {{invalid input constraint 'j' in asm}}
34*a59bffb5SDavid Candler   // thumb2-no-error
35*a59bffb5SDavid Candler   __asm("movw %0, %1;"
36*a59bffb5SDavid Candler         : [ result ] "=r"(res)
37*a59bffb5SDavid Candler         : [ constant ] "j"(65536), [ input ] "r"(i)
38*a59bffb5SDavid Candler         :);
39*a59bffb5SDavid Candler   // arm6-error@37 {{invalid input constraint 'j' in asm}}
40*a59bffb5SDavid Candler   // arm7-error@37 {{value '65536' out of range for constraint 'j'}}
41*a59bffb5SDavid Candler   // thumb1-error@37 {{invalid input constraint 'j' in asm}}
42*a59bffb5SDavid Candler   // thumb2-error@37 {{value '65536' out of range for constraint 'j'}}
43*a59bffb5SDavid Candler   return res;
44*a59bffb5SDavid Candler }
45*a59bffb5SDavid Candler 
46*a59bffb5SDavid Candler // I: An immediate integer valid for a data-processing instruction. (ARM/Thumb2)
47*a59bffb5SDavid Candler //    An immediate integer between 0 and 255. (Thumb1)
test_I(int i)48*a59bffb5SDavid Candler int test_I(int i) {
49*a59bffb5SDavid Candler   int res;
50*a59bffb5SDavid Candler   __asm(
51*a59bffb5SDavid Candler       "add %0, %1;"
52*a59bffb5SDavid Candler       : [ result ] "=r"(res)
53*a59bffb5SDavid Candler       : [ constant ] "I"(-1), [ input ] "r"(i)
54*a59bffb5SDavid Candler       :); // thumb1-error@53 {{value '-1' out of range for constraint 'I'}}
55*a59bffb5SDavid Candler   __asm(
56*a59bffb5SDavid Candler       "add %0, %1;"
57*a59bffb5SDavid Candler       : [ result ] "=r"(res)
58*a59bffb5SDavid Candler       : [ constant ] "I"(0), [ input ] "r"(i)
59*a59bffb5SDavid Candler       :); // No errors expected.
60*a59bffb5SDavid Candler   __asm(
61*a59bffb5SDavid Candler       "add %0, %1;"
62*a59bffb5SDavid Candler       : [ result ] "=r"(res)
63*a59bffb5SDavid Candler       : [ constant ] "I"(255), [ input ] "r"(i)
64*a59bffb5SDavid Candler       :); // No errors expected.
65*a59bffb5SDavid Candler   __asm(
66*a59bffb5SDavid Candler       "add %0, %1;"
67*a59bffb5SDavid Candler       : [ result ] "=r"(res)
68*a59bffb5SDavid Candler       : [ constant ] "I"(256), [ input ] "r"(i)
69*a59bffb5SDavid Candler       :); // thumb1-error@68 {{value '256' out of range for constraint 'I'}}
70*a59bffb5SDavid Candler   return res;
71*a59bffb5SDavid Candler }
72*a59bffb5SDavid Candler 
73*a59bffb5SDavid Candler // J: An immediate integer between -4095 and 4095. (ARM/Thumb2)
74*a59bffb5SDavid Candler //    An immediate integer between -255 and -1. (Thumb1)
test_J(int i)75*a59bffb5SDavid Candler int test_J(int i) {
76*a59bffb5SDavid Candler   int res;
77*a59bffb5SDavid Candler   __asm(
78*a59bffb5SDavid Candler       "movw %0, %1;"
79*a59bffb5SDavid Candler       : [ result ] "=r"(res)
80*a59bffb5SDavid Candler       : [ constant ] "J"(-4096), [ input ] "r"(i)
81*a59bffb5SDavid Candler       :);
82*a59bffb5SDavid Candler   // arm6-error@80 {{value '-4096' out of range for constraint 'J'}}
83*a59bffb5SDavid Candler   // arm7-error@80 {{value '-4096' out of range for constraint 'J'}}
84*a59bffb5SDavid Candler   // thumb1-error@80 {{value '-4096' out of range for constraint 'J'}}
85*a59bffb5SDavid Candler   // thumb2-error@80 {{value '-4096' out of range for constraint 'J'}}
86*a59bffb5SDavid Candler   __asm(
87*a59bffb5SDavid Candler       "movw %0, %1;"
88*a59bffb5SDavid Candler       : [ result ] "=r"(res)
89*a59bffb5SDavid Candler       : [ constant ] "J"(-4095), [ input ] "r"(i)
90*a59bffb5SDavid Candler       :);
91*a59bffb5SDavid Candler   // thumb1-error@89 {{value '-4095' out of range for constraint 'J'}}
92*a59bffb5SDavid Candler   __asm(
93*a59bffb5SDavid Candler       "add %0, %1;"
94*a59bffb5SDavid Candler       : [ result ] "=r"(res)
95*a59bffb5SDavid Candler       : [ constant ] "J"(-256), [ input ] "r"(i)
96*a59bffb5SDavid Candler       :);
97*a59bffb5SDavid Candler   // thumb1-error@95 {{value '-256' out of range for constraint 'J'}}
98*a59bffb5SDavid Candler   __asm(
99*a59bffb5SDavid Candler       "add %0, %1;"
100*a59bffb5SDavid Candler       : [ result ] "=r"(res)
101*a59bffb5SDavid Candler       : [ constant ] "J"(-255), [ input ] "r"(i)
102*a59bffb5SDavid Candler       :);
103*a59bffb5SDavid Candler   // No errors expected.
104*a59bffb5SDavid Candler   __asm(
105*a59bffb5SDavid Candler       "add %0, %1;"
106*a59bffb5SDavid Candler       : [ result ] "=r"(res)
107*a59bffb5SDavid Candler       : [ constant ] "J"(-1), [ input ] "r"(i)
108*a59bffb5SDavid Candler       :);
109*a59bffb5SDavid Candler   // No errors expected.
110*a59bffb5SDavid Candler   __asm(
111*a59bffb5SDavid Candler       "add %0, %1;"
112*a59bffb5SDavid Candler       : [ result ] "=r"(res)
113*a59bffb5SDavid Candler       : [ constant ] "J"(0), [ input ] "r"(i)
114*a59bffb5SDavid Candler       :);
115*a59bffb5SDavid Candler   // thumb1-error@113 {{value '0' out of range for constraint 'J'}}
116*a59bffb5SDavid Candler   __asm(
117*a59bffb5SDavid Candler       "movw %0, %1;"
118*a59bffb5SDavid Candler       : [ result ] "=r"(res)
119*a59bffb5SDavid Candler       : [ constant ] "J"(4095), [ input ] "r"(i)
120*a59bffb5SDavid Candler       :);
121*a59bffb5SDavid Candler   // thumb1-error@119 {{value '4095' out of range for constraint 'J'}}
122*a59bffb5SDavid Candler   __asm(
123*a59bffb5SDavid Candler       "movw %0, %1;"
124*a59bffb5SDavid Candler       : [ result ] "=r"(res)
125*a59bffb5SDavid Candler       : [ constant ] "J"(4096), [ input ] "r"(i)
126*a59bffb5SDavid Candler       :);
127*a59bffb5SDavid Candler   // arm6-error@125 {{value '4096' out of range for constraint 'J'}}
128*a59bffb5SDavid Candler   // arm7-error@125 {{value '4096' out of range for constraint 'J'}}
129*a59bffb5SDavid Candler   // thumb1-error@125 {{value '4096' out of range for constraint 'J'}}
130*a59bffb5SDavid Candler   // thumb2-error@125 {{value '4096' out of range for constraint 'J'}}
131*a59bffb5SDavid Candler   return res;
132*a59bffb5SDavid Candler }
133*a59bffb5SDavid Candler 
134*a59bffb5SDavid Candler // K: An immediate integer whose bitwise inverse is valid for a data-processing instruction. (ARM/Thumb2)
135*a59bffb5SDavid Candler //    An immediate integer between 0 and 255, with optional left-shift by some amount. (Thumb1)
test_K(int i)136*a59bffb5SDavid Candler int test_K(int i) {
137*a59bffb5SDavid Candler   int res;
138*a59bffb5SDavid Candler   __asm(
139*a59bffb5SDavid Candler       "add %0, %1;"
140*a59bffb5SDavid Candler       : [ result ] "=r"(res)
141*a59bffb5SDavid Candler       : [ constant ] "K"(123), [ input ] "r"(i)
142*a59bffb5SDavid Candler       :);
143*a59bffb5SDavid Candler   // No errors expected.
144*a59bffb5SDavid Candler   return res;
145*a59bffb5SDavid Candler }
146*a59bffb5SDavid Candler 
147*a59bffb5SDavid Candler // L: An immediate integer whose negation is valid for a data-processing instruction. (ARM/Thumb2)
148*a59bffb5SDavid Candler //    An immediate integer between -7 and 7. (Thumb1)
test_L(int i)149*a59bffb5SDavid Candler int test_L(int i) {
150*a59bffb5SDavid Candler   int res;
151*a59bffb5SDavid Candler   __asm(
152*a59bffb5SDavid Candler       "add %0, %1;"
153*a59bffb5SDavid Candler       : [ result ] "=r"(res)
154*a59bffb5SDavid Candler       : [ constant ] "L"(-8), [ input ] "r"(i)
155*a59bffb5SDavid Candler       :); // thumb1-error@154 {{value '-8' out of range for constraint 'L'}}
156*a59bffb5SDavid Candler   __asm(
157*a59bffb5SDavid Candler       "add %0, %1;"
158*a59bffb5SDavid Candler       : [ result ] "=r"(res)
159*a59bffb5SDavid Candler       : [ constant ] "L"(-7), [ input ] "r"(i)
160*a59bffb5SDavid Candler       :); // No errors expected.
161*a59bffb5SDavid Candler   __asm(
162*a59bffb5SDavid Candler       "add %0, %1;"
163*a59bffb5SDavid Candler       : [ result ] "=r"(res)
164*a59bffb5SDavid Candler       : [ constant ] "L"(7), [ input ] "r"(i)
165*a59bffb5SDavid Candler       :); // No errors expected.
166*a59bffb5SDavid Candler   __asm(
167*a59bffb5SDavid Candler       "add %0, %1;"
168*a59bffb5SDavid Candler       : [ result ] "=r"(res)
169*a59bffb5SDavid Candler       : [ constant ] "L"(8), [ input ] "r"(i)
170*a59bffb5SDavid Candler       :); // thumb1-error@169 {{value '8' out of range for constraint 'L'}}
171*a59bffb5SDavid Candler   return res;
172*a59bffb5SDavid Candler }
173*a59bffb5SDavid Candler 
174*a59bffb5SDavid Candler // M: A power of two or a integer between 0 and 32. (ARM/Thumb2)
175*a59bffb5SDavid Candler //    An immediate integer which is a multiple of 4 between 0 and 1020. (Thumb1)
test_M(int i)176*a59bffb5SDavid Candler int test_M(int i) {
177*a59bffb5SDavid Candler   int res;
178*a59bffb5SDavid Candler   __asm(
179*a59bffb5SDavid Candler       "add %0, %1;"
180*a59bffb5SDavid Candler       : [ result ] "=r"(res)
181*a59bffb5SDavid Candler       : [ constant ] "M"(123), [ input ] "r"(i)
182*a59bffb5SDavid Candler       :); // No errors expected.
183*a59bffb5SDavid Candler   return res;
184*a59bffb5SDavid Candler }
185*a59bffb5SDavid Candler 
186*a59bffb5SDavid Candler // N: Invalid (ARM/Thumb2)
187*a59bffb5SDavid Candler //    An immediate integer between 0 and 31. (Thumb1)
test_N(int i)188*a59bffb5SDavid Candler int test_N(int i) {
189*a59bffb5SDavid Candler   int res;
190*a59bffb5SDavid Candler   __asm("add %0, %1;"
191*a59bffb5SDavid Candler         : [ result ] "=r"(res)
192*a59bffb5SDavid Candler         : [ constant ] "N"(-1), [ input ] "r"(i)
193*a59bffb5SDavid Candler         :);
194*a59bffb5SDavid Candler   // arm6-error@192 {{invalid input constraint 'N' in asm}}
195*a59bffb5SDavid Candler   // arm7-error@192 {{invalid input constraint 'N' in asm}}
196*a59bffb5SDavid Candler   // thumb1-error@192 {{value '-1' out of range for constraint 'N'}}
197*a59bffb5SDavid Candler   // thumb2-error@192 {{invalid input constraint 'N' in asm}}
198*a59bffb5SDavid Candler   __asm(
199*a59bffb5SDavid Candler       "add %0, %1;"
200*a59bffb5SDavid Candler       : [ result ] "=r"(res)
201*a59bffb5SDavid Candler       : [ constant ] "N"(0), [ input ] "r"(i)
202*a59bffb5SDavid Candler       :);
203*a59bffb5SDavid Candler   // arm6-error@201 {{invalid input constraint 'N' in asm}}
204*a59bffb5SDavid Candler   // arm7-error@201 {{invalid input constraint 'N' in asm}}
205*a59bffb5SDavid Candler   // thumb1-no-error
206*a59bffb5SDavid Candler   // thumb2-error@201 {{invalid input constraint 'N' in asm}}
207*a59bffb5SDavid Candler   __asm(
208*a59bffb5SDavid Candler       "add %0, %1;"
209*a59bffb5SDavid Candler       : [ result ] "=r"(res)
210*a59bffb5SDavid Candler       : [ constant ] "N"(31), [ input ] "r"(i)
211*a59bffb5SDavid Candler       :);
212*a59bffb5SDavid Candler   // arm6-error@210 {{invalid input constraint 'N' in asm}}
213*a59bffb5SDavid Candler   // arm7-error@210 {{invalid input constraint 'N' in asm}}
214*a59bffb5SDavid Candler   // thumb1-no-error
215*a59bffb5SDavid Candler   // thumb2-error@210 {{invalid input constraint 'N' in asm}}
216*a59bffb5SDavid Candler   __asm(
217*a59bffb5SDavid Candler       "add %0, %1;"
218*a59bffb5SDavid Candler       : [ result ] "=r"(res)
219*a59bffb5SDavid Candler       : [ constant ] "N"(32), [ input ] "r"(i)
220*a59bffb5SDavid Candler       :);
221*a59bffb5SDavid Candler   // arm6-error@219 {{invalid input constraint 'N' in asm}}
222*a59bffb5SDavid Candler   // arm7-error@219 {{invalid input constraint 'N' in asm}}
223*a59bffb5SDavid Candler   // thumb1-error@219 {{value '32' out of range for constraint 'N'}}
224*a59bffb5SDavid Candler   // thumb2-error@219 {{invalid input constraint 'N' in asm}}
225*a59bffb5SDavid Candler   return res;
226*a59bffb5SDavid Candler }
227*a59bffb5SDavid Candler 
228*a59bffb5SDavid Candler // O: Invalid (ARM/Thumb2)
229*a59bffb5SDavid Candler //    An immediate integer which is a multiple of 4 between -508 and 508. (Thumb1)
test_O(int i)230*a59bffb5SDavid Candler int test_O(int i) {
231*a59bffb5SDavid Candler   int res;
232*a59bffb5SDavid Candler   __asm(
233*a59bffb5SDavid Candler       "add %0, %1;"
234*a59bffb5SDavid Candler       : [ result ] "=r"(res)
235*a59bffb5SDavid Candler       : [ constant ] "O"(1), [ input ] "r"(i)
236*a59bffb5SDavid Candler       :);
237*a59bffb5SDavid Candler   // arm6-error@235 {{invalid input constraint 'O' in asm}}
238*a59bffb5SDavid Candler   // arm7-error@235 {{invalid input constraint 'O' in asm}}
239*a59bffb5SDavid Candler   // thumb1-no-error
240*a59bffb5SDavid Candler   // thumb2-error@235 {{invalid input constraint 'O' in asm}}
241*a59bffb5SDavid Candler   return res;
242*a59bffb5SDavid Candler }
243*a59bffb5SDavid Candler 
244*a59bffb5SDavid Candler // l: Same as r (ARM)
245*a59bffb5SDavid Candler //    A low 32-bit GPR register (r0-r7). (Thumb1/Thumb2)
test_l(int i)246*a59bffb5SDavid Candler int test_l(int i) {
247*a59bffb5SDavid Candler   int res;
248*a59bffb5SDavid Candler   __asm(
249*a59bffb5SDavid Candler       "add %0, %1;"
250*a59bffb5SDavid Candler       : [ result ] "=l"(res)
251*a59bffb5SDavid Candler       : [ constant ] "i"(10), [ input ] "l"(i)
252*a59bffb5SDavid Candler       :); // No errors expected.
253*a59bffb5SDavid Candler   return res;
254*a59bffb5SDavid Candler }
255*a59bffb5SDavid Candler 
256*a59bffb5SDavid Candler // h: Invalid (ARM)
257*a59bffb5SDavid Candler //    A high 32-bit GPR register (r8-r15). (Thumb1/Thumb2)
test_h(int i)258*a59bffb5SDavid Candler int test_h(int i) {
259*a59bffb5SDavid Candler   int res;
260*a59bffb5SDavid Candler   __asm(
261*a59bffb5SDavid Candler       "add %0, %1;"
262*a59bffb5SDavid Candler       : [ result ] "=h"(res)
263*a59bffb5SDavid Candler       : [ constant ] "i"(10), [ input ] "h"(i)
264*a59bffb5SDavid Candler       :);
265*a59bffb5SDavid Candler   // arm6-error@262 {{invalid output constraint '=h' in asm}}
266*a59bffb5SDavid Candler   // arm7-error@262 {{invalid output constraint '=h' in asm}}
267*a59bffb5SDavid Candler   return res;
268*a59bffb5SDavid Candler }
269*a59bffb5SDavid Candler 
270*a59bffb5SDavid Candler // s: An integer constant, but allowing only relocatable values.
271*a59bffb5SDavid Candler int g;
272*a59bffb5SDavid Candler 
test_s(int i)273*a59bffb5SDavid Candler int test_s(int i) {
274*a59bffb5SDavid Candler   int res;
275*a59bffb5SDavid Candler   __asm(
276*a59bffb5SDavid Candler       "add %0, %1;"
277*a59bffb5SDavid Candler       : [ result ] "=r"(res)
278*a59bffb5SDavid Candler       : [ constant ] "s"(&g), [ input ] "r"(i)
279*a59bffb5SDavid Candler       :); // No errors expected.
280*a59bffb5SDavid Candler   return res;
281*a59bffb5SDavid Candler }
282*a59bffb5SDavid Candler 
283*a59bffb5SDavid Candler // w: A 32, 64, or 128-bit floating-point/SIMD register: s0-s31, d0-d31, or q0-q15.
test_w(float x)284*a59bffb5SDavid Candler float test_w(float x) {
285*a59bffb5SDavid Candler   __asm__("vsqrt.f32 %0, %1"
286*a59bffb5SDavid Candler           : "=w"(x)
287*a59bffb5SDavid Candler           : "w"(x)); // No error expected.
288*a59bffb5SDavid Candler   return x;
289*a59bffb5SDavid Candler }
290*a59bffb5SDavid Candler 
291*a59bffb5SDavid Candler // x: A 32, 64, or 128-bit floating-point/SIMD register: s0-s15, d0-d7, or q0-q3.
test_x(float x)292*a59bffb5SDavid Candler float test_x(float x) {
293*a59bffb5SDavid Candler   __asm__("vsqrt.f32 %0, %1"
294*a59bffb5SDavid Candler           : "=x"(x)
295*a59bffb5SDavid Candler           : "x"(x)); // No error expected.
296*a59bffb5SDavid Candler   return x;
297*a59bffb5SDavid Candler }
298*a59bffb5SDavid Candler 
299*a59bffb5SDavid Candler // t: A 32, 64, or 128-bit floating-point/SIMD register: s0-s31, d0-d15, or q0-q7.
test_t(float x)300*a59bffb5SDavid Candler float test_t(float x) {
301*a59bffb5SDavid Candler   __asm__("vsqrt.f32 %0, %1"
302*a59bffb5SDavid Candler           : "=t"(x)
303*a59bffb5SDavid Candler           : "t"(x)); // No error expected.
304*a59bffb5SDavid Candler   return x;
305*a59bffb5SDavid Candler }
306