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