1 // RUN: %clang_cc1 -O2 -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s
2 
3 int test_cca(long nr, volatile long *addr) {
4   //CHECK-LABEL: @test_cca
5   //CHECK: = tail call i32 asm "cmp $2,$1", "={@cca},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
6   int x;
7   asm("cmp %2,%1"
8       : "=@cca"(x), "=m"(*(volatile long *)(addr))
9       : "r"(nr)
10       : "cc");
11   if (x)
12     return 0;
13   return 1;
14 }
15 
16 int test_ccae(long nr, volatile long *addr) {
17   //CHECK-LABEL: @test_ccae
18   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
19   int x;
20   asm("cmp %2,%1"
21       : "=@ccae"(x), "=m"(*(volatile long *)(addr))
22       : "r"(nr)
23       : "cc");
24   if (x)
25     return 0;
26   return 1;
27 }
28 
29 int test_ccb(long nr, volatile long *addr) {
30   //CHECK-LABEL: @test_ccb
31   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
32   int x;
33   asm("cmp %2,%1"
34       : "=@ccb"(x), "=m"(*(volatile long *)(addr))
35       : "r"(nr)
36       : "cc");
37   if (x)
38     return 0;
39   return 1;
40 }
41 
42 int test_ccbe(long nr, volatile long *addr) {
43   //CHECK-LABEL: @test_ccbe
44   //CHECK: tail call i32 asm "cmp $2,$1", "={@ccbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
45   int x;
46   asm("cmp %2,%1"
47       : "=@ccbe"(x), "=m"(*(volatile long *)(addr))
48       : "r"(nr)
49       : "cc");
50   if (x)
51     return 0;
52   return 1;
53 }
54 
55 int test_ccc(long nr, volatile long *addr) {
56   //CHECK-LABEL: @test_ccc
57   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
58   int x;
59   asm("cmp %2,%1"
60       : "=@ccc"(x), "=m"(*(volatile long *)(addr))
61       : "r"(nr)
62       : "cc");
63   if (x)
64     return 0;
65   return 1;
66 }
67 
68 int test_cce(long nr, volatile long *addr) {
69   //CHECK-LABEL: @test_cce
70   //CHECK: = tail call i32 asm "cmp $2,$1", "={@cce},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
71   int x;
72   asm("cmp %2,%1"
73       : "=@cce"(x), "=m"(*(volatile long *)(addr))
74       : "r"(nr)
75       : "cc");
76   if (x)
77     return 0;
78   return 1;
79 }
80 
81 int test_ccz(long nr, volatile long *addr) {
82   //CHECK-LABEL: @test_ccz
83   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
84   int x;
85   asm("cmp %2,%1"
86       : "=@ccz"(x), "=m"(*(volatile long *)(addr))
87       : "r"(nr)
88       : "cc");
89   if (x)
90     return 0;
91   return 1;
92 }
93 
94 int test_ccg(long nr, volatile long *addr) {
95   //CHECK-LABEL: @test_ccg
96   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccg},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
97   int x;
98   asm("cmp %2,%1"
99       : "=@ccg"(x), "=m"(*(volatile long *)(addr))
100       : "r"(nr)
101       : "cc");
102   if (x)
103     return 0;
104   return 1;
105 }
106 
107 int test_ccge(long nr, volatile long *addr) {
108   //CHECK-LABEL: @test_ccge
109   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
110   int x;
111   asm("cmp %2,%1"
112       : "=@ccge"(x), "=m"(*(volatile long *)(addr))
113       : "r"(nr)
114       : "cc");
115   if (x)
116     return 0;
117   return 1;
118 }
119 
120 int test_ccl(long nr, volatile long *addr) {
121   //CHECK-LABEL: @test_ccl
122   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
123   int x;
124   asm("cmp %2,%1"
125       : "=@ccl"(x), "=m"(*(volatile long *)(addr))
126       : "r"(nr)
127       : "cc");
128   if (x)
129     return 0;
130   return 1;
131 }
132 
133 int test_ccle(long nr, volatile long *addr) {
134   //CHECK-LABEL: @test_ccle
135   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
136   int x;
137   asm("cmp %2,%1"
138       : "=@ccle"(x), "=m"(*(volatile long *)(addr))
139       : "r"(nr)
140       : "cc");
141   if (x)
142     return 0;
143   return 1;
144 }
145 
146 int test_ccna(long nr, volatile long *addr) {
147   //CHECK-LABEL: @test_ccna
148   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccna},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
149   int x;
150   asm("cmp %2,%1"
151       : "=@ccna"(x), "=m"(*(volatile long *)(addr))
152       : "r"(nr)
153       : "cc");
154   if (x)
155     return 0;
156   return 1;
157 }
158 
159 int test_ccnae(long nr, volatile long *addr) {
160   //CHECK-LABEL: @test_ccnae
161   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
162   int x;
163   asm("cmp %2,%1"
164       : "=@ccnae"(x), "=m"(*(volatile long *)(addr))
165       : "r"(nr)
166       : "cc");
167   if (x)
168     return 0;
169   return 1;
170 }
171 
172 int test_ccnb(long nr, volatile long *addr) {
173   //CHECK-LABEL: @test_ccnb
174   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnb},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
175   int x;
176   asm("cmp %2,%1"
177       : "=@ccnb"(x), "=m"(*(volatile long *)(addr))
178       : "r"(nr)
179       : "cc");
180   if (x)
181     return 0;
182   return 1;
183 }
184 
185 int test_ccnbe(long nr, volatile long *addr) {
186   //CHECK-LABEL: @test_ccnbe
187   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnbe},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
188   int x;
189   asm("cmp %2,%1"
190       : "=@ccnbe"(x), "=m"(*(volatile long *)(addr))
191       : "r"(nr)
192       : "cc");
193   if (x)
194     return 0;
195   return 1;
196 }
197 
198 int test_ccnc(long nr, volatile long *addr) {
199   //CHECK-LABEL: @test_ccnc
200   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnc},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
201   int x;
202   asm("cmp %2,%1"
203       : "=@ccnc"(x), "=m"(*(volatile long *)(addr))
204       : "r"(nr)
205       : "cc");
206   if (x)
207     return 0;
208   return 1;
209 }
210 
211 int test_ccne(long nr, volatile long *addr) {
212   //CHECK-LABEL: @test_ccne
213   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccne},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
214   int x;
215   asm("cmp %2,%1"
216       : "=@ccne"(x), "=m"(*(volatile long *)(addr))
217       : "r"(nr)
218       : "cc");
219   if (x)
220     return 0;
221   return 1;
222 }
223 
224 int test_ccnz(long nr, volatile long *addr) {
225   //CHECK-LABEL: @test_ccnz
226   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnz},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
227   int x;
228   asm("cmp %2,%1"
229       : "=@ccnz"(x), "=m"(*(volatile long *)(addr))
230       : "r"(nr)
231       : "cc");
232   if (x)
233     return 0;
234   return 1;
235 }
236 
237 int test_ccng(long nr, volatile long *addr) {
238   //CHECK-LABEL: @test_ccng
239   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccng},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
240   int x;
241   asm("cmp %2,%1"
242       : "=@ccng"(x), "=m"(*(volatile long *)(addr))
243       : "r"(nr)
244       : "cc");
245   if (x)
246     return 0;
247   return 1;
248 }
249 
250 int test_ccnge(long nr, volatile long *addr) {
251   //CHECK-LABEL: @test_ccnge
252   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnge},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
253   int x;
254   asm("cmp %2,%1"
255       : "=@ccnge"(x), "=m"(*(volatile long *)(addr))
256       : "r"(nr)
257       : "cc");
258   if (x)
259     return 0;
260   return 1;
261 }
262 
263 int test_ccnl(long nr, volatile long *addr) {
264   //CHECK-LABEL: @test_ccnl
265   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnl},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
266   int x;
267   asm("cmp %2,%1"
268       : "=@ccnl"(x), "=m"(*(volatile long *)(addr))
269       : "r"(nr)
270       : "cc");
271   if (x)
272     return 0;
273   return 1;
274 }
275 
276 int test_ccnle(long nr, volatile long *addr) {
277   //CHECK-LABEL: @test_ccnle
278   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnle},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
279   int x;
280   asm("cmp %2,%1"
281       : "=@ccnle"(x), "=m"(*(volatile long *)(addr))
282       : "r"(nr)
283       : "cc");
284   if (x)
285     return 0;
286   return 1;
287 }
288 
289 int test_ccno(long nr, volatile long *addr) {
290   //CHECK-LABEL: @test_ccno
291   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccno},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
292   int x;
293   asm("cmp %2,%1"
294       : "=@ccno"(x), "=m"(*(volatile long *)(addr))
295       : "r"(nr)
296       : "cc");
297   if (x)
298     return 0;
299   return 1;
300 }
301 
302 int test_ccnp(long nr, volatile long *addr) {
303   //CHECK-LABEL: @test_ccnp
304   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccnp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
305   int x;
306   asm("cmp %2,%1"
307       : "=@ccnp"(x), "=m"(*(volatile long *)(addr))
308       : "r"(nr)
309       : "cc");
310   if (x)
311     return 0;
312   return 1;
313 }
314 
315 int test_ccns(long nr, volatile long *addr) {
316   //CHECK-LABEL: @test_ccns
317   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccns},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
318   int x;
319   asm("cmp %2,%1"
320       : "=@ccns"(x), "=m"(*(volatile long *)(addr))
321       : "r"(nr)
322       : "cc");
323   if (x)
324     return 0;
325   return 1;
326 }
327 
328 int test_cco(long nr, volatile long *addr) {
329   //CHECK-LABEL: @test_cco
330   //CHECK: = tail call i32 asm "cmp $2,$1", "={@cco},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
331   int x;
332   asm("cmp %2,%1"
333       : "=@cco"(x), "=m"(*(volatile long *)(addr))
334       : "r"(nr)
335       : "cc");
336   if (x)
337     return 0;
338   return 1;
339 }
340 
341 int test_ccp(long nr, volatile long *addr) {
342   //CHECK-LABEL: @test_ccp
343   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccp},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
344   int x;
345   asm("cmp %2,%1"
346       : "=@ccp"(x), "=m"(*(volatile long *)(addr))
347       : "r"(nr)
348       : "cc");
349   if (x)
350     return 0;
351   return 1;
352 }
353 
354 int test_ccs(long nr, volatile long *addr) {
355   //CHECK-LABEL: @test_ccs
356   //CHECK: = tail call i32 asm "cmp $2,$1", "={@ccs},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(i64* %addr, i64 %nr)
357   int x;
358   asm("cmp %2,%1"
359       : "=@ccs"(x), "=m"(*(volatile long *)(addr))
360       : "r"(nr)
361       : "cc");
362   if (x)
363     return 0;
364   return 1;
365 }
366 
367 _Bool check_no_clobber_conflicts() {
368   //CHECK-LABEL: @check_no_clobber_conflicts
369   //CHECK:  = tail call i8 asm "", "={@cce},~{cx},~{dirflag},~{fpsr},~{flags}"()
370   _Bool b;
371   asm(""
372       : "=@cce"(b)
373       :
374       : "cx");
375   return b;
376 }
377