asm.c revision 78b929121f44f7c983fce8c871aa913dce087561
1b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
210ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t1(int len) {
39f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "=&r"(len), "+&r"(len));
42763b3af0a527c3a63cb058b90c22db0b7bcf558Anders Carlsson}
59f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
610ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t2(unsigned long long t)  {
79f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "+m"(t));
89f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson}
99f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
1010ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t3(unsigned char *src, unsigned long long temp) {
119f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "+m"(temp), "+r"(src));
129f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson}
139f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
1410ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t4() {
15ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson  unsigned long long a;
16ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson  struct reg { unsigned long long a, b; } b;
17ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson
181eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  __asm__ volatile ("":: "m"(a), "m"(b));
19ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson}
209f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
2103eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson// PR3417
2210ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t5(int i) {
2303eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson  asm("nop" : "=r"(i) : "0"(t5));
2403eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson}
256032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson
266032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson// PR3641
2710ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t6(void) {
286032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson  __asm__ volatile("" : : "i" (t6));
296032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson}
3010ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattner
3110ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t7(int a) {
3210ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattner  __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
3329a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: @t7(i32
3429a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: T7 NAMED: $1
3502af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner}
3602af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner
3702af974dca0f855dc36d8a8c26bb87f373310815Chris Lattnervoid t8() {
3802af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner  __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
3929a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: @t8()
4029a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: T8 NAMED MODIFIER: ${0:c}
4102af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner}
4288beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner
4388beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner// PR3682
4488beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattnerunsigned t9(unsigned int a) {
4588beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner  asm("bswap %0 %1" : "+r" (a));
4688beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner  return a;
4788beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner}
48ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson
49ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson// PR3908
50ec91dab1977154f13621cfb63184364afee84ea1Anders Carlssonvoid t10(int r) {
51ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson  __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0)));
5278b929121f44f7c983fce8c871aa913dce087561Eric Christopher
5329a4071fc450ee17449ad73266012c1b1b975511Chris Lattner// CHECK: @t10(
5429a4071fc450ee17449ad73266012c1b1b975511Chris Lattner// CHECK:PR3908 $1 $3 $2 $0
5578b929121f44f7c983fce8c871aa913dce087561Eric Christopher}
564df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner
574df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner
584df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner// PR3373
594df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattnerunsigned t11(signed char input) {
604df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  unsigned  output;
614df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  __asm__("xyz"
624df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner          : "=a" (output)
634df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner          : "0" (input));
644df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  return output;
654df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner}
66ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
67a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner// PR3373
68a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattnerunsigned char t12(unsigned input) {
69a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  unsigned char output;
70a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  __asm__("xyz"
71a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner          : "=a" (output)
72a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner          : "0" (input));
73a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  return output;
74a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner}
75ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
763351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnerunsigned char t13(unsigned input) {
773351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  unsigned char output;
783351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  __asm__("xyz %1"
793351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner          : "=a" (output)
803351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner          : "0" (input));
813351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  return output;
823351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner}
833351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
840bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerstruct large {
850bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  int x[1000];
860bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner};
870bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
880bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerunsigned long t15(int x, struct large *P) {
890bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  __asm__("xyz "
900bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner          : "=r" (x)
910bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner          : "m" (*P), "0" (x));
920bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  return x;
930bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner}
940bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
950bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
960bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
97ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
983351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner// bitfield destination of an asm.
99ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattnerstruct S {
100ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner  int a : 4;
101ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner};
102ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
1033351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnervoid t14(struct S *P) {
104ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner  __asm__("abc %0" : "=r"(P->a) );
105ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner}
1063351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
1073351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
1084053983963cb94a6129da47bca8cce637c8b7bffChris Lattner// PR4938
1094053983963cb94a6129da47bca8cce637c8b7bffChris Lattnerint t16() {
1104053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  int a,b;
1114053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  asm ( "nop;"
1124053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       :"=%c" (a)
1134053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       : "r" (b)
1144053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       );
1154053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  return 0;
1164053983963cb94a6129da47bca8cce637c8b7bffChris Lattner}
117b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
118b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// PR6475
119b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattnervoid t17() {
120b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  int i;
121b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  __asm__ ( "nop": "=m"(i));
12278b929121f44f7c983fce8c871aa913dce087561Eric Christopher
123b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: @t17()
124b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: call void asm "nop", "=*m,
125b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner}
126b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
127eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// <rdar://problem/6841383>
128eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattnerint t18(unsigned data) {
129eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  int a, b;
13078b929121f44f7c983fce8c871aa913dce087561Eric Christopher
131eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
132eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  return a + b;
133eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: t18(i32
134eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: = call {{.*}}asm "xyz"
135eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
136eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
137eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner}
138018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
139018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
140018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner// PR6780
141018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattnerint t19(unsigned data) {
142018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  int a, b;
14378b929121f44f7c983fce8c871aa913dce087561Eric Christopher
144018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  asm("x{abc|def|ghi}z" :"=r"(a): "r"(data));
145018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  return a + b;
146018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  // CHECK: t19(i32
147018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z"
148018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner}
149018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
150aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner
151aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner// PR6845 - Mismatching source/dest fp types.
152aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattnerdouble t20(double x) {
153aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  register long double result;
154aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
155aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  return result;
15678b929121f44f7c983fce8c871aa913dce087561Eric Christopher
157aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: @t20
158aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: fpext double {{.*}} to x86_fp80
159aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint"
160aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: fptrunc x86_fp80 {{.*}} to double
161aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner}
162aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner
163aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattnerfloat t21(long double x) {
164aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  register float result;
165aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
166aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  return result;
167aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: @t21
168aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: call x86_fp80 asm sideeffect "frndint"
169aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float
170aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner}
171545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen
172545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen// <rdar://problem/8348447> - accept 'l' constraint
173545be51fdfbd243b9ee98177a80397504327a687Dale Johannesenunsigned char t22(unsigned char a, unsigned char b) {
174545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int la = a;
175545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int lb = b;
176545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int bigres;
177545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned char res;
178545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) :
179545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen                        "edx", "cc");
180545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  res = bigres;
181545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  return res;
182545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen}
183545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen
184545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen// <rdar://problem/8348447> - accept 'l' constraint
185545be51fdfbd243b9ee98177a80397504327a687Dale Johannesenunsigned char t23(unsigned char a, unsigned char b) {
186545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int la = a;
187545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int lb = b;
188545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned char res;
189545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) :
190545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen                        "edx", "cc");
191545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  return res;
192545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen}
19378b929121f44f7c983fce8c871aa913dce087561Eric Christopher
19478b929121f44f7c983fce8c871aa913dce087561Eric Christopher
19578b929121f44f7c983fce8c871aa913dce087561Eric Christopher// PR10299 - fpsr, fpcr
19678b929121f44f7c983fce8c871aa913dce087561Eric Christophervoid test(void)
19778b929121f44f7c983fce8c871aa913dce087561Eric Christopher{
19878b929121f44f7c983fce8c871aa913dce087561Eric Christopher  __asm__ __volatile__(					   \
19978b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       "finit"				   \
20078b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :				   \
20178b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :				   \
20278b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :"st","st(1)","st(2)","st(3)",	   \
20378b929121f44f7c983fce8c871aa913dce087561Eric Christopher			"st(4)","st(5)","st(6)","st(7)",   \
20478b929121f44f7c983fce8c871aa913dce087561Eric Christopher			"fpsr","fpcr"			   \
20578b929121f44f7c983fce8c871aa913dce087561Eric Christopher							   );
20678b929121f44f7c983fce8c871aa913dce087561Eric Christopher}
207