Chris Lattner | b992259 | 2010-03-03 21:52:23 +0000 | [diff] [blame] | 1 | // RUN: %clang_cc1 -triple i386-unknown-unknown -emit-llvm %s -o - | FileCheck %s |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 2 | void t1(int len) { |
Anders Carlsson | 9f2505b | 2009-01-11 21:23:27 +0000 | [diff] [blame] | 3 | __asm__ volatile("" : "=&r"(len), "+&r"(len)); |
Anders Carlsson | 2763b3a | 2009-01-11 19:46:50 +0000 | [diff] [blame] | 4 | } |
Anders Carlsson | 9f2505b | 2009-01-11 21:23:27 +0000 | [diff] [blame] | 5 | |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 6 | void t2(unsigned long long t) { |
Anders Carlsson | 9f2505b | 2009-01-11 21:23:27 +0000 | [diff] [blame] | 7 | __asm__ volatile("" : "+m"(t)); |
| 8 | } |
| 9 | |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 10 | void t3(unsigned char *src, unsigned long long temp) { |
Anders Carlsson | 9f2505b | 2009-01-11 21:23:27 +0000 | [diff] [blame] | 11 | __asm__ volatile("" : "+m"(temp), "+r"(src)); |
| 12 | } |
| 13 | |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 14 | void t4() { |
Anders Carlsson | ebaae2a | 2009-01-12 02:22:13 +0000 | [diff] [blame] | 15 | unsigned long long a; |
| 16 | struct reg { unsigned long long a, b; } b; |
| 17 | |
Mike Stump | 1eb4433 | 2009-09-09 15:08:12 +0000 | [diff] [blame] | 18 | __asm__ volatile ("":: "m"(a), "m"(b)); |
Anders Carlsson | ebaae2a | 2009-01-12 02:22:13 +0000 | [diff] [blame] | 19 | } |
Anders Carlsson | 9f2505b | 2009-01-11 21:23:27 +0000 | [diff] [blame] | 20 | |
Anders Carlsson | 03eb543 | 2009-01-27 20:38:24 +0000 | [diff] [blame] | 21 | // PR3417 |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 22 | void t5(int i) { |
Anders Carlsson | 03eb543 | 2009-01-27 20:38:24 +0000 | [diff] [blame] | 23 | asm("nop" : "=r"(i) : "0"(t5)); |
| 24 | } |
Anders Carlsson | 6032979 | 2009-02-22 02:11:23 +0000 | [diff] [blame] | 25 | |
| 26 | // PR3641 |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 27 | void t6(void) { |
Anders Carlsson | 6032979 | 2009-02-22 02:11:23 +0000 | [diff] [blame] | 28 | __asm__ volatile("" : : "i" (t6)); |
| 29 | } |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 30 | |
Chris Lattner | 10ca96a | 2009-03-10 06:33:24 +0000 | [diff] [blame] | 31 | void t7(int a) { |
| 32 | __asm__ volatile("T7 NAMED: %[input]" : "+r"(a): [input] "i" (4)); |
Chris Lattner | 29a4071 | 2010-03-04 00:38:16 +0000 | [diff] [blame] | 33 | // CHECK: @t7(i32 |
| 34 | // CHECK: T7 NAMED: $1 |
Chris Lattner | 02af974 | 2009-03-10 06:38:02 +0000 | [diff] [blame] | 35 | } |
| 36 | |
Chris Lattner | 02af974 | 2009-03-10 06:38:02 +0000 | [diff] [blame] | 37 | void t8() { |
| 38 | __asm__ volatile("T8 NAMED MODIFIER: %c[input]" :: [input] "i" (4)); |
Chris Lattner | 29a4071 | 2010-03-04 00:38:16 +0000 | [diff] [blame] | 39 | // CHECK: @t8() |
| 40 | // CHECK: T8 NAMED MODIFIER: ${0:c} |
Chris Lattner | 02af974 | 2009-03-10 06:38:02 +0000 | [diff] [blame] | 41 | } |
Chris Lattner | 88beebe | 2009-03-10 06:42:37 +0000 | [diff] [blame] | 42 | |
| 43 | // PR3682 |
| 44 | unsigned t9(unsigned int a) { |
| 45 | asm("bswap %0 %1" : "+r" (a)); |
| 46 | return a; |
| 47 | } |
Anders Carlsson | ec91dab | 2009-04-03 05:57:08 +0000 | [diff] [blame] | 48 | |
| 49 | // PR3908 |
Anders Carlsson | ec91dab | 2009-04-03 05:57:08 +0000 | [diff] [blame] | 50 | void t10(int r) { |
| 51 | __asm__("PR3908 %[lf] %[xx] %[li] %[r]" : [r] "+r" (r) : [lf] "mx" (0), [li] "mr" (0), [xx] "x" ((double)(0))); |
Chris Lattner | 29a4071 | 2010-03-04 00:38:16 +0000 | [diff] [blame] | 52 | |
| 53 | // CHECK: @t10( |
| 54 | // CHECK:PR3908 $1 $3 $2 $0 |
Anders Carlsson | ec91dab | 2009-04-03 05:57:08 +0000 | [diff] [blame] | 55 | } |
Chris Lattner | 4df4ee0 | 2009-05-03 07:27:51 +0000 | [diff] [blame] | 56 | |
| 57 | |
| 58 | // PR3373 |
| 59 | unsigned t11(signed char input) { |
| 60 | unsigned output; |
| 61 | __asm__("xyz" |
| 62 | : "=a" (output) |
| 63 | : "0" (input)); |
| 64 | return output; |
| 65 | } |
Chris Lattner | ede9d90 | 2009-05-03 07:53:25 +0000 | [diff] [blame] | 66 | |
Chris Lattner | a077b5c | 2009-05-03 08:21:20 +0000 | [diff] [blame] | 67 | // PR3373 |
| 68 | unsigned char t12(unsigned input) { |
| 69 | unsigned char output; |
| 70 | __asm__("xyz" |
| 71 | : "=a" (output) |
| 72 | : "0" (input)); |
| 73 | return output; |
| 74 | } |
Chris Lattner | ede9d90 | 2009-05-03 07:53:25 +0000 | [diff] [blame] | 75 | |
Chris Lattner | 3351f11 | 2009-05-03 08:32:32 +0000 | [diff] [blame] | 76 | unsigned char t13(unsigned input) { |
| 77 | unsigned char output; |
| 78 | __asm__("xyz %1" |
| 79 | : "=a" (output) |
| 80 | : "0" (input)); |
| 81 | return output; |
| 82 | } |
Chris Lattner | ede9d90 | 2009-05-03 07:53:25 +0000 | [diff] [blame] | 83 | |
Chris Lattner | 0bdaa5b | 2009-05-03 09:05:53 +0000 | [diff] [blame] | 84 | struct large { |
| 85 | int x[1000]; |
| 86 | }; |
| 87 | |
| 88 | unsigned 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 | |
Chris Lattner | 3351f11 | 2009-05-03 08:32:32 +0000 | [diff] [blame] | 97 | |
| 98 | // bitfield destination of an asm. |
Chris Lattner | ede9d90 | 2009-05-03 07:53:25 +0000 | [diff] [blame] | 99 | struct S { |
| 100 | int a : 4; |
| 101 | }; |
| 102 | |
Chris Lattner | 3351f11 | 2009-05-03 08:32:32 +0000 | [diff] [blame] | 103 | void t14(struct S *P) { |
Chris Lattner | ede9d90 | 2009-05-03 07:53:25 +0000 | [diff] [blame] | 104 | __asm__("abc %0" : "=r"(P->a) ); |
| 105 | } |
Chris Lattner | 3351f11 | 2009-05-03 08:32:32 +0000 | [diff] [blame] | 106 | |
| 107 | |
Chris Lattner | 4053983 | 2009-10-13 04:32:07 +0000 | [diff] [blame] | 108 | // PR4938 |
| 109 | int t16() { |
| 110 | int a,b; |
| 111 | asm ( "nop;" |
| 112 | :"=%c" (a) |
| 113 | : "r" (b) |
| 114 | ); |
| 115 | return 0; |
| 116 | } |
Chris Lattner | b992259 | 2010-03-03 21:52:23 +0000 | [diff] [blame] | 117 | |
| 118 | // PR6475 |
| 119 | void t17() { |
| 120 | int i; |
| 121 | __asm__ ( "nop": "=m"(i)); |
| 122 | |
| 123 | // CHECK: @t17() |
| 124 | // CHECK: call void asm "nop", "=*m, |
| 125 | } |
| 126 | |
Chris Lattner | eeeb49a | 2010-03-03 21:56:57 +0000 | [diff] [blame] | 127 | // <rdar://problem/6841383> |
| 128 | int 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 | } |
Chris Lattner | 018b54e | 2010-04-05 18:44:00 +0000 | [diff] [blame] | 138 | |
| 139 | |
| 140 | // PR6780 |
| 141 | int 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 | |
Chris Lattner | aab64d0 | 2010-04-23 17:27:29 +0000 | [diff] [blame] | 150 | |
| 151 | // PR6845 - Mismatching source/dest fp types. |
| 152 | double 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 | |
| 163 | float 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 | } |
Dale Johannesen | 545be51 | 2010-08-24 22:33:12 +0000 | [diff] [blame^] | 171 | |
| 172 | // <rdar://problem/8348447> - accept 'l' constraint |
| 173 | unsigned 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 |
| 185 | unsigned 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 | } |