asm.c revision 9f5bff086cad25c15b4deb8a7763786097aadccd
1b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s
29f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner
39f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner// PR10415
49f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner__asm__ ("foo1");
59f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner__asm__ ("foo2");
69f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner__asm__ ("foo3");
79f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner// CHECK: module asm "foo1"
89f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner// CHECK-NEXT: module asm "foo2"
99f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner// CHECK-NEXT: module asm "foo3"
109f5bff086cad25c15b4deb8a7763786097aadccdChris Lattner
1110ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t1(int len) {
129f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "=&r"(len), "+&r"(len));
132763b3af0a527c3a63cb058b90c22db0b7bcf558Anders Carlsson}
149f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
1510ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t2(unsigned long long t)  {
169f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "+m"(t));
179f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson}
189f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
1910ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t3(unsigned char *src, unsigned long long temp) {
209f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson  __asm__ volatile("" : "+m"(temp), "+r"(src));
219f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson}
229f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
2310ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t4() {
24ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson  unsigned long long a;
25ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson  struct reg { unsigned long long a, b; } b;
26ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson
271eb4433ac451dc16f4133a88af2d002ac26c58efMike Stump  __asm__ volatile ("":: "m"(a), "m"(b));
28ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson}
299f2505b934745b18d580ade4dac7b8b16952a30cAnders Carlsson
3003eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson// PR3417
3110ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t5(int i) {
3203eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson  asm("nop" : "=r"(i) : "0"(t5));
3303eb543cf7ebee463b33b5802b83ac92c21770cfAnders Carlsson}
346032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson
356032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson// PR3641
3610ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t6(void) {
376032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson  __asm__ volatile("" : : "i" (t6));
386032979a5d091e5607c7c467400449727d9beb5aAnders Carlsson}
3910ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattner
4010ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t7(int a) {
4110ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattner  __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4));
4229a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: @t7(i32
4329a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: T7 NAMED: $1
4402af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner}
4502af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner
4602af974dca0f855dc36d8a8c26bb87f373310815Chris Lattnervoid t8() {
4702af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner  __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4));
4829a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: @t8()
4929a4071fc450ee17449ad73266012c1b1b975511Chris Lattner  // CHECK: T8 NAMED MODIFIER: ${0:c}
5002af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner}
5188beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner
5288beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner// PR3682
5388beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattnerunsigned t9(unsigned int a) {
5488beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner  asm("bswap %0 %1" : "+r" (a));
5588beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner  return a;
5688beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner}
57ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson
58ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson// PR3908
59ec91dab1977154f13621cfb63184364afee84ea1Anders Carlssonvoid t10(int r) {
60ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson  __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0)));
6178b929121f44f7c983fce8c871aa913dce087561Eric Christopher
6229a4071fc450ee17449ad73266012c1b1b975511Chris Lattner// CHECK: @t10(
6329a4071fc450ee17449ad73266012c1b1b975511Chris Lattner// CHECK:PR3908 $1 $3 $2 $0
6478b929121f44f7c983fce8c871aa913dce087561Eric Christopher}
654df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner
664df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner
674df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner// PR3373
684df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattnerunsigned t11(signed char input) {
694df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  unsigned  output;
704df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  __asm__("xyz"
714df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner          : "=a" (output)
724df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner          : "0" (input));
734df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner  return output;
744df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner}
75ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
76a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner// PR3373
77a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattnerunsigned char t12(unsigned input) {
78a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  unsigned char output;
79a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  __asm__("xyz"
80a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner          : "=a" (output)
81a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner          : "0" (input));
82a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner  return output;
83a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner}
84ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
853351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnerunsigned char t13(unsigned input) {
863351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  unsigned char output;
873351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  __asm__("xyz %1"
883351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner          : "=a" (output)
893351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner          : "0" (input));
903351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner  return output;
913351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner}
923351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
930bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerstruct large {
940bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  int x[1000];
950bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner};
960bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
970bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerunsigned long t15(int x, struct large *P) {
980bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  __asm__("xyz "
990bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner          : "=r" (x)
1000bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner          : "m" (*P), "0" (x));
1010bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner  return x;
1020bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner}
1030bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
1040bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
1050bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner
106ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
1073351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner// bitfield destination of an asm.
108ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattnerstruct S {
109ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner  int a : 4;
110ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner};
111ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner
1123351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnervoid t14(struct S *P) {
113ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner  __asm__("abc %0" : "=r"(P->a) );
114ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner}
1153351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
1163351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner
1174053983963cb94a6129da47bca8cce637c8b7bffChris Lattner// PR4938
1184053983963cb94a6129da47bca8cce637c8b7bffChris Lattnerint t16() {
1194053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  int a,b;
1204053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  asm ( "nop;"
1214053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       :"=%c" (a)
1224053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       : "r" (b)
1234053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       );
1244053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  return 0;
1254053983963cb94a6129da47bca8cce637c8b7bffChris Lattner}
126b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
127b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// PR6475
128b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattnervoid t17() {
129b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  int i;
130b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  __asm__ ( "nop": "=m"(i));
13178b929121f44f7c983fce8c871aa913dce087561Eric Christopher
132b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: @t17()
133b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: call void asm "nop", "=*m,
134b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner}
135b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
136eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// <rdar://problem/6841383>
137eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattnerint t18(unsigned data) {
138eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  int a, b;
13978b929121f44f7c983fce8c871aa913dce087561Eric Christopher
140eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
141eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  return a + b;
142eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: t18(i32
143eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: = call {{.*}}asm "xyz"
144eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
145eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
146eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner}
147018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
148018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
149018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner// PR6780
150018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattnerint t19(unsigned data) {
151018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  int a, b;
15278b929121f44f7c983fce8c871aa913dce087561Eric Christopher
153018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  asm("x{abc|def|ghi}z" :"=r"(a): "r"(data));
154018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  return a + b;
155018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  // CHECK: t19(i32
156018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner  // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z"
157018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner}
158018b54e5c3d31dc03e2a874d58ae258651087296Chris Lattner
159aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner
160aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner// PR6845 - Mismatching source/dest fp types.
161aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattnerdouble t20(double x) {
162aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  register long double result;
163aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
164aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  return result;
16578b929121f44f7c983fce8c871aa913dce087561Eric Christopher
166aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: @t20
167aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: fpext double {{.*}} to x86_fp80
168aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint"
169aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: fptrunc x86_fp80 {{.*}} to double
170aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner}
171aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner
172aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattnerfloat t21(long double x) {
173aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  register float result;
174aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  __asm __volatile ("frndint"  : "=t" (result) : "0" (x));
175aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  return result;
176aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: @t21
177aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK: call x86_fp80 asm sideeffect "frndint"
178aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner  // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float
179aab64d0b7f41ed30b15ba9210ed859424cbc7455Chris Lattner}
180545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen
181545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen// <rdar://problem/8348447> - accept 'l' constraint
182545be51fdfbd243b9ee98177a80397504327a687Dale Johannesenunsigned char t22(unsigned char a, unsigned char b) {
183545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int la = a;
184545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int lb = b;
185545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int bigres;
186545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned char res;
187545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) :
188545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen                        "edx", "cc");
189545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  res = bigres;
190545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  return res;
191545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen}
192545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen
193545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen// <rdar://problem/8348447> - accept 'l' constraint
194545be51fdfbd243b9ee98177a80397504327a687Dale Johannesenunsigned char t23(unsigned char a, unsigned char b) {
195545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int la = a;
196545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned int lb = b;
197545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  unsigned char res;
198545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) :
199545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen                        "edx", "cc");
200545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen  return res;
201545be51fdfbd243b9ee98177a80397504327a687Dale Johannesen}
20278b929121f44f7c983fce8c871aa913dce087561Eric Christopher
20378b929121f44f7c983fce8c871aa913dce087561Eric Christopher
20478b929121f44f7c983fce8c871aa913dce087561Eric Christopher// PR10299 - fpsr, fpcr
20578b929121f44f7c983fce8c871aa913dce087561Eric Christophervoid test(void)
20678b929121f44f7c983fce8c871aa913dce087561Eric Christopher{
20778b929121f44f7c983fce8c871aa913dce087561Eric Christopher  __asm__ __volatile__(					   \
20878b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       "finit"				   \
20978b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :				   \
21078b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :				   \
21178b929121f44f7c983fce8c871aa913dce087561Eric Christopher		       :"st","st(1)","st(2)","st(3)",	   \
21278b929121f44f7c983fce8c871aa913dce087561Eric Christopher			"st(4)","st(5)","st(6)","st(7)",   \
21378b929121f44f7c983fce8c871aa913dce087561Eric Christopher			"fpsr","fpcr"			   \
21478b929121f44f7c983fce8c871aa913dce087561Eric Christopher							   );
21578b929121f44f7c983fce8c871aa913dce087561Eric Christopher}
216