xref: /llvm-project/clang/test/CodeGen/inline-asm-x86-flag-output.c (revision 05670b42f5b45710bfdba48dcb7e8c30c8c7478f)
1 // RUN: %clang_cc1 -O2 -emit-llvm %s -o - -triple x86_64-unknown-linux-gnu | FileCheck %s
2 
test_cca(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccae(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccb(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccbe(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccc(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_cce(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccz(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccg(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccge(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccl(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccle(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccna(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnae(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnb(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnbe(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnc(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccne(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnz(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccng(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnge(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnl(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnle(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccno(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccnp(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccns(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_cco(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccp(long nr,volatile long * addr)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}"(ptr elementtype(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 
test_ccs(long nr,volatile long * addr)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}"(ptr elementtype(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 
check_no_clobber_conflicts(void)367 _Bool check_no_clobber_conflicts(void) {
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 
test_assume_boolean_flag(long nr,volatile long * addr)378 int test_assume_boolean_flag(long nr, volatile long *addr) {
379   //CHECK-LABEL: @test_assume_boolean_flag
380   //CHECK: %0 = tail call { i32, i32 } asm "cmp $2,$1", "={@cca},={@ccae},=*m,r,~{cc},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i64) %addr, i64 %nr)
381   //CHECK: [[RES1:%.*]] = extractvalue { i32, i32 } %0, 0
382   //CHECK: [[RES2:%.*]] = extractvalue { i32, i32 } %0, 1
383   //CHECK: %1 = icmp ult i32 [[RES1]], 2
384   //CHECK: tail call void @llvm.assume(i1 %1)
385   //CHECK: %2 = icmp ult i32 [[RES2]], 2
386   //CHECK: tail call void @llvm.assume(i1 %2)
387   int x,y;
388   asm("cmp %2,%1"
389       : "=@cca"(x), "=@ccae"(y), "=m"(*(volatile long *)(addr))
390       : "r"(nr)
391       : "cc");
392   if (x)
393     return 0;
394   return 1;
395 }
396