asm.c revision 545be51fdfbd243b9ee98177a80397504327a687
1// RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s 2void t1(int len) { 3 __asm__ volatile("" : "=&r"(len), "+&r"(len)); 4} 5 6void t2(unsigned long long t) { 7 __asm__ volatile("" : "+m"(t)); 8} 9 10void t3(unsigned char *src, unsigned long long temp) { 11 __asm__ volatile("" : "+m"(temp), "+r"(src)); 12} 13 14void t4() { 15 unsigned long long a; 16 struct reg { unsigned long long a, b; } b; 17 18 __asm__ volatile ("":: "m"(a), "m"(b)); 19} 20 21// PR3417 22void t5(int i) { 23 asm("nop" : "=r"(i) : "0"(t5)); 24} 25 26// PR3641 27void t6(void) { 28 __asm__ volatile("" : : "i" (t6)); 29} 30 31void t7(int a) { 32 __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4)); 33 // CHECK: @t7(i32 34 // CHECK: T7 NAMED: $1 35} 36 37void t8() { 38 __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4)); 39 // CHECK: @t8() 40 // CHECK: T8 NAMED MODIFIER: ${0:c} 41} 42 43// PR3682 44unsigned t9(unsigned int a) { 45 asm("bswap %0 %1" : "+r" (a)); 46 return a; 47} 48 49// PR3908 50void t10(int r) { 51 __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0))); 52 53// CHECK: @t10( 54// CHECK:PR3908 $1 $3 $2 $0 55} 56 57 58// PR3373 59unsigned t11(signed char input) { 60 unsigned output; 61 __asm__("xyz" 62 : "=a" (output) 63 : "0" (input)); 64 return output; 65} 66 67// PR3373 68unsigned char t12(unsigned input) { 69 unsigned char output; 70 __asm__("xyz" 71 : "=a" (output) 72 : "0" (input)); 73 return output; 74} 75 76unsigned char t13(unsigned input) { 77 unsigned char output; 78 __asm__("xyz %1" 79 : "=a" (output) 80 : "0" (input)); 81 return output; 82} 83 84struct large { 85 int x[1000]; 86}; 87 88unsigned long t15(int x, struct large *P) { 89 __asm__("xyz " 90 : "=r" (x) 91 : "m" (*P), "0" (x)); 92 return x; 93} 94 95 96 97 98// bitfield destination of an asm. 99struct S { 100 int a : 4; 101}; 102 103void t14(struct S *P) { 104 __asm__("abc %0" : "=r"(P->a) ); 105} 106 107 108// PR4938 109int t16() { 110 int a,b; 111 asm ( "nop;" 112 :"=%c" (a) 113 : "r" (b) 114 ); 115 return 0; 116} 117 118// PR6475 119void t17() { 120 int i; 121 __asm__ ( "nop": "=m"(i)); 122 123// CHECK: @t17() 124// CHECK: call void asm "nop", "=*m, 125} 126 127// <rdar://problem/6841383> 128int t18(unsigned data) { 129 int a, b; 130 131 asm("xyz" :"=a"(a), "=d"(b) : "a"(data)); 132 return a + b; 133// CHECK: t18(i32 134// CHECK: = call {{.*}}asm "xyz" 135// CHECK-NEXT: extractvalue 136// CHECK-NEXT: extractvalue 137} 138 139 140// PR6780 141int t19(unsigned data) { 142 int a, b; 143 144 asm("x{abc|def|ghi}z" :"=r"(a): "r"(data)); 145 return a + b; 146 // CHECK: t19(i32 147 // CHECK: = call {{.*}}asm "x$(abc$|def$|ghi$)z" 148} 149 150 151// PR6845 - Mismatching source/dest fp types. 152double t20(double x) { 153 register long double result; 154 __asm __volatile ("frndint" : "=t" (result) : "0" (x)); 155 return result; 156 157 // CHECK: @t20 158 // CHECK: fpext double {{.*}} to x86_fp80 159 // CHECK-NEXT: call x86_fp80 asm sideeffect "frndint" 160 // CHECK: fptrunc x86_fp80 {{.*}} to double 161} 162 163float t21(long double x) { 164 register float result; 165 __asm __volatile ("frndint" : "=t" (result) : "0" (x)); 166 return result; 167 // CHECK: @t21 168 // CHECK: call x86_fp80 asm sideeffect "frndint" 169 // CHECK-NEXT: fptrunc x86_fp80 {{.*}} to float 170} 171 172// <rdar://problem/8348447> - accept 'l' constraint 173unsigned char t22(unsigned char a, unsigned char b) { 174 unsigned int la = a; 175 unsigned int lb = b; 176 unsigned int bigres; 177 unsigned char res; 178 __asm__ ("0:\n1:\n" : [bigres] "=la"(bigres) : [la] "0"(la), [lb] "c"(lb) : 179 "edx", "cc"); 180 res = bigres; 181 return res; 182} 183 184// <rdar://problem/8348447> - accept 'l' constraint 185unsigned char t23(unsigned char a, unsigned char b) { 186 unsigned int la = a; 187 unsigned int lb = b; 188 unsigned char res; 189 __asm__ ("0:\n1:\n" : [res] "=la"(res) : [la] "0"(la), [lb] "c"(lb) : 190 "edx", "cc"); 191 return res; 192} 193