brintos

brintos / llvm-project-archived public Read only

0
0
Text · 25.1 KiB · c3eef9a Raw
796 lines · c
1// REQUIRES: x86-registered-target2// RUN: %clang_cc1 %s -triple i386-apple-darwin10 -fasm-blocks -emit-llvm -o - | FileCheck %s3 4void t1(void) {5// CHECK: @t16// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()7// CHECK: ret void8  __asm {}9}10 11void t2(void) {12// CHECK: @t213// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()14// CHECK: ret void15  __asm nop16  __asm nop17  __asm nop18}19 20void t3(void) {21// CHECK: @t322// CHECK: call void asm sideeffect inteldialect "nop\0A\09nop\0A\09nop", "~{dirflag},~{fpsr},~{flags}"()23// CHECK: ret void24  __asm nop __asm nop __asm nop25}26 27void t4(void) {28// CHECK: @t429// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()30// CHECK: ret void31  __asm mov ebx, eax32  __asm mov ecx, ebx33}34 35void t5(void) {36// CHECK: @t537// CHECK: call void asm sideeffect inteldialect "mov ebx, eax\0A\09mov ecx, ebx", "~{ebx},~{ecx},~{dirflag},~{fpsr},~{flags}"()38// CHECK: ret void39  __asm mov ebx, eax __asm mov ecx, ebx40}41 42void t6(void) {43  __asm int 0x2c44// CHECK: t645// CHECK: call void asm sideeffect inteldialect "int $$44", "~{dirflag},~{fpsr},~{flags}"()46}47 48void t7(void) {49  __asm {50    int 0x2cU ; } asm comments are fun! }{51  }52  __asm {53    {54      int 0x2c ; } asm comments are fun! }{55    }56  }57  __asm {}58  __asm {59    ;60    ; label61    mov eax, ebx62  }63// CHECK: t764// CHECK: call void asm sideeffect inteldialect "int $$44", "~{dirflag},~{fpsr},~{flags}"()65// CHECK: call void asm sideeffect inteldialect "", "~{dirflag},~{fpsr},~{flags}"()66// CHECK: call void asm sideeffect inteldialect "mov eax, ebx", "~{eax},~{dirflag},~{fpsr},~{flags}"()67}68 69int t8(void) {70  __asm int 4 ; } comments for single-line asm71  __asm {}72  __asm { int 5}73  __asm int 674  __asm int 775  __asm { 76    int 877  }78  return 10;79// CHECK: t880// CHECK: call i32 asm sideeffect inteldialect "int $$4", "={eax},~{dirflag},~{fpsr},~{flags}"()81// CHECK: call i32 asm sideeffect inteldialect "", "={eax},~{dirflag},~{fpsr},~{flags}"()82// CHECK: call i32 asm sideeffect inteldialect "int $$5", "={eax},~{dirflag},~{fpsr},~{flags}"()83// CHECK: call i32 asm sideeffect inteldialect "int $$6\0A\09int $$7", "={eax},~{dirflag},~{fpsr},~{flags}"()84// CHECK: call i32 asm sideeffect inteldialect "int $$8", "={eax},~{dirflag},~{fpsr},~{flags}"()85// CHECK: ret i32 1086}87 88void t9(void) {89  __asm {90    push ebx91    { mov ebx, 0x07 }92    __asm { pop ebx }93  }94// CHECK: t995// CHECK: call void asm sideeffect inteldialect96// CHECK-SAME: push ebx97// CHECK-SAME: mov ebx, $$798// CHECK-SAME: pop ebx99// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()100}101 102unsigned t10(void) {103  unsigned i = 1, j;104  __asm {105    mov eax, i106    mov j, eax107  }108  return j;109// CHECK: t10110// CHECK: [[r:%[a-zA-Z0-9]+]] = alloca i32, align 4111// CHECK: [[I:%[a-zA-Z0-9]+]] = alloca i32, align 4112// CHECK: [[J:%[a-zA-Z0-9]+]] = alloca i32, align 4113// CHECK: store i32 1, ptr [[I]], align 4114// CHECK: call i32 asm sideeffect inteldialect115// CHECK-SAME: mov eax, $2116// CHECK-SAME: mov $0, eax117// CHECK-SAME: "=*m,=&{eax},*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}})118// CHECK: [[RET:%[a-zA-Z0-9]+]] = load i32, ptr [[J]], align 4119// CHECK: ret i32 [[RET]]120}121 122void t11(void) {123  __asm mov eax, 1124// CHECK: t11125// CHECK: call void asm sideeffect inteldialect "mov eax, $$1", "~{eax},~{dirflag},~{fpsr},~{flags}"()126}127 128unsigned t12(void) {129  unsigned i = 1, j, l = 1, m;130  __asm {131    mov eax, i132    mov j, eax133    mov eax, l134    mov m, eax135  }136  return j + m;137// CHECK: t12138// CHECK: call i32 asm sideeffect inteldialect139// CHECK-SAME: mov eax, $3140// CHECK-SAME: mov $0, eax141// CHECK-SAME: mov eax, $4142// CHECK-SAME: mov $1, eax143// CHECK-SAME: "=*m,=*m,=&{eax},*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}})144}145 146void t13(void) {147  char i = 1;148  short j = 2;149  __asm movzx eax, i150  __asm movzx eax, j151// CHECK-LABEL: define{{.*}} void @t13()152// CHECK: call void asm sideeffect inteldialect153// CHECK-SAME: movzx eax, byte ptr $0154// CHECK-SAME: movzx eax, word ptr $1155// CHECK-SAME: "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i8) %{{.*}}i, ptr elementtype(i16) %{{.*}}j)156}157 158void t13_brac(void) {159  char i = 1;160  short j = 2;161  __asm movzx eax, [i]162  __asm movzx eax, [j]163// CHECK-LABEL: define{{.*}} void @t13_brac()164// CHECK: call void asm sideeffect inteldialect165// CHECK-SAME: movzx eax, byte ptr $0166// CHECK-SAME: movzx eax, word ptr $1167// CHECK-SAME: "*m,*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i8) %{{.*}}i, ptr elementtype(i16) %{{.*}}j)168}169 170void t14(void) {171  unsigned i = 1, j = 2;172  __asm {173    .if 1174    { mov eax, i }175    .else176    mov ebx, j177    .endif178  }179// CHECK: t14180// CHECK: call void asm sideeffect inteldialect ".if 1\0A\09mov eax, $0\0A\09.else\0A\09mov ebx, j\0A\09.endif", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})181}182 183int gvar = 10;184void t15(void) {185// CHECK: t15186  int lvar = 10;187  __asm mov eax, lvar        ; eax = 10188// CHECK: mov eax, $0189  __asm mov eax, offset lvar ; eax = address of lvar190// CHECK: mov eax, $1191  __asm mov eax, offset gvar ; eax = address of gvar192// CHECK: mov eax, $2193  __asm mov eax, offset gvar+1 ; eax = 1 + address of gvar194// CHECK: mov eax, $3 + $$1195  __asm mov eax, 1+offset gvar ; eax = 1 + address of gvar196// CHECK: mov eax, $4 + $$1197  __asm mov eax, 1+offset gvar+1 ; eax = 2 + address of gvar198// CHECK: mov eax, $5 + $$2199// CHECK: "*m,r,i,i,i,i,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr %{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}}, ptr @{{.*}})200}201 202void t16(void) {203  int var = 10;204  __asm mov dword ptr [eax], offset var205// CHECK: t16206// CHECK: call void asm sideeffect inteldialect "mov dword ptr [eax], $0", "r,~{dirflag},~{fpsr},~{flags}"(ptr %{{.*}})207}208 209void t17(void) {210// CHECK: t17211  __asm _emit 0x4A212// CHECK: .byte 0x4A213  __asm _emit 0x43L214// CHECK: .byte 0x43L215  __asm _emit 0x4B216// CHECK: .byte 0x4B217  __asm _EMIT 0x4B218// CHECK: .byte 0x4B219// CHECK:  "~{dirflag},~{fpsr},~{flags}"()220}221 222void t20(void) {223// CHECK: t20224  char bar;225  int foo;226  char _bar[2];227  int _foo[4];228 229  __asm mov eax, LENGTH foo230// CHECK: mov eax, $$1231  __asm mov eax, LENGTH bar232// CHECK: mov eax, $$1233  __asm mov eax, LENGTH _foo234// CHECK: mov eax, $$4235  __asm mov eax, LENGTH _bar236// CHECK: mov eax, $$2237  __asm mov eax, [eax + LENGTH foo * 4]238// CHECK: mov eax, [eax + $$4]239 240  __asm mov eax, TYPE foo241// CHECK: mov eax, $$4242  __asm mov eax, TYPE bar243// CHECK: mov eax, $$1244  __asm mov eax, TYPE _foo245// CHECK: mov eax, $$4246  __asm mov eax, TYPE _bar247// CHECK: mov eax, $$1248  __asm mov eax, [eax + TYPE foo * 4]249// CHECK: mov eax, [eax + $$16]250 251  __asm mov eax, SIZE foo252// CHECK: mov eax, $$4253  __asm mov eax, SIZE bar254// CHECK: mov eax, $$1255  __asm mov eax, SIZE _foo256// CHECK: mov eax, $$16257  __asm mov eax, [eax + SIZE _foo * 4]258// CHECK: mov eax, [eax + $$64]259  __asm mov eax, SIZE _bar260// CHECK: mov eax, $$2261// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()262 263}264 265void t21(void) {266  __asm {267    __asm push ebx268    __asm mov ebx, 07H269    __asm pop ebx270  }271// CHECK: t21272// CHECK: call void asm sideeffect inteldialect273// CHECK-SAME: push ebx274// CHECK-SAME: mov ebx, $$7275// CHECK-SAME: pop ebx276// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()277}278 279extern void t22_helper(int x);280void t22(void) {281  int x = 0;282  __asm {283    __asm push ebx284    __asm mov ebx, esp285  }286  t22_helper(x);287  __asm {288    __asm mov esp, ebx289    __asm pop ebx290  }291// CHECK: t22292// CHECK: call void asm sideeffect inteldialect293// CHECK-SAME: push ebx294// CHECK-SAME: mov ebx, esp295// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()296// CHECK: call void @t22_helper297// CHECK: call void asm sideeffect inteldialect298// CHECK-SAME: mov esp, ebx299// CHECK-SAME: pop ebx300// CHECK-SAME: "~{ebx},~{esp},~{dirflag},~{fpsr},~{flags}"()301}302 303void t23(void) {304  __asm {305  the_label:306  }307// CHECK: t23308// CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.${:uid}__the_label:", "~{dirflag},~{fpsr},~{flags}"()309}310 311void t24_helper(void) {}312void t24(void) {313  __asm call t24_helper314// CHECK: t24315// CHECK: call void asm sideeffect inteldialect "call ${0:P}", "*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(void ()) @t24_helper)316}317 318void t25(void) {319// CHECK: t25320  __asm mov eax, 0ffffffffh321// CHECK: mov eax, $$4294967295322  __asm mov eax, 0fhU323// CHECK: mov eax, $$15324  __asm mov eax, 0a2h325// CHECK: mov eax, $$162326  __asm mov eax, 10100010b327// CHECK: mov eax, $$162328  __asm mov eax, 10100010BU329// CHECK: mov eax, $$162330// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()331}332 333void t26(void) {334// CHECK: t26335  __asm pushad336// CHECK: pushad337  __asm mov eax, 0338// CHECK: mov eax, $$0339  __asm __emit 0fh340// CHECK: .byte 0fh341  __asm __emit 0a2h342// CHECK: .byte 0a2h343  __asm __EMIT 0a2h344// CHECK: .byte 0a2h345  __asm popad346// CHECK: popad347// CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()348}349 350void t27(void) {351  __asm mov eax, fs:[0h]352// CHECK: t27353// CHECK: call void asm sideeffect inteldialect "mov eax, fs:[$$0]", "~{eax},~{dirflag},~{fpsr},~{flags}"()354}355 356void t28(void) {357// CHECK: t28358  __asm align 8359// CHECK: .align 3360  __asm align 16;361// CHECK: .align 4362  __asm align 128;363// CHECK: .align 7364  __asm ALIGN 256;365// CHECK: .align 8366// CHECK: "~{dirflag},~{fpsr},~{flags}"()367}368 369void t29(void) {370// CHECK: t29371  int arr[2] = {0, 0};372  int olen = 0, osize = 0, otype = 0;373  __asm mov olen, LENGTH arr374// CHECK: mov dword ptr $0, $$2375  __asm mov osize, SIZE arr376// CHECK: mov dword ptr $1, $$8377  __asm mov otype, TYPE arr378// CHECK: mov dword ptr $2, $$4379// CHECK: "=*m,=*m,=*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}})380}381 382int results[2] = {13, 37};383int *t30(void)384// CHECK: t30385{386  int *res;387  __asm lea edi, results388// CHECK: lea edi, $2389  __asm mov res, edi390// CHECK: mov $0, edi391  return res;392// CHECK: "=*m,={eax},*m,~{edi},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(ptr) %{{.*}}, ptr elementtype([2 x i32]) @{{.*}})393}394 395void t31(void) {396// CHECK: t31397  __asm pushad398// CHECK: pushad399  __asm popad400// CHECK: popad401// CHECK: "~{eax},~{ebp},~{ebx},~{ecx},~{edi},~{edx},~{esi},~{esp},~{dirflag},~{fpsr},~{flags}"()402}403 404void t32(void) {405// CHECK: t32406  int i;407  __asm mov eax, i408// CHECK: mov eax, $0409  __asm mov eax, dword ptr i410// CHECK: mov eax, dword ptr $1411  __asm mov ax, word ptr i412// CHECK: mov ax, word ptr $2413  __asm mov al, byte ptr i414// CHECK: mov al, byte ptr $3415// CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}})416}417 418void t33(void) {419// CHECK: t33420  int i;421  __asm mov eax, [i]422// CHECK: mov eax, $0423  __asm mov eax, dword ptr [i]424// CHECK: mov eax, dword ptr $1425  __asm mov ax, word ptr [i]426// CHECK: mov ax, word ptr $2427  __asm mov al, byte ptr [i]428// CHECK: mov al, byte ptr $3429// CHECK: "*m,*m,*m,*m,~{al},~{ax},~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}}, ptr elementtype(i32) %{{.*}})430}431 432void t34(void) {433// CHECK: t34434  __asm prefetchnta 64[eax]435// CHECK: prefetchnta [eax + $$64]436  __asm mov eax, dword ptr 4[eax]437// CHECK: mov eax, dword ptr [eax + $$4]438// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()439}440 441void t35(void) {442// CHECK: t35443  __asm prefetchnta [eax + (200*64)]444// CHECK: prefetchnta [eax + $$12800]445  __asm mov eax, dword ptr [eax + (200*64)]446// CHECK: mov eax, dword ptr [eax + $$12800]447// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()448}449 450void t36(void) {451// CHECK: t36452  int arr[4];453  // Work around PR20368: These should be single line blocks454  __asm { mov eax, 4[arr] }455// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})456  __asm { mov eax, 4[arr + 4] }457// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})458  __asm { mov eax, 8[arr + 4 + 32*2 - 4] }459// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$72]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})460  __asm { mov eax, 12[4 + arr] }461// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$16]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})462  __asm { mov eax, 4[4 + arr + 4] }463// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$12]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})464  __asm { mov eax, 4[64 + arr + (2*32)] }465// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$132]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})466  __asm { mov eax, 4[64 + arr - 2*32] }467// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})468  __asm { mov eax, [arr + 4] }469// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})470  __asm { mov eax, [arr + 4 + 32*2 - 4] }471// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$64]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})472  __asm { mov eax, [4 + arr] }473// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})474  __asm { mov eax, [4 + arr + 4] }475// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})476  __asm { mov eax, [64 + arr + (2*32)] }477// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$128]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})478  __asm { mov eax, [64 + arr - 2*32] }479// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})480}481 482void t37(void) {483// CHECK: t37484  __asm mov eax, 4 + 8485// CHECK: mov eax, $$12486  __asm mov eax, 4 + 8 * 16487// CHECK: mov eax, $$132488  __asm mov eax, -4 + 8 * 16489// CHECK: mov eax, $$124490  __asm mov eax, (4 + 4) * 16491// CHECK: mov eax, $$128492  __asm mov eax, 4 + 8 * -16493// CHECK: mov eax, $$-124494  __asm mov eax, 4 + 16 / -8495// CHECK: mov eax, $$2496  __asm mov eax, (16 + 16) / -8497// CHECK: mov eax, $$-4498  __asm mov eax, ~15499// CHECK: mov eax, $$-16500  __asm mov eax, 6 ^ 3501// CHECK: mov eax, $$5502// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()503}504 505void t38(void) {506// CHECK: t38507  int arr[4];508  // Work around PR20368: These should be single line blocks509  __asm { mov eax, 4+4[arr] }510// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})511  __asm { mov eax, (4+4)[arr + 4] }512// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$12]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})513  __asm { mov eax, 8*2[arr + 4 + 32*2 - 4] }514// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$80]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})515  __asm { mov eax, 12+20[4 + arr] }516// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$36]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})517  __asm { mov eax, 4*16+4[4 + arr + 4] }518// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$76]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})519  __asm { mov eax, 4*4[64 + arr + (2*32)] }520// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$144]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})521  __asm { mov eax, 4*(4-2)[64 + arr - 2*32] }522// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})523  __asm { mov eax, 32*(4-2)[arr - 2*32] }524// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype([4 x i32]) %{{.*}})525}526 527void cpuid(void) {528  __asm cpuid529// CHECK-LABEL: define{{.*}} void @cpuid530// CHECK: call void asm sideeffect inteldialect "cpuid", "~{eax},~{ebx},~{ecx},~{edx},~{dirflag},~{fpsr},~{flags}"()531}532 533typedef struct {534  int a;535  int b;536} A, *pA;537 538typedef struct {539  int b1;540  A   b2;541} B;542 543typedef struct {544  int c1;545  A   c2;546  int c3;547  B   c4;548} C, *pC;549 550void t39(void) {551// CHECK-LABEL: define{{.*}} void @t39552  __asm mov eax, [eax].A.b553// CHECK: mov eax, [eax + $$4]554  __asm mov eax, [eax] A.b555// CHECK: mov eax, [eax + $$4]556  __asm mov eax, [eax] pA.b557// CHECK: mov eax, [eax + $$4]558  __asm mov eax, fs:[0] A.b559// CHECK: mov eax, fs:[$$4]560  __asm mov eax, [eax].B.b2.a561// CHECK: mov eax, [eax + $$4]562  __asm mov eax, [eax] B.b2.b563// CHECK: mov eax, [eax + $$8]564  __asm mov eax, fs:[0] C.c2.b565// CHECK: mov eax, fs:[$$8]566  __asm mov eax, [eax]C.c4.b2.b567// CHECK: mov eax, [eax + $$24]568  __asm mov eax, [eax]pC.c4.b2.b569// CHECK: mov eax, [eax + $$24]570// CHECK: "~{eax},~{dirflag},~{fpsr},~{flags}"()571}572 573void t40(float a) {574// CHECK-LABEL: define{{.*}} void @t40575  int i;576  __asm fld a577// CHECK: fld dword ptr $1578  __asm fistp i579// CHECK: fistp dword ptr $0580// CHECK: "=*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}}, ptr elementtype(float) %{{.*}})581}582 583void t41(unsigned short a) {584// CHECK-LABEL: define{{.*}} void @t41(i16 noundef zeroext %a)585  __asm mov cs, a;586// CHECK: mov cs, $0587  __asm mov ds, a;588// CHECK: mov ds, $1589  __asm mov es, a;590// CHECK: mov es, $2591  __asm mov fs, a;592// CHECK: mov fs, $3593  __asm mov gs, a;594// CHECK: mov gs, $4595  __asm mov ss, a;596// CHECK: mov ss, $5597// CHECK: "*m,*m,*m,*m,*m,*m,~{dirflag},~{fpsr},~{flags}"(ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr {{.*}}, ptr {{.*}})598}599 600void t42(void) {601// CHECK-LABEL: define{{.*}} void @t42(602  int flags;603  __asm mov flags, eax604// CHECK: mov $0, eax605// CHECK: "=*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %flags)606}607 608void t42b(void) {609// CHECK-LABEL: define{{.*}} void @t42b(610  int mxcsr;611  __asm mov mxcsr, eax612// CHECK: mov $0, eax613// CHECK: "=*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %mxcsr)614}615 616void t43(void) {617// CHECK-LABEL: define{{.*}} void @t43618  C strct;619// Work around PR20368: These should be single line blocks620 __asm { mov eax, 4[strct.c1] }621// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})622  __asm { mov eax, 4[strct.c3 + 4] }623// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})624  __asm { mov eax, 8[strct.c2.a + 4 + 32*2 - 4] }625// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$72]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})626  __asm { mov eax, 12[4 + strct.c2.b] }627// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$16]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})628  __asm { mov eax, 4[4 + strct.c4.b2.b + 4] }629// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$12]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})630  __asm { mov eax, 4[64 + strct.c1 + (2*32)] }631// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$132]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})632  __asm { mov eax, 4[64 + strct.c2.a - 2*32] }633// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})634  __asm { mov eax, [strct.c4.b1 + 4] }635// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})636  __asm { mov eax, [strct.c4.b2.a + 4 + 32*2 - 4] }637// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$64]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})638  __asm { mov eax, [4 + strct.c1] }639// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$4]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})640  __asm { mov eax, [4 + strct.c2.b + 4] }641// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$8]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})642  __asm { mov eax, [64 + strct.c3 + (2*32)] }643// CHECK: call void asm sideeffect inteldialect "mov eax, $0[$$128]", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})644  __asm { mov eax, [64 + strct.c4.b2.b - 2*32] }645// CHECK: call void asm sideeffect inteldialect "mov eax, $0", "*m,~{eax},~{dirflag},~{fpsr},~{flags}"(ptr elementtype(i32) %{{.*}})646}647 648void t44(void) {649  // CHECK-LABEL: define{{.*}} void @t44650  __asm {651    mov cr0, eax652    mov cr2, ebx653    mov cr3, ecx654    mov cr4, edx655  }656  // CHECK: call void asm sideeffect inteldialect "mov cr0, eax\0A\09mov cr2, ebx\0A\09mov cr3, ecx\0A\09mov cr4, edx", "~{cr0},~{cr2},~{cr3},~{cr4},~{dirflag},~{fpsr},~{flags}"()657}658 659void t45(void) {660  // CHECK-LABEL: define{{.*}} void @t45661  __asm {662    mov dr0, eax663    mov dr1, ebx664    mov dr2, ebx665    mov dr3, ecx666    mov dr6, edx667    mov dr7, ecx668  }669  // CHECK: call void asm sideeffect inteldialect "mov dr0, eax\0A\09mov dr1, ebx\0A\09mov dr2, ebx\0A\09mov dr3, ecx\0A\09mov dr6, edx\0A\09mov dr7, ecx", "~{dr0},~{dr1},~{dr2},~{dr3},~{dr6},~{dr7},~{dirflag},~{fpsr},~{flags}"()670}671 672void t46(void) {673  // CHECK-LABEL: define{{.*}} void @t46674  __asm add eax, -128[eax]675  // CHECK: call void asm sideeffect inteldialect "add eax, [eax + $$-128]", "~{eax},~{flags},~{dirflag},~{fpsr},~{flags}"()676}677 678void t47(void) {679  // CHECK-LABEL: define{{.*}} void @t47680  int arr[1000];681  __asm movdir64b eax, zmmword ptr [arr]682  // CHECK: call void asm sideeffect inteldialect "movdir64b eax, zmmword ptr $0", "*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype([1000 x i32]) %arr)683}684 685void dot_operator(void){686  // CHECK-LABEL: define{{.*}} void @dot_operator687	__asm { mov eax, 3[ebx]A.b}688  // CHECK: call void asm sideeffect inteldialect "mov eax, [ebx + $$7]", "~{eax},~{dirflag},~{fpsr},~{flags}"689}690 691void call_clobber(void) {692  __asm call t41693  // CHECK-LABEL: define{{.*}} void @call_clobber694  // CHECK: call void asm sideeffect inteldialect "call ${0:P}", "*m,~{dirflag},~{fpsr},~{flags}"(ptr elementtype(void (i16)) @t41)695}696 697void xgetbv(void) {698  __asm xgetbv699}700// CHECK-LABEL: define{{.*}} void @xgetbv()701// CHECK: call void asm sideeffect inteldialect "xgetbv", "~{eax},~{edx},~{dirflag},~{fpsr},~{flags}"()702 703void label1(void) {704  __asm {705    label:706    jmp label707  }708  // CHECK-LABEL: define{{.*}} void @label1()709  // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.${:uid}__label:\0A\09jmp {{.*}}__MSASMLABEL_.${:uid}__label", "~{dirflag},~{fpsr},~{flags}"() [[ATTR1:#[0-9]+]]710}711 712void label2(void) {713  __asm {714    jmp label715    label:716  }717  // CHECK-LABEL: define{{.*}} void @label2718  // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.${:uid}__label\0A\09{{.*}}__MSASMLABEL_.${:uid}__label:", "~{dirflag},~{fpsr},~{flags}"()719}720 721void label3(void) {722  __asm {723    label:724    mov eax, label725  }726  // CHECK-LABEL: define{{.*}} void @label3727  // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.${:uid}__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.${:uid}__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()728}729 730void label4(void) {731  __asm {732    label:733    mov eax, [label]734  }735  // CHECK-LABEL: define{{.*}} void @label4736  // CHECK: call void asm sideeffect inteldialect "{{.*}}__MSASMLABEL_.${:uid}__label:\0A\09mov eax, {{.*}}__MSASMLABEL_.${:uid}__label", "~{eax},~{dirflag},~{fpsr},~{flags}"()737}738 739void label5(void) {740  __asm {741    jmp dollar_label$742    dollar_label$:743  }744  // CHECK-LABEL: define{{.*}} void @label5745  // CHECK: call void asm sideeffect inteldialect "jmp {{.*}}__MSASMLABEL_.${:uid}__dollar_label$$\0A\09{{.*}}__MSASMLABEL_.${:uid}__dollar_label$$:", "~{dirflag},~{fpsr},~{flags}"()746}747 748void label6(void){749  __asm {750      jmp short label751      jc  short label752      jz  short label753    label:754  }755  // CHECK-LABEL: define{{.*}} void @label6756  // CHECK: jmp {{.*}}__MSASMLABEL_.${:uid}__label\0A\09jc {{.*}}__MSASMLABEL_.${:uid}__label\0A\09jz {{.*}}__MSASMLABEL_.${:uid}__label\0A\09{{.*}}__MSASMLABEL_.${:uid}__label:"757}758 759// Don't include mxcsr in the clobber list.760void mxcsr(void) {761  char buf[4096];762  __asm fxrstor buf763}764// CHECK-LABEL: define{{.*}} void @mxcsr765// CHECK: call void asm sideeffect inteldialect "fxrstor $0", "=*m,~{fpcr},~{dirflag},~{fpsr},~{flags}"766 767// Make sure we can find the register for the dirflag for popfd768void dirflag(void) {769  __asm popfd770}771// CHECK-LABEL: define{{.*}} void @dirflag772// CHECK: call void asm sideeffect inteldialect "popfd", "~{dirflag},~{flags},~{esp},~{dirflag},~{fpsr},~{flags}"773 774typedef union _LARGE_INTEGER {775  struct {776    unsigned int LowPart;777    unsigned int  HighPart;778  };779  struct {780    unsigned int LowPart;781    unsigned int  HighPart;782  } u;783  unsigned long long QuadPart;784} LARGE_INTEGER, *PLARGE_INTEGER;785 786int test_indirect_field(LARGE_INTEGER LargeInteger) {787    __asm mov     eax, LargeInteger.LowPart788}789// CHECK-LABEL: define{{.*}} i32 @test_indirect_field(790// CHECK: call i32 asm sideeffect inteldialect "mov eax, $1",791 792// MS ASM containing labels must not be duplicated (PR23715).793// CHECK: attributes [[ATTR1]] = {794// CHECK-NOT: noduplicate795// CHECK-SAME: }{{$}}796