1 // RUN: %clang_cc1 -triple i686 -emit-llvm %s -o - | FileCheck %s 2 // RUN: %clang_cc1 -triple x86_64 -emit-llvm %s -o - | FileCheck %s 3 4 int mout0; 5 int min1; 6 int marray[2]; 7 double dout0; 8 double din1; 9 10 // CHECK: @single_R 11 void single_R() 12 { 13 // CHECK: asm "foo $1,$0", "=R,R[[CLOBBERS:[a-zA-Z0-9@%{},~_ ]*\"]](i32 {{[a-zA-Z0-9@%]+}}) 14 asm("foo %1,%0" : "=R" (mout0) : "R" (min1)); 15 } 16 17 // CHECK: @single_q 18 void single_q() 19 { 20 // CHECK: asm "foo $1,$0", "=q,q[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 21 asm("foo %1,%0" : "=q" (mout0) : "q" (min1)); 22 } 23 24 // CHECK: @single_Q 25 void single_Q() 26 { 27 // CHECK: asm "foo $1,$0", "=Q,Q[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 28 asm("foo %1,%0" : "=Q" (mout0) : "Q" (min1)); 29 } 30 31 // CHECK: @single_a 32 void single_a() 33 { 34 // CHECK: asm "foo $1,$0", "={ax},{ax}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 35 asm("foo %1,%0" : "=a" (mout0) : "a" (min1)); 36 } 37 38 // CHECK: @single_b 39 void single_b() 40 { 41 // CHECK: asm "foo $1,$0", "={bx},{bx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 42 asm("foo %1,%0" : "=b" (mout0) : "b" (min1)); 43 } 44 45 // CHECK: @single_c 46 void single_c() 47 { 48 // CHECK: asm "foo $1,$0", "={cx},{cx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 49 asm("foo %1,%0" : "=c" (mout0) : "c" (min1)); 50 } 51 52 // CHECK: @single_d 53 void single_d() 54 { 55 // CHECK: asm "foo $1,$0", "={dx},{dx}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 56 asm("foo %1,%0" : "=d" (mout0) : "d" (min1)); 57 } 58 59 // CHECK: @single_S 60 void single_S() 61 { 62 // CHECK: asm "foo $1,$0", "={si},{si}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 63 asm("foo %1,%0" : "=S" (mout0) : "S" (min1)); 64 } 65 66 // CHECK: @single_D 67 void single_D() 68 { 69 // CHECK: asm "foo $1,$0", "={di},{di}[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 70 asm("foo %1,%0" : "=D" (mout0) : "D" (min1)); 71 } 72 73 // CHECK: @single_A 74 void single_A() 75 { 76 // CHECK: asm "foo $1,$0", "=A,A[[CLOBBERS]](i32 {{[a-zA-Z0-9@%]+}}) 77 asm("foo %1,%0" : "=A" (mout0) : "A" (min1)); 78 } 79 80 // CHECK: @single_f 81 void single_f() 82 { 83 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 84 } 85 86 // CHECK: @single_t 87 void single_t() 88 { 89 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 90 } 91 92 // CHECK: @single_u 93 void single_u() 94 { 95 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 96 } 97 98 // CHECK: @single_y 99 void single_y() 100 { 101 // CHECK: call double asm "foo $1,$0", "=y,y[[CLOBBERS]](double {{[a-zA-Z0-9@%]+}}) 102 asm("foo %1,%0" : "=y" (dout0) : "y" (din1)); 103 } 104 105 // CHECK: @single_x 106 void single_x() 107 { 108 // CHECK: asm "foo $1,$0", "=x,x[[CLOBBERS]](double {{[a-zA-Z0-9@%]+}}) 109 asm("foo %1,%0" : "=x" (dout0) : "x" (din1)); 110 } 111 112 // CHECK: @single_Y 113 void single_Y() 114 { 115 // 'Y' constraint currently broken. 116 //asm("foo %1,%0" : "=Y0" (mout0) : "Y0" (min1)); 117 //asm("foo %1,%0" : "=Yz" (mout0) : "Yz" (min1)); 118 //asm("foo %1,%0" : "=Yt" (mout0) : "Yt" (min1)); 119 //asm("foo %1,%0" : "=Yi" (mout0) : "Yi" (min1)); 120 //asm("foo %1,%0" : "=Ym" (mout0) : "Ym" (min1)); 121 } 122 123 // CHECK: @single_I 124 void single_I() 125 { 126 // CHECK: asm "foo $1,$0", "=*m,I[[CLOBBERS]](i32* @mout0, i32 1) 127 asm("foo %1,%0" : "=m" (mout0) : "I" (1)); 128 } 129 130 // CHECK: @single_J 131 void single_J() 132 { 133 // CHECK: asm "foo $1,$0", "=*m,J[[CLOBBERS]](i32* @mout0, i32 1) 134 asm("foo %1,%0" : "=m" (mout0) : "J" (1)); 135 } 136 137 // CHECK: @single_K 138 void single_K() 139 { 140 // CHECK: asm "foo $1,$0", "=*m,K[[CLOBBERS]](i32* @mout0, i32 1) 141 asm("foo %1,%0" : "=m" (mout0) : "K" (1)); 142 } 143 144 // CHECK: @single_L 145 void single_L() 146 { 147 // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 255) 148 asm("foo %1,%0" : "=m" (mout0) : "L" (0xff)); 149 // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 65535) 150 asm("foo %1,%0" : "=m" (mout0) : "L" (0xffff)); 151 // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 -1) 152 asm("foo %1,%0" : "=m" (mout0) : "L" (0xffffffff)); 153 } 154 155 // CHECK: @single_M 156 void single_M() 157 { 158 // CHECK: asm "foo $1,$0", "=*m,M[[CLOBBERS]](i32* @mout0, i32 1) 159 asm("foo %1,%0" : "=m" (mout0) : "M" (1)); 160 } 161 162 // CHECK: @single_N 163 void single_N() 164 { 165 // CHECK: asm "foo $1,$0", "=*m,N[[CLOBBERS]](i32* @mout0, i32 1) 166 asm("foo %1,%0" : "=m" (mout0) : "N" (1)); 167 } 168 169 // CHECK: @single_G 170 void single_G() 171 { 172 // CHECK: asm "foo $1,$0", "=*m,G[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 173 asm("foo %1,%0" : "=m" (mout0) : "G" (1.0)); 174 } 175 176 // CHECK: @single_C 177 void single_C() 178 { 179 // CHECK: asm "foo $1,$0", "=*m,C[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 180 asm("foo %1,%0" : "=m" (mout0) : "C" (1.0)); 181 } 182 183 // CHECK: @single_e 184 void single_e() 185 { 186 // CHECK: asm "foo $1,$0", "=*m,e[[CLOBBERS]](i32* @mout0, i32 1) 187 asm("foo %1,%0" : "=m" (mout0) : "e" (1)); 188 } 189 190 // CHECK: @single_Z 191 void single_Z() 192 { 193 // CHECK: asm "foo $1,$0", "=*m,Z[[CLOBBERS]](i32* @mout0, i32 1) 194 asm("foo %1,%0" : "=m" (mout0) : "Z" (1)); 195 } 196 197 // CHECK: @multi_R 198 void multi_R() 199 { 200 // CHECK: asm "foo $1,$0", "=*r|R|m,r|R|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 201 asm("foo %1,%0" : "=r,R,m" (mout0) : "r,R,m" (min1)); 202 } 203 204 // CHECK: @multi_q 205 void multi_q() 206 { 207 // CHECK: asm "foo $1,$0", "=*r|q|m,r|q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 208 asm("foo %1,%0" : "=r,q,m" (mout0) : "r,q,m" (min1)); 209 } 210 211 // CHECK: @multi_Q 212 void multi_Q() 213 { 214 // CHECK: asm "foo $1,$0", "=*r|Q|m,r|Q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 215 asm("foo %1,%0" : "=r,Q,m" (mout0) : "r,Q,m" (min1)); 216 } 217 218 // CHECK: @multi_a 219 void multi_a() 220 { 221 // CHECK: asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 222 asm("foo %1,%0" : "=r,a,m" (mout0) : "r,a,m" (min1)); 223 } 224 225 // CHECK: @multi_b 226 void multi_b() 227 { 228 // CHECK: asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 229 asm("foo %1,%0" : "=r,b,m" (mout0) : "r,b,m" (min1)); 230 } 231 232 // CHECK: @multi_c 233 void multi_c() 234 { 235 // CHECK: asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 236 asm("foo %1,%0" : "=r,c,m" (mout0) : "r,c,m" (min1)); 237 } 238 239 // CHECK: @multi_d 240 void multi_d() 241 { 242 // CHECK: asm "foo $1,$0", "=*r|{dx}|m,r|{dx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 243 asm("foo %1,%0" : "=r,d,m" (mout0) : "r,d,m" (min1)); 244 } 245 246 // CHECK: @multi_S 247 void multi_S() 248 { 249 // CHECK: asm "foo $1,$0", "=*r|{si}|m,r|{si}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 250 asm("foo %1,%0" : "=r,S,m" (mout0) : "r,S,m" (min1)); 251 } 252 253 // CHECK: @multi_D 254 void multi_D() 255 { 256 // CHECK: asm "foo $1,$0", "=*r|{di}|m,r|{di}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 257 asm("foo %1,%0" : "=r,D,m" (mout0) : "r,D,m" (min1)); 258 } 259 260 // CHECK: @multi_A 261 void multi_A() 262 { 263 // CHECK: asm "foo $1,$0", "=*r|A|m,r|A|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 264 asm("foo %1,%0" : "=r,A,m" (mout0) : "r,A,m" (min1)); 265 } 266 267 // CHECK: @multi_f 268 void multi_f() 269 { 270 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 271 } 272 273 // CHECK: @multi_t 274 void multi_t() 275 { 276 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 277 } 278 279 // CHECK: @multi_u 280 void multi_u() 281 { 282 //FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 283 } 284 285 // CHECK: @multi_y 286 void multi_y() 287 { 288 // CHECK: asm "foo $1,$0", "=*r|y|m,r|y|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}}) 289 asm("foo %1,%0" : "=r,y,m" (dout0) : "r,y,m" (din1)); 290 } 291 292 // CHECK: @multi_x 293 void multi_x() 294 { 295 // CHECK: asm "foo $1,$0", "=*r|x|m,r|x|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}}) 296 asm("foo %1,%0" : "=r,x,m" (dout0) : "r,x,m" (din1)); 297 } 298 299 // CHECK: @multi_Y 300 void multi_Y0() 301 { 302 // Y constraint currently broken. 303 //asm("foo %1,%0" : "=r,Y0,m" (mout0) : "r,Y0,m" (min1)); 304 //asm("foo %1,%0" : "=r,Yz,m" (mout0) : "r,Yz,m" (min1)); 305 //asm("foo %1,%0" : "=r,Yt,m" (mout0) : "r,Yt,m" (min1)); 306 //asm("foo %1,%0" : "=r,Yi,m" (mout0) : "r,Yi,m" (min1)); 307 //asm("foo %1,%0" : "=r,Ym,m" (mout0) : "r,Ym,m" (min1)); 308 } 309 310 // CHECK: @multi_I 311 void multi_I() 312 { 313 // CHECK: asm "foo $1,$0", "=*r|m|m,r|I|m[[CLOBBERS]](i32* @mout0, i32 1) 314 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,I,m" (1)); 315 } 316 317 // CHECK: @multi_J 318 void multi_J() 319 { 320 // CHECK: asm "foo $1,$0", "=*r|m|m,r|J|m[[CLOBBERS]](i32* @mout0, i32 1) 321 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,J,m" (1)); 322 } 323 324 // CHECK: @multi_K 325 void multi_K() 326 { 327 // CHECK: asm "foo $1,$0", "=*r|m|m,r|K|m[[CLOBBERS]](i32* @mout0, i32 1) 328 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,K,m" (1)); 329 } 330 331 // CHECK: @multi_L 332 void multi_L() 333 { 334 // CHECK: asm "foo $1,$0", "=*r|m|m,r|L|m[[CLOBBERS]](i32* @mout0, i32 1) 335 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,L,m" (1)); 336 } 337 338 // CHECK: @multi_M 339 void multi_M() 340 { 341 // CHECK: asm "foo $1,$0", "=*r|m|m,r|M|m[[CLOBBERS]](i32* @mout0, i32 1) 342 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,M,m" (1)); 343 } 344 345 // CHECK: @multi_N 346 void multi_N() 347 { 348 // CHECK: asm "foo $1,$0", "=*r|m|m,r|N|m[[CLOBBERS]](i32* @mout0, i32 1) 349 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,N,m" (1)); 350 } 351 352 // CHECK: @multi_G 353 void multi_G() 354 { 355 // CHECK: asm "foo $1,$0", "=*r|m|m,r|G|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 356 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,G,m" (1.0)); 357 } 358 359 // CHECK: @multi_C 360 void multi_C() 361 { 362 // CHECK: asm "foo $1,$0", "=*r|m|m,r|C|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 363 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,C,m" (1.0)); 364 } 365 366 // CHECK: @multi_e 367 void multi_e() 368 { 369 // CHECK: asm "foo $1,$0", "=*r|m|m,r|e|m[[CLOBBERS]](i32* @mout0, i32 1) 370 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,e,m" (1)); 371 } 372 373 // CHECK: @multi_Z 374 void multi_Z() 375 { 376 // CHECK: asm "foo $1,$0", "=*r|m|m,r|Z|m[[CLOBBERS]](i32* @mout0, i32 1) 377 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,Z,m" (1)); 378 } 379