brintos

brintos / llvm-project-archived public Read only

0
0
Text · 22.1 KiB · 59ec7bf Raw
570 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mtriple=x86_64-unknown-unknown -verify-machineinstrs < %s | FileCheck -check-prefixes=X64 %s3; RUN: llc -mtriple=x86_64-pc-win32 -verify-machineinstrs < %s | FileCheck -check-prefixes=WIN64 %s4; RUN: llc -mtriple=i386-pc-win32 -verify-machineinstrs < %s | FileCheck -check-prefix=WIN32 %s5 6define float @ldexp_f32(i8 zeroext %x) nounwind {7; X64-LABEL: ldexp_f32:8; X64:       # %bb.0:9; X64-NEXT:    movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]10; X64-NEXT:    jmp ldexpf@PLT # TAILCALL11;12; WIN64-LABEL: ldexp_f32:13; WIN64:       # %bb.0:14; WIN64-NEXT:    subq $40, %rsp15; WIN64-NEXT:    movzbl %cl, %edx16; WIN64-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]17; WIN64-NEXT:    callq ldexp18; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm019; WIN64-NEXT:    addq $40, %rsp20; WIN64-NEXT:    retq21;22; WIN32-LABEL: ldexp_f32:23; WIN32:       # %bb.0:24; WIN32-NEXT:    subl $16, %esp25; WIN32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax26; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)27; WIN32-NEXT:    fld128; WIN32-NEXT:    fstpl (%esp)29; WIN32-NEXT:    calll _ldexp30; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)31; WIN32-NEXT:    flds {{[0-9]+}}(%esp)32; WIN32-NEXT:    addl $16, %esp33; WIN32-NEXT:    retl34  %zext = zext i8 %x to i3235  %ldexp = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 %zext)36  ret float %ldexp37}38 39define double @ldexp_f64(i8 zeroext %x) nounwind {40; X64-LABEL: ldexp_f64:41; X64:       # %bb.0:42; X64-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]43; X64-NEXT:    jmp ldexp@PLT # TAILCALL44;45; WIN64-LABEL: ldexp_f64:46; WIN64:       # %bb.0:47; WIN64-NEXT:    movzbl %cl, %edx48; WIN64-NEXT:    movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]49; WIN64-NEXT:    jmp ldexp # TAILCALL50;51; WIN32-LABEL: ldexp_f64:52; WIN32:       # %bb.0:53; WIN32-NEXT:    subl $12, %esp54; WIN32-NEXT:    movzbl {{[0-9]+}}(%esp), %eax55; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)56; WIN32-NEXT:    fld157; WIN32-NEXT:    fstpl (%esp)58; WIN32-NEXT:    calll _ldexp59; WIN32-NEXT:    addl $12, %esp60; WIN32-NEXT:    retl61  %zext = zext i8 %x to i3262  %ldexp = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 %zext)63  ret double %ldexp64}65 66define <2 x float> @ldexp_v2f32(<2 x float> %val, <2 x i32> %exp) nounwind {67; X64-LABEL: ldexp_v2f32:68; X64:       # %bb.0:69; X64-NEXT:    subq $56, %rsp70; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill71; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill72; X64-NEXT:    movd %xmm1, %edi73; X64-NEXT:    callq ldexpf@PLT74; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill75; X64-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload76; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]77; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload78; X64-NEXT:    # xmm1 = mem[1,1,1,1]79; X64-NEXT:    movd %xmm1, %edi80; X64-NEXT:    callq ldexpf@PLT81; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload82; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]83; X64-NEXT:    movaps %xmm1, %xmm084; X64-NEXT:    addq $56, %rsp85; X64-NEXT:    retq86;87; WIN64-LABEL: ldexp_v2f32:88; WIN64:       # %bb.0:89; WIN64-NEXT:    pushq %rsi90; WIN64-NEXT:    subq $80, %rsp91; WIN64-NEXT:    movaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill92; WIN64-NEXT:    movaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill93; WIN64-NEXT:    movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill94; WIN64-NEXT:    movq %rdx, %rsi95; WIN64-NEXT:    movaps (%rcx), %xmm796; WIN64-NEXT:    movl 12(%rdx), %edx97; WIN64-NEXT:    movaps %xmm7, %xmm098; WIN64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm7[3,3]99; WIN64-NEXT:    cvtss2sd %xmm0, %xmm0100; WIN64-NEXT:    callq ldexp101; WIN64-NEXT:    xorps %xmm6, %xmm6102; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm6103; WIN64-NEXT:    movl 8(%rsi), %edx104; WIN64-NEXT:    movaps %xmm7, %xmm0105; WIN64-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm7[1]106; WIN64-NEXT:    cvtss2sd %xmm0, %xmm0107; WIN64-NEXT:    callq ldexp108; WIN64-NEXT:    xorps %xmm8, %xmm8109; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm8110; WIN64-NEXT:    unpcklps {{.*#+}} xmm8 = xmm8[0],xmm6[0],xmm8[1],xmm6[1]111; WIN64-NEXT:    movl (%rsi), %edx112; WIN64-NEXT:    movl 4(%rsi), %esi113; WIN64-NEXT:    xorps %xmm0, %xmm0114; WIN64-NEXT:    cvtss2sd %xmm7, %xmm0115; WIN64-NEXT:    callq ldexp116; WIN64-NEXT:    xorps %xmm6, %xmm6117; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm6118; WIN64-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,1,1,1]119; WIN64-NEXT:    xorps %xmm0, %xmm0120; WIN64-NEXT:    cvtss2sd %xmm7, %xmm0121; WIN64-NEXT:    movl %esi, %edx122; WIN64-NEXT:    callq ldexp123; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm0124; WIN64-NEXT:    unpcklps {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1]125; WIN64-NEXT:    movlhps {{.*#+}} xmm6 = xmm6[0],xmm8[0]126; WIN64-NEXT:    movaps %xmm6, %xmm0127; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload128; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload129; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload130; WIN64-NEXT:    addq $80, %rsp131; WIN64-NEXT:    popq %rsi132; WIN64-NEXT:    retq133;134; WIN32-LABEL: ldexp_v2f32:135; WIN32:       # %bb.0:136; WIN32-NEXT:    pushl %esi137; WIN32-NEXT:    subl $20, %esp138; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi139; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax140; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)141; WIN32-NEXT:    flds {{[0-9]+}}(%esp)142; WIN32-NEXT:    fstpl (%esp)143; WIN32-NEXT:    calll _ldexp144; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)145; WIN32-NEXT:    flds {{[0-9]+}}(%esp)146; WIN32-NEXT:    fstpl (%esp)147; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)148; WIN32-NEXT:    calll _ldexp149; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)150; WIN32-NEXT:    flds {{[0-9]+}}(%esp)151; WIN32-NEXT:    flds {{[0-9]+}}(%esp)152; WIN32-NEXT:    addl $20, %esp153; WIN32-NEXT:    popl %esi154; WIN32-NEXT:    retl155  %1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp)156  ret <2 x float> %1157}158 159define <4 x float> @ldexp_v4f32(<4 x float> %val, <4 x i32> %exp) nounwind {160; X64-LABEL: ldexp_v4f32:161; X64:       # %bb.0:162; X64-NEXT:    subq $72, %rsp163; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill164; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill165; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]166; X64-NEXT:    pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]167; X64-NEXT:    movd %xmm2, %edi168; X64-NEXT:    callq ldexpf@PLT169; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill170; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload171; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]172; X64-NEXT:    pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload173; X64-NEXT:    # xmm1 = mem[2,3,2,3]174; X64-NEXT:    movd %xmm1, %edi175; X64-NEXT:    callq ldexpf@PLT176; X64-NEXT:    unpcklps (%rsp), %xmm0 # 16-byte Folded Reload177; X64-NEXT:    # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]178; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill179; X64-NEXT:    movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload180; X64-NEXT:    movd %xmm0, %edi181; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload182; X64-NEXT:    callq ldexpf@PLT183; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill184; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload185; X64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]186; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload187; X64-NEXT:    # xmm1 = mem[1,1,1,1]188; X64-NEXT:    movd %xmm1, %edi189; X64-NEXT:    callq ldexpf@PLT190; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload191; X64-NEXT:    unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]192; X64-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload193; X64-NEXT:    # xmm1 = xmm1[0],mem[0]194; X64-NEXT:    movaps %xmm1, %xmm0195; X64-NEXT:    addq $72, %rsp196; X64-NEXT:    retq197;198; WIN64-LABEL: ldexp_v4f32:199; WIN64:       # %bb.0:200; WIN64-NEXT:    pushq %rsi201; WIN64-NEXT:    subq $80, %rsp202; WIN64-NEXT:    movaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill203; WIN64-NEXT:    movaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill204; WIN64-NEXT:    movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill205; WIN64-NEXT:    movq %rdx, %rsi206; WIN64-NEXT:    movaps (%rcx), %xmm7207; WIN64-NEXT:    movl 12(%rdx), %edx208; WIN64-NEXT:    movaps %xmm7, %xmm0209; WIN64-NEXT:    shufps {{.*#+}} xmm0 = xmm0[3,3],xmm7[3,3]210; WIN64-NEXT:    cvtss2sd %xmm0, %xmm0211; WIN64-NEXT:    callq ldexp212; WIN64-NEXT:    xorps %xmm6, %xmm6213; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm6214; WIN64-NEXT:    movl 8(%rsi), %edx215; WIN64-NEXT:    movaps %xmm7, %xmm0216; WIN64-NEXT:    unpckhpd {{.*#+}} xmm0 = xmm0[1],xmm7[1]217; WIN64-NEXT:    cvtss2sd %xmm0, %xmm0218; WIN64-NEXT:    callq ldexp219; WIN64-NEXT:    xorps %xmm8, %xmm8220; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm8221; WIN64-NEXT:    unpcklps {{.*#+}} xmm8 = xmm8[0],xmm6[0],xmm8[1],xmm6[1]222; WIN64-NEXT:    movl (%rsi), %edx223; WIN64-NEXT:    movl 4(%rsi), %esi224; WIN64-NEXT:    xorps %xmm0, %xmm0225; WIN64-NEXT:    cvtss2sd %xmm7, %xmm0226; WIN64-NEXT:    callq ldexp227; WIN64-NEXT:    xorps %xmm6, %xmm6228; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm6229; WIN64-NEXT:    shufps {{.*#+}} xmm7 = xmm7[1,1,1,1]230; WIN64-NEXT:    xorps %xmm0, %xmm0231; WIN64-NEXT:    cvtss2sd %xmm7, %xmm0232; WIN64-NEXT:    movl %esi, %edx233; WIN64-NEXT:    callq ldexp234; WIN64-NEXT:    cvtsd2ss %xmm0, %xmm0235; WIN64-NEXT:    unpcklps {{.*#+}} xmm6 = xmm6[0],xmm0[0],xmm6[1],xmm0[1]236; WIN64-NEXT:    movlhps {{.*#+}} xmm6 = xmm6[0],xmm8[0]237; WIN64-NEXT:    movaps %xmm6, %xmm0238; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload239; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload240; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload241; WIN64-NEXT:    addq $80, %rsp242; WIN64-NEXT:    popq %rsi243; WIN64-NEXT:    retq244;245; WIN32-LABEL: ldexp_v4f32:246; WIN32:       # %bb.0:247; WIN32-NEXT:    pushl %ebp248; WIN32-NEXT:    pushl %ebx249; WIN32-NEXT:    pushl %edi250; WIN32-NEXT:    pushl %esi251; WIN32-NEXT:    subl $44, %esp252; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi253; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi254; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx255; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp256; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax257; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)258; WIN32-NEXT:    flds {{[0-9]+}}(%esp)259; WIN32-NEXT:    fstpl (%esp)260; WIN32-NEXT:    calll _ldexp261; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill262; WIN32-NEXT:    movl %ebp, {{[0-9]+}}(%esp)263; WIN32-NEXT:    flds {{[0-9]+}}(%esp)264; WIN32-NEXT:    fstpl (%esp)265; WIN32-NEXT:    calll _ldexp266; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill267; WIN32-NEXT:    movl %ebx, {{[0-9]+}}(%esp)268; WIN32-NEXT:    flds {{[0-9]+}}(%esp)269; WIN32-NEXT:    fstpl (%esp)270; WIN32-NEXT:    calll _ldexp271; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)272; WIN32-NEXT:    flds {{[0-9]+}}(%esp)273; WIN32-NEXT:    fstpl (%esp)274; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)275; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload276; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)277; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload278; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)279; WIN32-NEXT:    calll _ldexp280; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)281; WIN32-NEXT:    flds {{[0-9]+}}(%esp)282; WIN32-NEXT:    flds {{[0-9]+}}(%esp)283; WIN32-NEXT:    flds {{[0-9]+}}(%esp)284; WIN32-NEXT:    flds {{[0-9]+}}(%esp)285; WIN32-NEXT:    fstps 12(%esi)286; WIN32-NEXT:    fstps 8(%esi)287; WIN32-NEXT:    fstps 4(%esi)288; WIN32-NEXT:    fstps (%esi)289; WIN32-NEXT:    movl %esi, %eax290; WIN32-NEXT:    addl $44, %esp291; WIN32-NEXT:    popl %esi292; WIN32-NEXT:    popl %edi293; WIN32-NEXT:    popl %ebx294; WIN32-NEXT:    popl %ebp295; WIN32-NEXT:    retl296  %1 = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %val, <4 x i32> %exp)297  ret <4 x float> %1298}299 300define <2 x double> @ldexp_v2f64(<2 x double> %val, <2 x i32> %exp) nounwind {301; X64-LABEL: ldexp_v2f64:302; X64:       # %bb.0:303; X64-NEXT:    subq $56, %rsp304; X64-NEXT:    movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill305; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill306; X64-NEXT:    movd %xmm1, %edi307; X64-NEXT:    callq ldexp@PLT308; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill309; X64-NEXT:    movaps (%rsp), %xmm0 # 16-byte Reload310; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]311; X64-NEXT:    pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload312; X64-NEXT:    # xmm1 = mem[1,1,1,1]313; X64-NEXT:    movd %xmm1, %edi314; X64-NEXT:    callq ldexp@PLT315; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload316; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]317; X64-NEXT:    movaps %xmm1, %xmm0318; X64-NEXT:    addq $56, %rsp319; X64-NEXT:    retq320;321; WIN64-LABEL: ldexp_v2f64:322; WIN64:       # %bb.0:323; WIN64-NEXT:    pushq %rsi324; WIN64-NEXT:    subq $64, %rsp325; WIN64-NEXT:    movaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill326; WIN64-NEXT:    movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill327; WIN64-NEXT:    movaps (%rcx), %xmm6328; WIN64-NEXT:    movl (%rdx), %eax329; WIN64-NEXT:    movl 4(%rdx), %esi330; WIN64-NEXT:    movaps %xmm6, %xmm0331; WIN64-NEXT:    movl %eax, %edx332; WIN64-NEXT:    callq ldexp333; WIN64-NEXT:    movaps %xmm0, %xmm7334; WIN64-NEXT:    movhlps {{.*#+}} xmm6 = xmm6[1,1]335; WIN64-NEXT:    movaps %xmm6, %xmm0336; WIN64-NEXT:    movl %esi, %edx337; WIN64-NEXT:    callq ldexp338; WIN64-NEXT:    movlhps {{.*#+}} xmm7 = xmm7[0],xmm0[0]339; WIN64-NEXT:    movaps %xmm7, %xmm0340; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload341; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload342; WIN64-NEXT:    addq $64, %rsp343; WIN64-NEXT:    popq %rsi344; WIN64-NEXT:    retq345;346; WIN32-LABEL: ldexp_v2f64:347; WIN32:       # %bb.0:348; WIN32-NEXT:    pushl %esi349; WIN32-NEXT:    subl $28, %esp350; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)351; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill352; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi353; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)354; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax355; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)356; WIN32-NEXT:    fstpl (%esp)357; WIN32-NEXT:    calll _ldexp358; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill359; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)360; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload361; WIN32-NEXT:    fstpl (%esp)362; WIN32-NEXT:    calll _ldexp363; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload364; WIN32-NEXT:    fxch %st(1)365; WIN32-NEXT:    addl $28, %esp366; WIN32-NEXT:    popl %esi367; WIN32-NEXT:    retl368  %1 = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %val, <2 x i32> %exp)369  ret <2 x double> %1370}371 372define <4 x double> @ldexp_v4f64(<4 x double> %val, <4 x i32> %exp) nounwind {373; X64-LABEL: ldexp_v4f64:374; X64:       # %bb.0:375; X64-NEXT:    pushq %rbp376; X64-NEXT:    pushq %rbx377; X64-NEXT:    subq $72, %rsp378; X64-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill379; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill380; X64-NEXT:    movdqa %xmm2, (%rsp) # 16-byte Spill381; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]382; X64-NEXT:    movd %xmm1, %ebx383; X64-NEXT:    pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]384; X64-NEXT:    movd %xmm1, %ebp385; X64-NEXT:    movd %xmm2, %edi386; X64-NEXT:    callq ldexp@PLT387; X64-NEXT:    movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill388; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload389; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]390; X64-NEXT:    pshufd $85, (%rsp), %xmm1 # 16-byte Folded Reload391; X64-NEXT:    # xmm1 = mem[1,1,1,1]392; X64-NEXT:    movd %xmm1, %edi393; X64-NEXT:    callq ldexp@PLT394; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload395; X64-NEXT:    movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]396; X64-NEXT:    movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill397; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload398; X64-NEXT:    movhlps {{.*#+}} xmm0 = xmm0[1,1]399; X64-NEXT:    movl %ebp, %edi400; X64-NEXT:    callq ldexp@PLT401; X64-NEXT:    movaps %xmm0, (%rsp) # 16-byte Spill402; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload403; X64-NEXT:    movl %ebx, %edi404; X64-NEXT:    callq ldexp@PLT405; X64-NEXT:    movaps %xmm0, %xmm1406; X64-NEXT:    unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload407; X64-NEXT:    # xmm1 = xmm1[0],mem[0]408; X64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload409; X64-NEXT:    addq $72, %rsp410; X64-NEXT:    popq %rbx411; X64-NEXT:    popq %rbp412; X64-NEXT:    retq413;414; WIN64-LABEL: ldexp_v4f64:415; WIN64:       # %bb.0:416; WIN64-NEXT:    pushq %rsi417; WIN64-NEXT:    pushq %rdi418; WIN64-NEXT:    pushq %rbx419; WIN64-NEXT:    subq $80, %rsp420; WIN64-NEXT:    movaps %xmm8, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill421; WIN64-NEXT:    movaps %xmm7, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill422; WIN64-NEXT:    movaps %xmm6, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill423; WIN64-NEXT:    movl 12(%r8), %esi424; WIN64-NEXT:    movl 8(%r8), %edi425; WIN64-NEXT:    movaps (%rdx), %xmm6426; WIN64-NEXT:    movaps (%rcx), %xmm7427; WIN64-NEXT:    movl (%r8), %edx428; WIN64-NEXT:    movl 4(%r8), %ebx429; WIN64-NEXT:    movaps %xmm7, %xmm0430; WIN64-NEXT:    callq ldexp431; WIN64-NEXT:    movaps %xmm0, %xmm8432; WIN64-NEXT:    movhlps {{.*#+}} xmm7 = xmm7[1,1]433; WIN64-NEXT:    movaps %xmm7, %xmm0434; WIN64-NEXT:    movl %ebx, %edx435; WIN64-NEXT:    callq ldexp436; WIN64-NEXT:    movlhps {{.*#+}} xmm8 = xmm8[0],xmm0[0]437; WIN64-NEXT:    movaps %xmm6, %xmm0438; WIN64-NEXT:    movl %edi, %edx439; WIN64-NEXT:    callq ldexp440; WIN64-NEXT:    movaps %xmm0, %xmm7441; WIN64-NEXT:    movhlps {{.*#+}} xmm6 = xmm6[1,1]442; WIN64-NEXT:    movaps %xmm6, %xmm0443; WIN64-NEXT:    movl %esi, %edx444; WIN64-NEXT:    callq ldexp445; WIN64-NEXT:    movlhps {{.*#+}} xmm7 = xmm7[0],xmm0[0]446; WIN64-NEXT:    movaps %xmm8, %xmm0447; WIN64-NEXT:    movaps %xmm7, %xmm1448; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm6 # 16-byte Reload449; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm7 # 16-byte Reload450; WIN64-NEXT:    movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm8 # 16-byte Reload451; WIN64-NEXT:    addq $80, %rsp452; WIN64-NEXT:    popq %rbx453; WIN64-NEXT:    popq %rdi454; WIN64-NEXT:    popq %rsi455; WIN64-NEXT:    retq456;457; WIN32-LABEL: ldexp_v4f64:458; WIN32:       # %bb.0:459; WIN32-NEXT:    pushl %ebp460; WIN32-NEXT:    pushl %ebx461; WIN32-NEXT:    pushl %edi462; WIN32-NEXT:    pushl %esi463; WIN32-NEXT:    subl $44, %esp464; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi465; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)466; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill467; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %edi468; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)469; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill470; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebx471; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)472; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill473; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %ebp474; WIN32-NEXT:    fldl {{[0-9]+}}(%esp)475; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %eax476; WIN32-NEXT:    movl %eax, {{[0-9]+}}(%esp)477; WIN32-NEXT:    fstpl (%esp)478; WIN32-NEXT:    calll _ldexp479; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill480; WIN32-NEXT:    movl %ebp, {{[0-9]+}}(%esp)481; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload482; WIN32-NEXT:    fstpl (%esp)483; WIN32-NEXT:    calll _ldexp484; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill485; WIN32-NEXT:    movl %ebx, {{[0-9]+}}(%esp)486; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload487; WIN32-NEXT:    fstpl (%esp)488; WIN32-NEXT:    calll _ldexp489; WIN32-NEXT:    fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill490; WIN32-NEXT:    movl %edi, {{[0-9]+}}(%esp)491; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload492; WIN32-NEXT:    fstpl (%esp)493; WIN32-NEXT:    calll _ldexp494; WIN32-NEXT:    fstpl 24(%esi)495; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload496; WIN32-NEXT:    fstpl 16(%esi)497; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload498; WIN32-NEXT:    fstpl 8(%esi)499; WIN32-NEXT:    fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload500; WIN32-NEXT:    fstpl (%esi)501; WIN32-NEXT:    movl %esi, %eax502; WIN32-NEXT:    addl $44, %esp503; WIN32-NEXT:    popl %esi504; WIN32-NEXT:    popl %edi505; WIN32-NEXT:    popl %ebx506; WIN32-NEXT:    popl %ebp507; WIN32-NEXT:    retl508  %1 = call <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double> %val, <4 x i32> %exp)509  ret <4 x double> %1510}511 512define half @ldexp_f16(half %arg0, i32 %arg1) nounwind {513; X64-LABEL: ldexp_f16:514; X64:       # %bb.0:515; X64-NEXT:    pushq %rbx516; X64-NEXT:    movl %edi, %ebx517; X64-NEXT:    callq __extendhfsf2@PLT518; X64-NEXT:    movl %ebx, %edi519; X64-NEXT:    callq ldexpf@PLT520; X64-NEXT:    callq __truncsfhf2@PLT521; X64-NEXT:    popq %rbx522; X64-NEXT:    retq523;524; WIN64-LABEL: ldexp_f16:525; WIN64:       # %bb.0:526; WIN64-NEXT:    pushq %rsi527; WIN64-NEXT:    subq $32, %rsp528; WIN64-NEXT:    movl %edx, %esi529; WIN64-NEXT:    callq __extendhfsf2530; WIN64-NEXT:    cvtss2sd %xmm0, %xmm0531; WIN64-NEXT:    movl %esi, %edx532; WIN64-NEXT:    callq ldexp533; WIN64-NEXT:    callq __truncdfhf2534; WIN64-NEXT:    addq $32, %rsp535; WIN64-NEXT:    popq %rsi536; WIN64-NEXT:    retq537;538; WIN32-LABEL: ldexp_f16:539; WIN32:       # %bb.0:540; WIN32-NEXT:    pushl %esi541; WIN32-NEXT:    subl $16, %esp542; WIN32-NEXT:    movl {{[0-9]+}}(%esp), %esi543; WIN32-NEXT:    movzwl {{[0-9]+}}(%esp), %eax544; WIN32-NEXT:    movl %eax, (%esp)545; WIN32-NEXT:    calll ___extendhfsf2546; WIN32-NEXT:    movl %esi, {{[0-9]+}}(%esp)547; WIN32-NEXT:    fstpl (%esp)548; WIN32-NEXT:    calll _ldexp549; WIN32-NEXT:    fstps {{[0-9]+}}(%esp)550; WIN32-NEXT:    flds {{[0-9]+}}(%esp)551; WIN32-NEXT:    fstps (%esp)552; WIN32-NEXT:    calll ___truncsfhf2553; WIN32-NEXT:    addl $16, %esp554; WIN32-NEXT:    popl %esi555; WIN32-NEXT:    retl556  %ldexp = call half @llvm.ldexp.f16.i32(half %arg0, i32 %arg1)557  ret half %ldexp558}559 560declare double @llvm.ldexp.f64.i32(double, i32) #0561declare float @llvm.ldexp.f32.i32(float, i32) #0562declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0563declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0564declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0565declare <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double>, <4 x i32>) #0566declare half @llvm.ldexp.f16.i32(half, i32) #0567 568attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }569attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }570