Home | History | Annotate | Download | only in CodeGen
      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