brintos

brintos / llvm-project-archived public Read only

0
0
Text · 44.4 KiB · 6d4ec06 Raw
1440 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+sse | FileCheck %s --check-prefix=X64-SSE3; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+sse | FileCheck %s --check-prefix=X64-SSE4; RUN: llc < %s -O2 -mtriple=i686-linux-gnu -mattr=+mmx | FileCheck %s --check-prefix=X865; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+avx | FileCheck %s --check-prefix=X64-AVX6; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+avx | FileCheck %s --check-prefix=X64-AVX7; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+avx512f | FileCheck %s --check-prefix=X64-AVX8; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+avx512f | FileCheck %s --check-prefix=X64-AVX9 10; Check soft floating point conversion function calls.11 12@vi16 = common dso_local global i16 0, align 213@vi32 = common dso_local global i32 0, align 414@vi64 = common dso_local global i64 0, align 815@vi128 = common dso_local global i128 0, align 1616@vu32 = common dso_local global i32 0, align 417@vu64 = common dso_local global i64 0, align 818@vu128 = common dso_local global i128 0, align 1619@vf32 = common dso_local global float 0.000000e+00, align 420@vf64 = common dso_local global double 0.000000e+00, align 821@vf80 = common dso_local global x86_fp80 0xK00000000000000000000, align 822@vf128 = common dso_local global fp128 0xL00000000000000000000000000000000, align 1623 24define dso_local void @TestFPExtF32_F128() nounwind {25; X64-SSE-LABEL: TestFPExtF32_F128:26; X64-SSE:       # %bb.0: # %entry27; X64-SSE-NEXT:    pushq %rax28; X64-SSE-NEXT:    movss {{.*#+}} xmm0 = mem[0],zero,zero,zero29; X64-SSE-NEXT:    callq __extendsftf2@PLT30; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)31; X64-SSE-NEXT:    popq %rax32; X64-SSE-NEXT:    retq33;34; X86-LABEL: TestFPExtF32_F128:35; X86:       # %bb.0: # %entry36; X86-NEXT:    pushl %esi37; X86-NEXT:    subl $40, %esp38; X86-NEXT:    flds vf3239; X86-NEXT:    fstps {{[0-9]+}}(%esp)40; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax41; X86-NEXT:    movl %eax, (%esp)42; X86-NEXT:    calll __extendsftf243; X86-NEXT:    subl $4, %esp44; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax45; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx46; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx47; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi48; X86-NEXT:    movl %esi, vf128+1249; X86-NEXT:    movl %edx, vf128+850; X86-NEXT:    movl %ecx, vf128+451; X86-NEXT:    movl %eax, vf12852; X86-NEXT:    addl $40, %esp53; X86-NEXT:    popl %esi54; X86-NEXT:    retl55;56; X64-AVX-LABEL: TestFPExtF32_F128:57; X64-AVX:       # %bb.0: # %entry58; X64-AVX-NEXT:    pushq %rax59; X64-AVX-NEXT:    vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero60; X64-AVX-NEXT:    callq __extendsftf2@PLT61; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)62; X64-AVX-NEXT:    popq %rax63; X64-AVX-NEXT:    retq64entry:65  %0 = load float, ptr @vf32, align 466  %conv = fpext float %0 to fp12867  store fp128 %conv, ptr @vf128, align 1668  ret void69}70 71define dso_local void @TestFPExtF64_F128() nounwind {72; X64-SSE-LABEL: TestFPExtF64_F128:73; X64-SSE:       # %bb.0: # %entry74; X64-SSE-NEXT:    pushq %rax75; X64-SSE-NEXT:    movsd {{.*#+}} xmm0 = mem[0],zero76; X64-SSE-NEXT:    callq __extenddftf2@PLT77; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)78; X64-SSE-NEXT:    popq %rax79; X64-SSE-NEXT:    retq80;81; X86-LABEL: TestFPExtF64_F128:82; X86:       # %bb.0: # %entry83; X86-NEXT:    pushl %esi84; X86-NEXT:    subl $40, %esp85; X86-NEXT:    fldl vf6486; X86-NEXT:    fstpl {{[0-9]+}}(%esp)87; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax88; X86-NEXT:    movl %eax, (%esp)89; X86-NEXT:    calll __extenddftf290; X86-NEXT:    subl $4, %esp91; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax92; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx93; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx94; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi95; X86-NEXT:    movl %esi, vf128+1296; X86-NEXT:    movl %edx, vf128+897; X86-NEXT:    movl %ecx, vf128+498; X86-NEXT:    movl %eax, vf12899; X86-NEXT:    addl $40, %esp100; X86-NEXT:    popl %esi101; X86-NEXT:    retl102;103; X64-AVX-LABEL: TestFPExtF64_F128:104; X64-AVX:       # %bb.0: # %entry105; X64-AVX-NEXT:    pushq %rax106; X64-AVX-NEXT:    vmovsd {{.*#+}} xmm0 = mem[0],zero107; X64-AVX-NEXT:    callq __extenddftf2@PLT108; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)109; X64-AVX-NEXT:    popq %rax110; X64-AVX-NEXT:    retq111entry:112  %0 = load double, ptr @vf64, align 8113  %conv = fpext double %0 to fp128114  store fp128 %conv, ptr @vf128, align 16115  ret void116}117 118define dso_local void @TestFPExtF80_F128() nounwind {119; X64-SSE-LABEL: TestFPExtF80_F128:120; X64-SSE:       # %bb.0: # %entry121; X64-SSE-NEXT:    subq $24, %rsp122; X64-SSE-NEXT:    fldt vf80(%rip)123; X64-SSE-NEXT:    fstpt (%rsp)124; X64-SSE-NEXT:    callq __extendxftf2@PLT125; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)126; X64-SSE-NEXT:    addq $24, %rsp127; X64-SSE-NEXT:    retq128;129; X86-LABEL: TestFPExtF80_F128:130; X86:       # %bb.0: # %entry131; X86-NEXT:    pushl %esi132; X86-NEXT:    subl $40, %esp133; X86-NEXT:    fldt vf80134; X86-NEXT:    fstpt {{[0-9]+}}(%esp)135; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax136; X86-NEXT:    movl %eax, (%esp)137; X86-NEXT:    calll __extendxftf2138; X86-NEXT:    subl $4, %esp139; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax140; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx141; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx142; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi143; X86-NEXT:    movl %esi, vf128+12144; X86-NEXT:    movl %edx, vf128+8145; X86-NEXT:    movl %ecx, vf128+4146; X86-NEXT:    movl %eax, vf128147; X86-NEXT:    addl $40, %esp148; X86-NEXT:    popl %esi149; X86-NEXT:    retl150;151; X64-AVX-LABEL: TestFPExtF80_F128:152; X64-AVX:       # %bb.0: # %entry153; X64-AVX-NEXT:    subq $24, %rsp154; X64-AVX-NEXT:    fldt vf80(%rip)155; X64-AVX-NEXT:    fstpt (%rsp)156; X64-AVX-NEXT:    callq __extendxftf2@PLT157; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)158; X64-AVX-NEXT:    addq $24, %rsp159; X64-AVX-NEXT:    retq160entry:161  %0 = load x86_fp80, ptr @vf80, align 8162  %conv = fpext x86_fp80 %0 to fp128163  store fp128 %conv, ptr @vf128, align 16164  ret void165}166 167define dso_local void @TestFPToSIF128_I16() nounwind {168; X64-SSE-LABEL: TestFPToSIF128_I16:169; X64-SSE:       # %bb.0: # %entry170; X64-SSE-NEXT:    pushq %rax171; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0172; X64-SSE-NEXT:    callq __fixtfsi@PLT173; X64-SSE-NEXT:    movw %ax, vi16(%rip)174; X64-SSE-NEXT:    popq %rax175; X64-SSE-NEXT:    retq176;177; X86-LABEL: TestFPToSIF128_I16:178; X86:       # %bb.0: # %entry179; X86-NEXT:    subl $12, %esp180; X86-NEXT:    pushl vf128+12181; X86-NEXT:    pushl vf128+8182; X86-NEXT:    pushl vf128+4183; X86-NEXT:    pushl vf128184; X86-NEXT:    calll __fixtfsi185; X86-NEXT:    addl $16, %esp186; X86-NEXT:    movw %ax, vi16187; X86-NEXT:    addl $12, %esp188; X86-NEXT:    retl189;190; X64-AVX-LABEL: TestFPToSIF128_I16:191; X64-AVX:       # %bb.0: # %entry192; X64-AVX-NEXT:    pushq %rax193; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0194; X64-AVX-NEXT:    callq __fixtfsi@PLT195; X64-AVX-NEXT:    movw %ax, vi16(%rip)196; X64-AVX-NEXT:    popq %rax197; X64-AVX-NEXT:    retq198entry:199  %0 = load fp128, ptr @vf128, align 16200  %conv = fptosi fp128 %0 to i16201  store i16 %conv, ptr @vi16, align 2202  ret void203}204 205define dso_local void @TestFPToUIF128_I16() nounwind {206; X64-SSE-LABEL: TestFPToUIF128_I16:207; X64-SSE:       # %bb.0: # %entry208; X64-SSE-NEXT:    pushq %rax209; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0210; X64-SSE-NEXT:    callq __fixtfsi@PLT211; X64-SSE-NEXT:    movw %ax, vi16(%rip)212; X64-SSE-NEXT:    popq %rax213; X64-SSE-NEXT:    retq214;215; X86-LABEL: TestFPToUIF128_I16:216; X86:       # %bb.0: # %entry217; X86-NEXT:    subl $12, %esp218; X86-NEXT:    pushl vf128+12219; X86-NEXT:    pushl vf128+8220; X86-NEXT:    pushl vf128+4221; X86-NEXT:    pushl vf128222; X86-NEXT:    calll __fixunstfsi223; X86-NEXT:    addl $16, %esp224; X86-NEXT:    movw %ax, vi16225; X86-NEXT:    addl $12, %esp226; X86-NEXT:    retl227;228; X64-AVX-LABEL: TestFPToUIF128_I16:229; X64-AVX:       # %bb.0: # %entry230; X64-AVX-NEXT:    pushq %rax231; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0232; X64-AVX-NEXT:    callq __fixtfsi@PLT233; X64-AVX-NEXT:    movw %ax, vi16(%rip)234; X64-AVX-NEXT:    popq %rax235; X64-AVX-NEXT:    retq236entry:237  %0 = load fp128, ptr @vf128, align 16238  %conv = fptoui fp128 %0 to i16239  store i16 %conv, ptr @vi16, align 2240  ret void241}242 243define dso_local void @TestFPToSIF128_I32() nounwind {244; X64-SSE-LABEL: TestFPToSIF128_I32:245; X64-SSE:       # %bb.0: # %entry246; X64-SSE-NEXT:    pushq %rax247; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0248; X64-SSE-NEXT:    callq __fixtfsi@PLT249; X64-SSE-NEXT:    movl %eax, vi32(%rip)250; X64-SSE-NEXT:    popq %rax251; X64-SSE-NEXT:    retq252;253; X86-LABEL: TestFPToSIF128_I32:254; X86:       # %bb.0: # %entry255; X86-NEXT:    subl $12, %esp256; X86-NEXT:    pushl vf128+12257; X86-NEXT:    pushl vf128+8258; X86-NEXT:    pushl vf128+4259; X86-NEXT:    pushl vf128260; X86-NEXT:    calll __fixtfsi261; X86-NEXT:    addl $16, %esp262; X86-NEXT:    movl %eax, vi32263; X86-NEXT:    addl $12, %esp264; X86-NEXT:    retl265;266; X64-AVX-LABEL: TestFPToSIF128_I32:267; X64-AVX:       # %bb.0: # %entry268; X64-AVX-NEXT:    pushq %rax269; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0270; X64-AVX-NEXT:    callq __fixtfsi@PLT271; X64-AVX-NEXT:    movl %eax, vi32(%rip)272; X64-AVX-NEXT:    popq %rax273; X64-AVX-NEXT:    retq274entry:275  %0 = load fp128, ptr @vf128, align 16276  %conv = fptosi fp128 %0 to i32277  store i32 %conv, ptr @vi32, align 4278  ret void279}280 281define dso_local void @TestFPToUIF128_U32() nounwind {282; X64-SSE-LABEL: TestFPToUIF128_U32:283; X64-SSE:       # %bb.0: # %entry284; X64-SSE-NEXT:    pushq %rax285; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0286; X64-SSE-NEXT:    callq __fixunstfsi@PLT287; X64-SSE-NEXT:    movl %eax, vu32(%rip)288; X64-SSE-NEXT:    popq %rax289; X64-SSE-NEXT:    retq290;291; X86-LABEL: TestFPToUIF128_U32:292; X86:       # %bb.0: # %entry293; X86-NEXT:    subl $12, %esp294; X86-NEXT:    pushl vf128+12295; X86-NEXT:    pushl vf128+8296; X86-NEXT:    pushl vf128+4297; X86-NEXT:    pushl vf128298; X86-NEXT:    calll __fixunstfsi299; X86-NEXT:    addl $16, %esp300; X86-NEXT:    movl %eax, vu32301; X86-NEXT:    addl $12, %esp302; X86-NEXT:    retl303;304; X64-AVX-LABEL: TestFPToUIF128_U32:305; X64-AVX:       # %bb.0: # %entry306; X64-AVX-NEXT:    pushq %rax307; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0308; X64-AVX-NEXT:    callq __fixunstfsi@PLT309; X64-AVX-NEXT:    movl %eax, vu32(%rip)310; X64-AVX-NEXT:    popq %rax311; X64-AVX-NEXT:    retq312entry:313  %0 = load fp128, ptr @vf128, align 16314  %conv = fptoui fp128 %0 to i32315  store i32 %conv, ptr @vu32, align 4316  ret void317}318 319define dso_local void @TestFPToSIF128_I64() nounwind {320; X64-SSE-LABEL: TestFPToSIF128_I64:321; X64-SSE:       # %bb.0: # %entry322; X64-SSE-NEXT:    pushq %rax323; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0324; X64-SSE-NEXT:    callq __fixtfsi@PLT325; X64-SSE-NEXT:    cltq326; X64-SSE-NEXT:    movq %rax, vi64(%rip)327; X64-SSE-NEXT:    popq %rax328; X64-SSE-NEXT:    retq329;330; X86-LABEL: TestFPToSIF128_I64:331; X86:       # %bb.0: # %entry332; X86-NEXT:    subl $12, %esp333; X86-NEXT:    pushl vf128+12334; X86-NEXT:    pushl vf128+8335; X86-NEXT:    pushl vf128+4336; X86-NEXT:    pushl vf128337; X86-NEXT:    calll __fixtfsi338; X86-NEXT:    addl $16, %esp339; X86-NEXT:    movl %eax, vi64340; X86-NEXT:    sarl $31, %eax341; X86-NEXT:    movl %eax, vi64+4342; X86-NEXT:    addl $12, %esp343; X86-NEXT:    retl344;345; X64-AVX-LABEL: TestFPToSIF128_I64:346; X64-AVX:       # %bb.0: # %entry347; X64-AVX-NEXT:    pushq %rax348; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0349; X64-AVX-NEXT:    callq __fixtfsi@PLT350; X64-AVX-NEXT:    cltq351; X64-AVX-NEXT:    movq %rax, vi64(%rip)352; X64-AVX-NEXT:    popq %rax353; X64-AVX-NEXT:    retq354entry:355  %0 = load fp128, ptr @vf128, align 16356  %conv = fptosi fp128 %0 to i32357  %conv1 = sext i32 %conv to i64358  store i64 %conv1, ptr @vi64, align 8359  ret void360}361 362define dso_local void @TestFPToUIF128_U64() nounwind {363; X64-SSE-LABEL: TestFPToUIF128_U64:364; X64-SSE:       # %bb.0: # %entry365; X64-SSE-NEXT:    pushq %rax366; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0367; X64-SSE-NEXT:    callq __fixunstfsi@PLT368; X64-SSE-NEXT:    movl %eax, %eax369; X64-SSE-NEXT:    movq %rax, vu64(%rip)370; X64-SSE-NEXT:    popq %rax371; X64-SSE-NEXT:    retq372;373; X86-LABEL: TestFPToUIF128_U64:374; X86:       # %bb.0: # %entry375; X86-NEXT:    subl $12, %esp376; X86-NEXT:    pushl vf128+12377; X86-NEXT:    pushl vf128+8378; X86-NEXT:    pushl vf128+4379; X86-NEXT:    pushl vf128380; X86-NEXT:    calll __fixunstfsi381; X86-NEXT:    addl $16, %esp382; X86-NEXT:    movl %eax, vu64383; X86-NEXT:    movl $0, vu64+4384; X86-NEXT:    addl $12, %esp385; X86-NEXT:    retl386;387; X64-AVX-LABEL: TestFPToUIF128_U64:388; X64-AVX:       # %bb.0: # %entry389; X64-AVX-NEXT:    pushq %rax390; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0391; X64-AVX-NEXT:    callq __fixunstfsi@PLT392; X64-AVX-NEXT:    movl %eax, %eax393; X64-AVX-NEXT:    movq %rax, vu64(%rip)394; X64-AVX-NEXT:    popq %rax395; X64-AVX-NEXT:    retq396entry:397  %0 = load fp128, ptr @vf128, align 16398  %conv = fptoui fp128 %0 to i32399  %conv1 = zext i32 %conv to i64400  store i64 %conv1, ptr @vu64, align 8401  ret void402}403 404define dso_local void @TestFPToSIF128_I128() nounwind {405; X64-SSE-LABEL: TestFPToSIF128_I128:406; X64-SSE:       # %bb.0: # %entry407; X64-SSE-NEXT:    pushq %rax408; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0409; X64-SSE-NEXT:    callq __fixtfti@PLT410; X64-SSE-NEXT:    movq %rdx, vi128+8(%rip)411; X64-SSE-NEXT:    movq %rax, vi128(%rip)412; X64-SSE-NEXT:    popq %rax413; X64-SSE-NEXT:    retq414;415; X86-LABEL: TestFPToSIF128_I128:416; X86:       # %bb.0: # %entry417; X86-NEXT:    pushl %esi418; X86-NEXT:    subl $56, %esp419; X86-NEXT:    movl vf128, %eax420; X86-NEXT:    movl vf128+4, %ecx421; X86-NEXT:    movl vf128+8, %edx422; X86-NEXT:    movl vf128+12, %esi423; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)424; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)425; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)426; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)427; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax428; X86-NEXT:    movl %eax, (%esp)429; X86-NEXT:    calll __fixtfti430; X86-NEXT:    subl $4, %esp431; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax432; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx433; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx434; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi435; X86-NEXT:    movl %esi, vi128+12436; X86-NEXT:    movl %edx, vi128+8437; X86-NEXT:    movl %ecx, vi128+4438; X86-NEXT:    movl %eax, vi128439; X86-NEXT:    addl $56, %esp440; X86-NEXT:    popl %esi441; X86-NEXT:    retl442;443; X64-AVX-LABEL: TestFPToSIF128_I128:444; X64-AVX:       # %bb.0: # %entry445; X64-AVX-NEXT:    pushq %rax446; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0447; X64-AVX-NEXT:    callq __fixtfti@PLT448; X64-AVX-NEXT:    movq %rdx, vi128+8(%rip)449; X64-AVX-NEXT:    movq %rax, vi128(%rip)450; X64-AVX-NEXT:    popq %rax451; X64-AVX-NEXT:    retq452entry:453  %0 = load fp128, ptr @vf128, align 16454  %conv = fptosi fp128 %0 to i128455  store i128 %conv, ptr @vi128, align 16456  ret void457}458 459define dso_local void @TestFPToUIF128_U128() nounwind {460; X64-SSE-LABEL: TestFPToUIF128_U128:461; X64-SSE:       # %bb.0: # %entry462; X64-SSE-NEXT:    pushq %rax463; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0464; X64-SSE-NEXT:    callq __fixunstfti@PLT465; X64-SSE-NEXT:    movq %rdx, vu128+8(%rip)466; X64-SSE-NEXT:    movq %rax, vu128(%rip)467; X64-SSE-NEXT:    popq %rax468; X64-SSE-NEXT:    retq469;470; X86-LABEL: TestFPToUIF128_U128:471; X86:       # %bb.0: # %entry472; X86-NEXT:    pushl %esi473; X86-NEXT:    subl $56, %esp474; X86-NEXT:    movl vf128, %eax475; X86-NEXT:    movl vf128+4, %ecx476; X86-NEXT:    movl vf128+8, %edx477; X86-NEXT:    movl vf128+12, %esi478; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)479; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)480; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)481; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)482; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax483; X86-NEXT:    movl %eax, (%esp)484; X86-NEXT:    calll __fixunstfti485; X86-NEXT:    subl $4, %esp486; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax487; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx488; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx489; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi490; X86-NEXT:    movl %esi, vu128+12491; X86-NEXT:    movl %edx, vu128+8492; X86-NEXT:    movl %ecx, vu128+4493; X86-NEXT:    movl %eax, vu128494; X86-NEXT:    addl $56, %esp495; X86-NEXT:    popl %esi496; X86-NEXT:    retl497;498; X64-AVX-LABEL: TestFPToUIF128_U128:499; X64-AVX:       # %bb.0: # %entry500; X64-AVX-NEXT:    pushq %rax501; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0502; X64-AVX-NEXT:    callq __fixunstfti@PLT503; X64-AVX-NEXT:    movq %rdx, vu128+8(%rip)504; X64-AVX-NEXT:    movq %rax, vu128(%rip)505; X64-AVX-NEXT:    popq %rax506; X64-AVX-NEXT:    retq507entry:508  %0 = load fp128, ptr @vf128, align 16509  %conv = fptoui fp128 %0 to i128510  store i128 %conv, ptr @vu128, align 16511  ret void512}513 514define dso_local void @TestFPTruncF128_F32() nounwind {515; X64-SSE-LABEL: TestFPTruncF128_F32:516; X64-SSE:       # %bb.0: # %entry517; X64-SSE-NEXT:    pushq %rax518; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0519; X64-SSE-NEXT:    callq __trunctfsf2@PLT520; X64-SSE-NEXT:    movss %xmm0, vf32(%rip)521; X64-SSE-NEXT:    popq %rax522; X64-SSE-NEXT:    retq523;524; X86-LABEL: TestFPTruncF128_F32:525; X86:       # %bb.0: # %entry526; X86-NEXT:    subl $12, %esp527; X86-NEXT:    pushl vf128+12528; X86-NEXT:    pushl vf128+8529; X86-NEXT:    pushl vf128+4530; X86-NEXT:    pushl vf128531; X86-NEXT:    calll __trunctfsf2532; X86-NEXT:    addl $16, %esp533; X86-NEXT:    fstps vf32534; X86-NEXT:    addl $12, %esp535; X86-NEXT:    retl536;537; X64-AVX-LABEL: TestFPTruncF128_F32:538; X64-AVX:       # %bb.0: # %entry539; X64-AVX-NEXT:    pushq %rax540; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0541; X64-AVX-NEXT:    callq __trunctfsf2@PLT542; X64-AVX-NEXT:    vmovss %xmm0, vf32(%rip)543; X64-AVX-NEXT:    popq %rax544; X64-AVX-NEXT:    retq545entry:546  %0 = load fp128, ptr @vf128, align 16547  %conv = fptrunc fp128 %0 to float548  store float %conv, ptr @vf32, align 4549  ret void550}551 552define dso_local void @TestFPTruncF128_F64() nounwind {553; X64-SSE-LABEL: TestFPTruncF128_F64:554; X64-SSE:       # %bb.0: # %entry555; X64-SSE-NEXT:    pushq %rax556; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0557; X64-SSE-NEXT:    callq __trunctfdf2@PLT558; X64-SSE-NEXT:    movsd %xmm0, vf64(%rip)559; X64-SSE-NEXT:    popq %rax560; X64-SSE-NEXT:    retq561;562; X86-LABEL: TestFPTruncF128_F64:563; X86:       # %bb.0: # %entry564; X86-NEXT:    subl $12, %esp565; X86-NEXT:    pushl vf128+12566; X86-NEXT:    pushl vf128+8567; X86-NEXT:    pushl vf128+4568; X86-NEXT:    pushl vf128569; X86-NEXT:    calll __trunctfdf2570; X86-NEXT:    addl $16, %esp571; X86-NEXT:    fstpl vf64572; X86-NEXT:    addl $12, %esp573; X86-NEXT:    retl574;575; X64-AVX-LABEL: TestFPTruncF128_F64:576; X64-AVX:       # %bb.0: # %entry577; X64-AVX-NEXT:    pushq %rax578; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0579; X64-AVX-NEXT:    callq __trunctfdf2@PLT580; X64-AVX-NEXT:    vmovsd %xmm0, vf64(%rip)581; X64-AVX-NEXT:    popq %rax582; X64-AVX-NEXT:    retq583entry:584  %0 = load fp128, ptr @vf128, align 16585  %conv = fptrunc fp128 %0 to double586  store double %conv, ptr @vf64, align 8587  ret void588}589 590define dso_local void @TestFPTruncF128_F80() nounwind {591; X64-SSE-LABEL: TestFPTruncF128_F80:592; X64-SSE:       # %bb.0: # %entry593; X64-SSE-NEXT:    pushq %rax594; X64-SSE-NEXT:    movaps vf128(%rip), %xmm0595; X64-SSE-NEXT:    callq __trunctfxf2@PLT596; X64-SSE-NEXT:    fstpt vf80(%rip)597; X64-SSE-NEXT:    popq %rax598; X64-SSE-NEXT:    retq599;600; X86-LABEL: TestFPTruncF128_F80:601; X86:       # %bb.0: # %entry602; X86-NEXT:    subl $12, %esp603; X86-NEXT:    pushl vf128+12604; X86-NEXT:    pushl vf128+8605; X86-NEXT:    pushl vf128+4606; X86-NEXT:    pushl vf128607; X86-NEXT:    calll __trunctfxf2608; X86-NEXT:    addl $16, %esp609; X86-NEXT:    fstpt vf80610; X86-NEXT:    addl $12, %esp611; X86-NEXT:    retl612;613; X64-AVX-LABEL: TestFPTruncF128_F80:614; X64-AVX:       # %bb.0: # %entry615; X64-AVX-NEXT:    pushq %rax616; X64-AVX-NEXT:    vmovaps vf128(%rip), %xmm0617; X64-AVX-NEXT:    callq __trunctfxf2@PLT618; X64-AVX-NEXT:    fstpt vf80(%rip)619; X64-AVX-NEXT:    popq %rax620; X64-AVX-NEXT:    retq621entry:622  %0 = load fp128, ptr @vf128, align 16623  %conv = fptrunc fp128 %0 to x86_fp80624  store x86_fp80 %conv, ptr @vf80, align 8625  ret void626}627 628define dso_local void @TestSIToFPI16_F128() nounwind {629; X64-SSE-LABEL: TestSIToFPI16_F128:630; X64-SSE:       # %bb.0: # %entry631; X64-SSE-NEXT:    pushq %rax632; X64-SSE-NEXT:    movswl vi16(%rip), %edi633; X64-SSE-NEXT:    callq __floatsitf@PLT634; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)635; X64-SSE-NEXT:    popq %rax636; X64-SSE-NEXT:    retq637;638; X86-LABEL: TestSIToFPI16_F128:639; X86:       # %bb.0: # %entry640; X86-NEXT:    pushl %esi641; X86-NEXT:    subl $24, %esp642; X86-NEXT:    movswl vi16, %eax643; X86-NEXT:    subl $8, %esp644; X86-NEXT:    leal {{[0-9]+}}(%esp), %ecx645; X86-NEXT:    pushl %eax646; X86-NEXT:    pushl %ecx647; X86-NEXT:    calll __floatsitf648; X86-NEXT:    addl $12, %esp649; X86-NEXT:    movl (%esp), %eax650; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx651; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx652; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi653; X86-NEXT:    movl %esi, vf128+12654; X86-NEXT:    movl %edx, vf128+8655; X86-NEXT:    movl %ecx, vf128+4656; X86-NEXT:    movl %eax, vf128657; X86-NEXT:    addl $24, %esp658; X86-NEXT:    popl %esi659; X86-NEXT:    retl660;661; X64-AVX-LABEL: TestSIToFPI16_F128:662; X64-AVX:       # %bb.0: # %entry663; X64-AVX-NEXT:    pushq %rax664; X64-AVX-NEXT:    movswl vi16(%rip), %edi665; X64-AVX-NEXT:    callq __floatsitf@PLT666; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)667; X64-AVX-NEXT:    popq %rax668; X64-AVX-NEXT:    retq669entry:670  %0 = load i16, ptr @vi16, align 4671  %conv = sitofp i16 %0 to fp128672  store fp128 %conv, ptr @vf128, align 16673  ret void674}675 676define dso_local void @TestSIToFPU16_F128() nounwind {677; X64-SSE-LABEL: TestSIToFPU16_F128:678; X64-SSE:       # %bb.0: # %entry679; X64-SSE-NEXT:    pushq %rax680; X64-SSE-NEXT:    movzwl vi16(%rip), %edi681; X64-SSE-NEXT:    callq __floatsitf@PLT682; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)683; X64-SSE-NEXT:    popq %rax684; X64-SSE-NEXT:    retq685;686; X86-LABEL: TestSIToFPU16_F128:687; X86:       # %bb.0: # %entry688; X86-NEXT:    pushl %esi689; X86-NEXT:    subl $24, %esp690; X86-NEXT:    movzwl vi16, %eax691; X86-NEXT:    subl $8, %esp692; X86-NEXT:    leal {{[0-9]+}}(%esp), %ecx693; X86-NEXT:    pushl %eax694; X86-NEXT:    pushl %ecx695; X86-NEXT:    calll __floatunsitf696; X86-NEXT:    addl $12, %esp697; X86-NEXT:    movl (%esp), %eax698; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx699; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx700; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi701; X86-NEXT:    movl %esi, vf128+12702; X86-NEXT:    movl %edx, vf128+8703; X86-NEXT:    movl %ecx, vf128+4704; X86-NEXT:    movl %eax, vf128705; X86-NEXT:    addl $24, %esp706; X86-NEXT:    popl %esi707; X86-NEXT:    retl708;709; X64-AVX-LABEL: TestSIToFPU16_F128:710; X64-AVX:       # %bb.0: # %entry711; X64-AVX-NEXT:    pushq %rax712; X64-AVX-NEXT:    movzwl vi16(%rip), %edi713; X64-AVX-NEXT:    callq __floatsitf@PLT714; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)715; X64-AVX-NEXT:    popq %rax716; X64-AVX-NEXT:    retq717entry:718  %0 = load i16, ptr @vi16, align 4719  %conv = uitofp i16 %0 to fp128720  store fp128 %conv, ptr @vf128, align 16721  ret void722}723 724define dso_local void @TestSIToFPI32_F128() nounwind {725; X64-SSE-LABEL: TestSIToFPI32_F128:726; X64-SSE:       # %bb.0: # %entry727; X64-SSE-NEXT:    pushq %rax728; X64-SSE-NEXT:    movl vi32(%rip), %edi729; X64-SSE-NEXT:    callq __floatsitf@PLT730; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)731; X64-SSE-NEXT:    popq %rax732; X64-SSE-NEXT:    retq733;734; X86-LABEL: TestSIToFPI32_F128:735; X86:       # %bb.0: # %entry736; X86-NEXT:    pushl %esi737; X86-NEXT:    subl $32, %esp738; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax739; X86-NEXT:    pushl vi32740; X86-NEXT:    pushl %eax741; X86-NEXT:    calll __floatsitf742; X86-NEXT:    addl $12, %esp743; X86-NEXT:    movl (%esp), %eax744; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx745; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx746; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi747; X86-NEXT:    movl %esi, vf128+12748; X86-NEXT:    movl %edx, vf128+8749; X86-NEXT:    movl %ecx, vf128+4750; X86-NEXT:    movl %eax, vf128751; X86-NEXT:    addl $24, %esp752; X86-NEXT:    popl %esi753; X86-NEXT:    retl754;755; X64-AVX-LABEL: TestSIToFPI32_F128:756; X64-AVX:       # %bb.0: # %entry757; X64-AVX-NEXT:    pushq %rax758; X64-AVX-NEXT:    movl vi32(%rip), %edi759; X64-AVX-NEXT:    callq __floatsitf@PLT760; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)761; X64-AVX-NEXT:    popq %rax762; X64-AVX-NEXT:    retq763entry:764  %0 = load i32, ptr @vi32, align 4765  %conv = sitofp i32 %0 to fp128766  store fp128 %conv, ptr @vf128, align 16767  ret void768}769 770define dso_local void @TestUIToFPU32_F128() #2 {771; X64-SSE-LABEL: TestUIToFPU32_F128:772; X64-SSE:       # %bb.0: # %entry773; X64-SSE-NEXT:    pushq %rax774; X64-SSE-NEXT:    movl vu32(%rip), %edi775; X64-SSE-NEXT:    callq __floatunsitf@PLT776; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)777; X64-SSE-NEXT:    popq %rax778; X64-SSE-NEXT:    retq779;780; X86-LABEL: TestUIToFPU32_F128:781; X86:       # %bb.0: # %entry782; X86-NEXT:    pushl %esi783; X86-NEXT:    subl $32, %esp784; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax785; X86-NEXT:    pushl vu32786; X86-NEXT:    pushl %eax787; X86-NEXT:    calll __floatunsitf788; X86-NEXT:    addl $12, %esp789; X86-NEXT:    movl (%esp), %eax790; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx791; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx792; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi793; X86-NEXT:    movl %esi, vf128+12794; X86-NEXT:    movl %edx, vf128+8795; X86-NEXT:    movl %ecx, vf128+4796; X86-NEXT:    movl %eax, vf128797; X86-NEXT:    addl $24, %esp798; X86-NEXT:    popl %esi799; X86-NEXT:    retl800;801; X64-AVX-LABEL: TestUIToFPU32_F128:802; X64-AVX:       # %bb.0: # %entry803; X64-AVX-NEXT:    pushq %rax804; X64-AVX-NEXT:    movl vu32(%rip), %edi805; X64-AVX-NEXT:    callq __floatunsitf@PLT806; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)807; X64-AVX-NEXT:    popq %rax808; X64-AVX-NEXT:    retq809entry:810  %0 = load i32, ptr @vu32, align 4811  %conv = uitofp i32 %0 to fp128812  store fp128 %conv, ptr @vf128, align 16813  ret void814}815 816define dso_local void @TestSIToFPI64_F128() nounwind {817; X64-SSE-LABEL: TestSIToFPI64_F128:818; X64-SSE:       # %bb.0: # %entry819; X64-SSE-NEXT:    pushq %rax820; X64-SSE-NEXT:    movq vi64(%rip), %rdi821; X64-SSE-NEXT:    callq __floatditf@PLT822; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)823; X64-SSE-NEXT:    popq %rax824; X64-SSE-NEXT:    retq825;826; X86-LABEL: TestSIToFPI64_F128:827; X86:       # %bb.0: # %entry828; X86-NEXT:    pushl %esi829; X86-NEXT:    subl $28, %esp830; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax831; X86-NEXT:    pushl vi64+4832; X86-NEXT:    pushl vi64833; X86-NEXT:    pushl %eax834; X86-NEXT:    calll __floatditf835; X86-NEXT:    addl $12, %esp836; X86-NEXT:    movl (%esp), %eax837; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx838; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx839; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi840; X86-NEXT:    movl %esi, vf128+12841; X86-NEXT:    movl %edx, vf128+8842; X86-NEXT:    movl %ecx, vf128+4843; X86-NEXT:    movl %eax, vf128844; X86-NEXT:    addl $24, %esp845; X86-NEXT:    popl %esi846; X86-NEXT:    retl847;848; X64-AVX-LABEL: TestSIToFPI64_F128:849; X64-AVX:       # %bb.0: # %entry850; X64-AVX-NEXT:    pushq %rax851; X64-AVX-NEXT:    movq vi64(%rip), %rdi852; X64-AVX-NEXT:    callq __floatditf@PLT853; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)854; X64-AVX-NEXT:    popq %rax855; X64-AVX-NEXT:    retq856entry:857  %0 = load i64, ptr @vi64, align 8858  %conv = sitofp i64 %0 to fp128859  store fp128 %conv, ptr @vf128, align 16860  ret void861}862 863define dso_local void @TestUIToFPU64_F128() #2 {864; X64-SSE-LABEL: TestUIToFPU64_F128:865; X64-SSE:       # %bb.0: # %entry866; X64-SSE-NEXT:    pushq %rax867; X64-SSE-NEXT:    movq vu64(%rip), %rdi868; X64-SSE-NEXT:    callq __floatunditf@PLT869; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)870; X64-SSE-NEXT:    popq %rax871; X64-SSE-NEXT:    retq872;873; X86-LABEL: TestUIToFPU64_F128:874; X86:       # %bb.0: # %entry875; X86-NEXT:    pushl %esi876; X86-NEXT:    subl $28, %esp877; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax878; X86-NEXT:    pushl vu64+4879; X86-NEXT:    pushl vu64880; X86-NEXT:    pushl %eax881; X86-NEXT:    calll __floatunditf882; X86-NEXT:    addl $12, %esp883; X86-NEXT:    movl (%esp), %eax884; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx885; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx886; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi887; X86-NEXT:    movl %esi, vf128+12888; X86-NEXT:    movl %edx, vf128+8889; X86-NEXT:    movl %ecx, vf128+4890; X86-NEXT:    movl %eax, vf128891; X86-NEXT:    addl $24, %esp892; X86-NEXT:    popl %esi893; X86-NEXT:    retl894;895; X64-AVX-LABEL: TestUIToFPU64_F128:896; X64-AVX:       # %bb.0: # %entry897; X64-AVX-NEXT:    pushq %rax898; X64-AVX-NEXT:    movq vu64(%rip), %rdi899; X64-AVX-NEXT:    callq __floatunditf@PLT900; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)901; X64-AVX-NEXT:    popq %rax902; X64-AVX-NEXT:    retq903entry:904  %0 = load i64, ptr @vu64, align 8905  %conv = uitofp i64 %0 to fp128906  store fp128 %conv, ptr @vf128, align 16907  ret void908}909 910define dso_local void @TestSIToFPI128_F128() nounwind {911; X64-SSE-LABEL: TestSIToFPI128_F128:912; X64-SSE:       # %bb.0: # %entry913; X64-SSE-NEXT:    pushq %rax914; X64-SSE-NEXT:    movq vi128(%rip), %rdi915; X64-SSE-NEXT:    movq vi128+8(%rip), %rsi916; X64-SSE-NEXT:    callq __floattitf@PLT917; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)918; X64-SSE-NEXT:    popq %rax919; X64-SSE-NEXT:    retq920;921; X86-LABEL: TestSIToFPI128_F128:922; X86:       # %bb.0: # %entry923; X86-NEXT:    pushl %esi924; X86-NEXT:    subl $56, %esp925; X86-NEXT:    movl vi128, %eax926; X86-NEXT:    movl vi128+4, %ecx927; X86-NEXT:    movl vi128+8, %edx928; X86-NEXT:    movl vi128+12, %esi929; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)930; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)931; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)932; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)933; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax934; X86-NEXT:    movl %eax, (%esp)935; X86-NEXT:    calll __floattitf936; X86-NEXT:    subl $4, %esp937; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax938; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx939; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx940; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi941; X86-NEXT:    movl %esi, vf128+12942; X86-NEXT:    movl %edx, vf128+8943; X86-NEXT:    movl %ecx, vf128+4944; X86-NEXT:    movl %eax, vf128945; X86-NEXT:    addl $56, %esp946; X86-NEXT:    popl %esi947; X86-NEXT:    retl948;949; X64-AVX-LABEL: TestSIToFPI128_F128:950; X64-AVX:       # %bb.0: # %entry951; X64-AVX-NEXT:    pushq %rax952; X64-AVX-NEXT:    movq vi128(%rip), %rdi953; X64-AVX-NEXT:    movq vi128+8(%rip), %rsi954; X64-AVX-NEXT:    callq __floattitf@PLT955; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)956; X64-AVX-NEXT:    popq %rax957; X64-AVX-NEXT:    retq958entry:959  %0 = load i128, ptr @vi128, align 16960  %conv = sitofp i128 %0 to fp128961  store fp128 %conv, ptr @vf128, align 16962  ret void963}964 965define dso_local void @TestUIToFPU128_F128() #2 {966; X64-SSE-LABEL: TestUIToFPU128_F128:967; X64-SSE:       # %bb.0: # %entry968; X64-SSE-NEXT:    pushq %rax969; X64-SSE-NEXT:    movq vu128(%rip), %rdi970; X64-SSE-NEXT:    movq vu128+8(%rip), %rsi971; X64-SSE-NEXT:    callq __floatuntitf@PLT972; X64-SSE-NEXT:    movaps %xmm0, vf128(%rip)973; X64-SSE-NEXT:    popq %rax974; X64-SSE-NEXT:    retq975;976; X86-LABEL: TestUIToFPU128_F128:977; X86:       # %bb.0: # %entry978; X86-NEXT:    pushl %esi979; X86-NEXT:    subl $56, %esp980; X86-NEXT:    movl vu128, %eax981; X86-NEXT:    movl vu128+4, %ecx982; X86-NEXT:    movl vu128+8, %edx983; X86-NEXT:    movl vu128+12, %esi984; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)985; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)986; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)987; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)988; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax989; X86-NEXT:    movl %eax, (%esp)990; X86-NEXT:    calll __floatuntitf991; X86-NEXT:    subl $4, %esp992; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax993; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx994; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx995; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi996; X86-NEXT:    movl %esi, vf128+12997; X86-NEXT:    movl %edx, vf128+8998; X86-NEXT:    movl %ecx, vf128+4999; X86-NEXT:    movl %eax, vf1281000; X86-NEXT:    addl $56, %esp1001; X86-NEXT:    popl %esi1002; X86-NEXT:    retl1003;1004; X64-AVX-LABEL: TestUIToFPU128_F128:1005; X64-AVX:       # %bb.0: # %entry1006; X64-AVX-NEXT:    pushq %rax1007; X64-AVX-NEXT:    movq vu128(%rip), %rdi1008; X64-AVX-NEXT:    movq vu128+8(%rip), %rsi1009; X64-AVX-NEXT:    callq __floatuntitf@PLT1010; X64-AVX-NEXT:    vmovaps %xmm0, vf128(%rip)1011; X64-AVX-NEXT:    popq %rax1012; X64-AVX-NEXT:    retq1013entry:1014  %0 = load i128, ptr @vu128, align 161015  %conv = uitofp i128 %0 to fp1281016  store fp128 %conv, ptr @vf128, align 161017  ret void1018}1019 1020define dso_local i32 @TestConst128(fp128 %v) nounwind {1021; X64-SSE-LABEL: TestConst128:1022; X64-SSE:       # %bb.0: # %entry1023; X64-SSE-NEXT:    pushq %rax1024; X64-SSE-NEXT:    movaps {{.*#+}} xmm1 = [1.0E+0]1025; X64-SSE-NEXT:    callq __gttf2@PLT1026; X64-SSE-NEXT:    xorl %ecx, %ecx1027; X64-SSE-NEXT:    testl %eax, %eax1028; X64-SSE-NEXT:    setg %cl1029; X64-SSE-NEXT:    movl %ecx, %eax1030; X64-SSE-NEXT:    popq %rcx1031; X64-SSE-NEXT:    retq1032;1033; X86-LABEL: TestConst128:1034; X86:       # %bb.0: # %entry1035; X86-NEXT:    subl $12, %esp1036; X86-NEXT:    pushl $1073676288 # imm = 0x3FFF00001037; X86-NEXT:    pushl $01038; X86-NEXT:    pushl $01039; X86-NEXT:    pushl $01040; X86-NEXT:    pushl {{[0-9]+}}(%esp)1041; X86-NEXT:    pushl {{[0-9]+}}(%esp)1042; X86-NEXT:    pushl {{[0-9]+}}(%esp)1043; X86-NEXT:    pushl {{[0-9]+}}(%esp)1044; X86-NEXT:    calll __gttf21045; X86-NEXT:    addl $32, %esp1046; X86-NEXT:    xorl %ecx, %ecx1047; X86-NEXT:    testl %eax, %eax1048; X86-NEXT:    setg %cl1049; X86-NEXT:    movl %ecx, %eax1050; X86-NEXT:    addl $12, %esp1051; X86-NEXT:    retl1052;1053; X64-AVX-LABEL: TestConst128:1054; X64-AVX:       # %bb.0: # %entry1055; X64-AVX-NEXT:    pushq %rax1056; X64-AVX-NEXT:    vmovaps {{.*#+}} xmm1 = [1.0E+0]1057; X64-AVX-NEXT:    callq __gttf2@PLT1058; X64-AVX-NEXT:    xorl %ecx, %ecx1059; X64-AVX-NEXT:    testl %eax, %eax1060; X64-AVX-NEXT:    setg %cl1061; X64-AVX-NEXT:    movl %ecx, %eax1062; X64-AVX-NEXT:    popq %rcx1063; X64-AVX-NEXT:    retq1064entry:1065  %cmp = fcmp ogt fp128 %v, 0xL00000000000000003FFF0000000000001066  %conv = zext i1 %cmp to i321067  ret i32 %conv1068}1069 1070 1071define dso_local i32 @TestConst128Zero(fp128 %v) nounwind {1072; X64-SSE-LABEL: TestConst128Zero:1073; X64-SSE:       # %bb.0: # %entry1074; X64-SSE-NEXT:    pushq %rax1075; X64-SSE-NEXT:    xorps %xmm1, %xmm11076; X64-SSE-NEXT:    callq __gttf2@PLT1077; X64-SSE-NEXT:    xorl %ecx, %ecx1078; X64-SSE-NEXT:    testl %eax, %eax1079; X64-SSE-NEXT:    setg %cl1080; X64-SSE-NEXT:    movl %ecx, %eax1081; X64-SSE-NEXT:    popq %rcx1082; X64-SSE-NEXT:    retq1083;1084; X86-LABEL: TestConst128Zero:1085; X86:       # %bb.0: # %entry1086; X86-NEXT:    subl $12, %esp1087; X86-NEXT:    pushl $01088; X86-NEXT:    pushl $01089; X86-NEXT:    pushl $01090; X86-NEXT:    pushl $01091; X86-NEXT:    pushl {{[0-9]+}}(%esp)1092; X86-NEXT:    pushl {{[0-9]+}}(%esp)1093; X86-NEXT:    pushl {{[0-9]+}}(%esp)1094; X86-NEXT:    pushl {{[0-9]+}}(%esp)1095; X86-NEXT:    calll __gttf21096; X86-NEXT:    addl $32, %esp1097; X86-NEXT:    xorl %ecx, %ecx1098; X86-NEXT:    testl %eax, %eax1099; X86-NEXT:    setg %cl1100; X86-NEXT:    movl %ecx, %eax1101; X86-NEXT:    addl $12, %esp1102; X86-NEXT:    retl1103;1104; X64-AVX-LABEL: TestConst128Zero:1105; X64-AVX:       # %bb.0: # %entry1106; X64-AVX-NEXT:    pushq %rax1107; X64-AVX-NEXT:    vxorps %xmm1, %xmm1, %xmm11108; X64-AVX-NEXT:    callq __gttf2@PLT1109; X64-AVX-NEXT:    xorl %ecx, %ecx1110; X64-AVX-NEXT:    testl %eax, %eax1111; X64-AVX-NEXT:    setg %cl1112; X64-AVX-NEXT:    movl %ecx, %eax1113; X64-AVX-NEXT:    popq %rcx1114; X64-AVX-NEXT:    retq1115entry:1116  %cmp = fcmp ogt fp128 %v, 0xL000000000000000000000000000000001117  %conv = zext i1 %cmp to i321118  ret i32 %conv1119}1120 1121; C code:1122;  struct TestBits_ieee_ext {1123;    unsigned v1;1124;    unsigned v2;1125; };1126; union TestBits_LDU {1127;   FP128 ld;1128;   struct TestBits_ieee_ext bits;1129; };1130; int TestBits128(FP128 ld) {1131;   union TestBits_LDU u;1132;   u.ld = ld * ld;1133;   return ((u.bits.v1 | u.bits.v2)  == 0);1134; }1135define dso_local i32 @TestBits128(fp128 %ld) nounwind {1136; X64-SSE-LABEL: TestBits128:1137; X64-SSE:       # %bb.0: # %entry1138; X64-SSE-NEXT:    subq $24, %rsp1139; X64-SSE-NEXT:    movaps %xmm0, %xmm11140; X64-SSE-NEXT:    callq __multf3@PLT1141; X64-SSE-NEXT:    movaps %xmm0, (%rsp)1142; X64-SSE-NEXT:    movq (%rsp), %rcx1143; X64-SSE-NEXT:    movq %rcx, %rdx1144; X64-SSE-NEXT:    shrq $32, %rdx1145; X64-SSE-NEXT:    xorl %eax, %eax1146; X64-SSE-NEXT:    orl %ecx, %edx1147; X64-SSE-NEXT:    sete %al1148; X64-SSE-NEXT:    addq $24, %rsp1149; X64-SSE-NEXT:    retq1150;1151; X86-LABEL: TestBits128:1152; X86:       # %bb.0: # %entry1153; X86-NEXT:    pushl %esi1154; X86-NEXT:    subl $72, %esp1155; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1156; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1157; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1158; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1159; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)1160; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)1161; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1162; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)1163; X86-NEXT:    movl %esi, {{[0-9]+}}(%esp)1164; X86-NEXT:    movl %edx, {{[0-9]+}}(%esp)1165; X86-NEXT:    movl %ecx, {{[0-9]+}}(%esp)1166; X86-NEXT:    movl %eax, {{[0-9]+}}(%esp)1167; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax1168; X86-NEXT:    movl %eax, (%esp)1169; X86-NEXT:    calll __multf31170; X86-NEXT:    subl $4, %esp1171; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1172; X86-NEXT:    xorl %eax, %eax1173; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx1174; X86-NEXT:    sete %al1175; X86-NEXT:    addl $72, %esp1176; X86-NEXT:    popl %esi1177; X86-NEXT:    retl1178;1179; X64-AVX-LABEL: TestBits128:1180; X64-AVX:       # %bb.0: # %entry1181; X64-AVX-NEXT:    subq $24, %rsp1182; X64-AVX-NEXT:    vmovaps %xmm0, %xmm11183; X64-AVX-NEXT:    callq __multf3@PLT1184; X64-AVX-NEXT:    vmovaps %xmm0, (%rsp)1185; X64-AVX-NEXT:    movq (%rsp), %rcx1186; X64-AVX-NEXT:    movq %rcx, %rdx1187; X64-AVX-NEXT:    shrq $32, %rdx1188; X64-AVX-NEXT:    xorl %eax, %eax1189; X64-AVX-NEXT:    orl %ecx, %edx1190; X64-AVX-NEXT:    sete %al1191; X64-AVX-NEXT:    addq $24, %rsp1192; X64-AVX-NEXT:    retq1193entry:1194  %mul = fmul fp128 %ld, %ld1195  %0 = bitcast fp128 %mul to i1281196  %shift = lshr i128 %0, 321197  %or5 = or i128 %shift, %01198  %or = trunc i128 %or5 to i321199  %cmp = icmp eq i32 %or, 01200  %conv = zext i1 %cmp to i321201  ret i32 %conv1202; If TestBits128 fails due to any llvm or clang change,1203; please make sure the original simplified C code will1204; be compiled into correct IL and assembly code, not1205; just this TestBits128 test case. Better yet, try to1206; test the whole libm and its test cases.1207}1208 1209; C code: (compiled with -target x86_64-linux-android)1210; typedef long double __float128;1211; __float128 TestPair128(unsigned long a, unsigned long b) {1212;   unsigned __int128 n;1213;   unsigned __int128 v1 = ((unsigned __int128)a << 64);1214;   unsigned __int128 v2 = (unsigned __int128)b;1215;   n = (v1 | v2) + 3;1216;   return *(__float128*)&n;1217; }1218define fp128 @TestPair128(i64 %a, i64 %b) nounwind {1219; X64-SSE-LABEL: TestPair128:1220; X64-SSE:       # %bb.0: # %entry1221; X64-SSE-NEXT:    addq $3, %rsi1222; X64-SSE-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)1223; X64-SSE-NEXT:    adcq $0, %rdi1224; X64-SSE-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)1225; X64-SSE-NEXT:    movaps -{{[0-9]+}}(%rsp), %xmm01226; X64-SSE-NEXT:    retq1227;1228; X86-LABEL: TestPair128:1229; X86:       # %bb.0: # %entry1230; X86-NEXT:    pushl %edi1231; X86-NEXT:    pushl %esi1232; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1233; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1234; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1235; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1236; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1237; X86-NEXT:    addl $3, %ecx1238; X86-NEXT:    adcl $0, %edx1239; X86-NEXT:    adcl $0, %esi1240; X86-NEXT:    adcl $0, %edi1241; X86-NEXT:    movl %esi, 8(%eax)1242; X86-NEXT:    movl %edx, 4(%eax)1243; X86-NEXT:    movl %ecx, (%eax)1244; X86-NEXT:    movl %edi, 12(%eax)1245; X86-NEXT:    popl %esi1246; X86-NEXT:    popl %edi1247; X86-NEXT:    retl $41248;1249; X64-AVX-LABEL: TestPair128:1250; X64-AVX:       # %bb.0: # %entry1251; X64-AVX-NEXT:    addq $3, %rsi1252; X64-AVX-NEXT:    movq %rsi, -{{[0-9]+}}(%rsp)1253; X64-AVX-NEXT:    adcq $0, %rdi1254; X64-AVX-NEXT:    movq %rdi, -{{[0-9]+}}(%rsp)1255; X64-AVX-NEXT:    vmovaps -{{[0-9]+}}(%rsp), %xmm01256; X64-AVX-NEXT:    retq1257entry:1258  %conv = zext i64 %a to i1281259  %shl = shl nuw i128 %conv, 641260  %conv1 = zext i64 %b to i1281261  %or = or i128 %shl, %conv11262  %add = add i128 %or, 31263  %0 = bitcast i128 %add to fp1281264  ret fp128 %01265}1266 1267define fp128 @TestTruncCopysign(fp128 %x, i32 %n) nounwind {1268; X64-SSE-LABEL: TestTruncCopysign:1269; X64-SSE:       # %bb.0: # %entry1270; X64-SSE-NEXT:    cmpl $50001, %edi # imm = 0xC3511271; X64-SSE-NEXT:    jl .LBB26_21272; X64-SSE-NEXT:  # %bb.1: # %if.then1273; X64-SSE-NEXT:    pushq %rax1274; X64-SSE-NEXT:    callq __trunctfdf2@PLT1275; X64-SSE-NEXT:    andps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01276; X64-SSE-NEXT:    orps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01277; X64-SSE-NEXT:    callq __extenddftf2@PLT1278; X64-SSE-NEXT:    addq $8, %rsp1279; X64-SSE-NEXT:  .LBB26_2: # %cleanup1280; X64-SSE-NEXT:    retq1281;1282; X86-LABEL: TestTruncCopysign:1283; X86:       # %bb.0: # %entry1284; X86-NEXT:    pushl %edi1285; X86-NEXT:    pushl %esi1286; X86-NEXT:    subl $36, %esp1287; X86-NEXT:    movl {{[0-9]+}}(%esp), %esi1288; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1289; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1290; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1291; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx1292; X86-NEXT:    cmpl $50001, {{[0-9]+}}(%esp) # imm = 0xC3511293; X86-NEXT:    jl .LBB26_41294; X86-NEXT:  # %bb.1: # %if.then1295; X86-NEXT:    pushl %eax1296; X86-NEXT:    pushl %ecx1297; X86-NEXT:    pushl %edi1298; X86-NEXT:    pushl %edx1299; X86-NEXT:    calll __trunctfdf21300; X86-NEXT:    addl $16, %esp1301; X86-NEXT:    fstpl {{[0-9]+}}(%esp)1302; X86-NEXT:    testb $-128, {{[0-9]+}}(%esp)1303; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}1304; X86-NEXT:    flds {{\.?LCPI[0-9]+_[0-9]+}}1305; X86-NEXT:    jne .LBB26_31306; X86-NEXT:  # %bb.2: # %if.then1307; X86-NEXT:    fstp %st(1)1308; X86-NEXT:    fldz1309; X86-NEXT:  .LBB26_3: # %if.then1310; X86-NEXT:    fstp %st(0)1311; X86-NEXT:    subl $16, %esp1312; X86-NEXT:    leal {{[0-9]+}}(%esp), %eax1313; X86-NEXT:    movl %eax, (%esp)1314; X86-NEXT:    fstpl {{[0-9]+}}(%esp)1315; X86-NEXT:    calll __extenddftf21316; X86-NEXT:    addl $12, %esp1317; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1318; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1319; X86-NEXT:    movl (%esp), %edx1320; X86-NEXT:    movl {{[0-9]+}}(%esp), %edi1321; X86-NEXT:  .LBB26_4: # %cleanup1322; X86-NEXT:    movl %edx, (%esi)1323; X86-NEXT:    movl %edi, 4(%esi)1324; X86-NEXT:    movl %ecx, 8(%esi)1325; X86-NEXT:    movl %eax, 12(%esi)1326; X86-NEXT:    movl %esi, %eax1327; X86-NEXT:    addl $36, %esp1328; X86-NEXT:    popl %esi1329; X86-NEXT:    popl %edi1330; X86-NEXT:    retl $41331;1332; X64-AVX-LABEL: TestTruncCopysign:1333; X64-AVX:       # %bb.0: # %entry1334; X64-AVX-NEXT:    cmpl $50001, %edi # imm = 0xC3511335; X64-AVX-NEXT:    jl .LBB26_21336; X64-AVX-NEXT:  # %bb.1: # %if.then1337; X64-AVX-NEXT:    pushq %rax1338; X64-AVX-NEXT:    callq __trunctfdf2@PLT1339; X64-AVX-NEXT:    vandps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01340; X64-AVX-NEXT:    vmovddup {{.*#+}} xmm1 = [+Inf,+Inf]1341; X64-AVX-NEXT:    # xmm1 = mem[0,0]1342; X64-AVX-NEXT:    vorps %xmm1, %xmm0, %xmm01343; X64-AVX-NEXT:    callq __extenddftf2@PLT1344; X64-AVX-NEXT:    addq $8, %rsp1345; X64-AVX-NEXT:  .LBB26_2: # %cleanup1346; X64-AVX-NEXT:    retq1347entry:1348  %cmp = icmp sgt i32 %n, 500001349  br i1 %cmp, label %if.then, label %cleanup1350 1351if.then:                                          ; preds = %entry1352  %conv = fptrunc fp128 %x to double1353  %call = tail call double @copysign(double 0x7FF0000000000000, double %conv) #21354  %conv1 = fpext double %call to fp1281355  br label %cleanup1356 1357cleanup:                                          ; preds = %entry, %if.then1358  %retval.0 = phi fp128 [ %conv1, %if.then ], [ %x, %entry ]1359  ret fp128 %retval.01360}1361 1362define i1 @PR34866(i128 %x) nounwind {1363; X64-SSE-LABEL: PR34866:1364; X64-SSE:       # %bb.0:1365; X64-SSE-NEXT:    xorps %xmm0, %xmm01366; X64-SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)1367; X64-SSE-NEXT:    xorq -{{[0-9]+}}(%rsp), %rsi1368; X64-SSE-NEXT:    xorq -{{[0-9]+}}(%rsp), %rdi1369; X64-SSE-NEXT:    orq %rsi, %rdi1370; X64-SSE-NEXT:    sete %al1371; X64-SSE-NEXT:    retq1372;1373; X86-LABEL: PR34866:1374; X86:       # %bb.0:1375; X86-NEXT:    subl $12, %esp1376; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1377; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1378; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx1379; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax1380; X86-NEXT:    orl %ecx, %eax1381; X86-NEXT:    sete %al1382; X86-NEXT:    addl $12, %esp1383; X86-NEXT:    retl1384;1385; X64-AVX-LABEL: PR34866:1386; X64-AVX:       # %bb.0:1387; X64-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm01388; X64-AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)1389; X64-AVX-NEXT:    xorq -{{[0-9]+}}(%rsp), %rsi1390; X64-AVX-NEXT:    xorq -{{[0-9]+}}(%rsp), %rdi1391; X64-AVX-NEXT:    orq %rsi, %rdi1392; X64-AVX-NEXT:    sete %al1393; X64-AVX-NEXT:    retq1394  %bc_mmx = bitcast fp128 0xL00000000000000000000000000000000 to i1281395  %cmp = icmp eq i128 %bc_mmx, %x1396  ret i1 %cmp1397}1398 1399define i1 @PR34866_commute(i128 %x) nounwind {1400; X64-SSE-LABEL: PR34866_commute:1401; X64-SSE:       # %bb.0:1402; X64-SSE-NEXT:    xorps %xmm0, %xmm01403; X64-SSE-NEXT:    movaps %xmm0, -{{[0-9]+}}(%rsp)1404; X64-SSE-NEXT:    xorq -{{[0-9]+}}(%rsp), %rsi1405; X64-SSE-NEXT:    xorq -{{[0-9]+}}(%rsp), %rdi1406; X64-SSE-NEXT:    orq %rsi, %rdi1407; X64-SSE-NEXT:    sete %al1408; X64-SSE-NEXT:    retq1409;1410; X86-LABEL: PR34866_commute:1411; X86:       # %bb.0:1412; X86-NEXT:    subl $12, %esp1413; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax1414; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx1415; X86-NEXT:    orl {{[0-9]+}}(%esp), %ecx1416; X86-NEXT:    orl {{[0-9]+}}(%esp), %eax1417; X86-NEXT:    orl %ecx, %eax1418; X86-NEXT:    sete %al1419; X86-NEXT:    addl $12, %esp1420; X86-NEXT:    retl1421;1422; X64-AVX-LABEL: PR34866_commute:1423; X64-AVX:       # %bb.0:1424; X64-AVX-NEXT:    vxorps %xmm0, %xmm0, %xmm01425; X64-AVX-NEXT:    vmovaps %xmm0, -{{[0-9]+}}(%rsp)1426; X64-AVX-NEXT:    xorq -{{[0-9]+}}(%rsp), %rsi1427; X64-AVX-NEXT:    xorq -{{[0-9]+}}(%rsp), %rdi1428; X64-AVX-NEXT:    orq %rsi, %rdi1429; X64-AVX-NEXT:    sete %al1430; X64-AVX-NEXT:    retq1431  %bc_mmx = bitcast fp128 0xL00000000000000000000000000000000 to i1281432  %cmp = icmp eq i128 %x, %bc_mmx1433  ret i1 %cmp1434}1435 1436 1437declare double @copysign(double, double) #11438 1439attributes #2 = { nounwind readnone }1440