• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // 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 
4 int mout0;
5 int min1;
6 int marray[2];
7 double dout0;
8 double din1;
9 
10 // CHECK: @single_R
single_R()11 void 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
single_q()18 void 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
single_Q()25 void 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
single_a()32 void 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
single_b()39 void 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
single_c()46 void 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
single_d()53 void 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
single_S()60 void 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
single_D()67 void 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
single_A()74 void 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
single_f()81 void 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
single_t()87 void 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
single_u()93 void 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
single_y()99 void 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
single_x()106 void 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
single_Y0()113 void 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
single_I()124 void 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
single_J()131 void 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
single_K()138 void 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
single_L()145 void 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
single_M()152 void 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
single_N()159 void 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
single_G()166 void 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
single_C()173 void 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
single_e()180 void 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
single_Z()187 void 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
multi_R()194 void multi_R()
195 {
196   // CHECK: asm "foo $1,$0", "=*r|R|m,r|R|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
197   asm("foo %1,%0" : "=r,R,m" (mout0) : "r,R,m" (min1));
198 }
199 
200 // CHECK: @multi_q
multi_q()201 void multi_q()
202 {
203   // CHECK: asm "foo $1,$0", "=*r|q|m,r|q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
204   asm("foo %1,%0" : "=r,q,m" (mout0) : "r,q,m" (min1));
205 }
206 
207 // CHECK: @multi_Q
multi_Q()208 void multi_Q()
209 {
210   // CHECK: asm "foo $1,$0", "=*r|Q|m,r|Q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
211   asm("foo %1,%0" : "=r,Q,m" (mout0) : "r,Q,m" (min1));
212 }
213 
214 // CHECK: @multi_a
multi_a()215 void multi_a()
216 {
217   // CHECK: asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
218   asm("foo %1,%0" : "=r,a,m" (mout0) : "r,a,m" (min1));
219 }
220 
221 // CHECK: @multi_b
multi_b()222 void multi_b()
223 {
224   // CHECK: asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
225   asm("foo %1,%0" : "=r,b,m" (mout0) : "r,b,m" (min1));
226 }
227 
228 // CHECK: @multi_c
multi_c()229 void multi_c()
230 {
231   // CHECK: asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
232   asm("foo %1,%0" : "=r,c,m" (mout0) : "r,c,m" (min1));
233 }
234 
235 // CHECK: @multi_d
multi_d()236 void multi_d()
237 {
238   // 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));
240 }
241 
242 // CHECK: @multi_S
multi_S()243 void multi_S()
244 {
245   // CHECK: asm "foo $1,$0", "=*r|{si}|m,r|{si}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
246   asm("foo %1,%0" : "=r,S,m" (mout0) : "r,S,m" (min1));
247 }
248 
249 // CHECK: @multi_D
multi_D()250 void multi_D()
251 {
252   // CHECK: asm "foo $1,$0", "=*r|{di}|m,r|{di}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
253   asm("foo %1,%0" : "=r,D,m" (mout0) : "r,D,m" (min1));
254 }
255 
256 // CHECK: @multi_A
multi_A()257 void multi_A()
258 {
259   // CHECK: asm "foo $1,$0", "=*r|A|m,r|A|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
260   asm("foo %1,%0" : "=r,A,m" (mout0) : "r,A,m" (min1));
261 }
262 
263 // CHECK: @multi_f
multi_f()264 void 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
multi_t()270 void 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
multi_u()276 void 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
multi_y()282 void multi_y()
283 {
284   // CHECK: asm "foo $1,$0", "=*r|y|m,r|y|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
285   asm("foo %1,%0" : "=r,y,m" (dout0) : "r,y,m" (din1));
286 }
287 
288 // CHECK: @multi_x
multi_x()289 void multi_x()
290 {
291   // CHECK: asm "foo $1,$0", "=*r|x|m,r|x|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
292   asm("foo %1,%0" : "=r,x,m" (dout0) : "r,x,m" (din1));
293 }
294 
295 // CHECK: @multi_Y
multi_Y0()296 void multi_Y0()
297 {
298   // Y constraint currently broken.
299   //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));
304 }
305 
306 // CHECK: @multi_I
multi_I()307 void multi_I()
308 {
309   // CHECK: asm "foo $1,$0", "=*r|m|m,r|I|m[[CLOBBERS]](i32* @mout0, i32 1)
310   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,I,m" (1));
311 }
312 
313 // CHECK: @multi_J
multi_J()314 void multi_J()
315 {
316   // CHECK: asm "foo $1,$0", "=*r|m|m,r|J|m[[CLOBBERS]](i32* @mout0, i32 1)
317   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,J,m" (1));
318 }
319 
320 // CHECK: @multi_K
multi_K()321 void multi_K()
322 {
323   // CHECK: asm "foo $1,$0", "=*r|m|m,r|K|m[[CLOBBERS]](i32* @mout0, i32 1)
324   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,K,m" (1));
325 }
326 
327 // CHECK: @multi_L
multi_L()328 void multi_L()
329 {
330   // CHECK: asm "foo $1,$0", "=*r|m|m,r|L|m[[CLOBBERS]](i32* @mout0, i32 1)
331   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,L,m" (1));
332 }
333 
334 // CHECK: @multi_M
multi_M()335 void multi_M()
336 {
337   // CHECK: asm "foo $1,$0", "=*r|m|m,r|M|m[[CLOBBERS]](i32* @mout0, i32 1)
338   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,M,m" (1));
339 }
340 
341 // CHECK: @multi_N
multi_N()342 void multi_N()
343 {
344   // CHECK: asm "foo $1,$0", "=*r|m|m,r|N|m[[CLOBBERS]](i32* @mout0, i32 1)
345   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,N,m" (1));
346 }
347 
348 // CHECK: @multi_G
multi_G()349 void multi_G()
350 {
351   // CHECK: asm "foo $1,$0", "=*r|m|m,r|G|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
352   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,G,m" (1.0));
353 }
354 
355 // CHECK: @multi_C
multi_C()356 void multi_C()
357 {
358   // CHECK: asm "foo $1,$0", "=*r|m|m,r|C|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
359   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,C,m" (1.0));
360 }
361 
362 // CHECK: @multi_e
multi_e()363 void multi_e()
364 {
365   // CHECK: asm "foo $1,$0", "=*r|m|m,r|e|m[[CLOBBERS]](i32* @mout0, i32 1)
366   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,e,m" (1));
367 }
368 
369 // CHECK: @multi_Z
multi_Z()370 void multi_Z()
371 {
372   // CHECK: asm "foo $1,$0", "=*r|m|m,r|Z|m[[CLOBBERS]](i32* @mout0, i32 1)
373   asm("foo %1,%0" : "=r,m,m" (mout0) : "r,Z,m" (1));
374 }
375