asm.c revision eeeb49a69a35aba5b09021ffb4550a840af54053
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
314fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// 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
364fcfde4d5c8f25e40720972a5543d538a0dcb220Daniel Dunbar// 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
1044053983963cb94a6129da47bca8cce637c8b7bffChris Lattner// PR4938
1054053983963cb94a6129da47bca8cce637c8b7bffChris Lattnerint t16() {
1064053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  int a,b;
1074053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  asm ( "nop;"
1084053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       :"=%c" (a)
1094053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       : "r" (b)
1104053983963cb94a6129da47bca8cce637c8b7bffChris Lattner       );
1114053983963cb94a6129da47bca8cce637c8b7bffChris Lattner  return 0;
1124053983963cb94a6129da47bca8cce637c8b7bffChris Lattner}
113b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
114b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// PR6475
115b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattnervoid t17() {
116b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  int i;
117b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner  __asm__ ( "nop": "=m"(i));
118b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
119b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: @t17()
120b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner// CHECK: call void asm "nop", "=*m,
121b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner}
122b992259f7790d3fb9fc5c2eb7182d7af9d64f9acChris Lattner
123eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// <rdar://problem/6841383>
124eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattnerint t18(unsigned data) {
125eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  int a, b;
126eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner
127eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  asm("xyz" :"=a"(a), "=d"(b) : "a"(data));
128eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner  return a + b;
129eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: t18(i32
130eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK: = call {{.*}}asm "xyz"
131eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
132eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner// CHECK-NEXT: extractvalue
133eeeb49a69a35aba5b09021ffb4550a840af54053Chris Lattner}
134