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 4int mout0; 5int min1; 6int marray[2]; 7double dout0; 8double din1; 9 10// CHECK: @single_R 11void 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 18void 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 25void 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 32void 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 39void 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 46void 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 53void 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 60void 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 67void 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 74void 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 81void 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 87void 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 93void 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 99void 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 106void 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 113void single_Y0() 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 124void 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 131void 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 138void 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 145void single_L() 146{ 147 // CHECK: asm "foo $1,$0", "=*m,L[[CLOBBERS]](i32* @mout0, i32 1) 148 asm("foo %1,%0" : "=m" (mout0) : "L" (1)); 149} 150 151// CHECK: @single_M 152void single_M() 153{ 154 // CHECK: asm "foo $1,$0", "=*m,M[[CLOBBERS]](i32* @mout0, i32 1) 155 asm("foo %1,%0" : "=m" (mout0) : "M" (1)); 156} 157 158// CHECK: @single_N 159void single_N() 160{ 161 // CHECK: asm "foo $1,$0", "=*m,N[[CLOBBERS]](i32* @mout0, i32 1) 162 asm("foo %1,%0" : "=m" (mout0) : "N" (1)); 163} 164 165// CHECK: @single_G 166void single_G() 167{ 168 // CHECK: asm "foo $1,$0", "=*m,G[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 169 asm("foo %1,%0" : "=m" (mout0) : "G" (1.0)); 170} 171 172// CHECK: @single_C 173void single_C() 174{ 175 // CHECK: asm "foo $1,$0", "=*m,C[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 176 asm("foo %1,%0" : "=m" (mout0) : "C" (1.0)); 177} 178 179// CHECK: @single_e 180void single_e() 181{ 182 // CHECK: asm "foo $1,$0", "=*m,e[[CLOBBERS]](i32* @mout0, i32 1) 183 asm("foo %1,%0" : "=m" (mout0) : "e" (1)); 184} 185 186// CHECK: @single_Z 187void single_Z() 188{ 189 // CHECK: asm "foo $1,$0", "=*m,Z[[CLOBBERS]](i32* @mout0, i32 1) 190 asm("foo %1,%0" : "=m" (mout0) : "Z" (1)); 191} 192 193// CHECK: @multi_R 194void multi_R() 195{ 196 // CHECK: asm "foo $1,$0", "=*r|R|m,r|R|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 197 asm("foo %1,%0" : "=r,R,m" (mout0) : "r,R,m" (min1)); 198} 199 200// CHECK: @multi_q 201void multi_q() 202{ 203 // CHECK: asm "foo $1,$0", "=*r|q|m,r|q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 204 asm("foo %1,%0" : "=r,q,m" (mout0) : "r,q,m" (min1)); 205} 206 207// CHECK: @multi_Q 208void multi_Q() 209{ 210 // CHECK: asm "foo $1,$0", "=*r|Q|m,r|Q|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 211 asm("foo %1,%0" : "=r,Q,m" (mout0) : "r,Q,m" (min1)); 212} 213 214// CHECK: @multi_a 215void multi_a() 216{ 217 // CHECK: asm "foo $1,$0", "=*r|{ax}|m,r|{ax}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 218 asm("foo %1,%0" : "=r,a,m" (mout0) : "r,a,m" (min1)); 219} 220 221// CHECK: @multi_b 222void multi_b() 223{ 224 // CHECK: asm "foo $1,$0", "=*r|{bx}|m,r|{bx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 225 asm("foo %1,%0" : "=r,b,m" (mout0) : "r,b,m" (min1)); 226} 227 228// CHECK: @multi_c 229void multi_c() 230{ 231 // CHECK: asm "foo $1,$0", "=*r|{cx}|m,r|{cx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 232 asm("foo %1,%0" : "=r,c,m" (mout0) : "r,c,m" (min1)); 233} 234 235// CHECK: @multi_d 236void multi_d() 237{ 238 // CHECK: asm "foo $1,$0", "=*r|{dx}|m,r|{dx}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 239 asm("foo %1,%0" : "=r,d,m" (mout0) : "r,d,m" (min1)); 240} 241 242// CHECK: @multi_S 243void multi_S() 244{ 245 // CHECK: asm "foo $1,$0", "=*r|{si}|m,r|{si}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 246 asm("foo %1,%0" : "=r,S,m" (mout0) : "r,S,m" (min1)); 247} 248 249// CHECK: @multi_D 250void multi_D() 251{ 252 // CHECK: asm "foo $1,$0", "=*r|{di}|m,r|{di}|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 253 asm("foo %1,%0" : "=r,D,m" (mout0) : "r,D,m" (min1)); 254} 255 256// CHECK: @multi_A 257void multi_A() 258{ 259 // CHECK: asm "foo $1,$0", "=*r|A|m,r|A|m[[CLOBBERS]](i32* @mout0, i32 {{[a-zA-Z0-9@%]+}}) 260 asm("foo %1,%0" : "=r,A,m" (mout0) : "r,A,m" (min1)); 261} 262 263// CHECK: @multi_f 264void multi_f() 265{ 266//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 267} 268 269// CHECK: @multi_t 270void multi_t() 271{ 272//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 273} 274 275// CHECK: @multi_u 276void multi_u() 277{ 278//FIXME: I don't know how to do an 80387 floating point stack register operation, which I think is fp80. 279} 280 281// CHECK: @multi_y 282void multi_y() 283{ 284 // CHECK: asm "foo $1,$0", "=*r|y|m,r|y|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}}) 285 asm("foo %1,%0" : "=r,y,m" (dout0) : "r,y,m" (din1)); 286} 287 288// CHECK: @multi_x 289void multi_x() 290{ 291 // CHECK: asm "foo $1,$0", "=*r|x|m,r|x|m[[CLOBBERS]](double* @dout0, double {{[a-zA-Z0-9@%]+}}) 292 asm("foo %1,%0" : "=r,x,m" (dout0) : "r,x,m" (din1)); 293} 294 295// CHECK: @multi_Y 296void multi_Y0() 297{ 298 // Y constraint currently broken. 299 //asm("foo %1,%0" : "=r,Y0,m" (mout0) : "r,Y0,m" (min1)); 300 //asm("foo %1,%0" : "=r,Yz,m" (mout0) : "r,Yz,m" (min1)); 301 //asm("foo %1,%0" : "=r,Yt,m" (mout0) : "r,Yt,m" (min1)); 302 //asm("foo %1,%0" : "=r,Yi,m" (mout0) : "r,Yi,m" (min1)); 303 //asm("foo %1,%0" : "=r,Ym,m" (mout0) : "r,Ym,m" (min1)); 304} 305 306// CHECK: @multi_I 307void multi_I() 308{ 309 // CHECK: asm "foo $1,$0", "=*r|m|m,r|I|m[[CLOBBERS]](i32* @mout0, i32 1) 310 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,I,m" (1)); 311} 312 313// CHECK: @multi_J 314void multi_J() 315{ 316 // CHECK: asm "foo $1,$0", "=*r|m|m,r|J|m[[CLOBBERS]](i32* @mout0, i32 1) 317 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,J,m" (1)); 318} 319 320// CHECK: @multi_K 321void multi_K() 322{ 323 // CHECK: asm "foo $1,$0", "=*r|m|m,r|K|m[[CLOBBERS]](i32* @mout0, i32 1) 324 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,K,m" (1)); 325} 326 327// CHECK: @multi_L 328void multi_L() 329{ 330 // CHECK: asm "foo $1,$0", "=*r|m|m,r|L|m[[CLOBBERS]](i32* @mout0, i32 1) 331 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,L,m" (1)); 332} 333 334// CHECK: @multi_M 335void multi_M() 336{ 337 // CHECK: asm "foo $1,$0", "=*r|m|m,r|M|m[[CLOBBERS]](i32* @mout0, i32 1) 338 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,M,m" (1)); 339} 340 341// CHECK: @multi_N 342void multi_N() 343{ 344 // CHECK: asm "foo $1,$0", "=*r|m|m,r|N|m[[CLOBBERS]](i32* @mout0, i32 1) 345 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,N,m" (1)); 346} 347 348// CHECK: @multi_G 349void multi_G() 350{ 351 // CHECK: asm "foo $1,$0", "=*r|m|m,r|G|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 352 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,G,m" (1.0)); 353} 354 355// CHECK: @multi_C 356void multi_C() 357{ 358 // CHECK: asm "foo $1,$0", "=*r|m|m,r|C|m[[CLOBBERS]](i32* @mout0, double {{1.[0]+e[+]*[0]+}}) 359 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,C,m" (1.0)); 360} 361 362// CHECK: @multi_e 363void multi_e() 364{ 365 // CHECK: asm "foo $1,$0", "=*r|m|m,r|e|m[[CLOBBERS]](i32* @mout0, i32 1) 366 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,e,m" (1)); 367} 368 369// CHECK: @multi_Z 370void multi_Z() 371{ 372 // CHECK: asm "foo $1,$0", "=*r|m|m,r|Z|m[[CLOBBERS]](i32* @mout0, i32 1) 373 asm("foo %1,%0" : "=r,m,m" (mout0) : "r,Z,m" (1)); 374} 375