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