asm.c revision 0bdaa5b576237195a260d347f2646cf42ec7d745
150ac766f562cc6433f767252ce5b713132019560Daniel Dunbar// RUN: clang-cc -emit-llvm %s -o %t -arch=i386 && 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 18ebaae2a3103b443d50444d335ab5ab0ff7680da2Anders Carlsson __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 31ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson// RUN: grep "T7 NAMED: \$1" %t && 3210ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattnervoid t7(int a) { 3310ca96ae9aed6906c3302403ef1a146a8d4c6b74Chris Lattner __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4)); 3402af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner} 3502af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner 3602af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner// RUN: grep "T8 NAMED MODIFIER: \${0:c}" %t 3702af974dca0f855dc36d8a8c26bb87f373310815Chris Lattnervoid t8() { 3802af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4)); 3902af974dca0f855dc36d8a8c26bb87f373310815Chris Lattner} 4088beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner 4188beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner// PR3682 4288beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattnerunsigned t9(unsigned int a) { 4388beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner asm("bswap %0 %1" : "+r" (a)); 4488beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner return a; 4588beebe6ecab1810c3f62f0b5f8be796855861ccChris Lattner} 46ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson 47ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson// PR3908 48ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson// RUN: grep "PR3908 \$1 \$3 \$2 \$0" %t 49ec91dab1977154f13621cfb63184364afee84ea1Anders Carlssonvoid t10(int r) { 50ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0))); 51ec91dab1977154f13621cfb63184364afee84ea1Anders Carlsson} 524df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner 534df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner 544df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner// PR3373 554df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattnerunsigned t11(signed char input) { 564df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner unsigned output; 574df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner __asm__("xyz" 584df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner : "=a" (output) 594df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner : "0" (input)); 604df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner return output; 614df4ee0ff6f804e9d3dd478712e3b5b20cd3bf2fChris Lattner} 62ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner 63a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner// PR3373 64a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattnerunsigned char t12(unsigned input) { 65a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner unsigned char output; 66a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner __asm__("xyz" 67a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner : "=a" (output) 68a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner : "0" (input)); 69a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner return output; 70a077b5c8631596f8d7a588933a9de5d08e9ba428Chris Lattner} 71ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner 723351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnerunsigned char t13(unsigned input) { 733351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner unsigned char output; 743351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner __asm__("xyz %1" 753351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner : "=a" (output) 763351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner : "0" (input)); 773351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner return output; 783351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner} 793351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner 800bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerstruct large { 810bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner int x[1000]; 820bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner}; 830bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner 840bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattnerunsigned long t15(int x, struct large *P) { 850bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner __asm__("xyz " 860bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner : "=r" (x) 870bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner : "m" (*P), "0" (x)); 880bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner return x; 890bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner} 900bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner 910bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner 920bdaa5b576237195a260d347f2646cf42ec7d745Chris Lattner 93ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner 943351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner// bitfield destination of an asm. 95ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattnerstruct S { 96ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner int a : 4; 97ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner}; 98ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner 993351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattnervoid t14(struct S *P) { 100ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner __asm__("abc %0" : "=r"(P->a) ); 101ede9d900809c4fd0298d52f5a63088ecb8302275Chris Lattner} 1023351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner 1033351f1145aa91ddd8022fcd3ca16c219db9e8277Chris Lattner 104