923 lines
31 KiB
LLVM
923 lines
31 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
|
|
; RUN: llc -mtriple=x86_64-unknown-unknown -verify-machineinstrs < %s | FileCheck -check-prefixes=X64 %s
|
|
; RUN: llc -mtriple=i386-pc-win32 -verify-machineinstrs < %s | FileCheck -check-prefix=WIN32 %s
|
|
|
|
define float @ldexp_f32(i8 zeroext %x) {
|
|
; X64-LABEL: ldexp_f32:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: movss {{.*#+}} xmm0 = [1.0E+0,0.0E+0,0.0E+0,0.0E+0]
|
|
; X64-NEXT: jmp ldexpf@PLT # TAILCALL
|
|
;
|
|
; WIN32-LABEL: ldexp_f32:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %eax
|
|
; WIN32-NEXT: movzbl {{[0-9]+}}(%esp), %ecx
|
|
; WIN32-NEXT: cmpl $381, %ecx # imm = 0x17D
|
|
; WIN32-NEXT: movl %ecx, %eax
|
|
; WIN32-NEXT: jl LBB0_2
|
|
; WIN32-NEXT: # %bb.1:
|
|
; WIN32-NEXT: movl $381, %eax # imm = 0x17D
|
|
; WIN32-NEXT: LBB0_2:
|
|
; WIN32-NEXT: addl $-254, %eax
|
|
; WIN32-NEXT: leal -127(%ecx), %edx
|
|
; WIN32-NEXT: cmpl $255, %ecx
|
|
; WIN32-NEXT: jae LBB0_4
|
|
; WIN32-NEXT: # %bb.3:
|
|
; WIN32-NEXT: movl %edx, %eax
|
|
; WIN32-NEXT: LBB0_4:
|
|
; WIN32-NEXT: flds __real@7f800000
|
|
; WIN32-NEXT: flds __real@7f000000
|
|
; WIN32-NEXT: jae LBB0_6
|
|
; WIN32-NEXT: # %bb.5:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB0_6:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $-329, %ecx # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %ecx, %edx
|
|
; WIN32-NEXT: jge LBB0_8
|
|
; WIN32-NEXT: # %bb.7:
|
|
; WIN32-NEXT: movl $-330, %edx # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB0_8:
|
|
; WIN32-NEXT: cmpl $-228, %ecx
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: flds __real@0c800000
|
|
; WIN32-NEXT: jb LBB0_9
|
|
; WIN32-NEXT: # %bb.10:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: leal 102(%ecx), %edx
|
|
; WIN32-NEXT: cmpl $-126, %ecx
|
|
; WIN32-NEXT: jge LBB0_12
|
|
; WIN32-NEXT: jmp LBB0_13
|
|
; WIN32-NEXT: LBB0_9:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: addl $204, %edx
|
|
; WIN32-NEXT: cmpl $-126, %ecx
|
|
; WIN32-NEXT: jl LBB0_13
|
|
; WIN32-NEXT: LBB0_12:
|
|
; WIN32-NEXT: movl %ecx, %edx
|
|
; WIN32-NEXT: LBB0_13:
|
|
; WIN32-NEXT: fld1
|
|
; WIN32-NEXT: jl LBB0_15
|
|
; WIN32-NEXT: # %bb.14:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB0_15:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $127, %ecx
|
|
; WIN32-NEXT: jg LBB0_17
|
|
; WIN32-NEXT: # %bb.16:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: movl %edx, %eax
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB0_17:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: shll $23, %eax
|
|
; WIN32-NEXT: addl $1065353216, %eax # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %eax, (%esp)
|
|
; WIN32-NEXT: fmuls (%esp)
|
|
; WIN32-NEXT: popl %eax
|
|
; WIN32-NEXT: retl
|
|
%zext = zext i8 %x to i32
|
|
%ldexp = call float @llvm.ldexp.f32.i32(float 1.000000e+00, i32 %zext)
|
|
ret float %ldexp
|
|
}
|
|
|
|
define double @ldexp_f64(i8 zeroext %x) {
|
|
; X64-LABEL: ldexp_f64:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: movsd {{.*#+}} xmm0 = [1.0E+0,0.0E+0]
|
|
; X64-NEXT: jmp ldexp@PLT # TAILCALL
|
|
;
|
|
; WIN32-LABEL: ldexp_f64:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: subl $12, %esp
|
|
; WIN32-NEXT: movzbl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fld1
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: addl $12, %esp
|
|
; WIN32-NEXT: retl
|
|
%zext = zext i8 %x to i32
|
|
%ldexp = call double @llvm.ldexp.f64.i32(double 1.000000e+00, i32 %zext)
|
|
ret double %ldexp
|
|
}
|
|
|
|
define <2 x float> @ldexp_v2f32(<2 x float> %val, <2 x i32> %exp) {
|
|
; X64-LABEL: ldexp_v2f32:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: subq $56, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 64
|
|
; X64-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
|
|
; X64-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = mem[1,1,1,1]
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
|
|
; X64-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
|
|
; X64-NEXT: movaps %xmm1, %xmm0
|
|
; X64-NEXT: addq $56, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 8
|
|
; X64-NEXT: retq
|
|
;
|
|
; WIN32-LABEL: ldexp_v2f32:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %edi
|
|
; WIN32-NEXT: pushl %esi
|
|
; WIN32-NEXT: subl $8, %esp
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: cmpl $-329, %eax # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %eax, %edx
|
|
; WIN32-NEXT: jge LBB2_2
|
|
; WIN32-NEXT: # %bb.1:
|
|
; WIN32-NEXT: movl $-330, %edx # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB2_2:
|
|
; WIN32-NEXT: addl $204, %edx
|
|
; WIN32-NEXT: leal 102(%eax), %ecx
|
|
; WIN32-NEXT: cmpl $-228, %eax
|
|
; WIN32-NEXT: jb LBB2_4
|
|
; WIN32-NEXT: # %bb.3:
|
|
; WIN32-NEXT: movl %ecx, %edx
|
|
; WIN32-NEXT: LBB2_4:
|
|
; WIN32-NEXT: flds __real@0c800000
|
|
; WIN32-NEXT: fld %st(1)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: jb LBB2_6
|
|
; WIN32-NEXT: # %bb.5:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB2_6:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: cmpl $-126, %eax
|
|
; WIN32-NEXT: jl LBB2_8
|
|
; WIN32-NEXT: # %bb.7:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fld %st(1)
|
|
; WIN32-NEXT: movl %eax, %edx
|
|
; WIN32-NEXT: LBB2_8:
|
|
; WIN32-NEXT: cmpl $381, %eax # imm = 0x17D
|
|
; WIN32-NEXT: movl %eax, %esi
|
|
; WIN32-NEXT: jl LBB2_10
|
|
; WIN32-NEXT: # %bb.9:
|
|
; WIN32-NEXT: movl $381, %esi # imm = 0x17D
|
|
; WIN32-NEXT: LBB2_10:
|
|
; WIN32-NEXT: flds __real@7f000000
|
|
; WIN32-NEXT: fmul %st, %st(3)
|
|
; WIN32-NEXT: fld %st(3)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: leal -127(%eax), %ecx
|
|
; WIN32-NEXT: cmpl $255, %eax
|
|
; WIN32-NEXT: jae LBB2_11
|
|
; WIN32-NEXT: # %bb.12:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: jmp LBB2_13
|
|
; WIN32-NEXT: LBB2_11:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: addl $-254, %esi
|
|
; WIN32-NEXT: movl %esi, %ecx
|
|
; WIN32-NEXT: LBB2_13:
|
|
; WIN32-NEXT: cmpl $127, %eax
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; WIN32-NEXT: jg LBB2_15
|
|
; WIN32-NEXT: # %bb.14:
|
|
; WIN32-NEXT: movl %edx, %ecx
|
|
; WIN32-NEXT: LBB2_15:
|
|
; WIN32-NEXT: cmpl $381, %esi # imm = 0x17D
|
|
; WIN32-NEXT: movl %esi, %edx
|
|
; WIN32-NEXT: jl LBB2_17
|
|
; WIN32-NEXT: # %bb.16:
|
|
; WIN32-NEXT: movl $381, %edx # imm = 0x17D
|
|
; WIN32-NEXT: LBB2_17:
|
|
; WIN32-NEXT: addl $-254, %edx
|
|
; WIN32-NEXT: leal -127(%esi), %edi
|
|
; WIN32-NEXT: cmpl $255, %esi
|
|
; WIN32-NEXT: jae LBB2_19
|
|
; WIN32-NEXT: # %bb.18:
|
|
; WIN32-NEXT: movl %edi, %edx
|
|
; WIN32-NEXT: LBB2_19:
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: fmul %st, %st(2)
|
|
; WIN32-NEXT: jae LBB2_21
|
|
; WIN32-NEXT: # %bb.20:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB2_21:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $-329, %esi # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %esi, %edi
|
|
; WIN32-NEXT: jge LBB2_23
|
|
; WIN32-NEXT: # %bb.22:
|
|
; WIN32-NEXT: movl $-330, %edi # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB2_23:
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(4), %st
|
|
; WIN32-NEXT: fmul %st, %st(4)
|
|
; WIN32-NEXT: cmpl $-228, %esi
|
|
; WIN32-NEXT: jb LBB2_24
|
|
; WIN32-NEXT: # %bb.25:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: leal 102(%esi), %edi
|
|
; WIN32-NEXT: cmpl $-126, %esi
|
|
; WIN32-NEXT: jge LBB2_27
|
|
; WIN32-NEXT: jmp LBB2_28
|
|
; WIN32-NEXT: LBB2_24:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: addl $204, %edi
|
|
; WIN32-NEXT: cmpl $-126, %esi
|
|
; WIN32-NEXT: jl LBB2_28
|
|
; WIN32-NEXT: LBB2_27:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: movl %esi, %edi
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB2_28:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $127, %esi
|
|
; WIN32-NEXT: jg LBB2_30
|
|
; WIN32-NEXT: # %bb.29:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: movl %edi, %edx
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(2)
|
|
; WIN32-NEXT: LBB2_30:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: cmpl $127, %eax
|
|
; WIN32-NEXT: jg LBB2_32
|
|
; WIN32-NEXT: # %bb.31:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB2_32:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: shll $23, %ecx
|
|
; WIN32-NEXT: addl $1065353216, %ecx # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %ecx, (%esp)
|
|
; WIN32-NEXT: shll $23, %edx
|
|
; WIN32-NEXT: addl $1065353216, %edx # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fmuls (%esp)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: addl $8, %esp
|
|
; WIN32-NEXT: popl %esi
|
|
; WIN32-NEXT: popl %edi
|
|
; WIN32-NEXT: retl
|
|
%1 = call <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float> %val, <2 x i32> %exp)
|
|
ret <2 x float> %1
|
|
}
|
|
|
|
define <4 x float> @ldexp_v4f32(<4 x float> %val, <4 x i32> %exp) {
|
|
; X64-LABEL: ldexp_v4f32:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: subq $72, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 80
|
|
; X64-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[3,3,3,3]
|
|
; X64-NEXT: pshufd {{.*#+}} xmm2 = xmm1[3,3,3,3]
|
|
; X64-NEXT: movd %xmm2, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
|
|
; X64-NEXT: pshufd $238, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = mem[2,3,2,3]
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: unpcklps (%rsp), %xmm0 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm0 = xmm0[0],mem[0],xmm0[1],mem[1]
|
|
; X64-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: movdqa {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movd %xmm0, %edi
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: shufps {{.*#+}} xmm0 = xmm0[1,1,1,1]
|
|
; X64-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = mem[1,1,1,1]
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
|
|
; X64-NEXT: unpcklps {{.*#+}} xmm1 = xmm1[0],xmm0[0],xmm1[1],xmm0[1]
|
|
; X64-NEXT: unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = xmm1[0],mem[0]
|
|
; X64-NEXT: movaps %xmm1, %xmm0
|
|
; X64-NEXT: addq $72, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 8
|
|
; X64-NEXT: retq
|
|
;
|
|
; WIN32-LABEL: ldexp_v4f32:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %ebp
|
|
; WIN32-NEXT: pushl %ebx
|
|
; WIN32-NEXT: pushl %edi
|
|
; WIN32-NEXT: pushl %esi
|
|
; WIN32-NEXT: subl $32, %esp
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ecx
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: flds __real@7f000000
|
|
; WIN32-NEXT: fld %st(1)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: cmpl $255, %ecx
|
|
; WIN32-NEXT: jae LBB3_2
|
|
; WIN32-NEXT: # %bb.1:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_2:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: cmpl $-329, %ecx # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %ecx, %esi
|
|
; WIN32-NEXT: jge LBB3_4
|
|
; WIN32-NEXT: # %bb.3:
|
|
; WIN32-NEXT: movl $-330, %esi # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB3_4:
|
|
; WIN32-NEXT: addl $204, %esi
|
|
; WIN32-NEXT: leal 102(%ecx), %eax
|
|
; WIN32-NEXT: cmpl $-228, %ecx
|
|
; WIN32-NEXT: jb LBB3_6
|
|
; WIN32-NEXT: # %bb.5:
|
|
; WIN32-NEXT: movl %eax, %esi
|
|
; WIN32-NEXT: LBB3_6:
|
|
; WIN32-NEXT: flds __real@0c800000
|
|
; WIN32-NEXT: fld %st(3)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: jb LBB3_8
|
|
; WIN32-NEXT: # %bb.7:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_8:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: cmpl $-126, %ecx
|
|
; WIN32-NEXT: jl LBB3_10
|
|
; WIN32-NEXT: # %bb.9:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(4)
|
|
; WIN32-NEXT: LBB3_10:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
|
|
; WIN32-NEXT: movl %ecx, %edx
|
|
; WIN32-NEXT: subl $127, %edx
|
|
; WIN32-NEXT: jg LBB3_12
|
|
; WIN32-NEXT: # %bb.11:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(3)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_12:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: fld %st(3)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(3), %st
|
|
; WIN32-NEXT: cmpl $255, %edi
|
|
; WIN32-NEXT: jae LBB3_14
|
|
; WIN32-NEXT: # %bb.13:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_14:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
|
|
; WIN32-NEXT: cmpl $-329, %edi # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %edi, %eax
|
|
; WIN32-NEXT: jge LBB3_16
|
|
; WIN32-NEXT: # %bb.15:
|
|
; WIN32-NEXT: movl $-330, %eax # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB3_16:
|
|
; WIN32-NEXT: fld %st(3)
|
|
; WIN32-NEXT: fmul %st(3), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(4), %st
|
|
; WIN32-NEXT: cmpl $-228, %edi
|
|
; WIN32-NEXT: jb LBB3_17
|
|
; WIN32-NEXT: # %bb.18:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: leal 102(%edi), %eax
|
|
; WIN32-NEXT: cmpl $-126, %edi
|
|
; WIN32-NEXT: jge LBB3_20
|
|
; WIN32-NEXT: jmp LBB3_21
|
|
; WIN32-NEXT: LBB3_17:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: addl $204, %eax
|
|
; WIN32-NEXT: cmpl $-126, %edi
|
|
; WIN32-NEXT: jl LBB3_21
|
|
; WIN32-NEXT: LBB3_20:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: movl %edi, %eax
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(4)
|
|
; WIN32-NEXT: LBB3_21:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: movl %eax, (%esp) # 4-byte Spill
|
|
; WIN32-NEXT: movl %edi, %ebx
|
|
; WIN32-NEXT: subl $127, %ebx
|
|
; WIN32-NEXT: jg LBB3_23
|
|
; WIN32-NEXT: # %bb.22:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(3)
|
|
; WIN32-NEXT: LBB3_23:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: cmpl $381, %edi # imm = 0x17D
|
|
; WIN32-NEXT: movl %edi, %eax
|
|
; WIN32-NEXT: jge LBB3_24
|
|
; WIN32-NEXT: # %bb.25:
|
|
; WIN32-NEXT: cmpl $255, %edi
|
|
; WIN32-NEXT: jae LBB3_26
|
|
; WIN32-NEXT: LBB3_27:
|
|
; WIN32-NEXT: cmpl $-126, %ecx
|
|
; WIN32-NEXT: jl LBB3_29
|
|
; WIN32-NEXT: LBB3_28:
|
|
; WIN32-NEXT: movl %ecx, %esi
|
|
; WIN32-NEXT: LBB3_29:
|
|
; WIN32-NEXT: cmpl $381, %ecx # imm = 0x17D
|
|
; WIN32-NEXT: movl %ecx, %eax
|
|
; WIN32-NEXT: jl LBB3_31
|
|
; WIN32-NEXT: # %bb.30:
|
|
; WIN32-NEXT: movl $381, %eax # imm = 0x17D
|
|
; WIN32-NEXT: LBB3_31:
|
|
; WIN32-NEXT: cmpl $255, %ecx
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ebp
|
|
; WIN32-NEXT: jb LBB3_33
|
|
; WIN32-NEXT: # %bb.32:
|
|
; WIN32-NEXT: addl $-254, %eax
|
|
; WIN32-NEXT: movl %eax, %edx
|
|
; WIN32-NEXT: LBB3_33:
|
|
; WIN32-NEXT: fxch %st(3)
|
|
; WIN32-NEXT: fstps {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill
|
|
; WIN32-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill
|
|
; WIN32-NEXT: cmpl $381, %ebp # imm = 0x17D
|
|
; WIN32-NEXT: movl %ebp, %eax
|
|
; WIN32-NEXT: jl LBB3_35
|
|
; WIN32-NEXT: # %bb.34:
|
|
; WIN32-NEXT: movl $381, %eax # imm = 0x17D
|
|
; WIN32-NEXT: LBB3_35:
|
|
; WIN32-NEXT: fld %st(2)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(2), %st
|
|
; WIN32-NEXT: leal -127(%ebp), %edi
|
|
; WIN32-NEXT: cmpl $255, %ebp
|
|
; WIN32-NEXT: jae LBB3_36
|
|
; WIN32-NEXT: # %bb.37:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: jmp LBB3_38
|
|
; WIN32-NEXT: LBB3_24:
|
|
; WIN32-NEXT: movl $381, %eax # imm = 0x17D
|
|
; WIN32-NEXT: cmpl $255, %edi
|
|
; WIN32-NEXT: jb LBB3_27
|
|
; WIN32-NEXT: LBB3_26:
|
|
; WIN32-NEXT: addl $-254, %eax
|
|
; WIN32-NEXT: movl %eax, %ebx
|
|
; WIN32-NEXT: cmpl $-126, %ecx
|
|
; WIN32-NEXT: jge LBB3_28
|
|
; WIN32-NEXT: jmp LBB3_29
|
|
; WIN32-NEXT: LBB3_36:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: addl $-254, %eax
|
|
; WIN32-NEXT: movl %eax, %edi
|
|
; WIN32-NEXT: LBB3_38:
|
|
; WIN32-NEXT: cmpl $-329, %ebp # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %ebp, %ecx
|
|
; WIN32-NEXT: jge LBB3_40
|
|
; WIN32-NEXT: # %bb.39:
|
|
; WIN32-NEXT: movl $-330, %ecx # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB3_40:
|
|
; WIN32-NEXT: addl $204, %ecx
|
|
; WIN32-NEXT: leal 102(%ebp), %eax
|
|
; WIN32-NEXT: cmpl $-228, %ebp
|
|
; WIN32-NEXT: jb LBB3_42
|
|
; WIN32-NEXT: # %bb.41:
|
|
; WIN32-NEXT: movl %eax, %ecx
|
|
; WIN32-NEXT: LBB3_42:
|
|
; WIN32-NEXT: fld %st(3)
|
|
; WIN32-NEXT: fmul %st(3), %st
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(4), %st
|
|
; WIN32-NEXT: jb LBB3_44
|
|
; WIN32-NEXT: # %bb.43:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_44:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: cmpl $-126, %ebp
|
|
; WIN32-NEXT: jl LBB3_46
|
|
; WIN32-NEXT: # %bb.45:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: movl %ebp, %ecx
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(4)
|
|
; WIN32-NEXT: LBB3_46:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: cmpl $127, %ebp
|
|
; WIN32-NEXT: flds {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; WIN32-NEXT: jg LBB3_48
|
|
; WIN32-NEXT: # %bb.47:
|
|
; WIN32-NEXT: movl %ecx, %edi
|
|
; WIN32-NEXT: LBB3_48:
|
|
; WIN32-NEXT: cmpl $381, %esi # imm = 0x17D
|
|
; WIN32-NEXT: movl %esi, %ecx
|
|
; WIN32-NEXT: jl LBB3_50
|
|
; WIN32-NEXT: # %bb.49:
|
|
; WIN32-NEXT: movl $381, %ecx # imm = 0x17D
|
|
; WIN32-NEXT: LBB3_50:
|
|
; WIN32-NEXT: addl $-254, %ecx
|
|
; WIN32-NEXT: leal -127(%esi), %eax
|
|
; WIN32-NEXT: cmpl $255, %esi
|
|
; WIN32-NEXT: jae LBB3_52
|
|
; WIN32-NEXT: # %bb.51:
|
|
; WIN32-NEXT: movl %eax, %ecx
|
|
; WIN32-NEXT: LBB3_52:
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(3), %st
|
|
; WIN32-NEXT: fmul %st, %st(3)
|
|
; WIN32-NEXT: jae LBB3_54
|
|
; WIN32-NEXT: # %bb.53:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB3_54:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $-329, %esi # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %esi, %eax
|
|
; WIN32-NEXT: jge LBB3_56
|
|
; WIN32-NEXT: # %bb.55:
|
|
; WIN32-NEXT: movl $-330, %eax # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB3_56:
|
|
; WIN32-NEXT: fld %st(0)
|
|
; WIN32-NEXT: fmul %st(4), %st
|
|
; WIN32-NEXT: fmul %st, %st(4)
|
|
; WIN32-NEXT: cmpl $-228, %esi
|
|
; WIN32-NEXT: jb LBB3_57
|
|
; WIN32-NEXT: # %bb.58:
|
|
; WIN32-NEXT: fstp %st(4)
|
|
; WIN32-NEXT: leal 102(%esi), %eax
|
|
; WIN32-NEXT: cmpl $-126, %esi
|
|
; WIN32-NEXT: jge LBB3_60
|
|
; WIN32-NEXT: jmp LBB3_61
|
|
; WIN32-NEXT: LBB3_57:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: addl $204, %eax
|
|
; WIN32-NEXT: cmpl $-126, %esi
|
|
; WIN32-NEXT: jl LBB3_61
|
|
; WIN32-NEXT: LBB3_60:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: movl %esi, %eax
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB3_61:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $127, %esi
|
|
; WIN32-NEXT: jg LBB3_63
|
|
; WIN32-NEXT: # %bb.62:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: movl %eax, %ecx
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(2)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB3_63:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: cmpl $127, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: jg LBB3_65
|
|
; WIN32-NEXT: # %bb.64:
|
|
; WIN32-NEXT: movl (%esp), %ebx # 4-byte Reload
|
|
; WIN32-NEXT: LBB3_65:
|
|
; WIN32-NEXT: cmpl $127, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
|
|
; WIN32-NEXT: jg LBB3_67
|
|
; WIN32-NEXT: # %bb.66:
|
|
; WIN32-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Reload
|
|
; WIN32-NEXT: LBB3_67:
|
|
; WIN32-NEXT: cmpl $127, %ebp
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: jg LBB3_69
|
|
; WIN32-NEXT: # %bb.68:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(3)
|
|
; WIN32-NEXT: fxch %st(2)
|
|
; WIN32-NEXT: LBB3_69:
|
|
; WIN32-NEXT: fstp %st(3)
|
|
; WIN32-NEXT: shll $23, %edi
|
|
; WIN32-NEXT: addl $1065353216, %edi # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %edi, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: shll $23, %ecx
|
|
; WIN32-NEXT: addl $1065353216, %ecx # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %ecx, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: shll $23, %ebx
|
|
; WIN32-NEXT: addl $1065353216, %ebx # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %ebx, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: shll $23, %edx
|
|
; WIN32-NEXT: addl $1065353216, %edx # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %edx, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fxch %st(3)
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstps 12(%eax)
|
|
; WIN32-NEXT: fxch %st(2)
|
|
; WIN32-NEXT: fstps 8(%eax)
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: fstps 4(%eax)
|
|
; WIN32-NEXT: fstps (%eax)
|
|
; WIN32-NEXT: addl $32, %esp
|
|
; WIN32-NEXT: popl %esi
|
|
; WIN32-NEXT: popl %edi
|
|
; WIN32-NEXT: popl %ebx
|
|
; WIN32-NEXT: popl %ebp
|
|
; WIN32-NEXT: retl
|
|
%1 = call <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float> %val, <4 x i32> %exp)
|
|
ret <4 x float> %1
|
|
}
|
|
|
|
define <2 x double> @ldexp_v2f64(<2 x double> %val, <2 x i32> %exp) {
|
|
; X64-LABEL: ldexp_v2f64:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: subq $56, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 64
|
|
; X64-NEXT: movdqa %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
|
|
; X64-NEXT: pshufd $85, {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = mem[1,1,1,1]
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
|
|
; X64-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
|
|
; X64-NEXT: movaps %xmm1, %xmm0
|
|
; X64-NEXT: addq $56, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 8
|
|
; X64-NEXT: retq
|
|
;
|
|
; WIN32-LABEL: ldexp_v2f64:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %esi
|
|
; WIN32-NEXT: subl $28, %esp
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl %esi, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: addl $28, %esp
|
|
; WIN32-NEXT: popl %esi
|
|
; WIN32-NEXT: retl
|
|
%1 = call <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double> %val, <2 x i32> %exp)
|
|
ret <2 x double> %1
|
|
}
|
|
|
|
define <4 x double> @ldexp_v4f64(<4 x double> %val, <4 x i32> %exp) {
|
|
; X64-LABEL: ldexp_v4f64:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: pushq %rbp
|
|
; X64-NEXT: .cfi_def_cfa_offset 16
|
|
; X64-NEXT: pushq %rbx
|
|
; X64-NEXT: .cfi_def_cfa_offset 24
|
|
; X64-NEXT: subq $72, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 96
|
|
; X64-NEXT: .cfi_offset %rbx, -24
|
|
; X64-NEXT: .cfi_offset %rbp, -16
|
|
; X64-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movdqa %xmm2, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm2[2,3,2,3]
|
|
; X64-NEXT: movd %xmm1, %ebx
|
|
; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm2[3,3,3,3]
|
|
; X64-NEXT: movd %xmm1, %ebp
|
|
; X64-NEXT: movd %xmm2, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
|
|
; X64-NEXT: pshufd $85, (%rsp), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = mem[1,1,1,1]
|
|
; X64-NEXT: movd %xmm1, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload
|
|
; X64-NEXT: movlhps {{.*#+}} xmm1 = xmm1[0],xmm0[0]
|
|
; X64-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movhlps {{.*#+}} xmm0 = xmm0[1,1]
|
|
; X64-NEXT: movl %ebp, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: movl %ebx, %edi
|
|
; X64-NEXT: callq ldexp@PLT
|
|
; X64-NEXT: movaps %xmm0, %xmm1
|
|
; X64-NEXT: unpcklpd (%rsp), %xmm1 # 16-byte Folded Reload
|
|
; X64-NEXT: # xmm1 = xmm1[0],mem[0]
|
|
; X64-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 16-byte Reload
|
|
; X64-NEXT: addq $72, %rsp
|
|
; X64-NEXT: .cfi_def_cfa_offset 24
|
|
; X64-NEXT: popq %rbx
|
|
; X64-NEXT: .cfi_def_cfa_offset 16
|
|
; X64-NEXT: popq %rbp
|
|
; X64-NEXT: .cfi_def_cfa_offset 8
|
|
; X64-NEXT: retq
|
|
;
|
|
; WIN32-LABEL: ldexp_v4f64:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %ebp
|
|
; WIN32-NEXT: pushl %ebx
|
|
; WIN32-NEXT: pushl %edi
|
|
; WIN32-NEXT: pushl %esi
|
|
; WIN32-NEXT: subl $44, %esp
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %esi
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ebx
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %ebp
|
|
; WIN32-NEXT: fldl {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: movl %eax, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl %ebp, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl %ebx, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fstpl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Spill
|
|
; WIN32-NEXT: movl %edi, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl (%esp)
|
|
; WIN32-NEXT: calll _ldexp
|
|
; WIN32-NEXT: fstpl 24(%esi)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl 16(%esi)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl 8(%esi)
|
|
; WIN32-NEXT: fldl {{[-0-9]+}}(%e{{[sb]}}p) # 8-byte Folded Reload
|
|
; WIN32-NEXT: fstpl (%esi)
|
|
; WIN32-NEXT: movl %esi, %eax
|
|
; WIN32-NEXT: addl $44, %esp
|
|
; WIN32-NEXT: popl %esi
|
|
; WIN32-NEXT: popl %edi
|
|
; WIN32-NEXT: popl %ebx
|
|
; WIN32-NEXT: popl %ebp
|
|
; WIN32-NEXT: retl
|
|
%1 = call <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double> %val, <4 x i32> %exp)
|
|
ret <4 x double> %1
|
|
}
|
|
|
|
define half @ldexp_f16(half %arg0, i32 %arg1) {
|
|
; X64-LABEL: ldexp_f16:
|
|
; X64: # %bb.0:
|
|
; X64-NEXT: pushq %rbx
|
|
; X64-NEXT: .cfi_def_cfa_offset 16
|
|
; X64-NEXT: .cfi_offset %rbx, -16
|
|
; X64-NEXT: movl %edi, %ebx
|
|
; X64-NEXT: callq __extendhfsf2@PLT
|
|
; X64-NEXT: movl %ebx, %edi
|
|
; X64-NEXT: callq ldexpf@PLT
|
|
; X64-NEXT: callq __truncsfhf2@PLT
|
|
; X64-NEXT: popq %rbx
|
|
; X64-NEXT: .cfi_def_cfa_offset 8
|
|
; X64-NEXT: retq
|
|
;
|
|
; WIN32-LABEL: ldexp_f16:
|
|
; WIN32: # %bb.0:
|
|
; WIN32-NEXT: pushl %edi
|
|
; WIN32-NEXT: pushl %esi
|
|
; WIN32-NEXT: subl $8, %esp
|
|
; WIN32-NEXT: movl {{[0-9]+}}(%esp), %edi
|
|
; WIN32-NEXT: movzwl {{[0-9]+}}(%esp), %eax
|
|
; WIN32-NEXT: movl %eax, (%esp)
|
|
; WIN32-NEXT: cmpl $381, %edi # imm = 0x17D
|
|
; WIN32-NEXT: movl %edi, %esi
|
|
; WIN32-NEXT: jl LBB6_2
|
|
; WIN32-NEXT: # %bb.1:
|
|
; WIN32-NEXT: movl $381, %esi # imm = 0x17D
|
|
; WIN32-NEXT: LBB6_2:
|
|
; WIN32-NEXT: addl $-254, %esi
|
|
; WIN32-NEXT: calll ___gnu_h2f_ieee
|
|
; WIN32-NEXT: leal -127(%edi), %eax
|
|
; WIN32-NEXT: cmpl $255, %edi
|
|
; WIN32-NEXT: jae LBB6_4
|
|
; WIN32-NEXT: # %bb.3:
|
|
; WIN32-NEXT: movl %eax, %esi
|
|
; WIN32-NEXT: LBB6_4:
|
|
; WIN32-NEXT: flds __real@7f000000
|
|
; WIN32-NEXT: fld %st(1)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fmul %st, %st(1)
|
|
; WIN32-NEXT: jae LBB6_6
|
|
; WIN32-NEXT: # %bb.5:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: LBB6_6:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: cmpl $-329, %edi # imm = 0xFEB7
|
|
; WIN32-NEXT: movl %edi, %eax
|
|
; WIN32-NEXT: jge LBB6_8
|
|
; WIN32-NEXT: # %bb.7:
|
|
; WIN32-NEXT: movl $-330, %eax # imm = 0xFEB6
|
|
; WIN32-NEXT: LBB6_8:
|
|
; WIN32-NEXT: flds __real@0c800000
|
|
; WIN32-NEXT: fld %st(2)
|
|
; WIN32-NEXT: fmul %st(1), %st
|
|
; WIN32-NEXT: fmul %st, %st(1)
|
|
; WIN32-NEXT: cmpl $-228, %edi
|
|
; WIN32-NEXT: jb LBB6_9
|
|
; WIN32-NEXT: # %bb.10:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: leal 102(%edi), %eax
|
|
; WIN32-NEXT: cmpl $-126, %edi
|
|
; WIN32-NEXT: jge LBB6_12
|
|
; WIN32-NEXT: jmp LBB6_13
|
|
; WIN32-NEXT: LBB6_9:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: addl $204, %eax
|
|
; WIN32-NEXT: cmpl $-126, %edi
|
|
; WIN32-NEXT: jl LBB6_13
|
|
; WIN32-NEXT: LBB6_12:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: movl %edi, %eax
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(2)
|
|
; WIN32-NEXT: LBB6_13:
|
|
; WIN32-NEXT: fstp %st(2)
|
|
; WIN32-NEXT: cmpl $127, %edi
|
|
; WIN32-NEXT: jg LBB6_15
|
|
; WIN32-NEXT: # %bb.14:
|
|
; WIN32-NEXT: fstp %st(0)
|
|
; WIN32-NEXT: movl %eax, %esi
|
|
; WIN32-NEXT: fldz
|
|
; WIN32-NEXT: fxch %st(1)
|
|
; WIN32-NEXT: LBB6_15:
|
|
; WIN32-NEXT: fstp %st(1)
|
|
; WIN32-NEXT: shll $23, %esi
|
|
; WIN32-NEXT: addl $1065353216, %esi # imm = 0x3F800000
|
|
; WIN32-NEXT: movl %esi, {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fmuls {{[0-9]+}}(%esp)
|
|
; WIN32-NEXT: fstps (%esp)
|
|
; WIN32-NEXT: calll ___gnu_f2h_ieee
|
|
; WIN32-NEXT: addl $8, %esp
|
|
; WIN32-NEXT: popl %esi
|
|
; WIN32-NEXT: popl %edi
|
|
; WIN32-NEXT: retl
|
|
%ldexp = call half @llvm.ldexp.f16.i32(half %arg0, i32 %arg1)
|
|
ret half %ldexp
|
|
}
|
|
|
|
declare double @llvm.ldexp.f64.i32(double, i32) #0
|
|
declare float @llvm.ldexp.f32.i32(float, i32) #0
|
|
declare <2 x float> @llvm.ldexp.v2f32.v2i32(<2 x float>, <2 x i32>) #0
|
|
declare <4 x float> @llvm.ldexp.v4f32.v4i32(<4 x float>, <4 x i32>) #0
|
|
declare <2 x double> @llvm.ldexp.v2f64.v2i32(<2 x double>, <2 x i32>) #0
|
|
declare <4 x double> @llvm.ldexp.v4f64.v4i32(<4 x double>, <4 x i32>) #0
|
|
declare half @llvm.ldexp.f16.i32(half, i32) #0
|
|
|
|
attributes #0 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }
|
|
attributes #1 = { nocallback nofree nosync nounwind willreturn memory(inaccessiblemem: readwrite) }
|