blob: 111679e3a980eb18b0b109abc37a743915c20235 [file] [log] [blame]
John Thompson926ee132010-11-02 23:03:52 +00001// RUN: %clang_cc1 -triple i686 %s -emit-llvm -o - | FileCheck %s
2// RUN: %clang_cc1 -triple x86_64 %s -emit-llvm -o - | FileCheck %s
3// RUN: %clang_cc1 -triple arm %s -emit-llvm -o - | FileCheck %s
John Thompson926ee132010-11-02 23:03:52 +00004// RUN: %clang_cc1 -triple mblaze %s -emit-llvm -o - | FileCheck %s
5// RUN: %clang_cc1 -triple mips %s -emit-llvm -o - | FileCheck %s
6// RUN: %clang_cc1 -triple mipsel %s -emit-llvm -o - | FileCheck %s
7// RUN: %clang_cc1 -triple powerpc %s -emit-llvm -o - | FileCheck %s
8// RUN: %clang_cc1 -triple powerpc64 %s -emit-llvm -o - | FileCheck %s
Ulrich Weigandb8409212013-05-06 16:26:41 +00009// RUN: %clang_cc1 -triple s390x %s -emit-llvm -o - | FileCheck %s
John Thompson926ee132010-11-02 23:03:52 +000010// RUN: %clang_cc1 -triple sparc %s -emit-llvm -o - | FileCheck %s
Jakob Stoklund Olesen56e1f1f2013-04-16 15:17:49 +000011// RUN: %clang_cc1 -triple sparcv9 %s -emit-llvm -o - | FileCheck %s
John Thompson926ee132010-11-02 23:03:52 +000012// RUN: %clang_cc1 -triple thumb %s -emit-llvm -o - | FileCheck %s
13
14int mout0;
15int min1;
16int marray[2];
17
18// CHECK: @single_m
19void single_m()
20{
21 // CHECK: call void asm "foo $1,$0", "=*m,*m[[CLOBBERS:[a-zA-Z0-9@%{},~_ ]*\"]](i32* {{[a-zA-Z0-9@%]+}}, i32* {{[a-zA-Z0-9@%]+}})
22 asm("foo %1,%0" : "=m" (mout0) : "m" (min1));
23}
24
25// CHECK: @single_o
26void single_o()
27{
28 register int out0 = 0;
29 register int index = 1;
30 // Doesn't really do an offset...
31 //asm("foo %1, %2,%0" : "=r" (out0) : "o" (min1));
32}
33
34// CHECK: @single_V
35void single_V()
36{
37// asm("foo %1,%0" : "=m" (mout0) : "V" (min1));
38}
39
40// CHECK: @single_lt
41void single_lt()
42{
43 register int out0 = 0;
44 register int in1 = 1;
45 // CHECK: call i32 asm "foo $1,$0", "=r,<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
46 asm("foo %1,%0" : "=r" (out0) : "<r" (in1));
47 // CHECK: call i32 asm "foo $1,$0", "=r,r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
48 asm("foo %1,%0" : "=r" (out0) : "r<" (in1));
49}
50
51// CHECK: @single_gt
52void single_gt()
53{
54 register int out0 = 0;
55 register int in1 = 1;
56 // CHECK: call i32 asm "foo $1,$0", "=r,>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
57 asm("foo %1,%0" : "=r" (out0) : ">r" (in1));
58 // CHECK: call i32 asm "foo $1,$0", "=r,r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
59 asm("foo %1,%0" : "=r" (out0) : "r>" (in1));
60}
61
62// CHECK: @single_r
63void single_r()
64{
65 register int out0 = 0;
66 register int in1 = 1;
67 // CHECK: call i32 asm "foo $1,$0", "=r,r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
68 asm("foo %1,%0" : "=r" (out0) : "r" (in1));
69}
70
71// CHECK: @single_i
72void single_i()
73{
74 register int out0 = 0;
75 // CHECK: call i32 asm "foo $1,$0", "=r,i[[CLOBBERS]](i32 1)
76 asm("foo %1,%0" : "=r" (out0) : "i" (1));
77}
78
79// CHECK: @single_n
80void single_n()
81{
82 register int out0 = 0;
83 // CHECK: call i32 asm "foo $1,$0", "=r,n[[CLOBBERS]](i32 1)
84 asm("foo %1,%0" : "=r" (out0) : "n" (1));
85}
86
87// CHECK: @single_E
88void single_E()
89{
90 register double out0 = 0.0;
91 // CHECK: call double asm "foo $1,$0", "=r,E[[CLOBBERS]](double {{[0-9.eE+-]+}})
92 asm("foo %1,%0" : "=r" (out0) : "E" (1.0e+01));
93}
94
95// CHECK: @single_F
96void single_F()
97{
98 register double out0 = 0.0;
99 // CHECK: call double asm "foo $1,$0", "=r,F[[CLOBBERS]](double {{[0-9.eE+-]+}})
100 asm("foo %1,%0" : "=r" (out0) : "F" (1.0));
101}
102
103// CHECK: @single_s
104void single_s()
105{
106 register int out0 = 0;
107 //asm("foo %1,%0" : "=r" (out0) : "s" (single_s));
108}
109
110// CHECK: @single_g
111void single_g()
112{
113 register int out0 = 0;
114 register int in1 = 1;
115 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
116 asm("foo %1,%0" : "=r" (out0) : "g" (in1));
117 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
118 asm("foo %1,%0" : "=r" (out0) : "g" (min1));
119 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 1)
120 asm("foo %1,%0" : "=r" (out0) : "g" (1));
121}
122
123// CHECK: @single_X
124void single_X()
125{
126 register int out0 = 0;
127 register int in1 = 1;
128 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
129 asm("foo %1,%0" : "=r" (out0) : "X" (in1));
130 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
131 asm("foo %1,%0" : "=r" (out0) : "X" (min1));
132 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 1)
133 asm("foo %1,%0" : "=r" (out0) : "X" (1));
134 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0))
135 asm("foo %1,%0" : "=r" (out0) : "X" (marray));
136 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}})
137 asm("foo %1,%0" : "=r" (out0) : "X" (1.0e+01));
138 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}})
139 asm("foo %1,%0" : "=r" (out0) : "X" (1.0));
140}
141
142// CHECK: @single_p
143void single_p()
144{
145 register int out0 = 0;
146 // Constraint converted differently on different platforms moved to platform-specific.
147 // : call i32 asm "foo $1,$0", "=r,im[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0))
148 asm("foo %1,%0" : "=r" (out0) : "p" (marray));
149}
150
151// CHECK: @multi_m
152void multi_m()
153{
154 // CHECK: call void asm "foo $1,$0", "=*m|r,m|r[[CLOBBERS]](i32* {{[a-zA-Z0-9@%]+}}, i32 {{[a-zA-Z0-9@%]+}})
155 asm("foo %1,%0" : "=m,r" (mout0) : "m,r" (min1));
156}
157
158// CHECK: @multi_o
159void multi_o()
160{
161 register int out0 = 0;
162 register int index = 1;
163 // Doesn't really do an offset...
164 //asm("foo %1, %2,%0" : "=r,r" (out0) : "r,o" (min1));
165}
166
167// CHECK: @multi_V
168void multi_V()
169{
170// asm("foo %1,%0" : "=m,r" (mout0) : "r,V" (min1));
171}
172
173// CHECK: @multi_lt
174void multi_lt()
175{
176 register int out0 = 0;
177 register int in1 = 1;
178 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
179 asm("foo %1,%0" : "=r,r" (out0) : "r,<r" (in1));
180 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
181 asm("foo %1,%0" : "=r,r" (out0) : "r,r<" (in1));
182}
183
184// CHECK: @multi_gt
185void multi_gt()
186{
187 register int out0 = 0;
188 register int in1 = 1;
189 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
190 asm("foo %1,%0" : "=r,r" (out0) : "r,>r" (in1));
191 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
192 asm("foo %1,%0" : "=r,r" (out0) : "r,r>" (in1));
193}
194
195// CHECK: @multi_r
196void multi_r()
197{
198 register int out0 = 0;
199 register int in1 = 1;
200 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|m[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
201 asm("foo %1,%0" : "=r,r" (out0) : "r,m" (in1));
202}
203
204// CHECK: @multi_i
205void multi_i()
206{
207 register int out0 = 0;
208 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|i[[CLOBBERS]](i32 1)
209 asm("foo %1,%0" : "=r,r" (out0) : "r,i" (1));
210}
211
212// CHECK: @multi_n
213void multi_n()
214{
215 register int out0 = 0;
216 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|n[[CLOBBERS]](i32 1)
217 asm("foo %1,%0" : "=r,r" (out0) : "r,n" (1));
218}
219
220// CHECK: @multi_E
221void multi_E()
222{
223 register double out0 = 0.0;
224 // CHECK: call double asm "foo $1,$0", "=r|r,r|E[[CLOBBERS]](double {{[0-9.eE+-]+}})
225 asm("foo %1,%0" : "=r,r" (out0) : "r,E" (1.0e+01));
226}
227
228// CHECK: @multi_F
229void multi_F()
230{
231 register double out0 = 0.0;
232 // CHECK: call double asm "foo $1,$0", "=r|r,r|F[[CLOBBERS]](double {{[0-9.eE+-]+}})
233 asm("foo %1,%0" : "=r,r" (out0) : "r,F" (1.0));
234}
235
236// CHECK: @multi_s
237void multi_s()
238{
239 register int out0 = 0;
240 //asm("foo %1,%0" : "=r,r" (out0) : "r,s" (multi_s));
241}
242
243// CHECK: @multi_g
244void multi_g()
245{
246 register int out0 = 0;
247 register int in1 = 1;
248 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
249 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (in1));
250 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
251 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (min1));
252 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 1)
253 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (1));
254}
255
256// CHECK: @multi_X
257void multi_X()
258{
259 register int out0 = 0;
260 register int in1 = 1;
261 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
262 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (in1));
263 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}})
264 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (min1));
265 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 1)
266 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1));
267 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0))
268 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (marray));
269 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}})
270 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0e+01));
271 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}})
272 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0));
273}
274
275// CHECK: @multi_p
276void multi_p()
277{
278 register int out0 = 0;
279 // Constraint converted differently on different platforms moved to platform-specific.
280 // : call i32 asm "foo $1,$0", "=r|r,r|im[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0))
281 asm("foo %1,%0" : "=r,r" (out0) : "r,p" (marray));
282}