brintos

brintos / llvm-project-archived public Read only

0
0
Text · 78.8 KiB · b655bda Raw
1720 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 32; RUN: llc < %s -mtriple=x86_64-unknown-unknown | FileCheck %s --check-prefixes=CHECK-SSE3; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx2 | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX24; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+avx512f | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX512F,CHECK-ONLY-AVX512F5; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mcpu=skx | FileCheck %s --check-prefixes=CHECK-AVX,CHECK-AVX512F,CHECK-SKX6 7declare i16 @llvm.umax.i16(i16, i16)8declare i64 @llvm.umin.i64(i64, i64)9 10declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>)11 12define <4 x float> @fmul_pow2_4xfloat(<4 x i32> %i) {13; CHECK-SSE-LABEL: fmul_pow2_4xfloat:14; CHECK-SSE:       # %bb.0:15; CHECK-SSE-NEXT:    pslld $23, %xmm016; CHECK-SSE-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm017; CHECK-SSE-NEXT:    retq18;19; CHECK-AVX2-LABEL: fmul_pow2_4xfloat:20; CHECK-AVX2:       # %bb.0:21; CHECK-AVX2-NEXT:    vpslld $23, %xmm0, %xmm022; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1091567616,1091567616,1091567616,1091567616]23; CHECK-AVX2-NEXT:    vpaddd %xmm1, %xmm0, %xmm024; CHECK-AVX2-NEXT:    retq25;26; CHECK-ONLY-AVX512F-LABEL: fmul_pow2_4xfloat:27; CHECK-ONLY-AVX512F:       # %bb.0:28; CHECK-ONLY-AVX512F-NEXT:    vpslld $23, %xmm0, %xmm029; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1091567616,1091567616,1091567616,1091567616]30; CHECK-ONLY-AVX512F-NEXT:    vpaddd %xmm1, %xmm0, %xmm031; CHECK-ONLY-AVX512F-NEXT:    retq32;33; CHECK-SKX-LABEL: fmul_pow2_4xfloat:34; CHECK-SKX:       # %bb.0:35; CHECK-SKX-NEXT:    vpslld $23, %xmm0, %xmm036; CHECK-SKX-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm037; CHECK-SKX-NEXT:    retq38  %p2 = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %i39  %p2_f = uitofp <4 x i32> %p2 to <4 x float>40  %r = fmul <4 x float> <float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00>, %p2_f41  ret <4 x float> %r42}43 44define <4 x float> @fmul_pow2_ldexp_4xfloat(<4 x i32> %i) {45; CHECK-SSE-LABEL: fmul_pow2_ldexp_4xfloat:46; CHECK-SSE:       # %bb.0:47; CHECK-SSE-NEXT:    subq $56, %rsp48; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 6449; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill50; CHECK-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[3,3,3,3]51; CHECK-SSE-NEXT:    movd %xmm1, %edi52; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]53; CHECK-SSE-NEXT:    callq ldexpf@PLT54; CHECK-SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill55; CHECK-SSE-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload56; CHECK-SSE-NEXT:    # xmm0 = mem[2,3,2,3]57; CHECK-SSE-NEXT:    movd %xmm0, %edi58; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]59; CHECK-SSE-NEXT:    callq ldexpf@PLT60; CHECK-SSE-NEXT:    unpcklps (%rsp), %xmm0 # 16-byte Folded Reload61; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]62; CHECK-SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill63; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload64; CHECK-SSE-NEXT:    movd %xmm0, %edi65; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]66; CHECK-SSE-NEXT:    callq ldexpf@PLT67; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill68; CHECK-SSE-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload69; CHECK-SSE-NEXT:    # xmm0 = mem[1,1,1,1]70; CHECK-SSE-NEXT:    movd %xmm0, %edi71; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]72; CHECK-SSE-NEXT:    callq ldexpf@PLT73; CHECK-SSE-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload74; CHECK-SSE-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]75; CHECK-SSE-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload76; CHECK-SSE-NEXT:    # xmm1 = xmm1[0],mem[0]77; CHECK-SSE-NEXT:    movaps %xmm1, %xmm078; CHECK-SSE-NEXT:    addq $56, %rsp79; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 880; CHECK-SSE-NEXT:    retq81;82; CHECK-AVX2-LABEL: fmul_pow2_ldexp_4xfloat:83; CHECK-AVX2:       # %bb.0:84; CHECK-AVX2-NEXT:    subq $40, %rsp85; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 4886; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill87; CHECK-AVX2-NEXT:    vextractps $1, %xmm0, %edi88; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]89; CHECK-AVX2-NEXT:    callq ldexpf@PLT90; CHECK-AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill91; CHECK-AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload92; CHECK-AVX2-NEXT:    vmovd %xmm0, %edi93; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]94; CHECK-AVX2-NEXT:    callq ldexpf@PLT95; CHECK-AVX2-NEXT:    vinsertps $16, (%rsp), %xmm0, %xmm0 # 16-byte Folded Reload96; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[2,3]97; CHECK-AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill98; CHECK-AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload99; CHECK-AVX2-NEXT:    vextractps $2, %xmm0, %edi100; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]101; CHECK-AVX2-NEXT:    callq ldexpf@PLT102; CHECK-AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload103; CHECK-AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1],xmm0[0],xmm1[3]104; CHECK-AVX2-NEXT:    vmovaps %xmm0, (%rsp) # 16-byte Spill105; CHECK-AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload106; CHECK-AVX2-NEXT:    vextractps $3, %xmm0, %edi107; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [9.0E+0,0.0E+0,0.0E+0,0.0E+0]108; CHECK-AVX2-NEXT:    callq ldexpf@PLT109; CHECK-AVX2-NEXT:    vmovaps (%rsp), %xmm1 # 16-byte Reload110; CHECK-AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm1[0,1,2],xmm0[0]111; CHECK-AVX2-NEXT:    addq $40, %rsp112; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 8113; CHECK-AVX2-NEXT:    retq114;115; CHECK-ONLY-AVX512F-LABEL: fmul_pow2_ldexp_4xfloat:116; CHECK-ONLY-AVX512F:       # %bb.0:117; CHECK-ONLY-AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm1 = [9.0E+0,9.0E+0,9.0E+0,9.0E+0]118; CHECK-ONLY-AVX512F-NEXT:    vmovaps %xmm0, %xmm0119; CHECK-ONLY-AVX512F-NEXT:    vscalefps %zmm0, %zmm1, %zmm0120; CHECK-ONLY-AVX512F-NEXT:    # kill: def $xmm0 killed $xmm0 killed $zmm0121; CHECK-ONLY-AVX512F-NEXT:    vzeroupper122; CHECK-ONLY-AVX512F-NEXT:    retq123;124; CHECK-SKX-LABEL: fmul_pow2_ldexp_4xfloat:125; CHECK-SKX:       # %bb.0:126; CHECK-SKX-NEXT:    vcvtdq2ps %xmm0, %xmm0127; CHECK-SKX-NEXT:    vbroadcastss {{.*#+}} xmm1 = [9.0E+0,9.0E+0,9.0E+0,9.0E+0]128; CHECK-SKX-NEXT:    vscalefps %xmm0, %xmm1, %xmm0129; CHECK-SKX-NEXT:    retq130  %r = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> <float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00>, <4 x i32> %i)131  ret <4 x float> %r132}133 134define <4 x float> @fdiv_pow2_4xfloat(<4 x i32> %i) {135; CHECK-SSE-LABEL: fdiv_pow2_4xfloat:136; CHECK-SSE:       # %bb.0:137; CHECK-SSE-NEXT:    pslld $23, %xmm0138; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [1091567616,1091567616,1091567616,1091567616]139; CHECK-SSE-NEXT:    psubd %xmm0, %xmm1140; CHECK-SSE-NEXT:    movdqa %xmm1, %xmm0141; CHECK-SSE-NEXT:    retq142;143; CHECK-AVX-LABEL: fdiv_pow2_4xfloat:144; CHECK-AVX:       # %bb.0:145; CHECK-AVX-NEXT:    vpslld $23, %xmm0, %xmm0146; CHECK-AVX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1091567616,1091567616,1091567616,1091567616]147; CHECK-AVX-NEXT:    vpsubd %xmm0, %xmm1, %xmm0148; CHECK-AVX-NEXT:    retq149  %p2 = shl <4 x i32> <i32 1, i32 1, i32 1, i32 1>, %i150  %p2_f = uitofp <4 x i32> %p2 to <4 x float>151  %r = fdiv <4 x float> <float 9.000000e+00, float 9.000000e+00, float 9.000000e+00, float 9.000000e+00>, %p2_f152  ret <4 x float> %r153}154 155declare <8 x half> @llvm.ldexp.v8f16.v8i16(<8 x half>, <8 x i16>)156 157define <8 x half> @fmul_pow2_8xhalf(<8 x i16> %i) {158; CHECK-SSE-LABEL: fmul_pow2_8xhalf:159; CHECK-SSE:       # %bb.0:160; CHECK-SSE-NEXT:    subq $104, %rsp161; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 112162; CHECK-SSE-NEXT:    movdqa %xmm0, %xmm1163; CHECK-SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4,4,5,5,6,6,7,7]164; CHECK-SSE-NEXT:    pslld $23, %xmm1165; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [1065353216,1065353216,1065353216,1065353216]166; CHECK-SSE-NEXT:    paddd %xmm2, %xmm1167; CHECK-SSE-NEXT:    cvttps2dq %xmm1, %xmm1168; CHECK-SSE-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill169; CHECK-SSE-NEXT:    pslld $16, %xmm1170; CHECK-SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill171; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]172; CHECK-SSE-NEXT:    pslld $23, %xmm0173; CHECK-SSE-NEXT:    paddd %xmm2, %xmm0174; CHECK-SSE-NEXT:    cvttps2dq %xmm0, %xmm0175; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill176; CHECK-SSE-NEXT:    pslld $16, %xmm0177; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill178; CHECK-SSE-NEXT:    psrld $16, %xmm0179; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0180; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT181; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill182; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload183; CHECK-SSE-NEXT:    psrlq $48, %xmm0184; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0185; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT186; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill187; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload188; CHECK-SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero189; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0190; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT191; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill192; CHECK-SSE-NEXT:    xorps %xmm0, %xmm0193; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload194; CHECK-SSE-NEXT:    punpckhwd {{.*#+}} xmm1 = xmm1[4],xmm0[4],xmm1[5],xmm0[5],xmm1[6],xmm0[6],xmm1[7],xmm0[7]195; CHECK-SSE-NEXT:    cvtdq2ps %xmm1, %xmm0196; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT197; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill198; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload199; CHECK-SSE-NEXT:    psrld $16, %xmm0200; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0201; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT202; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill203; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload204; CHECK-SSE-NEXT:    psrlq $48, %xmm0205; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0206; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT207; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill208; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload209; CHECK-SSE-NEXT:    psrldq {{.*#+}} xmm0 = xmm0[14,15],zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero,zero210; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0211; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT212; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill213; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload214; CHECK-SSE-NEXT:    pxor %xmm1, %xmm1215; CHECK-SSE-NEXT:    punpckhwd {{.*#+}} xmm0 = xmm0[4],xmm1[4],xmm0[5],xmm1[5],xmm0[6],xmm1[6],xmm0[7],xmm1[7]216; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm0217; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT218; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT219; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0220; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT221; CHECK-SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill222; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload223; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero224; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT225; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0226; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT227; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm1 # 16-byte Reload228; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]229; CHECK-SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill230; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload231; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero232; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT233; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0234; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT235; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill236; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload237; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero238; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT239; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0240; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT241; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload242; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]243; CHECK-SSE-NEXT:    punpckldq (%rsp), %xmm0 # 16-byte Folded Reload244; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]245; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill246; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload247; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero248; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT249; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0250; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT251; CHECK-SSE-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill252; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload253; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero254; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT255; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0256; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT257; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm1 # 16-byte Reload258; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]259; CHECK-SSE-NEXT:    movdqa %xmm1, (%rsp) # 16-byte Spill260; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload261; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero262; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT263; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0264; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT265; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill266; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload267; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero268; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT269; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0270; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT271; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload272; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]273; CHECK-SSE-NEXT:    punpckldq (%rsp), %xmm0 # 16-byte Folded Reload274; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]275; CHECK-SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload276; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0]277; CHECK-SSE-NEXT:    addq $104, %rsp278; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 8279; CHECK-SSE-NEXT:    retq280;281; CHECK-AVX2-LABEL: fmul_pow2_8xhalf:282; CHECK-AVX2:       # %bb.0:283; CHECK-AVX2-NEXT:    subq $120, %rsp284; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 128285; CHECK-AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero286; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]287; CHECK-AVX2-NEXT:    vpsllvd %ymm0, %ymm1, %ymm0288; CHECK-AVX2-NEXT:    vpshufb {{.*#+}} ymm0 = ymm0[0,1,4,5,8,9,12,13,u,u,u,u,u,u,u,u,16,17,20,21,24,25,28,29,u,u,u,u,u,u,u,u]289; CHECK-AVX2-NEXT:    vpermq {{.*#+}} ymm0 = ymm0[0,2,2,3]290; CHECK-AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero291; CHECK-AVX2-NEXT:    vcvtdq2ps %ymm0, %ymm0292; CHECK-AVX2-NEXT:    vmovups %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill293; CHECK-AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]294; CHECK-AVX2-NEXT:    vzeroupper295; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT296; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill297; CHECK-AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload298; CHECK-AVX2-NEXT:    # kill: def $xmm0 killed $xmm0 killed $ymm0299; CHECK-AVX2-NEXT:    vzeroupper300; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT301; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill302; CHECK-AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload303; CHECK-AVX2-NEXT:    # xmm0 = mem[1,0]304; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT305; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill306; CHECK-AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload307; CHECK-AVX2-NEXT:    # xmm0 = mem[3,3,3,3]308; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT309; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill310; CHECK-AVX2-NEXT:    vmovups {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload311; CHECK-AVX2-NEXT:    vextractf128 $1, %ymm0, %xmm0312; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill313; CHECK-AVX2-NEXT:    vmovshdup {{.*#+}} xmm0 = xmm0[1,1,3,3]314; CHECK-AVX2-NEXT:    vzeroupper315; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT316; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill317; CHECK-AVX2-NEXT:    vmovaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload318; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT319; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill320; CHECK-AVX2-NEXT:    vpermilpd $1, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload321; CHECK-AVX2-NEXT:    # xmm0 = mem[1,0]322; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT323; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill324; CHECK-AVX2-NEXT:    vpermilps $255, {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload325; CHECK-AVX2-NEXT:    # xmm0 = mem[3,3,3,3]326; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT327; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT328; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0329; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT330; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill331; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload332; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero333; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT334; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0335; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT336; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload337; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]338; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill339; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload340; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero341; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT342; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0343; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT344; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill345; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload346; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero347; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT348; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0349; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT350; CHECK-AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload351; CHECK-AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]352; CHECK-AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload353; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]354; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill355; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload356; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero357; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT358; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0359; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT360; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill361; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload362; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero363; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT364; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0365; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT366; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload367; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]368; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill369; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload370; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero371; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT372; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0373; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT374; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill375; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload376; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero377; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT378; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0379; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT380; CHECK-AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload381; CHECK-AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]382; CHECK-AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload383; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]384; CHECK-AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload385; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0]386; CHECK-AVX2-NEXT:    addq $120, %rsp387; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 8388; CHECK-AVX2-NEXT:    retq389;390; CHECK-ONLY-AVX512F-LABEL: fmul_pow2_8xhalf:391; CHECK-ONLY-AVX512F:       # %bb.0:392; CHECK-ONLY-AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero393; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastd {{.*#+}} ymm1 = [1,1,1,1,1,1,1,1]394; CHECK-ONLY-AVX512F-NEXT:    vpsllvd %ymm0, %ymm1, %ymm0395; CHECK-ONLY-AVX512F-NEXT:    vpxor %xmm1, %xmm1, %xmm1396; CHECK-ONLY-AVX512F-NEXT:    vpblendw {{.*#+}} ymm0 = ymm0[0],ymm1[1],ymm0[2],ymm1[3],ymm0[4],ymm1[5],ymm0[6],ymm1[7],ymm0[8],ymm1[9],ymm0[10],ymm1[11],ymm0[12],ymm1[13],ymm0[14],ymm1[15]397; CHECK-ONLY-AVX512F-NEXT:    vcvtdq2ps %ymm0, %ymm0398; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm0399; CHECK-ONLY-AVX512F-NEXT:    vcvtph2ps %xmm0, %ymm0400; CHECK-ONLY-AVX512F-NEXT:    vbroadcastss {{.*#+}} ymm1 = [8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3]401; CHECK-ONLY-AVX512F-NEXT:    vmulps %ymm1, %ymm0, %ymm0402; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm0403; CHECK-ONLY-AVX512F-NEXT:    vzeroupper404; CHECK-ONLY-AVX512F-NEXT:    retq405;406; CHECK-SKX-LABEL: fmul_pow2_8xhalf:407; CHECK-SKX:       # %bb.0:408; CHECK-SKX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1,1,1,1,1,1,1,1]409; CHECK-SKX-NEXT:    vpsllvw %xmm0, %xmm1, %xmm0410; CHECK-SKX-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero411; CHECK-SKX-NEXT:    vcvtdq2ps %ymm0, %ymm0412; CHECK-SKX-NEXT:    vcvtps2ph $4, %ymm0, %xmm0413; CHECK-SKX-NEXT:    vcvtph2ps %xmm0, %ymm0414; CHECK-SKX-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm0415; CHECK-SKX-NEXT:    vcvtps2ph $4, %ymm0, %xmm0416; CHECK-SKX-NEXT:    vzeroupper417; CHECK-SKX-NEXT:    retq418  %p2 = shl <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, %i419  %p2_f = uitofp <8 x i16> %p2 to <8 x half>420  %r = fmul <8 x half> <half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000>, %p2_f421  ret <8 x half> %r422}423 424define <8 x half> @fmul_pow2_ldexp_8xhalf(<8 x i16> %i) {425; CHECK-SSE-LABEL: fmul_pow2_ldexp_8xhalf:426; CHECK-SSE:       # %bb.0:427; CHECK-SSE-NEXT:    subq $72, %rsp428; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 80429; CHECK-SSE-NEXT:    movdqa %xmm0, (%rsp) # 16-byte Spill430; CHECK-SSE-NEXT:    pextrw $7, %xmm0, %eax431; CHECK-SSE-NEXT:    movswl %ax, %edi432; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]433; CHECK-SSE-NEXT:    callq ldexpf@PLT434; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT435; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill436; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload437; CHECK-SSE-NEXT:    pextrw $6, %xmm0, %eax438; CHECK-SSE-NEXT:    movswl %ax, %edi439; CHECK-SSE-NEXT:    movd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]440; CHECK-SSE-NEXT:    callq ldexpf@PLT441; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT442; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload443; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]444; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill445; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload446; CHECK-SSE-NEXT:    pextrw $5, %xmm0, %eax447; CHECK-SSE-NEXT:    movswl %ax, %edi448; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]449; CHECK-SSE-NEXT:    callq ldexpf@PLT450; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT451; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill452; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload453; CHECK-SSE-NEXT:    pextrw $4, %xmm0, %eax454; CHECK-SSE-NEXT:    movswl %ax, %edi455; CHECK-SSE-NEXT:    movd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]456; CHECK-SSE-NEXT:    callq ldexpf@PLT457; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT458; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload459; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]460; CHECK-SSE-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload461; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]462; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill463; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload464; CHECK-SSE-NEXT:    pextrw $3, %xmm0, %eax465; CHECK-SSE-NEXT:    movswl %ax, %edi466; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]467; CHECK-SSE-NEXT:    callq ldexpf@PLT468; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT469; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill470; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload471; CHECK-SSE-NEXT:    pextrw $2, %xmm0, %eax472; CHECK-SSE-NEXT:    movswl %ax, %edi473; CHECK-SSE-NEXT:    movd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]474; CHECK-SSE-NEXT:    callq ldexpf@PLT475; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT476; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload477; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]478; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill479; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload480; CHECK-SSE-NEXT:    pextrw $1, %xmm0, %eax481; CHECK-SSE-NEXT:    movswl %ax, %edi482; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]483; CHECK-SSE-NEXT:    callq ldexpf@PLT484; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT485; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill486; CHECK-SSE-NEXT:    movdqa (%rsp), %xmm0 # 16-byte Reload487; CHECK-SSE-NEXT:    movd %xmm0, %eax488; CHECK-SSE-NEXT:    movswl %ax, %edi489; CHECK-SSE-NEXT:    movd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]490; CHECK-SSE-NEXT:    callq ldexpf@PLT491; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT492; CHECK-SSE-NEXT:    punpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload493; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]494; CHECK-SSE-NEXT:    punpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload495; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]496; CHECK-SSE-NEXT:    punpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Folded Reload497; CHECK-SSE-NEXT:    # xmm0 = xmm0[0],mem[0]498; CHECK-SSE-NEXT:    addq $72, %rsp499; CHECK-SSE-NEXT:    .cfi_def_cfa_offset 8500; CHECK-SSE-NEXT:    retq501;502; CHECK-AVX2-LABEL: fmul_pow2_ldexp_8xhalf:503; CHECK-AVX2:       # %bb.0:504; CHECK-AVX2-NEXT:    subq $72, %rsp505; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 80506; CHECK-AVX2-NEXT:    vmovdqa %xmm0, (%rsp) # 16-byte Spill507; CHECK-AVX2-NEXT:    vpextrw $7, %xmm0, %eax508; CHECK-AVX2-NEXT:    movswl %ax, %edi509; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]510; CHECK-AVX2-NEXT:    callq ldexpf@PLT511; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT512; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill513; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload514; CHECK-AVX2-NEXT:    vpextrw $6, %xmm0, %eax515; CHECK-AVX2-NEXT:    movswl %ax, %edi516; CHECK-AVX2-NEXT:    vmovd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]517; CHECK-AVX2-NEXT:    callq ldexpf@PLT518; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT519; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload520; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]521; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill522; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload523; CHECK-AVX2-NEXT:    vpextrw $5, %xmm0, %eax524; CHECK-AVX2-NEXT:    movswl %ax, %edi525; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]526; CHECK-AVX2-NEXT:    callq ldexpf@PLT527; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT528; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill529; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload530; CHECK-AVX2-NEXT:    vpextrw $4, %xmm0, %eax531; CHECK-AVX2-NEXT:    movswl %ax, %edi532; CHECK-AVX2-NEXT:    vmovd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]533; CHECK-AVX2-NEXT:    callq ldexpf@PLT534; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT535; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload536; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]537; CHECK-AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload538; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]539; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill540; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload541; CHECK-AVX2-NEXT:    vpextrw $3, %xmm0, %eax542; CHECK-AVX2-NEXT:    movswl %ax, %edi543; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]544; CHECK-AVX2-NEXT:    callq ldexpf@PLT545; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT546; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill547; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload548; CHECK-AVX2-NEXT:    vpextrw $2, %xmm0, %eax549; CHECK-AVX2-NEXT:    movswl %ax, %edi550; CHECK-AVX2-NEXT:    vmovd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]551; CHECK-AVX2-NEXT:    callq ldexpf@PLT552; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT553; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload554; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]555; CHECK-AVX2-NEXT:    vmovdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill556; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload557; CHECK-AVX2-NEXT:    vpextrw $1, %xmm0, %eax558; CHECK-AVX2-NEXT:    movswl %ax, %edi559; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]560; CHECK-AVX2-NEXT:    callq ldexpf@PLT561; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT562; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill563; CHECK-AVX2-NEXT:    vmovdqa (%rsp), %xmm0 # 16-byte Reload564; CHECK-AVX2-NEXT:    vmovd %xmm0, %eax565; CHECK-AVX2-NEXT:    movswl %ax, %edi566; CHECK-AVX2-NEXT:    vmovd {{.*#+}} xmm0 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]567; CHECK-AVX2-NEXT:    callq ldexpf@PLT568; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT569; CHECK-AVX2-NEXT:    vpunpcklwd {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload570; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1],xmm0[2],mem[2],xmm0[3],mem[3]571; CHECK-AVX2-NEXT:    vpunpckldq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload572; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]573; CHECK-AVX2-NEXT:    vpunpcklqdq {{[-0-9]+}}(%r{{[sb]}}p), %xmm0, %xmm0 # 16-byte Folded Reload574; CHECK-AVX2-NEXT:    # xmm0 = xmm0[0],mem[0]575; CHECK-AVX2-NEXT:    addq $72, %rsp576; CHECK-AVX2-NEXT:    .cfi_def_cfa_offset 8577; CHECK-AVX2-NEXT:    retq578;579; CHECK-AVX512F-LABEL: fmul_pow2_ldexp_8xhalf:580; CHECK-AVX512F:       # %bb.0:581; CHECK-AVX512F-NEXT:    vbroadcastss {{.*#+}} ymm1 = [8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3,8.192E+3]582; CHECK-AVX512F-NEXT:    vpmovsxwd %xmm0, %ymm0583; CHECK-AVX512F-NEXT:    vscalefps %zmm0, %zmm1, %zmm0584; CHECK-AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm0585; CHECK-AVX512F-NEXT:    vzeroupper586; CHECK-AVX512F-NEXT:    retq587  %r = call <8 x half> @llvm.ldexp.v8f16.v8i16(<8 x half> <half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000>, <8 x i16> %i)588  ret <8 x half> %r589}590 591define <8 x half> @fdiv_pow2_8xhalf(<8 x i16> %i) {592; CHECK-SSE-LABEL: fdiv_pow2_8xhalf:593; CHECK-SSE:       # %bb.0:594; CHECK-SSE-NEXT:    psllw $10, %xmm0595; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [28672,28672,28672,28672,28672,28672,28672,28672]596; CHECK-SSE-NEXT:    psubw %xmm0, %xmm1597; CHECK-SSE-NEXT:    movdqa %xmm1, %xmm0598; CHECK-SSE-NEXT:    retq599;600; CHECK-AVX2-LABEL: fdiv_pow2_8xhalf:601; CHECK-AVX2:       # %bb.0:602; CHECK-AVX2-NEXT:    vpsllw $10, %xmm0, %xmm0603; CHECK-AVX2-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [28672,28672,28672,28672,28672,28672,28672,28672]604; CHECK-AVX2-NEXT:    vpsubw %xmm0, %xmm1, %xmm0605; CHECK-AVX2-NEXT:    retq606;607; CHECK-ONLY-AVX512F-LABEL: fdiv_pow2_8xhalf:608; CHECK-ONLY-AVX512F:       # %bb.0:609; CHECK-ONLY-AVX512F-NEXT:    vpsllw $10, %xmm0, %xmm0610; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastw {{.*#+}} xmm1 = [28672,28672,28672,28672,28672,28672,28672,28672]611; CHECK-ONLY-AVX512F-NEXT:    vpsubw %xmm0, %xmm1, %xmm0612; CHECK-ONLY-AVX512F-NEXT:    retq613;614; CHECK-SKX-LABEL: fdiv_pow2_8xhalf:615; CHECK-SKX:       # %bb.0:616; CHECK-SKX-NEXT:    vpsllw $10, %xmm0, %xmm0617; CHECK-SKX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [28672,28672,28672,28672,28672,28672,28672,28672]618; CHECK-SKX-NEXT:    vpsubw %xmm0, %xmm1, %xmm0619; CHECK-SKX-NEXT:    retq620  %p2 = shl <8 x i16> <i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1, i16 1>, %i621  %p2_f = uitofp <8 x i16> %p2 to <8 x half>622  %r = fdiv <8 x half> <half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000, half 0xH7000>, %p2_f623  ret <8 x half> %r624}625 626; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set627; in the original IR.628define double @fmul_pow_shl_cnt(i64 %cnt) nounwind {629; CHECK-SSE-LABEL: fmul_pow_shl_cnt:630; CHECK-SSE:       # %bb.0:631; CHECK-SSE-NEXT:    movzbl %dil, %eax632; CHECK-SSE-NEXT:    shlq $52, %rax633; CHECK-SSE-NEXT:    movabsq $4621256167635550208, %rcx # imm = 0x4022000000000000634; CHECK-SSE-NEXT:    addq %rax, %rcx635; CHECK-SSE-NEXT:    movq %rcx, %xmm0636; CHECK-SSE-NEXT:    retq637;638; CHECK-AVX-LABEL: fmul_pow_shl_cnt:639; CHECK-AVX:       # %bb.0:640; CHECK-AVX-NEXT:    movzbl %dil, %eax641; CHECK-AVX-NEXT:    shlq $52, %rax642; CHECK-AVX-NEXT:    movabsq $4621256167635550208, %rcx # imm = 0x4022000000000000643; CHECK-AVX-NEXT:    addq %rax, %rcx644; CHECK-AVX-NEXT:    vmovq %rcx, %xmm0645; CHECK-AVX-NEXT:    retq646  %shl = shl nuw i64 1, %cnt647  %conv = uitofp i64 %shl to double648  %mul = fmul double 9.000000e+00, %conv649  ret double %mul650}651 652; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set653; in the original IR.654define double @fmul_pow_shl_cnt2(i64 %cnt) nounwind {655; CHECK-SSE-LABEL: fmul_pow_shl_cnt2:656; CHECK-SSE:       # %bb.0:657; CHECK-SSE-NEXT:    movzbl %dil, %eax658; CHECK-SSE-NEXT:    incl %eax659; CHECK-SSE-NEXT:    shlq $52, %rax660; CHECK-SSE-NEXT:    movabsq $-4602115869219225600, %rcx # imm = 0xC022000000000000661; CHECK-SSE-NEXT:    addq %rax, %rcx662; CHECK-SSE-NEXT:    movq %rcx, %xmm0663; CHECK-SSE-NEXT:    retq664;665; CHECK-AVX-LABEL: fmul_pow_shl_cnt2:666; CHECK-AVX:       # %bb.0:667; CHECK-AVX-NEXT:    movzbl %dil, %eax668; CHECK-AVX-NEXT:    incl %eax669; CHECK-AVX-NEXT:    shlq $52, %rax670; CHECK-AVX-NEXT:    movabsq $-4602115869219225600, %rcx # imm = 0xC022000000000000671; CHECK-AVX-NEXT:    addq %rax, %rcx672; CHECK-AVX-NEXT:    vmovq %rcx, %xmm0673; CHECK-AVX-NEXT:    retq674  %shl = shl nuw i64 2, %cnt675  %conv = uitofp i64 %shl to double676  %mul = fmul double -9.000000e+00, %conv677  ret double %mul678}679 680; Make sure we do a movzbl of the input register.681define double @fmul_pow_shl_cnt3(i8 %cnt) nounwind {682; CHECK-SSE-LABEL: fmul_pow_shl_cnt3:683; CHECK-SSE:       # %bb.0:684; CHECK-SSE-NEXT:    movzbl %dil, %eax685; CHECK-SSE-NEXT:    shlq $52, %rax686; CHECK-SSE-NEXT:    movabsq $-4602115869219225600, %rcx # imm = 0xC022000000000000687; CHECK-SSE-NEXT:    addq %rax, %rcx688; CHECK-SSE-NEXT:    movq %rcx, %xmm0689; CHECK-SSE-NEXT:    retq690;691; CHECK-AVX-LABEL: fmul_pow_shl_cnt3:692; CHECK-AVX:       # %bb.0:693; CHECK-AVX-NEXT:    movzbl %dil, %eax694; CHECK-AVX-NEXT:    shlq $52, %rax695; CHECK-AVX-NEXT:    movabsq $-4602115869219225600, %rcx # imm = 0xC022000000000000696; CHECK-AVX-NEXT:    addq %rax, %rcx697; CHECK-AVX-NEXT:    vmovq %rcx, %xmm0698; CHECK-AVX-NEXT:    retq699  %zext_cnt = zext i8 %cnt to i64700  %shl = shl nuw i64 1, %zext_cnt701  %conv = uitofp i64 %shl to double702  %mul = fmul double -9.000000e+00, %conv703  ret double %mul704}705 706; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set707; in the original IR.708define float @fmul_pow_select(i32 %cnt, i1 %c) nounwind {709; CHECK-SSE-LABEL: fmul_pow_select:710; CHECK-SSE:       # %bb.0:711; CHECK-SSE-NEXT:    movzbl %dil, %eax712; CHECK-SSE-NEXT:    leal 1(%rax), %ecx713; CHECK-SSE-NEXT:    testb $1, %sil714; CHECK-SSE-NEXT:    cmovnel %eax, %ecx715; CHECK-SSE-NEXT:    shll $23, %ecx716; CHECK-SSE-NEXT:    addl $1091567616, %ecx # imm = 0x41100000717; CHECK-SSE-NEXT:    movd %ecx, %xmm0718; CHECK-SSE-NEXT:    retq719;720; CHECK-AVX-LABEL: fmul_pow_select:721; CHECK-AVX:       # %bb.0:722; CHECK-AVX-NEXT:    movzbl %dil, %eax723; CHECK-AVX-NEXT:    leal 1(%rax), %ecx724; CHECK-AVX-NEXT:    testb $1, %sil725; CHECK-AVX-NEXT:    cmovnel %eax, %ecx726; CHECK-AVX-NEXT:    shll $23, %ecx727; CHECK-AVX-NEXT:    addl $1091567616, %ecx # imm = 0x41100000728; CHECK-AVX-NEXT:    vmovd %ecx, %xmm0729; CHECK-AVX-NEXT:    retq730  %shl2 = shl nuw i32 2, %cnt731  %shl1 = shl nuw i32 1, %cnt732  %shl = select i1 %c, i32 %shl1, i32 %shl2733  %conv = uitofp i32 %shl to float734  %mul = fmul float 9.000000e+00, %conv735  ret float %mul736}737 738; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set739; in the original IR.740define float @fmul_fly_pow_mul_min_pow2(i64 %cnt) nounwind {741; CHECK-SSE-LABEL: fmul_fly_pow_mul_min_pow2:742; CHECK-SSE:       # %bb.0:743; CHECK-SSE-NEXT:    movzbl %dil, %eax744; CHECK-SSE-NEXT:    addl $3, %eax745; CHECK-SSE-NEXT:    cmpl $13, %eax746; CHECK-SSE-NEXT:    movl $13, %ecx747; CHECK-SSE-NEXT:    cmovbl %eax, %ecx748; CHECK-SSE-NEXT:    shll $23, %ecx749; CHECK-SSE-NEXT:    addl $1091567616, %ecx # imm = 0x41100000750; CHECK-SSE-NEXT:    movd %ecx, %xmm0751; CHECK-SSE-NEXT:    retq752;753; CHECK-AVX-LABEL: fmul_fly_pow_mul_min_pow2:754; CHECK-AVX:       # %bb.0:755; CHECK-AVX-NEXT:    movzbl %dil, %eax756; CHECK-AVX-NEXT:    addl $3, %eax757; CHECK-AVX-NEXT:    cmpl $13, %eax758; CHECK-AVX-NEXT:    movl $13, %ecx759; CHECK-AVX-NEXT:    cmovbl %eax, %ecx760; CHECK-AVX-NEXT:    shll $23, %ecx761; CHECK-AVX-NEXT:    addl $1091567616, %ecx # imm = 0x41100000762; CHECK-AVX-NEXT:    vmovd %ecx, %xmm0763; CHECK-AVX-NEXT:    retq764  %shl8 = shl nuw i64 8, %cnt765  %shl = call i64 @llvm.umin.i64(i64 %shl8, i64 8192)766  %conv = uitofp i64 %shl to float767  %mul = fmul float 9.000000e+00, %conv768  ret float %mul769}770 771; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set772; in the original IR.773define double @fmul_pow_mul_max_pow2(i16 %cnt) nounwind {774; CHECK-SSE-LABEL: fmul_pow_mul_max_pow2:775; CHECK-SSE:       # %bb.0:776; CHECK-SSE-NEXT:    movzbl %dil, %eax777; CHECK-SSE-NEXT:    leaq 1(%rax), %rcx778; CHECK-SSE-NEXT:    cmpq %rcx, %rax779; CHECK-SSE-NEXT:    cmovaq %rax, %rcx780; CHECK-SSE-NEXT:    shlq $52, %rcx781; CHECK-SSE-NEXT:    movabsq $4613937818241073152, %rax # imm = 0x4008000000000000782; CHECK-SSE-NEXT:    orq %rcx, %rax783; CHECK-SSE-NEXT:    movq %rax, %xmm0784; CHECK-SSE-NEXT:    retq785;786; CHECK-AVX-LABEL: fmul_pow_mul_max_pow2:787; CHECK-AVX:       # %bb.0:788; CHECK-AVX-NEXT:    movzbl %dil, %eax789; CHECK-AVX-NEXT:    leaq 1(%rax), %rcx790; CHECK-AVX-NEXT:    cmpq %rcx, %rax791; CHECK-AVX-NEXT:    cmovaq %rax, %rcx792; CHECK-AVX-NEXT:    shlq $52, %rcx793; CHECK-AVX-NEXT:    movabsq $4613937818241073152, %rax # imm = 0x4008000000000000794; CHECK-AVX-NEXT:    orq %rcx, %rax795; CHECK-AVX-NEXT:    vmovq %rax, %xmm0796; CHECK-AVX-NEXT:    retq797  %shl2 = shl nuw i16 2, %cnt798  %shl1 = shl nuw i16 1, %cnt799  %shl = call i16 @llvm.umax.i16(i16 %shl1, i16 %shl2)800  %conv = uitofp i16 %shl to double801  %mul = fmul double 3.000000e+00, %conv802  ret double %mul803}804 805define double @fmul_pow_shl_cnt_fail_maybe_non_pow2(i64 %v, i64 %cnt) nounwind {806; CHECK-SSE-LABEL: fmul_pow_shl_cnt_fail_maybe_non_pow2:807; CHECK-SSE:       # %bb.0:808; CHECK-SSE-NEXT:    movq %rsi, %rcx809; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $rcx810; CHECK-SSE-NEXT:    shlq %cl, %rdi811; CHECK-SSE-NEXT:    movq %rdi, %xmm1812; CHECK-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]813; CHECK-SSE-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm1814; CHECK-SSE-NEXT:    movapd %xmm1, %xmm0815; CHECK-SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]816; CHECK-SSE-NEXT:    addsd %xmm1, %xmm0817; CHECK-SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0818; CHECK-SSE-NEXT:    retq819;820; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_fail_maybe_non_pow2:821; CHECK-AVX2:       # %bb.0:822; CHECK-AVX2-NEXT:    movq %rsi, %rcx823; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx824; CHECK-AVX2-NEXT:    shlq %cl, %rdi825; CHECK-AVX2-NEXT:    vmovq %rdi, %xmm0826; CHECK-AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]827; CHECK-AVX2-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0828; CHECK-AVX2-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]829; CHECK-AVX2-NEXT:    vaddsd %xmm0, %xmm1, %xmm0830; CHECK-AVX2-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0831; CHECK-AVX2-NEXT:    retq832;833; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_fail_maybe_non_pow2:834; CHECK-ONLY-AVX512F:       # %bb.0:835; CHECK-ONLY-AVX512F-NEXT:    movq %rsi, %rcx836; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $rcx837; CHECK-ONLY-AVX512F-NEXT:    shlq %cl, %rdi838; CHECK-ONLY-AVX512F-NEXT:    vcvtusi2sd %rdi, %xmm15, %xmm0839; CHECK-ONLY-AVX512F-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0840; CHECK-ONLY-AVX512F-NEXT:    retq841;842; CHECK-SKX-LABEL: fmul_pow_shl_cnt_fail_maybe_non_pow2:843; CHECK-SKX:       # %bb.0:844; CHECK-SKX-NEXT:    shlxq %rsi, %rdi, %rax845; CHECK-SKX-NEXT:    vcvtusi2sd %rax, %xmm15, %xmm0846; CHECK-SKX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0847; CHECK-SKX-NEXT:    retq848  %shl = shl nuw i64 %v, %cnt849  %conv = uitofp i64 %shl to double850  %mul = fmul double 9.000000e+00, %conv851  ret double %mul852}853 854define <2 x float> @fmul_pow_shl_cnt_vec_fail_expensive_cast(<2 x i64> %cnt) nounwind {855; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_fail_expensive_cast:856; CHECK-SSE:       # %bb.0:857; CHECK-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[2,3,2,3]858; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm2 = [2,2]859; CHECK-SSE-NEXT:    movdqa %xmm2, %xmm3860; CHECK-SSE-NEXT:    psllq %xmm1, %xmm3861; CHECK-SSE-NEXT:    psllq %xmm0, %xmm2862; CHECK-SSE-NEXT:    movq %xmm2, %rax863; CHECK-SSE-NEXT:    xorps %xmm0, %xmm0864; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm0865; CHECK-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm3[2,3,2,3]866; CHECK-SSE-NEXT:    movq %xmm1, %rax867; CHECK-SSE-NEXT:    xorps %xmm1, %xmm1868; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm1869; CHECK-SSE-NEXT:    unpcklps {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]870; CHECK-SSE-NEXT:    mulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0871; CHECK-SSE-NEXT:    retq872;873; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_vec_fail_expensive_cast:874; CHECK-AVX2:       # %bb.0:875; CHECK-AVX2-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [2,2]876; CHECK-AVX2-NEXT:    vpsllvq %xmm0, %xmm1, %xmm0877; CHECK-AVX2-NEXT:    vpextrq $1, %xmm0, %rax878; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm1879; CHECK-AVX2-NEXT:    vmovq %xmm0, %rax880; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm0881; CHECK-AVX2-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero882; CHECK-AVX2-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.5E+1,1.5E+1,1.5E+1,1.5E+1]883; CHECK-AVX2-NEXT:    vmulps %xmm1, %xmm0, %xmm0884; CHECK-AVX2-NEXT:    retq885;886; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_vec_fail_expensive_cast:887; CHECK-ONLY-AVX512F:       # %bb.0:888; CHECK-ONLY-AVX512F-NEXT:    vpmovsxbq {{.*#+}} xmm1 = [2,2]889; CHECK-ONLY-AVX512F-NEXT:    vpsllvq %xmm0, %xmm1, %xmm0890; CHECK-ONLY-AVX512F-NEXT:    vpextrq $1, %xmm0, %rax891; CHECK-ONLY-AVX512F-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm1892; CHECK-ONLY-AVX512F-NEXT:    vmovq %xmm0, %rax893; CHECK-ONLY-AVX512F-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm0894; CHECK-ONLY-AVX512F-NEXT:    vinsertps {{.*#+}} xmm0 = xmm0[0],xmm1[0],zero,zero895; CHECK-ONLY-AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm1 = [1.5E+1,1.5E+1,1.5E+1,1.5E+1]896; CHECK-ONLY-AVX512F-NEXT:    vmulps %xmm1, %xmm0, %xmm0897; CHECK-ONLY-AVX512F-NEXT:    retq898;899; CHECK-SKX-LABEL: fmul_pow_shl_cnt_vec_fail_expensive_cast:900; CHECK-SKX:       # %bb.0:901; CHECK-SKX-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [2,2]902; CHECK-SKX-NEXT:    vpsllvq %xmm0, %xmm1, %xmm0903; CHECK-SKX-NEXT:    vcvtqq2ps %xmm0, %xmm0904; CHECK-SKX-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm0905; CHECK-SKX-NEXT:    retq906  %shl = shl nsw nuw <2 x i64> <i64 2, i64 2>, %cnt907  %conv = uitofp <2 x i64> %shl to <2 x float>908  %mul = fmul <2 x float> <float 15.000000e+00, float 15.000000e+00>, %conv909  ret <2 x float> %mul910}911 912define <2 x double> @fmul_pow_shl_cnt_vec(<2 x i64> %cnt) nounwind {913; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec:914; CHECK-SSE:       # %bb.0:915; CHECK-SSE-NEXT:    psllq $52, %xmm0916; CHECK-SSE-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0917; CHECK-SSE-NEXT:    retq918;919; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_vec:920; CHECK-AVX2:       # %bb.0:921; CHECK-AVX2-NEXT:    vpsllq $52, %xmm0, %xmm0922; CHECK-AVX2-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0923; CHECK-AVX2-NEXT:    retq924;925; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_vec:926; CHECK-ONLY-AVX512F:       # %bb.0:927; CHECK-ONLY-AVX512F-NEXT:    vpsllq $52, %xmm0, %xmm0928; CHECK-ONLY-AVX512F-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0929; CHECK-ONLY-AVX512F-NEXT:    retq930;931; CHECK-SKX-LABEL: fmul_pow_shl_cnt_vec:932; CHECK-SKX:       # %bb.0:933; CHECK-SKX-NEXT:    vpsllq $52, %xmm0, %xmm0934; CHECK-SKX-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to2}, %xmm0, %xmm0935; CHECK-SKX-NEXT:    retq936  %shl = shl nsw nuw <2 x i64> <i64 2, i64 2>, %cnt937  %conv = uitofp <2 x i64> %shl to <2 x double>938  %mul = fmul <2 x double> <double 15.000000e+00, double 15.000000e+00>, %conv939  ret <2 x double> %mul940}941 942define <4 x float> @fmul_pow_shl_cnt_vec_preserve_fma(<4 x i32> %cnt, <4 x float> %add) nounwind {943; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_preserve_fma:944; CHECK-SSE:       # %bb.0:945; CHECK-SSE-NEXT:    pslld $23, %xmm0946; CHECK-SSE-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0947; CHECK-SSE-NEXT:    addps %xmm1, %xmm0948; CHECK-SSE-NEXT:    retq949;950; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_vec_preserve_fma:951; CHECK-AVX2:       # %bb.0:952; CHECK-AVX2-NEXT:    vpslld $23, %xmm0, %xmm0953; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1092616192,1092616192,1092616192,1092616192]954; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm0, %xmm0955; CHECK-AVX2-NEXT:    vaddps %xmm1, %xmm0, %xmm0956; CHECK-AVX2-NEXT:    retq957;958; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_vec_preserve_fma:959; CHECK-ONLY-AVX512F:       # %bb.0:960; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [2,2,2,2]961; CHECK-ONLY-AVX512F-NEXT:    vpsllvd %xmm0, %xmm2, %xmm0962; CHECK-ONLY-AVX512F-NEXT:    vcvtdq2ps %xmm0, %xmm2963; CHECK-ONLY-AVX512F-NEXT:    vbroadcastss {{.*#+}} xmm0 = [5.0E+0,5.0E+0,5.0E+0,5.0E+0]964; CHECK-ONLY-AVX512F-NEXT:    vfmadd213ps {{.*#+}} xmm0 = (xmm2 * xmm0) + xmm1965; CHECK-ONLY-AVX512F-NEXT:    retq966;967; CHECK-SKX-LABEL: fmul_pow_shl_cnt_vec_preserve_fma:968; CHECK-SKX:       # %bb.0:969; CHECK-SKX-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [2,2,2,2]970; CHECK-SKX-NEXT:    vpsllvd %xmm0, %xmm2, %xmm0971; CHECK-SKX-NEXT:    vcvtdq2ps %xmm0, %xmm0972; CHECK-SKX-NEXT:    vfmadd132ps {{.*#+}} xmm0 = (xmm0 * mem) + xmm1973; CHECK-SKX-NEXT:    retq974  %shl = shl nsw nuw <4 x i32> <i32 2, i32 2, i32 2, i32 2>, %cnt975  %conv = uitofp <4 x i32> %shl to <4 x float>976  %mul = fmul contract <4 x float> <float 5.000000e+00, float 5.000000e+00, float 5.000000e+00, float 5.000000e+00>, %conv977  %res = fadd contract <4 x float> %mul, %add978  ret <4 x float> %res979}980 981define <4 x float> @fmul_pow_shl_cnt_vec_no_fma(<4 x i32> %cnt, <4 x float> %add) nounwind {982; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_no_fma:983; CHECK-SSE:       # %bb.0:984; CHECK-SSE-NEXT:    pslld $23, %xmm0985; CHECK-SSE-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0986; CHECK-SSE-NEXT:    addps %xmm1, %xmm0987; CHECK-SSE-NEXT:    retq988;989; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_vec_no_fma:990; CHECK-AVX2:       # %bb.0:991; CHECK-AVX2-NEXT:    vpslld $23, %xmm0, %xmm0992; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1092616192,1092616192,1092616192,1092616192]993; CHECK-AVX2-NEXT:    vpaddd %xmm2, %xmm0, %xmm0994; CHECK-AVX2-NEXT:    vaddps %xmm1, %xmm0, %xmm0995; CHECK-AVX2-NEXT:    retq996;997; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_vec_no_fma:998; CHECK-ONLY-AVX512F:       # %bb.0:999; CHECK-ONLY-AVX512F-NEXT:    vpslld $23, %xmm0, %xmm01000; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm2 = [1092616192,1092616192,1092616192,1092616192]1001; CHECK-ONLY-AVX512F-NEXT:    vpaddd %xmm2, %xmm0, %xmm01002; CHECK-ONLY-AVX512F-NEXT:    vaddps %xmm1, %xmm0, %xmm01003; CHECK-ONLY-AVX512F-NEXT:    retq1004;1005; CHECK-SKX-LABEL: fmul_pow_shl_cnt_vec_no_fma:1006; CHECK-SKX:       # %bb.0:1007; CHECK-SKX-NEXT:    vpslld $23, %xmm0, %xmm01008; CHECK-SKX-NEXT:    vpaddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to4}, %xmm0, %xmm01009; CHECK-SKX-NEXT:    vaddps %xmm1, %xmm0, %xmm01010; CHECK-SKX-NEXT:    retq1011  %shl = shl nsw nuw <4 x i32> <i32 2, i32 2, i32 2, i32 2>, %cnt1012  %conv = uitofp <4 x i32> %shl to <4 x float>1013  %mul = fmul <4 x float> <float 5.000000e+00, float 5.000000e+00, float 5.000000e+00, float 5.000000e+00>, %conv1014  %res = fadd <4 x float> %mul, %add1015  ret <4 x float> %res1016}1017 1018define <2 x double> @fmul_pow_shl_cnt_vec_non_splat_todo(<2 x i64> %cnt) nounwind {1019; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_non_splat_todo:1020; CHECK-SSE:       # %bb.0:1021; CHECK-SSE-NEXT:    psllq $52, %xmm01022; CHECK-SSE-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01023; CHECK-SSE-NEXT:    retq1024;1025; CHECK-AVX-LABEL: fmul_pow_shl_cnt_vec_non_splat_todo:1026; CHECK-AVX:       # %bb.0:1027; CHECK-AVX-NEXT:    vpsllq $52, %xmm0, %xmm01028; CHECK-AVX-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01029; CHECK-AVX-NEXT:    retq1030  %shl = shl nsw nuw <2 x i64> <i64 2, i64 2>, %cnt1031  %conv = uitofp <2 x i64> %shl to <2 x double>1032  %mul = fmul <2 x double> <double 15.000000e+00, double 14.000000e+00>, %conv1033  ret <2 x double> %mul1034}1035 1036define <2 x double> @fmul_pow_shl_cnt_vec_non_splat2_todo(<2 x i64> %cnt) nounwind {1037; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_non_splat2_todo:1038; CHECK-SSE:       # %bb.0:1039; CHECK-SSE-NEXT:    psllq $52, %xmm01040; CHECK-SSE-NEXT:    paddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01041; CHECK-SSE-NEXT:    retq1042;1043; CHECK-AVX-LABEL: fmul_pow_shl_cnt_vec_non_splat2_todo:1044; CHECK-AVX:       # %bb.0:1045; CHECK-AVX-NEXT:    vpsllq $52, %xmm0, %xmm01046; CHECK-AVX-NEXT:    vpaddq {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01047; CHECK-AVX-NEXT:    retq1048  %shl = shl nsw nuw <2 x i64> <i64 2, i64 1>, %cnt1049  %conv = uitofp <2 x i64> %shl to <2 x double>1050  %mul = fmul <2 x double> <double 15.000000e+00, double 15.000000e+00>, %conv1051  ret <2 x double> %mul1052}1053 1054define <2 x half> @fmul_pow_shl_cnt_vec_fail_to_large(<2 x i16> %cnt) nounwind {1055; CHECK-SSE-LABEL: fmul_pow_shl_cnt_vec_fail_to_large:1056; CHECK-SSE:       # %bb.0:1057; CHECK-SSE-NEXT:    subq $40, %rsp1058; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm0 = xmm0[0,0,1,1,2,2,3,3]1059; CHECK-SSE-NEXT:    pslld $23, %xmm01060; CHECK-SSE-NEXT:    paddd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01061; CHECK-SSE-NEXT:    cvttps2dq %xmm0, %xmm01062; CHECK-SSE-NEXT:    pshuflw {{.*#+}} xmm0 = xmm0[0,2,2,3,4,5,6,7]1063; CHECK-SSE-NEXT:    pmullw {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 # [2,2,u,u,u,u,u,u]1064; CHECK-SSE-NEXT:    movdqa %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1065; CHECK-SSE-NEXT:    psrld $16, %xmm01066; CHECK-SSE-NEXT:    cvtdq2ps %xmm0, %xmm01067; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1068; CHECK-SSE-NEXT:    movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1069; CHECK-SSE-NEXT:    xorps %xmm0, %xmm01070; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1071; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1072; CHECK-SSE-NEXT:    cvtdq2ps %xmm1, %xmm01073; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1074; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT1075; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01076; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1077; CHECK-SSE-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1078; CHECK-SSE-NEXT:    movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload1079; CHECK-SSE-NEXT:    # xmm0 = mem[0],zero,zero,zero1080; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT1081; CHECK-SSE-NEXT:    mulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01082; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1083; CHECK-SSE-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1084; CHECK-SSE-NEXT:    punpcklwd {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1085; CHECK-SSE-NEXT:    movdqa %xmm1, %xmm01086; CHECK-SSE-NEXT:    addq $40, %rsp1087; CHECK-SSE-NEXT:    retq1088;1089; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_vec_fail_to_large:1090; CHECK-AVX2:       # %bb.0:1091; CHECK-AVX2-NEXT:    subq $56, %rsp1092; CHECK-AVX2-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]1093; CHECK-AVX2-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1094; CHECK-AVX2-NEXT:    vpsllvd %ymm0, %ymm1, %ymm01095; CHECK-AVX2-NEXT:    vmovdqu %ymm0, {{[-0-9]+}}(%r{{[sb]}}p) # 32-byte Spill1096; CHECK-AVX2-NEXT:    vpextrw $2, %xmm0, %eax1097; CHECK-AVX2-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm01098; CHECK-AVX2-NEXT:    vzeroupper1099; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1100; CHECK-AVX2-NEXT:    vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill1101; CHECK-AVX2-NEXT:    vmovdqu {{[-0-9]+}}(%r{{[sb]}}p), %ymm0 # 32-byte Reload1102; CHECK-AVX2-NEXT:    vpextrw $0, %xmm0, %eax1103; CHECK-AVX2-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm01104; CHECK-AVX2-NEXT:    vzeroupper1105; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1106; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT1107; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01108; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1109; CHECK-AVX2-NEXT:    vmovaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill1110; CHECK-AVX2-NEXT:    vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload1111; CHECK-AVX2-NEXT:    # xmm0 = mem[0],zero,zero,zero1112; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT1113; CHECK-AVX2-NEXT:    vmulss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01114; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1115; CHECK-AVX2-NEXT:    vmovdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload1116; CHECK-AVX2-NEXT:    vpunpcklwd {{.*#+}} xmm0 = xmm1[0],xmm0[0],xmm1[1],xmm0[1],xmm1[2],xmm0[2],xmm1[3],xmm0[3]1117; CHECK-AVX2-NEXT:    addq $56, %rsp1118; CHECK-AVX2-NEXT:    retq1119;1120; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_vec_fail_to_large:1121; CHECK-ONLY-AVX512F:       # %bb.0:1122; CHECK-ONLY-AVX512F-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2]1123; CHECK-ONLY-AVX512F-NEXT:    vpmovzxwd {{.*#+}} ymm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero,xmm0[4],zero,xmm0[5],zero,xmm0[6],zero,xmm0[7],zero1124; CHECK-ONLY-AVX512F-NEXT:    vpsllvd %ymm0, %ymm1, %ymm01125; CHECK-ONLY-AVX512F-NEXT:    vpmovdw %zmm0, %ymm01126; CHECK-ONLY-AVX512F-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1127; CHECK-ONLY-AVX512F-NEXT:    vcvtdq2ps %ymm0, %ymm01128; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm01129; CHECK-ONLY-AVX512F-NEXT:    vcvtph2ps %xmm0, %ymm01130; CHECK-ONLY-AVX512F-NEXT:    vbroadcastss {{.*#+}} ymm1 = [1.5E+1,1.5E+1,1.5E+1,1.5E+1,1.5E+1,1.5E+1,1.5E+1,1.5E+1]1131; CHECK-ONLY-AVX512F-NEXT:    vmulps %ymm1, %ymm0, %ymm01132; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %ymm0, %xmm01133; CHECK-ONLY-AVX512F-NEXT:    vzeroupper1134; CHECK-ONLY-AVX512F-NEXT:    retq1135;1136; CHECK-SKX-LABEL: fmul_pow_shl_cnt_vec_fail_to_large:1137; CHECK-SKX:       # %bb.0:1138; CHECK-SKX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [2,2,2,2,2,2,2,2]1139; CHECK-SKX-NEXT:    vpsllvw %xmm0, %xmm1, %xmm01140; CHECK-SKX-NEXT:    vpmovzxwd {{.*#+}} xmm0 = xmm0[0],zero,xmm0[1],zero,xmm0[2],zero,xmm0[3],zero1141; CHECK-SKX-NEXT:    vcvtdq2ps %ymm0, %ymm01142; CHECK-SKX-NEXT:    vcvtps2ph $4, %ymm0, %xmm01143; CHECK-SKX-NEXT:    vcvtph2ps %xmm0, %ymm01144; CHECK-SKX-NEXT:    vmulps {{\.?LCPI[0-9]+_[0-9]+}}(%rip){1to8}, %ymm0, %ymm01145; CHECK-SKX-NEXT:    vcvtps2ph $4, %ymm0, %xmm01146; CHECK-SKX-NEXT:    vzeroupper1147; CHECK-SKX-NEXT:    retq1148  %shl = shl nsw nuw <2 x i16> <i16 2, i16 2>, %cnt1149  %conv = uitofp <2 x i16> %shl to <2 x half>1150  %mul = fmul <2 x half> <half 15.000000e+00, half 15.000000e+00>, %conv1151  ret <2 x half> %mul1152}1153 1154define double @fmul_pow_shl_cnt_fail_maybe_bad_exp(i64 %cnt) nounwind {1155; CHECK-SSE-LABEL: fmul_pow_shl_cnt_fail_maybe_bad_exp:1156; CHECK-SSE:       # %bb.0:1157; CHECK-SSE-NEXT:    movq %rdi, %rcx1158; CHECK-SSE-NEXT:    movl $1, %eax1159; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $rcx1160; CHECK-SSE-NEXT:    shlq %cl, %rax1161; CHECK-SSE-NEXT:    movq %rax, %xmm11162; CHECK-SSE-NEXT:    punpckldq {{.*#+}} xmm1 = xmm1[0],mem[0],xmm1[1],mem[1]1163; CHECK-SSE-NEXT:    subpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm11164; CHECK-SSE-NEXT:    movapd %xmm1, %xmm01165; CHECK-SSE-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm1[1]1166; CHECK-SSE-NEXT:    addsd %xmm1, %xmm01167; CHECK-SSE-NEXT:    mulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm01168; CHECK-SSE-NEXT:    retq1169;1170; CHECK-AVX2-LABEL: fmul_pow_shl_cnt_fail_maybe_bad_exp:1171; CHECK-AVX2:       # %bb.0:1172; CHECK-AVX2-NEXT:    movq %rdi, %rcx1173; CHECK-AVX2-NEXT:    movl $1, %eax1174; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx1175; CHECK-AVX2-NEXT:    shlq %cl, %rax1176; CHECK-AVX2-NEXT:    vmovq %rax, %xmm01177; CHECK-AVX2-NEXT:    vpunpckldq {{.*#+}} xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]1178; CHECK-AVX2-NEXT:    vsubpd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01179; CHECK-AVX2-NEXT:    vshufpd {{.*#+}} xmm1 = xmm0[1,0]1180; CHECK-AVX2-NEXT:    vaddsd %xmm0, %xmm1, %xmm01181; CHECK-AVX2-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01182; CHECK-AVX2-NEXT:    retq1183;1184; CHECK-ONLY-AVX512F-LABEL: fmul_pow_shl_cnt_fail_maybe_bad_exp:1185; CHECK-ONLY-AVX512F:       # %bb.0:1186; CHECK-ONLY-AVX512F-NEXT:    movq %rdi, %rcx1187; CHECK-ONLY-AVX512F-NEXT:    movl $1, %eax1188; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $rcx1189; CHECK-ONLY-AVX512F-NEXT:    shlq %cl, %rax1190; CHECK-ONLY-AVX512F-NEXT:    vcvtusi2sd %rax, %xmm15, %xmm01191; CHECK-ONLY-AVX512F-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01192; CHECK-ONLY-AVX512F-NEXT:    retq1193;1194; CHECK-SKX-LABEL: fmul_pow_shl_cnt_fail_maybe_bad_exp:1195; CHECK-SKX:       # %bb.0:1196; CHECK-SKX-NEXT:    movl $1, %eax1197; CHECK-SKX-NEXT:    shlxq %rdi, %rax, %rax1198; CHECK-SKX-NEXT:    vcvtusi2sd %rax, %xmm15, %xmm01199; CHECK-SKX-NEXT:    vmulsd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm01200; CHECK-SKX-NEXT:    retq1201  %shl = shl nuw i64 1, %cnt1202  %conv = uitofp i64 %shl to double1203  %mul = fmul double 9.745314e+288, %conv1204  ret double %mul1205}1206 1207; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set1208; in the original IR.1209define double @fmul_pow_shl_cnt_safe(i16 %cnt) nounwind {1210; CHECK-SSE-LABEL: fmul_pow_shl_cnt_safe:1211; CHECK-SSE:       # %bb.0:1212; CHECK-SSE-NEXT:    movzbl %dil, %eax1213; CHECK-SSE-NEXT:    shlq $52, %rax1214; CHECK-SSE-NEXT:    movabsq $8930638061065157010, %rcx # imm = 0x7BEFFFFFFF5F39921215; CHECK-SSE-NEXT:    addq %rax, %rcx1216; CHECK-SSE-NEXT:    movq %rcx, %xmm01217; CHECK-SSE-NEXT:    retq1218;1219; CHECK-AVX-LABEL: fmul_pow_shl_cnt_safe:1220; CHECK-AVX:       # %bb.0:1221; CHECK-AVX-NEXT:    movzbl %dil, %eax1222; CHECK-AVX-NEXT:    shlq $52, %rax1223; CHECK-AVX-NEXT:    movabsq $8930638061065157010, %rcx # imm = 0x7BEFFFFFFF5F39921224; CHECK-AVX-NEXT:    addq %rax, %rcx1225; CHECK-AVX-NEXT:    vmovq %rcx, %xmm01226; CHECK-AVX-NEXT:    retq1227  %shl = shl nuw i16 1, %cnt1228  %conv = uitofp i16 %shl to double1229  %mul = fmul double 9.745314e+288, %conv1230  ret double %mul1231}1232 1233define <2 x double> @fdiv_pow_shl_cnt_vec(<2 x i64> %cnt) nounwind {1234; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_vec:1235; CHECK-SSE:       # %bb.0:1236; CHECK-SSE-NEXT:    psllq $52, %xmm01237; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm1 = [4607182418800017408,4607182418800017408]1238; CHECK-SSE-NEXT:    psubq %xmm0, %xmm11239; CHECK-SSE-NEXT:    movdqa %xmm1, %xmm01240; CHECK-SSE-NEXT:    retq1241;1242; CHECK-AVX-LABEL: fdiv_pow_shl_cnt_vec:1243; CHECK-AVX:       # %bb.0:1244; CHECK-AVX-NEXT:    vpsllq $52, %xmm0, %xmm01245; CHECK-AVX-NEXT:    vpbroadcastq {{.*#+}} xmm1 = [4607182418800017408,4607182418800017408]1246; CHECK-AVX-NEXT:    vpsubq %xmm0, %xmm1, %xmm01247; CHECK-AVX-NEXT:    retq1248  %shl = shl nuw <2 x i64> <i64 1, i64 1>, %cnt1249  %conv = uitofp <2 x i64> %shl to <2 x double>1250  %mul = fdiv <2 x double> <double 1.000000e+00, double 1.000000e+00>, %conv1251  ret <2 x double> %mul1252}1253 1254define <2 x float> @fdiv_pow_shl_cnt_vec_with_expensive_cast(<2 x i64> %cnt) nounwind {1255; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_vec_with_expensive_cast:1256; CHECK-SSE:       # %bb.0:1257; CHECK-SSE-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[0,2,2,3]1258; CHECK-SSE-NEXT:    pslld $23, %xmm11259; CHECK-SSE-NEXT:    movdqa {{.*#+}} xmm0 = [1065353216,1065353216,u,u]1260; CHECK-SSE-NEXT:    psubd %xmm1, %xmm01261; CHECK-SSE-NEXT:    retq1262;1263; CHECK-AVX-LABEL: fdiv_pow_shl_cnt_vec_with_expensive_cast:1264; CHECK-AVX:       # %bb.0:1265; CHECK-AVX-NEXT:    vpshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]1266; CHECK-AVX-NEXT:    vpslld $23, %xmm0, %xmm01267; CHECK-AVX-NEXT:    vpbroadcastd {{.*#+}} xmm1 = [1065353216,1065353216,1065353216,1065353216]1268; CHECK-AVX-NEXT:    vpsubd %xmm0, %xmm1, %xmm01269; CHECK-AVX-NEXT:    retq1270  %shl = shl nuw <2 x i64> <i64 1, i64 1>, %cnt1271  %conv = uitofp <2 x i64> %shl to <2 x float>1272  %mul = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, %conv1273  ret <2 x float> %mul1274}1275 1276define float @fdiv_pow_shl_cnt_fail_maybe_z(i64 %cnt) nounwind {1277; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_fail_maybe_z:1278; CHECK-SSE:       # %bb.0:1279; CHECK-SSE-NEXT:    movq %rdi, %rcx1280; CHECK-SSE-NEXT:    movl $8, %eax1281; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $rcx1282; CHECK-SSE-NEXT:    shlq %cl, %rax1283; CHECK-SSE-NEXT:    testq %rax, %rax1284; CHECK-SSE-NEXT:    js .LBB24_11285; CHECK-SSE-NEXT:  # %bb.2:1286; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm11287; CHECK-SSE-NEXT:    jmp .LBB24_31288; CHECK-SSE-NEXT:  .LBB24_1:1289; CHECK-SSE-NEXT:    shrq %rax1290; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm11291; CHECK-SSE-NEXT:    addss %xmm1, %xmm11292; CHECK-SSE-NEXT:  .LBB24_3:1293; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1294; CHECK-SSE-NEXT:    divss %xmm1, %xmm01295; CHECK-SSE-NEXT:    retq1296;1297; CHECK-AVX2-LABEL: fdiv_pow_shl_cnt_fail_maybe_z:1298; CHECK-AVX2:       # %bb.0:1299; CHECK-AVX2-NEXT:    movq %rdi, %rcx1300; CHECK-AVX2-NEXT:    movl $8, %eax1301; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx1302; CHECK-AVX2-NEXT:    shlq %cl, %rax1303; CHECK-AVX2-NEXT:    testq %rax, %rax1304; CHECK-AVX2-NEXT:    js .LBB24_11305; CHECK-AVX2-NEXT:  # %bb.2:1306; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01307; CHECK-AVX2-NEXT:    jmp .LBB24_31308; CHECK-AVX2-NEXT:  .LBB24_1:1309; CHECK-AVX2-NEXT:    shrq %rax1310; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01311; CHECK-AVX2-NEXT:    vaddss %xmm0, %xmm0, %xmm01312; CHECK-AVX2-NEXT:  .LBB24_3:1313; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1314; CHECK-AVX2-NEXT:    vdivss %xmm0, %xmm1, %xmm01315; CHECK-AVX2-NEXT:    retq1316;1317; CHECK-ONLY-AVX512F-LABEL: fdiv_pow_shl_cnt_fail_maybe_z:1318; CHECK-ONLY-AVX512F:       # %bb.0:1319; CHECK-ONLY-AVX512F-NEXT:    movq %rdi, %rcx1320; CHECK-ONLY-AVX512F-NEXT:    movl $8, %eax1321; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $rcx1322; CHECK-ONLY-AVX512F-NEXT:    shlq %cl, %rax1323; CHECK-ONLY-AVX512F-NEXT:    vcvtusi2ss %rax, %xmm15, %xmm01324; CHECK-ONLY-AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1325; CHECK-ONLY-AVX512F-NEXT:    vdivss %xmm0, %xmm1, %xmm01326; CHECK-ONLY-AVX512F-NEXT:    retq1327;1328; CHECK-SKX-LABEL: fdiv_pow_shl_cnt_fail_maybe_z:1329; CHECK-SKX:       # %bb.0:1330; CHECK-SKX-NEXT:    movl $8, %eax1331; CHECK-SKX-NEXT:    shlxq %rdi, %rax, %rax1332; CHECK-SKX-NEXT:    vcvtusi2ss %rax, %xmm15, %xmm01333; CHECK-SKX-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1334; CHECK-SKX-NEXT:    vdivss %xmm0, %xmm1, %xmm01335; CHECK-SKX-NEXT:    retq1336  %shl = shl i64 8, %cnt1337  %conv = uitofp i64 %shl to float1338  %mul = fdiv float -9.000000e+00, %conv1339  ret float %mul1340}1341 1342define float @fdiv_pow_shl_cnt_fail_neg_int(i64 %cnt) nounwind {1343; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_fail_neg_int:1344; CHECK-SSE:       # %bb.0:1345; CHECK-SSE-NEXT:    movq %rdi, %rcx1346; CHECK-SSE-NEXT:    movl $8, %eax1347; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $rcx1348; CHECK-SSE-NEXT:    shlq %cl, %rax1349; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm11350; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1351; CHECK-SSE-NEXT:    divss %xmm1, %xmm01352; CHECK-SSE-NEXT:    retq1353;1354; CHECK-AVX2-LABEL: fdiv_pow_shl_cnt_fail_neg_int:1355; CHECK-AVX2:       # %bb.0:1356; CHECK-AVX2-NEXT:    movq %rdi, %rcx1357; CHECK-AVX2-NEXT:    movl $8, %eax1358; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $rcx1359; CHECK-AVX2-NEXT:    shlq %cl, %rax1360; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01361; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1362; CHECK-AVX2-NEXT:    vdivss %xmm0, %xmm1, %xmm01363; CHECK-AVX2-NEXT:    retq1364;1365; CHECK-ONLY-AVX512F-LABEL: fdiv_pow_shl_cnt_fail_neg_int:1366; CHECK-ONLY-AVX512F:       # %bb.0:1367; CHECK-ONLY-AVX512F-NEXT:    movq %rdi, %rcx1368; CHECK-ONLY-AVX512F-NEXT:    movl $8, %eax1369; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $rcx1370; CHECK-ONLY-AVX512F-NEXT:    shlq %cl, %rax1371; CHECK-ONLY-AVX512F-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01372; CHECK-ONLY-AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1373; CHECK-ONLY-AVX512F-NEXT:    vdivss %xmm0, %xmm1, %xmm01374; CHECK-ONLY-AVX512F-NEXT:    retq1375;1376; CHECK-SKX-LABEL: fdiv_pow_shl_cnt_fail_neg_int:1377; CHECK-SKX:       # %bb.0:1378; CHECK-SKX-NEXT:    movl $8, %eax1379; CHECK-SKX-NEXT:    shlxq %rdi, %rax, %rax1380; CHECK-SKX-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01381; CHECK-SKX-NEXT:    vmovss {{.*#+}} xmm1 = [-9.0E+0,0.0E+0,0.0E+0,0.0E+0]1382; CHECK-SKX-NEXT:    vdivss %xmm0, %xmm1, %xmm01383; CHECK-SKX-NEXT:    retq1384  %shl = shl i64 8, %cnt1385  %conv = sitofp i64 %shl to float1386  %mul = fdiv float -9.000000e+00, %conv1387  ret float %mul1388}1389 1390define float @fdiv_pow_shl_cnt(i64 %cnt_in) nounwind {1391; CHECK-SSE-LABEL: fdiv_pow_shl_cnt:1392; CHECK-SSE:       # %bb.0:1393; CHECK-SSE-NEXT:    andl $31, %edi1394; CHECK-SSE-NEXT:    shll $23, %edi1395; CHECK-SSE-NEXT:    movl $-1115684864, %eax # imm = 0xBD8000001396; CHECK-SSE-NEXT:    subl %edi, %eax1397; CHECK-SSE-NEXT:    movd %eax, %xmm01398; CHECK-SSE-NEXT:    retq1399;1400; CHECK-AVX-LABEL: fdiv_pow_shl_cnt:1401; CHECK-AVX:       # %bb.0:1402; CHECK-AVX-NEXT:    andl $31, %edi1403; CHECK-AVX-NEXT:    shll $23, %edi1404; CHECK-AVX-NEXT:    movl $-1115684864, %eax # imm = 0xBD8000001405; CHECK-AVX-NEXT:    subl %edi, %eax1406; CHECK-AVX-NEXT:    vmovd %eax, %xmm01407; CHECK-AVX-NEXT:    retq1408  %cnt = and i64 %cnt_in, 311409  %shl = shl i64 8, %cnt1410  %conv = sitofp i64 %shl to float1411  %mul = fdiv float -0.500000e+00, %conv1412  ret float %mul1413}1414 1415define half @fdiv_pow_shl_cnt_fail_out_of_bounds(i32 %cnt) nounwind {1416; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_fail_out_of_bounds:1417; CHECK-SSE:       # %bb.0:1418; CHECK-SSE-NEXT:    pushq %rax1419; CHECK-SSE-NEXT:    movl %edi, %ecx1420; CHECK-SSE-NEXT:    movl $1, %eax1421; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $ecx1422; CHECK-SSE-NEXT:    shll %cl, %eax1423; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm01424; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1425; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT1426; CHECK-SSE-NEXT:    movss {{.*#+}} xmm1 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]1427; CHECK-SSE-NEXT:    divss %xmm0, %xmm11428; CHECK-SSE-NEXT:    movaps %xmm1, %xmm01429; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1430; CHECK-SSE-NEXT:    popq %rax1431; CHECK-SSE-NEXT:    retq1432;1433; CHECK-AVX2-LABEL: fdiv_pow_shl_cnt_fail_out_of_bounds:1434; CHECK-AVX2:       # %bb.0:1435; CHECK-AVX2-NEXT:    pushq %rax1436; CHECK-AVX2-NEXT:    movl %edi, %ecx1437; CHECK-AVX2-NEXT:    movl $1, %eax1438; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $ecx1439; CHECK-AVX2-NEXT:    shll %cl, %eax1440; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01441; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1442; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT1443; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]1444; CHECK-AVX2-NEXT:    vdivss %xmm0, %xmm1, %xmm01445; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1446; CHECK-AVX2-NEXT:    popq %rax1447; CHECK-AVX2-NEXT:    retq1448;1449; CHECK-ONLY-AVX512F-LABEL: fdiv_pow_shl_cnt_fail_out_of_bounds:1450; CHECK-ONLY-AVX512F:       # %bb.0:1451; CHECK-ONLY-AVX512F-NEXT:    movl %edi, %ecx1452; CHECK-ONLY-AVX512F-NEXT:    movl $1, %eax1453; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $ecx1454; CHECK-ONLY-AVX512F-NEXT:    shll %cl, %eax1455; CHECK-ONLY-AVX512F-NEXT:    vcvtusi2ss %eax, %xmm15, %xmm01456; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm01457; CHECK-ONLY-AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm01458; CHECK-ONLY-AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]1459; CHECK-ONLY-AVX512F-NEXT:    vdivss %xmm0, %xmm1, %xmm01460; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm01461; CHECK-ONLY-AVX512F-NEXT:    retq1462;1463; CHECK-SKX-LABEL: fdiv_pow_shl_cnt_fail_out_of_bounds:1464; CHECK-SKX:       # %bb.0:1465; CHECK-SKX-NEXT:    movl $1, %eax1466; CHECK-SKX-NEXT:    shlxl %edi, %eax, %eax1467; CHECK-SKX-NEXT:    vcvtusi2ss %eax, %xmm15, %xmm01468; CHECK-SKX-NEXT:    vcvtps2ph $4, %xmm0, %xmm01469; CHECK-SKX-NEXT:    vcvtph2ps %xmm0, %xmm01470; CHECK-SKX-NEXT:    vmovss {{.*#+}} xmm1 = [8.192E+3,0.0E+0,0.0E+0,0.0E+0]1471; CHECK-SKX-NEXT:    vdivss %xmm0, %xmm1, %xmm01472; CHECK-SKX-NEXT:    vcvtps2ph $4, %xmm0, %xmm01473; CHECK-SKX-NEXT:    retq1474  %shl = shl nuw i32 1, %cnt1475  %conv = uitofp i32 %shl to half1476  %mul = fdiv half 0xH7000, %conv1477  ret half %mul1478}1479 1480define half @fdiv_pow_shl_cnt_in_bounds(i16 %cnt) nounwind {1481; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_in_bounds:1482; CHECK-SSE:       # %bb.0:1483; CHECK-SSE-NEXT:    shll $10, %edi1484; CHECK-SSE-NEXT:    movl $28672, %eax # imm = 0x70001485; CHECK-SSE-NEXT:    subl %edi, %eax1486; CHECK-SSE-NEXT:    pinsrw $0, %eax, %xmm01487; CHECK-SSE-NEXT:    retq1488;1489; CHECK-AVX-LABEL: fdiv_pow_shl_cnt_in_bounds:1490; CHECK-AVX:       # %bb.0:1491; CHECK-AVX-NEXT:    shll $10, %edi1492; CHECK-AVX-NEXT:    movl $28672, %eax # imm = 0x70001493; CHECK-AVX-NEXT:    subl %edi, %eax1494; CHECK-AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm01495; CHECK-AVX-NEXT:    retq1496  %shl = shl nuw i16 1, %cnt1497  %conv = uitofp i16 %shl to half1498  %mul = fdiv half 0xH7000, %conv1499  ret half %mul1500}1501 1502define half @fdiv_pow_shl_cnt_in_bounds2(i16 %cnt) nounwind {1503; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_in_bounds2:1504; CHECK-SSE:       # %bb.0:1505; CHECK-SSE-NEXT:    shll $10, %edi1506; CHECK-SSE-NEXT:    movl $18432, %eax # imm = 0x48001507; CHECK-SSE-NEXT:    subl %edi, %eax1508; CHECK-SSE-NEXT:    pinsrw $0, %eax, %xmm01509; CHECK-SSE-NEXT:    retq1510;1511; CHECK-AVX-LABEL: fdiv_pow_shl_cnt_in_bounds2:1512; CHECK-AVX:       # %bb.0:1513; CHECK-AVX-NEXT:    shll $10, %edi1514; CHECK-AVX-NEXT:    movl $18432, %eax # imm = 0x48001515; CHECK-AVX-NEXT:    subl %edi, %eax1516; CHECK-AVX-NEXT:    vpinsrw $0, %eax, %xmm0, %xmm01517; CHECK-AVX-NEXT:    retq1518  %shl = shl nuw i16 1, %cnt1519  %conv = uitofp i16 %shl to half1520  %mul = fdiv half 0xH4800, %conv1521  ret half %mul1522}1523 1524define half @fdiv_pow_shl_cnt_fail_out_of_bound2(i16 %cnt) nounwind {1525; CHECK-SSE-LABEL: fdiv_pow_shl_cnt_fail_out_of_bound2:1526; CHECK-SSE:       # %bb.0:1527; CHECK-SSE-NEXT:    pushq %rax1528; CHECK-SSE-NEXT:    movl %edi, %ecx1529; CHECK-SSE-NEXT:    movl $1, %eax1530; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $ecx1531; CHECK-SSE-NEXT:    shll %cl, %eax1532; CHECK-SSE-NEXT:    movzwl %ax, %eax1533; CHECK-SSE-NEXT:    cvtsi2ss %eax, %xmm01534; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1535; CHECK-SSE-NEXT:    callq __extendhfsf2@PLT1536; CHECK-SSE-NEXT:    movss {{.*#+}} xmm1 = [2.0E+0,0.0E+0,0.0E+0,0.0E+0]1537; CHECK-SSE-NEXT:    divss %xmm0, %xmm11538; CHECK-SSE-NEXT:    movaps %xmm1, %xmm01539; CHECK-SSE-NEXT:    callq __truncsfhf2@PLT1540; CHECK-SSE-NEXT:    popq %rax1541; CHECK-SSE-NEXT:    retq1542;1543; CHECK-AVX2-LABEL: fdiv_pow_shl_cnt_fail_out_of_bound2:1544; CHECK-AVX2:       # %bb.0:1545; CHECK-AVX2-NEXT:    pushq %rax1546; CHECK-AVX2-NEXT:    movl %edi, %ecx1547; CHECK-AVX2-NEXT:    movl $1, %eax1548; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $ecx1549; CHECK-AVX2-NEXT:    shll %cl, %eax1550; CHECK-AVX2-NEXT:    movzwl %ax, %eax1551; CHECK-AVX2-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm01552; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1553; CHECK-AVX2-NEXT:    callq __extendhfsf2@PLT1554; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [2.0E+0,0.0E+0,0.0E+0,0.0E+0]1555; CHECK-AVX2-NEXT:    vdivss %xmm0, %xmm1, %xmm01556; CHECK-AVX2-NEXT:    callq __truncsfhf2@PLT1557; CHECK-AVX2-NEXT:    popq %rax1558; CHECK-AVX2-NEXT:    retq1559;1560; CHECK-ONLY-AVX512F-LABEL: fdiv_pow_shl_cnt_fail_out_of_bound2:1561; CHECK-ONLY-AVX512F:       # %bb.0:1562; CHECK-ONLY-AVX512F-NEXT:    movl %edi, %ecx1563; CHECK-ONLY-AVX512F-NEXT:    movl $1, %eax1564; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $ecx1565; CHECK-ONLY-AVX512F-NEXT:    shll %cl, %eax1566; CHECK-ONLY-AVX512F-NEXT:    movzwl %ax, %eax1567; CHECK-ONLY-AVX512F-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm01568; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm01569; CHECK-ONLY-AVX512F-NEXT:    vcvtph2ps %xmm0, %xmm01570; CHECK-ONLY-AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [2.0E+0,0.0E+0,0.0E+0,0.0E+0]1571; CHECK-ONLY-AVX512F-NEXT:    vdivss %xmm0, %xmm1, %xmm01572; CHECK-ONLY-AVX512F-NEXT:    vcvtps2ph $4, %xmm0, %xmm01573; CHECK-ONLY-AVX512F-NEXT:    retq1574;1575; CHECK-SKX-LABEL: fdiv_pow_shl_cnt_fail_out_of_bound2:1576; CHECK-SKX:       # %bb.0:1577; CHECK-SKX-NEXT:    movl $1, %eax1578; CHECK-SKX-NEXT:    shlxl %edi, %eax, %eax1579; CHECK-SKX-NEXT:    movzwl %ax, %eax1580; CHECK-SKX-NEXT:    vcvtsi2ss %eax, %xmm15, %xmm01581; CHECK-SKX-NEXT:    vcvtps2ph $4, %xmm0, %xmm01582; CHECK-SKX-NEXT:    vcvtph2ps %xmm0, %xmm01583; CHECK-SKX-NEXT:    vmovss {{.*#+}} xmm1 = [2.0E+0,0.0E+0,0.0E+0,0.0E+0]1584; CHECK-SKX-NEXT:    vdivss %xmm0, %xmm1, %xmm01585; CHECK-SKX-NEXT:    vcvtps2ph $4, %xmm0, %xmm01586; CHECK-SKX-NEXT:    retq1587  %shl = shl nuw i16 1, %cnt1588  %conv = uitofp i16 %shl to half1589  %mul = fdiv half 0xH4000, %conv1590  ret half %mul1591}1592 1593; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set1594; in the original IR.1595define double @fdiv_pow_shl_cnt32_to_dbl_okay(i32 %cnt) nounwind {1596; CHECK-SSE-LABEL: fdiv_pow_shl_cnt32_to_dbl_okay:1597; CHECK-SSE:       # %bb.0:1598; CHECK-SSE-NEXT:    movzbl %dil, %eax1599; CHECK-SSE-NEXT:    shlq $52, %rax1600; CHECK-SSE-NEXT:    movabsq $3936146074321813504, %rcx # imm = 0x36A00000000000001601; CHECK-SSE-NEXT:    subq %rax, %rcx1602; CHECK-SSE-NEXT:    movq %rcx, %xmm01603; CHECK-SSE-NEXT:    retq1604;1605; CHECK-AVX-LABEL: fdiv_pow_shl_cnt32_to_dbl_okay:1606; CHECK-AVX:       # %bb.0:1607; CHECK-AVX-NEXT:    movzbl %dil, %eax1608; CHECK-AVX-NEXT:    shlq $52, %rax1609; CHECK-AVX-NEXT:    movabsq $3936146074321813504, %rcx # imm = 0x36A00000000000001610; CHECK-AVX-NEXT:    subq %rax, %rcx1611; CHECK-AVX-NEXT:    vmovq %rcx, %xmm01612; CHECK-AVX-NEXT:    retq1613  %shl = shl nuw i32 1, %cnt1614  %conv = uitofp i32 %shl to double1615  %mul = fdiv double 0x36A0000000000000, %conv1616  ret double %mul1617}1618 1619define float @fdiv_pow_shl_cnt32_out_of_bounds2(i32 %cnt) nounwind {1620; CHECK-SSE-LABEL: fdiv_pow_shl_cnt32_out_of_bounds2:1621; CHECK-SSE:       # %bb.0:1622; CHECK-SSE-NEXT:    movl %edi, %ecx1623; CHECK-SSE-NEXT:    movl $1, %eax1624; CHECK-SSE-NEXT:    # kill: def $cl killed $cl killed $ecx1625; CHECK-SSE-NEXT:    shll %cl, %eax1626; CHECK-SSE-NEXT:    cvtsi2ss %rax, %xmm11627; CHECK-SSE-NEXT:    movss {{.*#+}} xmm0 = [1.00974148E-28,0.0E+0,0.0E+0,0.0E+0]1628; CHECK-SSE-NEXT:    divss %xmm1, %xmm01629; CHECK-SSE-NEXT:    retq1630;1631; CHECK-AVX2-LABEL: fdiv_pow_shl_cnt32_out_of_bounds2:1632; CHECK-AVX2:       # %bb.0:1633; CHECK-AVX2-NEXT:    movl %edi, %ecx1634; CHECK-AVX2-NEXT:    movl $1, %eax1635; CHECK-AVX2-NEXT:    # kill: def $cl killed $cl killed $ecx1636; CHECK-AVX2-NEXT:    shll %cl, %eax1637; CHECK-AVX2-NEXT:    vcvtsi2ss %rax, %xmm15, %xmm01638; CHECK-AVX2-NEXT:    vmovss {{.*#+}} xmm1 = [1.00974148E-28,0.0E+0,0.0E+0,0.0E+0]1639; CHECK-AVX2-NEXT:    vdivss %xmm0, %xmm1, %xmm01640; CHECK-AVX2-NEXT:    retq1641;1642; CHECK-ONLY-AVX512F-LABEL: fdiv_pow_shl_cnt32_out_of_bounds2:1643; CHECK-ONLY-AVX512F:       # %bb.0:1644; CHECK-ONLY-AVX512F-NEXT:    movl %edi, %ecx1645; CHECK-ONLY-AVX512F-NEXT:    movl $1, %eax1646; CHECK-ONLY-AVX512F-NEXT:    # kill: def $cl killed $cl killed $ecx1647; CHECK-ONLY-AVX512F-NEXT:    shll %cl, %eax1648; CHECK-ONLY-AVX512F-NEXT:    vcvtusi2ss %eax, %xmm15, %xmm01649; CHECK-ONLY-AVX512F-NEXT:    vmovss {{.*#+}} xmm1 = [1.00974148E-28,0.0E+0,0.0E+0,0.0E+0]1650; CHECK-ONLY-AVX512F-NEXT:    vdivss %xmm0, %xmm1, %xmm01651; CHECK-ONLY-AVX512F-NEXT:    retq1652;1653; CHECK-SKX-LABEL: fdiv_pow_shl_cnt32_out_of_bounds2:1654; CHECK-SKX:       # %bb.0:1655; CHECK-SKX-NEXT:    movl $1, %eax1656; CHECK-SKX-NEXT:    shlxl %edi, %eax, %eax1657; CHECK-SKX-NEXT:    vcvtusi2ss %eax, %xmm15, %xmm01658; CHECK-SKX-NEXT:    vmovss {{.*#+}} xmm1 = [1.00974148E-28,0.0E+0,0.0E+0,0.0E+0]1659; CHECK-SKX-NEXT:    vdivss %xmm0, %xmm1, %xmm01660; CHECK-SKX-NEXT:    retq1661  %shl = shl nuw i32 1, %cnt1662  %conv = uitofp i32 %shl to float1663  %mul = fdiv float 0x3a1fffff00000000, %conv1664  ret float %mul1665}1666 1667; FIXME: The movzbl is unnecessary. It would be UB for the upper bits to be set1668; in the original IR.1669define float @fdiv_pow_shl_cnt32_okay(i32 %cnt) nounwind {1670; CHECK-SSE-LABEL: fdiv_pow_shl_cnt32_okay:1671; CHECK-SSE:       # %bb.0:1672; CHECK-SSE-NEXT:    movzbl %dil, %eax1673; CHECK-SSE-NEXT:    shll $23, %eax1674; CHECK-SSE-NEXT:    movl $285212672, %ecx # imm = 0x110000001675; CHECK-SSE-NEXT:    subl %eax, %ecx1676; CHECK-SSE-NEXT:    movd %ecx, %xmm01677; CHECK-SSE-NEXT:    retq1678;1679; CHECK-AVX-LABEL: fdiv_pow_shl_cnt32_okay:1680; CHECK-AVX:       # %bb.0:1681; CHECK-AVX-NEXT:    movzbl %dil, %eax1682; CHECK-AVX-NEXT:    shll $23, %eax1683; CHECK-AVX-NEXT:    movl $285212672, %ecx # imm = 0x110000001684; CHECK-AVX-NEXT:    subl %eax, %ecx1685; CHECK-AVX-NEXT:    vmovd %ecx, %xmm01686; CHECK-AVX-NEXT:    retq1687  %shl = shl nuw i32 1, %cnt1688  %conv = uitofp i32 %shl to float1689  %mul = fdiv float 0x3a20000000000000, %conv1690  ret float %mul1691}1692 1693define x86_fp80 @pr128528(i1 %cond) {1694; CHECK-SSE-LABEL: pr128528:1695; CHECK-SSE:       # %bb.0:1696; CHECK-SSE-NEXT:    testb $1, %dil1697; CHECK-SSE-NEXT:    movl $8, %eax1698; CHECK-SSE-NEXT:    movl $1, %ecx1699; CHECK-SSE-NEXT:    cmovnel %eax, %ecx1700; CHECK-SSE-NEXT:    movl %ecx, -{{[0-9]+}}(%rsp)1701; CHECK-SSE-NEXT:    fildl -{{[0-9]+}}(%rsp)1702; CHECK-SSE-NEXT:    fmull {{\.?LCPI[0-9]+_[0-9]+}}(%rip)1703; CHECK-SSE-NEXT:    retq1704;1705; CHECK-AVX-LABEL: pr128528:1706; CHECK-AVX:       # %bb.0:1707; CHECK-AVX-NEXT:    testb $1, %dil1708; CHECK-AVX-NEXT:    movl $8, %eax1709; CHECK-AVX-NEXT:    movl $1, %ecx1710; CHECK-AVX-NEXT:    cmovnel %eax, %ecx1711; CHECK-AVX-NEXT:    movl %ecx, -{{[0-9]+}}(%rsp)1712; CHECK-AVX-NEXT:    fildl -{{[0-9]+}}(%rsp)1713; CHECK-AVX-NEXT:    fmull {{\.?LCPI[0-9]+_[0-9]+}}(%rip)1714; CHECK-AVX-NEXT:    retq1715  %sub9 = select i1 %cond, i32 8, i32 11716  %conv = uitofp i32 %sub9 to x86_fp801717  %mul = fmul x86_fp80 %conv, 0xK4007D0555555555558001718  ret x86_fp80 %mul1719}1720