Home | History | Annotate | Download | only in CodeGen
      1 // REQUIRES: x86-registered-target
      2 // RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s
      3 
      4 void t1() {
      5 // CHECK: @t1
      6 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
      7 // CHECK: ret void
      8   __asm {}
      9 }
     10 
     11 void t2() {
     12 // CHECK: @t2
     13 // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
     14 // CHECK: ret void
     15   __asm nop
     16   __asm nop
     17   __asm nop
     18 }
     19 
     20 void t3() {
     21 // CHECK: @t3
     22 // CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()
     23 // CHECK: ret void
     24   __asm nop __asm nop __asm nop
     25 }
     26 
     27 void t4(void) {
     28 // CHECK: @t4
     29 // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
     30 // CHECK: ret void
     31   __asm mov ebx, eax
     32   __asm mov ecx, ebx
     33 }
     34 
     35 void t5(void) {
     36 // CHECK: @t5
     37 // CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()
     38 // CHECK: ret void
     39   __asm mov ebx, eax __asm mov ecx, ebx
     40 }
     41 
     42 void t6(void) {
     43   __asm int 0x2c
     44 // CHECK: t6
     45 // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
     46 }
     47 
     48 void t7() {
     49   __asm {
     50     int 0x2c ; } asm comments are fun! }{
     51   }
     52   __asm {
     53     {
     54       int 0x2c ; } asm comments are fun! }{
     55     }
     56   }
     57   __asm {}
     58 // CHECK: t7
     59 // CHECK: call void asm sideeffect inteldialect "int $$0x2c", "~{dirflag},~{fpsr},~{flags}"()
     60 // CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()
     61 }
     62 
     63 int t8() {
     64   __asm int 4 ; } comments for single-line asm
     65   __asm {}
     66   __asm int 4
     67   return 10;
     68 // CHECK: t8
     69 // CHECK: call i32 asm sideeffect inteldialect "int $$4\0A\09int $$4", "={eax},~{dirflag},~{fpsr},~{flags}"()
     70 // CHECK: ret i32 10
     71 }
     72 
     73 void t9() {
     74   __asm {
     75     push ebx
     76     { mov ebx, 0x07 }
     77     __asm { pop ebx }
     78   }
     79 // CHECK: t9
     80 // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
     81 }
     82 
     83 unsigned t10(void) {
     84   unsigned i = 1, j;
     85   __asm {
     86     mov eax, i
     87     mov j, eax
     88   }
     89   return j;
     90 // CHECK: t10
     91 // CHECK: [[r:%[a-zA-Z0-9]+]] = alloca i32, align 4
     92 // CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4
     93 // CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4
     94 // CHECK: store i32 1, i32* [[I]], align 4
     95 // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $2\0A\09mov dword ptr $0, eax", "=*m,={eax},*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}})
     96 // CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32, i32* [[J]], align 4
     97 // CHECK: ret i32 [[RET]]
     98 }
     99 
    100 void t11(void) {
    101   __asm mov eax, 1
    102 // CHECK: t11
    103 // CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    104 }
    105 
    106 unsigned t12(void) {
    107   unsigned i = 1, j, l = 1, m;
    108   __asm {
    109     mov eax, i
    110     mov j, eax
    111     mov eax, l
    112     mov m, eax
    113   }
    114   return j + m;
    115 // CHECK: t12
    116 // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $3\0A\09mov dword ptr $0, eax\0A\09mov eax, dword ptr $4\0A\09mov dword ptr $1, eax", "=*m,=*m,={eax},*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
    117 }
    118 
    119 void t13() {
    120   char i = 1;
    121   short j = 2;
    122   __asm movzx eax, i
    123   __asm movzx eax, j
    124 // CHECK: t13
    125 // CHECK: call void asm sideeffect inteldialect "movzx eax, byte ptr $0\0A\09movzx eax, word ptr $1", "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i8* %{{.*}}i, i16* %{{.*}}j)
    126 }
    127 
    128 void t14() {
    129   unsigned i = 1, j = 2;
    130   __asm {
    131     .if 1
    132     { mov eax, i }
    133     .else
    134     mov ebx, j
    135     .endif
    136   }
    137 // CHECK: t14
    138 // CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, dword ptr $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
    139 }
    140 
    141 int gvar = 10;
    142 void t15() {
    143 // CHECK: t15
    144   int lvar = 10;
    145   __asm mov eax, lvar        ; eax = 10
    146 // CHECK: mov eax, dword ptr $0
    147   __asm mov eax, offset lvar ; eax = address of lvar
    148 // CHECK: mov eax, $1
    149   __asm mov eax, offset gvar ; eax = address of gvar
    150 // CHECK: mov eax, $2
    151 // CHECK: "*m,r,r,~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* @{{.*}})
    152 }
    153 
    154 void t16() {
    155   int var = 10;
    156   __asm mov [eax], offset var
    157 // CHECK: t16
    158 // CHECK: call void asm sideeffect inteldialect "mov [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}})
    159 }
    160 
    161 void t17() {
    162 // CHECK: t17
    163   __asm _emit 0x4A
    164 // CHECK: .byte 0x4A
    165   __asm _emit 0x43
    166 // CHECK: .byte 0x43
    167   __asm _emit 0x4B
    168 // CHECK: .byte 0x4B
    169   __asm _EMIT 0x4B
    170 // CHECK: .byte 0x4B
    171 // CHECK:  "~{dirflag},~{fpsr},~{flags}"()
    172 }
    173 
    174 void t20() {
    175 // CHECK: t20
    176   char bar;
    177   int foo;
    178   char _bar[2];
    179   int _foo[4];
    180 
    181   __asm mov eax, LENGTH foo
    182 // CHECK: mov eax, $$1
    183   __asm mov eax, LENGTH bar
    184 // CHECK: mov eax, $$1
    185   __asm mov eax, LENGTH _foo
    186 // CHECK: mov eax, $$4
    187   __asm mov eax, LENGTH _bar
    188 // CHECK: mov eax, $$2
    189 
    190   __asm mov eax, TYPE foo
    191 // CHECK: mov eax, $$4
    192   __asm mov eax, TYPE bar
    193 // CHECK: mov eax, $$1
    194   __asm mov eax, TYPE _foo
    195 // CHECK: mov eax, $$4
    196   __asm mov eax, TYPE _bar
    197 // CHECK: mov eax, $$1
    198 
    199   __asm mov eax, SIZE foo
    200 // CHECK: mov eax, $$4
    201   __asm mov eax, SIZE bar
    202 // CHECK: mov eax, $$1
    203   __asm mov eax, SIZE _foo
    204 // CHECK: mov eax, $$16
    205   __asm mov eax, SIZE _bar
    206 // CHECK: mov eax, $$2
    207 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    208 }
    209 
    210 void t21() {
    211   __asm {
    212     __asm push ebx
    213     __asm mov ebx, 0x07
    214     __asm pop ebx
    215   }
    216 // CHECK: t21
    217 // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, $$0x07\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
    218 }
    219 
    220 extern void t22_helper(int x);
    221 void t22() {
    222   int x = 0;
    223   __asm {
    224     __asm push ebx
    225     __asm mov ebx, esp
    226   }
    227   t22_helper(x);
    228   __asm {
    229     __asm mov esp, ebx
    230     __asm pop ebx
    231   }
    232 // CHECK: t22
    233 // CHECK: call void asm sideeffect inteldialect "push ebx\0A\09mov ebx, esp", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
    234 // CHECK: call void @t22_helper
    235 // CHECK: call void asm sideeffect inteldialect "mov esp, ebx\0A\09pop ebx", "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()
    236 }
    237 
    238 void t23() {
    239   __asm {
    240   the_label:
    241   }
    242 // CHECK: t23
    243 // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.0__the_label:", "~{dirflag},~{fpsr},~{flags}"()
    244 }
    245 
    246 void t24_helper(void) {}
    247 void t24() {
    248   __asm call t24_helper
    249 // CHECK: t24
    250 // CHECK: call void asm sideeffect inteldialect "call dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(void ()* @t24_helper)
    251 }
    252 
    253 void t25() {
    254 // CHECK: t25
    255   __asm mov eax, 0ffffffffh
    256 // CHECK: mov eax, $$4294967295
    257   __asm mov eax, 0fh
    258 // CHECK: mov eax, $$15
    259   __asm mov eax, 0a2h
    260 // CHECK: mov eax, $$162
    261   __asm mov eax, 0xa2h
    262 // CHECK: mov eax, $$0xa2h
    263   __asm mov eax, 0xa2
    264 // CHECK: mov eax, $$0xa2
    265 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    266 }
    267 
    268 void t26() {
    269 // CHECK: t26
    270   __asm pushad
    271 // CHECK: pushad
    272   __asm mov eax, 0
    273 // CHECK: mov eax, $$0
    274   __asm __emit 0fh
    275 // CHECK: .byte 0fh
    276   __asm __emit 0a2h
    277 // CHECK: .byte 0a2h
    278   __asm __EMIT 0a2h
    279 // CHECK: .byte 0a2h
    280   __asm popad
    281 // CHECK: popad
    282 // CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
    283 }
    284 
    285 void t27() {
    286   __asm mov eax, fs:[0h]
    287 // CHECK: t27
    288 // CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0h]", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    289 }
    290 
    291 void t28() {
    292 // CHECK: t28
    293   __asm align 8
    294 // CHECK: .align 3
    295   __asm align 16;
    296 // CHECK: .align 4
    297   __asm align 128;
    298 // CHECK: .align 7
    299   __asm ALIGN 256;
    300 // CHECK: .align 8
    301 // CHECK: "~{dirflag},~{fpsr},~{flags}"()
    302 }
    303 
    304 void t29() {
    305 // CHECK: t29
    306   int arr[2] = {0, 0};
    307   int olen = 0, osize = 0, otype = 0;
    308   __asm mov olen, LENGTH arr
    309 // CHECK: mov dword ptr $0, $$2
    310   __asm mov osize, SIZE arr
    311 // CHECK: mov dword ptr $1, $$8
    312   __asm mov otype, TYPE arr
    313 // CHECK: mov dword ptr $2, $$4
    314 // CHECK: "=*m,=*m,=*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
    315 }
    316 
    317 int results[2] = {13, 37};
    318 int *t30()
    319 // CHECK: t30
    320 {
    321   int *res;
    322   __asm lea edi, results
    323 // CHECK: lea edi, dword ptr $2
    324   __asm mov res, edi
    325 // CHECK: mov dword ptr $0, edi
    326   return res;
    327 // CHECK: "=*m,={eax},*m,~{edi},~{dirflag},~{fpsr},~{flags}"(i32** %{{.*}}, [2 x i32]* @{{.*}})
    328 }
    329 
    330 void t31() {
    331 // CHECK: t31
    332   __asm pushad
    333 // CHECK: pushad
    334   __asm popad
    335 // CHECK: popad
    336 // CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()
    337 }
    338 
    339 void t32() {
    340 // CHECK: t32
    341   int i;
    342   __asm mov eax, i
    343 // CHECK: mov eax, dword ptr $0
    344   __asm mov eax, dword ptr i
    345 // CHECK: mov eax, dword ptr $1
    346   __asm mov ax, word ptr i
    347 // CHECK: mov ax, word ptr $2
    348   __asm mov al, byte ptr i
    349 // CHECK: mov al, byte ptr $3
    350 // CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
    351 }
    352 
    353 void t33() {
    354 // CHECK: t33
    355   int i;
    356   __asm mov eax, [i]
    357 // CHECK: mov eax, dword ptr $0
    358   __asm mov eax, dword ptr [i]
    359 // CHECK: mov eax, dword ptr $1
    360   __asm mov ax, word ptr [i]
    361 // CHECK: mov ax, word ptr $2
    362   __asm mov al, byte ptr [i]
    363 // CHECK: mov al, byte ptr $3
    364 // CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}}, i32* %{{.*}})
    365 }
    366 
    367 void t34() {
    368 // CHECK: t34
    369   __asm prefetchnta 64[eax]
    370 // CHECK: prefetchnta $$64[eax]
    371   __asm mov eax, dword ptr 4[eax]
    372 // CHECK: mov eax, dword ptr $$4[eax]
    373 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    374 }
    375 
    376 void t35() {
    377 // CHECK: t35
    378   __asm prefetchnta [eax + (200*64)]
    379 // CHECK: prefetchnta [eax + ($$200*$$64)]
    380   __asm mov eax, dword ptr [eax + (200*64)]
    381 // CHECK: mov eax, dword ptr [eax + ($$200*$$64)]
    382 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    383 }
    384 
    385 void t36() {
    386 // CHECK: t36
    387   int arr[4];
    388   // Work around PR20368: These should be single line blocks
    389   __asm { mov eax, 4[arr] }
    390 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    391   __asm { mov eax, 4[arr + 4] }
    392 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    393   __asm { mov eax, 8[arr + 4 + 32*2 - 4] }
    394 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$72$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    395   __asm { mov eax, 12[4 + arr] }
    396 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$16$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    397   __asm { mov eax, 4[4 + arr + 4] }
    398 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    399   __asm { mov eax, 4[64 + arr + (2*32)] }
    400 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$132$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    401   __asm { mov eax, 4[64 + arr - 2*32] }
    402 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    403   __asm { mov eax, [arr + 4] }
    404 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    405   __asm { mov eax, [arr + 4 + 32*2 - 4] }
    406 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$64$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    407   __asm { mov eax, [4 + arr] }
    408 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$4$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    409   __asm { mov eax, [4 + arr + 4] }
    410 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    411   __asm { mov eax, [64 + arr + (2*32)] }
    412 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$128$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    413   __asm { mov eax, [64 + arr - 2*32] }
    414 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    415 }
    416 
    417 void t37() {
    418 // CHECK: t37
    419   __asm mov eax, 4 + 8
    420 // CHECK: mov eax, $$12
    421   __asm mov eax, 4 + 8 * 16
    422 // CHECK: mov eax, $$132
    423   __asm mov eax, -4 + 8 * 16
    424 // CHECK: mov eax, $$124
    425   __asm mov eax, (4 + 4) * 16
    426 // CHECK: mov eax, $$128
    427   __asm mov eax, 4 + 8 * -16
    428 // CHECK: mov eax, $$4294967172
    429   __asm mov eax, 4 + 16 / -8
    430 // CHECK: mov eax, $$2
    431   __asm mov eax, (16 + 16) / -8
    432 // CHECK: mov eax, $$4294967292
    433   __asm mov eax, ~15
    434 // CHECK: mov eax, $$4294967280
    435   __asm mov eax, 6 ^ 3
    436 // CHECK: mov eax, $$5
    437 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    438 }
    439 
    440 void t38() {
    441 // CHECK: t38
    442   int arr[4];
    443   // Work around PR20368: These should be single line blocks
    444   __asm { mov eax, 4+4[arr] }
    445 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    446   __asm { mov eax, (4+4)[arr + 4] }
    447 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$12$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    448   __asm { mov eax, 8*2[arr + 4 + 32*2 - 4] }
    449 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$80$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    450   __asm { mov eax, 12+20[4 + arr] }
    451 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$36$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    452   __asm { mov eax, 4*16+4[4 + arr + 4] }
    453 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$76$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    454   __asm { mov eax, 4*4[64 + arr + (2*32)] }
    455 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$144$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    456   __asm { mov eax, 4*(4-2)[64 + arr - 2*32] }
    457 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$8$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    458   __asm { mov eax, 32*(4-2)[arr - 2*32] }
    459 // CHECK: call void asm sideeffect inteldialect "mov eax, dword ptr $$0$0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"([4 x i32]* %{{.*}})
    460 }
    461 
    462 void cpuid() {
    463   __asm cpuid
    464 // CHECK-LABEL: define void @cpuid
    465 // CHECK: call void asm sideeffect inteldialect "cpuid", "~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()
    466 }
    467 
    468 typedef struct {
    469   int a;
    470   int b;
    471 } A;
    472 
    473 typedef struct {
    474   int b1;
    475   A   b2;
    476 } B;
    477 
    478 typedef struct {
    479   int c1;
    480   A   c2;
    481   int c3;
    482   B   c4;
    483 } C;
    484 
    485 void t39() {
    486 // CHECK-LABEL: define void @t39
    487   __asm mov eax, [eax].A.b
    488 // CHECK: mov eax, [eax].4
    489   __asm mov eax, [eax] A.b
    490 // CHECK: mov eax, [eax] .4
    491   __asm mov eax, fs:[0] A.b
    492 // CHECK: mov eax, fs:[$$0] .4
    493   __asm mov eax, [eax].B.b2.a
    494 // CHECK: mov eax, [eax].4
    495   __asm mov eax, [eax] B.b2.b
    496 // CHECK: mov eax, [eax] .8
    497   __asm mov eax, fs:[0] C.c2.b
    498 // CHECK: mov eax, fs:[$$0] .8
    499   __asm mov eax, [eax]C.c4.b2.b
    500 // CHECK: mov eax, [eax].24
    501 // CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()
    502 }
    503 
    504 void t40(float a) {
    505 // CHECK-LABEL: define void @t40
    506   int i;
    507   __asm fld a
    508 // CHECK: fld dword ptr $1
    509   __asm fistp i
    510 // CHECK: fistp dword ptr $0
    511 // CHECK: "=*m,*m,~{dirflag},~{fpsr},~{flags}"(i32* %{{.*}}, float* %{{.*}})
    512 }
    513 
    514 void t41(unsigned short a) {
    515 // CHECK-LABEL: define void @t41(i16 zeroext %a)
    516   __asm mov cs, a;
    517 // CHECK: mov cs, word ptr $0
    518   __asm mov ds, a;
    519 // CHECK: mov ds, word ptr $1
    520   __asm mov es, a;
    521 // CHECK: mov es, word ptr $2
    522   __asm mov fs, a;
    523 // CHECK: mov fs, word ptr $3
    524   __asm mov gs, a;
    525 // CHECK: mov gs, word ptr $4
    526   __asm mov ss, a;
    527 // CHECK: mov ss, word ptr $5
    528 // CHECK: "*m,*m,*m,*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}}, i16* {{.*}})
    529 }
    530 
    531 void t42() {
    532 // CHECK-LABEL: define void @t42
    533   int flags;
    534   __asm mov flags, eax
    535 // CHECK: mov dword ptr $0, eax
    536 // CHECK: "=*m,~{dirflag},~{fpsr},~{flags}"(i32* %flags)
    537 }
    538 
    539 void call_clobber() {
    540   __asm call t41
    541   // CHECK-LABEL: define void @call_clobber
    542   // CHECK: call void asm sideeffect inteldialect "call dword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(void (i16)* @t41)
    543 }
    544 
    545 void xgetbv() {
    546   __asm xgetbv
    547 }
    548 // CHECK-LABEL: define void @xgetbv()
    549 // CHECK: call void asm sideeffect inteldialect "xgetbv", "~{eax},~{edx},~{dirflag},~{fpsr},~{flags}"()
    550 
    551 void label1() {
    552   __asm {
    553     label:
    554     jmp label
    555   }
    556   // CHECK-LABEL: define void @label1()
    557   // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.1__label:\0A\09jmp {{.*}}__MSASMLABEL_.1__label", "~{dirflag},~{fpsr},~{flags}"() [[ATTR1:#[0-9]+]]
    558 }
    559 
    560 void label2() {
    561   __asm {
    562     jmp label
    563     label:
    564   }
    565   // CHECK-LABEL: define void @label2
    566   // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.2__label\0A\09{{.*}}__MSASMLABEL_.2__label:", "~{dirflag},~{fpsr},~{flags}"()
    567 }
    568 
    569 void label3() {
    570   __asm {
    571     label:
    572     mov eax, label
    573   }
    574   // CHECK-LABEL: define void @label3
    575   // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.3__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.3__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    576 }
    577 
    578 void label4() {
    579   __asm {
    580     label:
    581     mov eax, [label]
    582   }
    583   // CHECK-LABEL: define void @label4
    584   // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.4__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.4__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()
    585 }
    586 
    587 typedef union _LARGE_INTEGER {
    588   struct {
    589     unsigned int LowPart;
    590     unsigned int  HighPart;
    591   };
    592   struct {
    593     unsigned int LowPart;
    594     unsigned int  HighPart;
    595   } u;
    596   unsigned long long QuadPart;
    597 } LARGE_INTEGER, *PLARGE_INTEGER;
    598 
    599 int test_indirect_field(LARGE_INTEGER LargeInteger) {
    600     __asm mov     eax, LargeInteger.LowPart
    601 }
    602 // CHECK-LABEL: define i32 @test_indirect_field(
    603 // CHECK: call i32 asm sideeffect inteldialect "mov eax, dword ptr $1",
    604 
    605 // MS ASM containing labels must not be duplicated (PR23715).
    606 // CHECK: attributes [[ATTR1]] = { {{.*}}noduplicate{{.*}} }
    607