blob: 4e2a69d85bdd890ce20d96ba798f2142b7b9bd07 [file] [log] [blame]
John Thompson926ee132010-11-02 23:03:52 +00001// RUN: %clang_cc1 -triple i686 -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -triple x86_64 -emit-llvm %s -o - | FileCheck %s
3
4int mout0;
5int min1;
6int marray[2];
7double dout0;
8double din1;
9
10// CHECK: @single_R
11void single_R()
12{
13 // CHECK: asm "foo $1,$0", "=R,R[[CLOBBERS:[a-zA-Z0-9@%{},~_ ]*\"]](i32 {{[a-zA-Z0-9@%]+}})
14 asm("foo %1,%0" : "=R" (mout0) : "R" (min1));
15}
16
17// CHECK: @single_q
18void single_q()
19{
20 // CHECK: asm "foo $1,$0", "=q,q[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
21 asm("foo %1,%0" : "=q" (mout0) : "q" (min1));
22}
23
24// CHECK: @single_Q
25void single_Q()
26{
27 // CHECK: asm "foo $1,$0", "=Q,Q[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
28 asm("foo %1,%0" : "=Q" (mout0) : "Q" (min1));
29}
30
31// CHECK: @single_a
32void single_a()
33{
34 // CHECK: asm "foo $1,$0", "={ax},{ax}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
35 asm("foo %1,%0" : "=a" (mout0) : "a" (min1));
36}
37
38// CHECK: @single_b
39void single_b()
40{
41 // CHECK: asm "foo $1,$0", "={bx},{bx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
42 asm("foo %1,%0" : "=b" (mout0) : "b" (min1));
43}
44
45// CHECK: @single_c
46void single_c()
47{
48 // CHECK: asm "foo $1,$0", "={cx},{cx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
49 asm("foo %1,%0" : "=c" (mout0) : "c" (min1));
50}
51
52// CHECK: @single_d
53void single_d()
54{
55 // CHECK: asm "foo $1,$0", "={dx},{dx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
56 asm("foo %1,%0" : "=d" (mout0) : "d" (min1));
57}
58
59// CHECK: @single_S
60void single_S()
61{
62 // CHECK: asm "foo $1,$0", "={si},{si}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
63 asm("foo %1,%0" : "=S" (mout0) : "S" (min1));
64}
65
66// CHECK: @single_D
67void single_D()
68{
69 // CHECK: asm "foo $1,$0", "={di},{di}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
70 asm("foo %1,%0" : "=D" (mout0) : "D" (min1));
71}
72
73// CHECK: @single_A
74void single_A()
75{
76 // CHECK: asm "foo $1,$0", "=A,A[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
77 asm("foo %1,%0" : "=A" (mout0) : "A" (min1));
78}
79
80// CHECK: @single_f
81void single_f()
82{
83//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
84}
85
86// CHECK: @single_t
87void single_t()
88{
89//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
90}
91
92// CHECK: @single_u
93void single_u()
94{
95//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
96}
97
98// CHECK: @single_y
99void single_y()
100{
101 // CHECK: call double asm "foo $1,$0", "=y,y[[CLOBBERS]](double {{[a-zA-Z0-9@%]+}})
102 asm("foo %1,%0" : "=y" (dout0) : "y" (din1));
103}
104
105// CHECK: @single_x
106void single_x()
107{
108 // CHECK: asm "foo $1,$0", "=x,x[[CLOBBERS]](double {{[a-zA-Z0-9@%]+}})
109 asm("foo %1,%0" : "=x" (dout0) : "x" (din1));
110}
111
112// CHECK: @single_Y
113void single_Y0()
114{
115 // Y constraint currently broken.
116 //asm("foo %1,%0" : "=Y0" (mout0) : "Y0" (min1));
117 //asm("foo %1,%0" : "=Yz" (mout0) : "Yz" (min1));
118 //asm("foo %1,%0" : "=Yt" (mout0) : "Yt" (min1));
119 //asm("foo %1,%0" : "=Yi" (mout0) : "Yi" (min1));
120 //asm("foo %1,%0" : "=Ym" (mout0) : "Ym" (min1));
121}
122
123// CHECK: @single_I
124void single_I()
125{
126 // CHECK: asm "foo $1,$0", "=*m,I[[CLOBBERS]](i32* @mout0, i32 1)
127 asm("foo %1,%0" : "=m" (mout0) : "I" (1));
128}
129
130// CHECK: @single_J
131void single_J()
132{
133 // CHECK: asm "foo $1,$0", "=*m,J[[CLOBBERS]](i32* @mout0, i32 1)
134 asm("foo %1,%0" : "=m" (mout0) : "J" (1));
135}
136
137// CHECK: @single_K
138void single_K()
139{
140 // CHECK: asm "foo $1,$0", "=*m,K[[CLOBBERS]](i32* @mout0, i32 1)
141 asm("foo %1,%0" : "=m" (mout0) : "K" (1));
142}
143
144// CHECK: @single_L
145void single_L()
146{
147 // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 1)
148 asm("foo %1,%0" : "=m" (mout0) : "L" (1));
149}
150
151// CHECK: @single_M
152void single_M()
153{
154 // CHECK: asm "foo $1,$0", "=*m,M[[CLOBBERS]](i32* @mout0, i32 1)
155 asm("foo %1,%0" : "=m" (mout0) : "M" (1));
156}
157
158// CHECK: @single_N
159void single_N()
160{
161 // CHECK: asm "foo $1,$0", "=*m,N[[CLOBBERS]](i32* @mout0, i32 1)
162 asm("foo %1,%0" : "=m" (mout0) : "N" (1));
163}
164
165// CHECK: @single_G
166void single_G()
167{
168 // CHECK: asm "foo $1,$0", "=*m,G[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
169 asm("foo %1,%0" : "=m" (mout0) : "G" (1.0));
170}
171
172// CHECK: @single_C
173void single_C()
174{
175 // CHECK: asm "foo $1,$0", "=*m,C[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
176 asm("foo %1,%0" : "=m" (mout0) : "C" (1.0));
177}
178
179// CHECK: @single_e
180void single_e()
181{
182 // CHECK: asm "foo $1,$0", "=*m,e[[CLOBBERS]](i32* @mout0, i32 1)
183 asm("foo %1,%0" : "=m" (mout0) : "e" (1));
184}
185
186// CHECK: @single_Z
187void single_Z()
188{
189 // CHECK: asm "foo $1,$0", "=*m,Z[[CLOBBERS]](i32* @mout0, i32 1)
190 asm("foo %1,%0" : "=m" (mout0) : "Z" (1));
191}
192
193// CHECK: @multi_R
194void multi_R()
195{
196 // CHECK: asm "foo $1,$0", "=*r|R|m,r|R|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000197 asm("foo %1,%0" : "=r,R,m" (mout0) : "r,R,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000198}
199
200// CHECK: @multi_q
201void multi_q()
202{
203 // CHECK: asm "foo $1,$0", "=*r|q|m,r|q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000204 asm("foo %1,%0" : "=r,q,m" (mout0) : "r,q,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000205}
206
207// CHECK: @multi_Q
208void multi_Q()
209{
210 // CHECK: asm "foo $1,$0", "=*r|Q|m,r|Q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000211 asm("foo %1,%0" : "=r,Q,m" (mout0) : "r,Q,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000212}
213
214// CHECK: @multi_a
215void multi_a()
216{
217 // CHECK: asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000218 asm("foo %1,%0" : "=r,a,m" (mout0) : "r,a,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000219}
220
221// CHECK: @multi_b
222void multi_b()
223{
224 // CHECK: asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000225 asm("foo %1,%0" : "=r,b,m" (mout0) : "r,b,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000226}
227
228// CHECK: @multi_c
229void multi_c()
230{
231 // CHECK: asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000232 asm("foo %1,%0" : "=r,c,m" (mout0) : "r,c,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000233}
234
235// CHECK: @multi_d
236void multi_d()
237{
John Thompson8d8420e2011-03-24 18:51:57 +0000238 // CHECK: asm "foo $1,$0", "=*r|{dx}|m,r|{dx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
239 asm("foo %1,%0" : "=r,d,m" (mout0) : "r,d,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000240}
241
242// CHECK: @multi_S
243void multi_S()
244{
245 // CHECK: asm "foo $1,$0", "=*r|{si}|m,r|{si}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000246 asm("foo %1,%0" : "=r,S,m" (mout0) : "r,S,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000247}
248
249// CHECK: @multi_D
250void multi_D()
251{
252 // CHECK: asm "foo $1,$0", "=*r|{di}|m,r|{di}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000253 asm("foo %1,%0" : "=r,D,m" (mout0) : "r,D,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000254}
255
256// CHECK: @multi_A
257void multi_A()
258{
259 // CHECK: asm "foo $1,$0", "=*r|A|m,r|A|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000260 asm("foo %1,%0" : "=r,A,m" (mout0) : "r,A,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000261}
262
263// CHECK: @multi_f
264void multi_f()
265{
266//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
267}
268
269// CHECK: @multi_t
270void multi_t()
271{
272//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
273}
274
275// CHECK: @multi_u
276void multi_u()
277{
278//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
279}
280
281// CHECK: @multi_y
282void multi_y()
283{
284 // CHECK: asm "foo $1,$0", "=*r|y|m,r|y|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000285 asm("foo %1,%0" : "=r,y,m" (dout0) : "r,y,m" (din1));
John Thompson926ee132010-11-02 23:03:52 +0000286}
287
288// CHECK: @multi_x
289void multi_x()
290{
291 // CHECK: asm "foo $1,$0", "=*r|x|m,r|x|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000292 asm("foo %1,%0" : "=r,x,m" (dout0) : "r,x,m" (din1));
John Thompson926ee132010-11-02 23:03:52 +0000293}
294
295// CHECK: @multi_Y
296void multi_Y0()
297{
298 // Y constraint currently broken.
John Thompson8d8420e2011-03-24 18:51:57 +0000299 //asm("foo %1,%0" : "=r,Y0,m" (mout0) : "r,Y0,m" (min1));
300 //asm("foo %1,%0" : "=r,Yz,m" (mout0) : "r,Yz,m" (min1));
301 //asm("foo %1,%0" : "=r,Yt,m" (mout0) : "r,Yt,m" (min1));
302 //asm("foo %1,%0" : "=r,Yi,m" (mout0) : "r,Yi,m" (min1));
303 //asm("foo %1,%0" : "=r,Ym,m" (mout0) : "r,Ym,m" (min1));
John Thompson926ee132010-11-02 23:03:52 +0000304}
305
306// CHECK: @multi_I
307void multi_I()
308{
309 // CHECK: asm "foo $1,$0", "=*r|m|m,r|I|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000310 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,I,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000311}
312
313// CHECK: @multi_J
314void multi_J()
315{
316 // CHECK: asm "foo $1,$0", "=*r|m|m,r|J|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000317 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,J,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000318}
319
320// CHECK: @multi_K
321void multi_K()
322{
323 // CHECK: asm "foo $1,$0", "=*r|m|m,r|K|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000324 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,K,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000325}
326
327// CHECK: @multi_L
328void multi_L()
329{
330 // CHECK: asm "foo $1,$0", "=*r|m|m,r|L|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000331 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,L,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000332}
333
334// CHECK: @multi_M
335void multi_M()
336{
337 // CHECK: asm "foo $1,$0", "=*r|m|m,r|M|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000338 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,M,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000339}
340
341// CHECK: @multi_N
342void multi_N()
343{
344 // CHECK: asm "foo $1,$0", "=*r|m|m,r|N|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000345 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,N,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000346}
347
348// CHECK: @multi_G
349void multi_G()
350{
351 // CHECK: asm "foo $1,$0", "=*r|m|m,r|G|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000352 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,G,m" (1.0));
John Thompson926ee132010-11-02 23:03:52 +0000353}
354
355// CHECK: @multi_C
356void multi_C()
357{
358 // CHECK: asm "foo $1,$0", "=*r|m|m,r|C|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
John Thompson8d8420e2011-03-24 18:51:57 +0000359 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,C,m" (1.0));
John Thompson926ee132010-11-02 23:03:52 +0000360}
361
362// CHECK: @multi_e
363void multi_e()
364{
365 // CHECK: asm "foo $1,$0", "=*r|m|m,r|e|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000366 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,e,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000367}
368
369// CHECK: @multi_Z
370void multi_Z()
371{
372 // CHECK: asm "foo $1,$0", "=*r|m|m,r|Z|m[[CLOBBERS]](i32* @mout0, i32 1)
John Thompson8d8420e2011-03-24 18:51:57 +0000373 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,Z,m" (1));
John Thompson926ee132010-11-02 23:03:52 +0000374}