1 // RUN: %clang_cc1 -triple i686 %s -emit-llvm -o - | FileCheck %s 2 // RUN: %clang_cc1 -triple x86_64 %s -emit-llvm -o - | FileCheck %s 3 // RUN: %clang_cc1 -triple arm %s -emit-llvm -o - | FileCheck %s 4 // RUN: %clang_cc1 -triple mblaze %s -emit-llvm -o - | FileCheck %s 5 // RUN: %clang_cc1 -triple mips %s -emit-llvm -o - | FileCheck %s 6 // RUN: %clang_cc1 -triple mipsel %s -emit-llvm -o - | FileCheck %s 7 // RUN: %clang_cc1 -triple powerpc %s -emit-llvm -o - | FileCheck %s 8 // RUN: %clang_cc1 -triple powerpc64 %s -emit-llvm -o - | FileCheck %s 9 // RUN: %clang_cc1 -triple s390x %s -emit-llvm -o - | FileCheck %s 10 // RUN: %clang_cc1 -triple sparc %s -emit-llvm -o - | FileCheck %s 11 // RUN: %clang_cc1 -triple sparcv9 %s -emit-llvm -o - | FileCheck %s 12 // RUN: %clang_cc1 -triple thumb %s -emit-llvm -o - | FileCheck %s 13 14 int mout0; 15 int min1; 16 int marray[2]; 17 18 // CHECK: @single_m 19 void single_m() 20 { 21 // CHECK: call void asm "foo $1,$0", "=*m,*m[[CLOBBERS:[a-zA-Z0-9@%{},~_ ]*\"]](i32* {{[a-zA-Z0-9@%]+}}, i32* {{[a-zA-Z0-9@%]+}}) 22 asm("foo %1,%0" : "=m" (mout0) : "m" (min1)); 23 } 24 25 // CHECK: @single_o 26 void single_o() 27 { 28 register int out0 = 0; 29 register int index = 1; 30 // Doesn't really do an offset... 31 //asm("foo %1, %2,%0" : "=r" (out0) : "o" (min1)); 32 } 33 34 // CHECK: @single_V 35 void single_V() 36 { 37 // asm("foo %1,%0" : "=m" (mout0) : "V" (min1)); 38 } 39 40 // CHECK: @single_lt 41 void single_lt() 42 { 43 register int out0 = 0; 44 register int in1 = 1; 45 // CHECK: call i32 asm "foo $1,$0", "=r,<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 46 asm("foo %1,%0" : "=r" (out0) : "<r" (in1)); 47 // CHECK: call i32 asm "foo $1,$0", "=r,r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 48 asm("foo %1,%0" : "=r" (out0) : "r<" (in1)); 49 } 50 51 // CHECK: @single_gt 52 void single_gt() 53 { 54 register int out0 = 0; 55 register int in1 = 1; 56 // CHECK: call i32 asm "foo $1,$0", "=r,>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 57 asm("foo %1,%0" : "=r" (out0) : ">r" (in1)); 58 // CHECK: call i32 asm "foo $1,$0", "=r,r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 59 asm("foo %1,%0" : "=r" (out0) : "r>" (in1)); 60 } 61 62 // CHECK: @single_r 63 void single_r() 64 { 65 register int out0 = 0; 66 register int in1 = 1; 67 // CHECK: call i32 asm "foo $1,$0", "=r,r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 68 asm("foo %1,%0" : "=r" (out0) : "r" (in1)); 69 } 70 71 // CHECK: @single_i 72 void single_i() 73 { 74 register int out0 = 0; 75 // CHECK: call i32 asm "foo $1,$0", "=r,i[[CLOBBERS]](i32 1) 76 asm("foo %1,%0" : "=r" (out0) : "i" (1)); 77 } 78 79 // CHECK: @single_n 80 void single_n() 81 { 82 register int out0 = 0; 83 // CHECK: call i32 asm "foo $1,$0", "=r,n[[CLOBBERS]](i32 1) 84 asm("foo %1,%0" : "=r" (out0) : "n" (1)); 85 } 86 87 // CHECK: @single_E 88 void single_E() 89 { 90 register double out0 = 0.0; 91 // CHECK: call double asm "foo $1,$0", "=r,E[[CLOBBERS]](double {{[0-9.eE+-]+}}) 92 asm("foo %1,%0" : "=r" (out0) : "E" (1.0e+01)); 93 } 94 95 // CHECK: @single_F 96 void single_F() 97 { 98 register double out0 = 0.0; 99 // CHECK: call double asm "foo $1,$0", "=r,F[[CLOBBERS]](double {{[0-9.eE+-]+}}) 100 asm("foo %1,%0" : "=r" (out0) : "F" (1.0)); 101 } 102 103 // CHECK: @single_s 104 void single_s() 105 { 106 register int out0 = 0; 107 //asm("foo %1,%0" : "=r" (out0) : "s" (single_s)); 108 } 109 110 // CHECK: @single_g 111 void single_g() 112 { 113 register int out0 = 0; 114 register int in1 = 1; 115 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 116 asm("foo %1,%0" : "=r" (out0) : "g" (in1)); 117 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 118 asm("foo %1,%0" : "=r" (out0) : "g" (min1)); 119 // CHECK: call i32 asm "foo $1,$0", "=r,imr[[CLOBBERS]](i32 1) 120 asm("foo %1,%0" : "=r" (out0) : "g" (1)); 121 } 122 123 // CHECK: @single_X 124 void single_X() 125 { 126 register int out0 = 0; 127 register int in1 = 1; 128 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 129 asm("foo %1,%0" : "=r" (out0) : "X" (in1)); 130 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 131 asm("foo %1,%0" : "=r" (out0) : "X" (min1)); 132 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32 1) 133 asm("foo %1,%0" : "=r" (out0) : "X" (1)); 134 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0)) 135 asm("foo %1,%0" : "=r" (out0) : "X" (marray)); 136 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}}) 137 asm("foo %1,%0" : "=r" (out0) : "X" (1.0e+01)); 138 // CHECK: call i32 asm "foo $1,$0", "=r,X[[CLOBBERS]](double {{[0-9.eE+-]+}}) 139 asm("foo %1,%0" : "=r" (out0) : "X" (1.0)); 140 } 141 142 // CHECK: @single_p 143 void single_p() 144 { 145 register int out0 = 0; 146 // Constraint converted differently on different platforms moved to platform-specific. 147 // : call i32 asm "foo $1,$0", "=r,im[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0)) 148 asm("foo %1,%0" : "=r" (out0) : "p" (marray)); 149 } 150 151 // CHECK: @multi_m 152 void multi_m() 153 { 154 // CHECK: call void asm "foo $1,$0", "=*m|r,m|r[[CLOBBERS]](i32* {{[a-zA-Z0-9@%]+}}, i32 {{[a-zA-Z0-9@%]+}}) 155 asm("foo %1,%0" : "=m,r" (mout0) : "m,r" (min1)); 156 } 157 158 // CHECK: @multi_o 159 void multi_o() 160 { 161 register int out0 = 0; 162 register int index = 1; 163 // Doesn't really do an offset... 164 //asm("foo %1, %2,%0" : "=r,r" (out0) : "r,o" (min1)); 165 } 166 167 // CHECK: @multi_V 168 void multi_V() 169 { 170 // asm("foo %1,%0" : "=m,r" (mout0) : "r,V" (min1)); 171 } 172 173 // CHECK: @multi_lt 174 void multi_lt() 175 { 176 register int out0 = 0; 177 register int in1 = 1; 178 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|<r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 179 asm("foo %1,%0" : "=r,r" (out0) : "r,<r" (in1)); 180 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r<[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 181 asm("foo %1,%0" : "=r,r" (out0) : "r,r<" (in1)); 182 } 183 184 // CHECK: @multi_gt 185 void multi_gt() 186 { 187 register int out0 = 0; 188 register int in1 = 1; 189 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|>r[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 190 asm("foo %1,%0" : "=r,r" (out0) : "r,>r" (in1)); 191 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|r>[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 192 asm("foo %1,%0" : "=r,r" (out0) : "r,r>" (in1)); 193 } 194 195 // CHECK: @multi_r 196 void multi_r() 197 { 198 register int out0 = 0; 199 register int in1 = 1; 200 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|m[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 201 asm("foo %1,%0" : "=r,r" (out0) : "r,m" (in1)); 202 } 203 204 // CHECK: @multi_i 205 void multi_i() 206 { 207 register int out0 = 0; 208 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|i[[CLOBBERS]](i32 1) 209 asm("foo %1,%0" : "=r,r" (out0) : "r,i" (1)); 210 } 211 212 // CHECK: @multi_n 213 void multi_n() 214 { 215 register int out0 = 0; 216 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|n[[CLOBBERS]](i32 1) 217 asm("foo %1,%0" : "=r,r" (out0) : "r,n" (1)); 218 } 219 220 // CHECK: @multi_E 221 void multi_E() 222 { 223 register double out0 = 0.0; 224 // CHECK: call double asm "foo $1,$0", "=r|r,r|E[[CLOBBERS]](double {{[0-9.eE+-]+}}) 225 asm("foo %1,%0" : "=r,r" (out0) : "r,E" (1.0e+01)); 226 } 227 228 // CHECK: @multi_F 229 void multi_F() 230 { 231 register double out0 = 0.0; 232 // CHECK: call double asm "foo $1,$0", "=r|r,r|F[[CLOBBERS]](double {{[0-9.eE+-]+}}) 233 asm("foo %1,%0" : "=r,r" (out0) : "r,F" (1.0)); 234 } 235 236 // CHECK: @multi_s 237 void multi_s() 238 { 239 register int out0 = 0; 240 //asm("foo %1,%0" : "=r,r" (out0) : "r,s" (multi_s)); 241 } 242 243 // CHECK: @multi_g 244 void multi_g() 245 { 246 register int out0 = 0; 247 register int in1 = 1; 248 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 249 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (in1)); 250 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 251 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (min1)); 252 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|imr[[CLOBBERS]](i32 1) 253 asm("foo %1,%0" : "=r,r" (out0) : "r,g" (1)); 254 } 255 256 // CHECK: @multi_X 257 void multi_X() 258 { 259 register int out0 = 0; 260 register int in1 = 1; 261 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 262 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (in1)); 263 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 264 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (min1)); 265 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32 1) 266 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1)); 267 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0)) 268 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (marray)); 269 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}}) 270 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0e+01)); 271 // CHECK: call i32 asm "foo $1,$0", "=r|r,r|X[[CLOBBERS]](double {{[0-9.eE+-]+}}) 272 asm("foo %1,%0" : "=r,r" (out0) : "r,X" (1.0)); 273 } 274 275 // CHECK: @multi_p 276 void multi_p() 277 { 278 register int out0 = 0; 279 // Constraint converted differently on different platforms moved to platform-specific. 280 // : call i32 asm "foo $1,$0", "=r|r,r|im[[CLOBBERS]](i32* getelementptr inbounds ([2 x i32]* {{[a-zA-Z0-9@%]+}}, i32 0, i32 0)) 281 asm("foo %1,%0" : "=r,r" (out0) : "r,p" (marray)); 282 } 283