Clang Project

clang_source_code/test/CodeGen/mult-alt-x86.c
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
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_Y()
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 255)
148  asm("foo %1,%0" : "=m" (mout0) : "L" (0xff));
149  // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 65535)
150  asm("foo %1,%0" : "=m" (mout0) : "L" (0xffff));
151  // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 -1)
152  asm("foo %1,%0" : "=m" (mout0) : "L" (0xffffffff));
153}
154
155// CHECK: @single_M
156void single_M()
157{
158  // CHECK: asm "foo $1,$0", "=*m,M[[CLOBBERS]](i32* @mout0, i32 1)
159  asm("foo %1,%0" : "=m" (mout0) : "M" (1));
160}
161
162// CHECK: @single_N
163void single_N()
164{
165  // CHECK: asm "foo $1,$0", "=*m,N[[CLOBBERS]](i32* @mout0, i32 1)
166  asm("foo %1,%0" : "=m" (mout0) : "N" (1));
167}
168
169// CHECK: @single_G
170void single_G()
171{
172  // CHECK: asm "foo $1,$0", "=*m,G[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
173  asm("foo %1,%0" : "=m" (mout0) : "G" (1.0));
174}
175
176// CHECK: @single_C
177void single_C()
178{
179  // CHECK: asm "foo $1,$0", "=*m,C[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
180  asm("foo %1,%0" : "=m" (mout0) : "C" (1.0));
181}
182
183// CHECK: @single_e
184void single_e()
185{
186  // CHECK: asm "foo $1,$0", "=*m,e[[CLOBBERS]](i32* @mout0, i32 1)
187  asm("foo %1,%0" : "=m" (mout0) : "e" (1));
188}
189
190// CHECK: @single_Z
191void single_Z()
192{
193  // CHECK: asm "foo $1,$0", "=*m,Z[[CLOBBERS]](i32* @mout0, i32 1)
194  asm("foo %1,%0" : "=m" (mout0) : "Z" (1));
195}
196
197// CHECK: @multi_R
198void multi_R()
199{
200  // CHECK: asm "foo $1,$0", "=*r|R|m,r|R|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
201  asm("foo %1,%0" : "=r,R,m" (mout0) : "r,R,m" (min1));
202}
203
204// CHECK: @multi_q
205void multi_q()
206{
207  // CHECK: asm "foo $1,$0", "=*r|q|m,r|q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
208  asm("foo %1,%0" : "=r,q,m" (mout0) : "r,q,m" (min1));
209}
210
211// CHECK: @multi_Q
212void multi_Q()
213{
214  // CHECK: asm "foo $1,$0", "=*r|Q|m,r|Q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
215  asm("foo %1,%0" : "=r,Q,m" (mout0) : "r,Q,m" (min1));
216}
217
218// CHECK: @multi_a
219void multi_a()
220{
221  // CHECK: asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
222  asm("foo %1,%0" : "=r,a,m" (mout0) : "r,a,m" (min1));
223}
224
225// CHECK: @multi_b
226void multi_b()
227{
228  // CHECK: asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
229  asm("foo %1,%0" : "=r,b,m" (mout0) : "r,b,m" (min1));
230}
231
232// CHECK: @multi_c
233void multi_c()
234{
235  // CHECK: asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
236  asm("foo %1,%0" : "=r,c,m" (mout0) : "r,c,m" (min1));
237}
238
239// CHECK: @multi_d
240void multi_d()
241{
242  // CHECK: asm "foo $1,$0", "=*r|{dx}|m,r|{dx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
243  asm("foo %1,%0" : "=r,d,m" (mout0) : "r,d,m" (min1));
244}
245
246// CHECK: @multi_S
247void multi_S()
248{
249  // CHECK: asm "foo $1,$0", "=*r|{si}|m,r|{si}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
250  asm("foo %1,%0" : "=r,S,m" (mout0) : "r,S,m" (min1));
251}
252
253// CHECK: @multi_D
254void multi_D()
255{
256  // CHECK: asm "foo $1,$0", "=*r|{di}|m,r|{di}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
257  asm("foo %1,%0" : "=r,D,m" (mout0) : "r,D,m" (min1));
258}
259
260// CHECK: @multi_A
261void multi_A()
262{
263  // CHECK: asm "foo $1,$0", "=*r|A|m,r|A|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}})
264  asm("foo %1,%0" : "=r,A,m" (mout0) : "r,A,m" (min1));
265}
266
267// CHECK: @multi_f
268void multi_f()
269{
270//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
271}
272
273// CHECK: @multi_t
274void multi_t()
275{
276//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
277}
278
279// CHECK: @multi_u
280void multi_u()
281{
282//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80.
283}
284
285// CHECK: @multi_y
286void multi_y()
287{
288  // CHECK: asm "foo $1,$0", "=*r|y|m,r|y|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
289  asm("foo %1,%0" : "=r,y,m" (dout0) : "r,y,m" (din1));
290}
291
292// CHECK: @multi_x
293void multi_x()
294{
295  // CHECK: asm "foo $1,$0", "=*r|x|m,r|x|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}})
296  asm("foo %1,%0" : "=r,x,m" (dout0) : "r,x,m" (din1));
297}
298
299// CHECK: @multi_Y
300void multi_Y0()
301{
302  // Y constraint currently broken.
303  //asm("foo %1,%0" : "=r,Y0,m" (mout0) : "r,Y0,m" (min1));
304  //asm("foo %1,%0" : "=r,Yz,m" (mout0) : "r,Yz,m" (min1));
305  //asm("foo %1,%0" : "=r,Yt,m" (mout0) : "r,Yt,m" (min1));
306  //asm("foo %1,%0" : "=r,Yi,m" (mout0) : "r,Yi,m" (min1));
307  //asm("foo %1,%0" : "=r,Ym,m" (mout0) : "r,Ym,m" (min1));
308}
309
310// CHECK: @multi_I
311void multi_I()
312{
313  // CHECK: asm "foo $1,$0", "=*r|m|m,r|I|m[[CLOBBERS]](i32* @mout0, i32 1)
314  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,I,m" (1));
315}
316
317// CHECK: @multi_J
318void multi_J()
319{
320  // CHECK: asm "foo $1,$0", "=*r|m|m,r|J|m[[CLOBBERS]](i32* @mout0, i32 1)
321  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,J,m" (1));
322}
323
324// CHECK: @multi_K
325void multi_K()
326{
327  // CHECK: asm "foo $1,$0", "=*r|m|m,r|K|m[[CLOBBERS]](i32* @mout0, i32 1)
328  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,K,m" (1));
329}
330
331// CHECK: @multi_L
332void multi_L()
333{
334  // CHECK: asm "foo $1,$0", "=*r|m|m,r|L|m[[CLOBBERS]](i32* @mout0, i32 1)
335  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,L,m" (1));
336}
337
338// CHECK: @multi_M
339void multi_M()
340{
341  // CHECK: asm "foo $1,$0", "=*r|m|m,r|M|m[[CLOBBERS]](i32* @mout0, i32 1)
342  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,M,m" (1));
343}
344
345// CHECK: @multi_N
346void multi_N()
347{
348  // CHECK: asm "foo $1,$0", "=*r|m|m,r|N|m[[CLOBBERS]](i32* @mout0, i32 1)
349  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,N,m" (1));
350}
351
352// CHECK: @multi_G
353void multi_G()
354{
355  // CHECK: asm "foo $1,$0", "=*r|m|m,r|G|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
356  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,G,m" (1.0));
357}
358
359// CHECK: @multi_C
360void multi_C()
361{
362  // CHECK: asm "foo $1,$0", "=*r|m|m,r|C|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}})
363  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,C,m" (1.0));
364}
365
366// CHECK: @multi_e
367void multi_e()
368{
369  // CHECK: asm "foo $1,$0", "=*r|m|m,r|e|m[[CLOBBERS]](i32* @mout0, i32 1)
370  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,e,m" (1));
371}
372
373// CHECK: @multi_Z
374void multi_Z()
375{
376  // CHECK: asm "foo $1,$0", "=*r|m|m,r|Z|m[[CLOBBERS]](i32* @mout0, i32 1)
377  asm("foo %1,%0" : "=r,m,m" (mout0) : "r,Z,m" (1));
378}
379