blob: 019eb9ca3e6735063277f747351eb1af629359b7 [file] [log] [blame]
Chris Lattnerb9922592010-03-03 21:52:23 +00001// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
Chris Lattner9f5bff02011-07-23 20:04:25 +00002
3// PR10415
4__asm__ ("foo1");
5__asm__ ("foo2");
6__asm__ ("foo3");
7// CHECK: module asm "foo1"
8// CHECK-NEXT: module asm "foo2"
9// CHECK-NEXT: module asm "foo3"
10
Chris Lattner10ca96a2009-03-10 06:33:24 +000011void t1(int len) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000012 __asm__ volatile("" : "=&r"(len), "+&r"(len));
Anders Carlsson2763b3a2009-01-11 19:46:50 +000013}
Anders Carlsson9f2505b2009-01-11 21:23:27 +000014
Chris Lattner10ca96a2009-03-10 06:33:24 +000015void t2(unsigned long long t) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000016 __asm__ volatile("" : "+m"(t));
17}
18
Chris Lattner10ca96a2009-03-10 06:33:24 +000019void t3(unsigned char *src, unsigned long long temp) {
Anders Carlsson9f2505b2009-01-11 21:23:27 +000020 __asm__ volatile("" : "+m"(temp), "+r"(src));
21}
22
Chris Lattner10ca96a2009-03-10 06:33:24 +000023void t4() {
Anders Carlssonebaae2a2009-01-12 02:22:13 +000024 unsigned long long a;
25 struct reg { unsigned long long a, b; } b;
26
Mike Stump1eb44332009-09-09 15:08:12 +000027 __asm__ volatile ("":: "m"(a), "m"(b));
Anders Carlssonebaae2a2009-01-12 02:22:13 +000028}
Anders Carlsson9f2505b2009-01-11 21:23:27 +000029
Anders Carlsson03eb5432009-01-27 20:38:24 +000030// PR3417
Chris Lattner10ca96a2009-03-10 06:33:24 +000031void t5(int i) {
Anders Carlsson03eb5432009-01-27 20:38:24 +000032 asm("nop" : "=r"(i) : "0"(t5));
33}
Anders Carlsson60329792009-02-22 02:11:23 +000034
35// PR3641
Chris Lattner10ca96a2009-03-10 06:33:24 +000036void t6(void) {
Anders Carlsson60329792009-02-22 02:11:23 +000037 __asm__ volatile("" : : "i" (t6));
38}
Chris Lattner10ca96a2009-03-10 06:33:24 +000039
Chris Lattner10ca96a2009-03-10 06:33:24 +000040void t7(int a) {
41 __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
Chris Lattner29a40712010-03-04 00:38:16 +000042 // CHECK: @t7(i32
43 // CHECK: T7 NAMED: $1
Chris Lattner02af9742009-03-10 06:38:02 +000044}
45
Chris Lattner02af9742009-03-10 06:38:02 +000046void t8() {
47 __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
Chris Lattner29a40712010-03-04 00:38:16 +000048 // CHECK: @t8()
49 // CHECK: T8 NAMED MODIFIER: ${0:c}
Chris Lattner02af9742009-03-10 06:38:02 +000050}
Chris Lattner88beebe2009-03-10 06:42:37 +000051
52// PR3682
53unsigned t9(unsigned int a) {
54 asm("bswap %0 %1" : "+r" (a));
55 return a;
56}
Anders Carlssonec91dab2009-04-03 05:57:08 +000057
58// PR3908
Anders Carlssonec91dab2009-04-03 05:57:08 +000059void t10(int r) {
60 __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0)));
Eric Christopher78b92912011-07-07 23:11:01 +000061
Chris Lattner29a40712010-03-04 00:38:16 +000062// CHECK: @t10(
63// CHECK:PR3908 $1 $3 $2 $0
Eric Christopher78b92912011-07-07 23:11:01 +000064}
Chris Lattner4df4ee02009-05-03 07:27:51 +000065
66
67// PR3373
68unsigned t11(signed char input) {
69 unsigned output;
70 __asm__("xyz"
71 : "=a" (output)
72 : "0" (input));
73 return output;
74}
Chris Lattnerede9d902009-05-03 07:53:25 +000075
Chris Lattnera077b5c2009-05-03 08:21:20 +000076// PR3373
77unsigned char t12(unsigned input) {
78 unsigned char output;
79 __asm__("xyz"
80 : "=a" (output)
81 : "0" (input));
82 return output;
83}
Chris Lattnerede9d902009-05-03 07:53:25 +000084
Chris Lattner3351f112009-05-03 08:32:32 +000085unsigned char t13(unsigned input) {
86 unsigned char output;
87 __asm__("xyz %1"
88 : "=a" (output)
89 : "0" (input));
90 return output;
91}
Chris Lattnerede9d902009-05-03 07:53:25 +000092
Chris Lattner0bdaa5b2009-05-03 09:05:53 +000093struct large {
94 int x[1000];
95};
96
97unsigned long t15(int x, struct large *P) {
98 __asm__("xyz "
99 : "=r" (x)
100 : "m" (*P), "0" (x));
101 return x;
102}
103
104
105
Chris Lattner3351f112009-05-03 08:32:32 +0000106
107// bitfield destination of an asm.
Chris Lattnerede9d902009-05-03 07:53:25 +0000108struct S {
109 int a : 4;
110};
111
Chris Lattner3351f112009-05-03 08:32:32 +0000112void t14(struct S *P) {
Chris Lattnerede9d902009-05-03 07:53:25 +0000113 __asm__("abc %0" : "=r"(P->a) );
114}
Chris Lattner3351f112009-05-03 08:32:32 +0000115
116
Chris Lattner40539832009-10-13 04:32:07 +0000117// PR4938
118int t16() {
119 int a,b;
120 asm ( "nop;"
121 :"=%c" (a)
122 : "r" (b)
123 );
124 return 0;
125}
Chris Lattnerb9922592010-03-03 21:52:23 +0000126
127// PR6475
128void t17() {
129 int i;
130 __asm__ ( "nop": "=m"(i));
Eric Christopher78b92912011-07-07 23:11:01 +0000131
Chris Lattnerb9922592010-03-03 21:52:23 +0000132// CHECK: @t17()
133// CHECK: call void asm "nop", "=*m,
134}
135
Chris Lattnereeeb49a2010-03-03 21:56:57 +0000136// <rdar://problem/6841383>
137int t18(unsigned data) {
138 int a, b;
Eric Christopher78b92912011-07-07 23:11:01 +0000139
Chris Lattnereeeb49a2010-03-03 21:56:57 +0000140 asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
141 return a + b;
142// CHECK: t18(i32
143// CHECK: = call {{.*}}asm "xyz"
144// CHECK-NEXT: extractvalue
145// CHECK-NEXT: extractvalue
146}
Chris Lattner018b54e2010-04-05 18:44:00 +0000147
148
149// PR6780
150int t19(unsigned data) {
151 int a, b;
Eric Christopher78b92912011-07-07 23:11:01 +0000152
Chris Lattner018b54e2010-04-05 18:44:00 +0000153 asm("x{abc|def|ghi}z" :"=r"(a): "r"(data));
154 return a + b;
155 // CHECK: t19(i32
156 // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z"
157}
158
Chris Lattneraab64d02010-04-23 17:27:29 +0000159
160// PR6845 - Mismatching source/dest fp types.
161double t20(double x) {
162 register long double result;
163 __asm __volatile ("frndint" : "=t" (result) : "0" (x));
164 return result;
Eric Christopher78b92912011-07-07 23:11:01 +0000165
Chris Lattneraab64d02010-04-23 17:27:29 +0000166 // CHECK: @t20
167 // CHECK: fpext double {{.*}} to x86_fp80
168 // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint"
169 // CHECK: fptrunc x86_fp80 {{.*}} to double
170}
171
172float t21(long double x) {
173 register float result;
174 __asm __volatile ("frndint" : "=t" (result) : "0" (x));
175 return result;
176 // CHECK: @t21
177 // CHECK: call x86_fp80 asm sideeffect "frndint"
178 // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float
179}
Dale Johannesen545be512010-08-24 22:33:12 +0000180
181// <rdar://problem/8348447> - accept 'l' constraint
182unsigned char t22(unsigned char a, unsigned char b) {
183 unsigned int la = a;
184 unsigned int lb = b;
185 unsigned int bigres;
186 unsigned char res;
187 __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) :
188 "edx", "cc");
189 res = bigres;
190 return res;
191}
192
193// <rdar://problem/8348447> - accept 'l' constraint
194unsigned char t23(unsigned char a, unsigned char b) {
195 unsigned int la = a;
196 unsigned int lb = b;
197 unsigned char res;
198 __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) :
199 "edx", "cc");
200 return res;
201}
Eric Christopher78b92912011-07-07 23:11:01 +0000202
Peter Collingbourne93f13222011-07-29 00:24:50 +0000203void *t24(char c) {
204 void *addr;
205 // CHECK: @t24
206 // CHECK: zext i8 {{.*}} to i32
207 // CHECK-NEXT: call i8* asm "foobar"
208 __asm__ ("foobar" : "=a" (addr) : "0" (c));
209 return addr;
210}
211
Eric Christopher78b92912011-07-07 23:11:01 +0000212
213// PR10299 - fpsr, fpcr
214void test(void)
215{
216 __asm__ __volatile__( \
217 "finit" \
218 : \
219 : \
220 :"st","st(1)","st(2)","st(3)", \
221 "st(4)","st(5)","st(6)","st(7)", \
222 "fpsr","fpcr" \
223 );
224}