diff --git a/llvm/lib/Target/X86/X86ISelLowering.cpp b/llvm/lib/Target/X86/X86ISelLowering.cpp index 1de4ffa33e960..712db68314e6e 100644 --- a/llvm/lib/Target/X86/X86ISelLowering.cpp +++ b/llvm/lib/Target/X86/X86ISelLowering.cpp @@ -22536,10 +22536,14 @@ X86TargetLowering::LowerFP_TO_INT_SAT(SDValue Op, SelectionDAG &DAG) const { // result type of the fptoi instructions, INDVAL coincides with integer // minimum, so we don't need to explicitly check it. if (!IsSigned || SatWidth != TmpVT.getScalarSizeInBits()) { - // If Src ULT MinFloat, select MinInt. In particular, this also selects - // MinInt if Src is NaN. - Select = DAG.getSelectCC( - dl, Src, MinFloatNode, MinIntNode, Select, ISD::CondCode::SETULT); + // If Src is less than MinFloat, select MinInt. An unordered comparison + // also selects MinInt for NaN, which is correct except when signed and + // promoted to a wider TmpVT: there MinInt != 0, but the earlier + // truncation already mapped NaN to the correct 0, so use an ordered + // comparison to leave it alone. + ISD::CondCode MinCC = (IsSigned && DstVT != TmpVT) ? ISD::CondCode::SETOLT + : ISD::CondCode::SETULT; + Select = DAG.getSelectCC(dl, Src, MinFloatNode, MinIntNode, Select, MinCC); } // If Src OGT MaxFloat, select MaxInt. diff --git a/llvm/test/CodeGen/X86/fptosi-sat-scalar-f16.ll b/llvm/test/CodeGen/X86/fptosi-sat-scalar-f16.ll new file mode 100644 index 0000000000000..1079a7baab2b9 --- /dev/null +++ b/llvm/test/CodeGen/X86/fptosi-sat-scalar-f16.ll @@ -0,0 +1,1298 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py +; RUN: llc < %s -mtriple=i686-linux | FileCheck %s --check-prefix=X86-X87 +; RUN: llc < %s -mtriple=i686-linux -mattr=+sse2 | FileCheck %s --check-prefix=X86-SSE +; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X64 +; RUN: llc < %s -mtriple=x86_64-linux -mattr=+avx512fp16 | FileCheck %s --check-prefix=X64-AVX512FP16 + +; +; 16-bit float to signed integer +; + +; FIXME: Can be optimizated with maxss + minss +define i1 @test_signed_i1_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i1_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: pushl %ebx +; X86-X87-NEXT: subl $24, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fists {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fld1 +; X86-X87-NEXT: fchs +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movb $-1, %dl +; X86-X87-NEXT: jb .LBB0_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx +; X86-X87-NEXT: .LBB0_2: +; X86-X87-NEXT: fldz +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %ebx +; X86-X87-NEXT: ja .LBB0_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %edx, %ebx +; X86-X87-NEXT: .LBB0_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jp .LBB0_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %ebx, %ecx +; X86-X87-NEXT: .LBB0_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $24, %esp +; X86-X87-NEXT: popl %ebx +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i1_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: xorps %xmm1, %xmm1 +; X86-SSE-NEXT: minss %xmm0, %xmm1 +; X86-SSE-NEXT: cvttss2si %xmm1, %ecx +; X86-SSE-NEXT: cmovnpl %ecx, %eax +; X86-SSE-NEXT: # kill: def $al killed $al killed $eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i1_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: xorps %xmm1, %xmm1 +; X64-NEXT: minss %xmm0, %xmm1 +; X64-NEXT: cvttss2si %xmm1, %ecx +; X64-NEXT: cmovnpl %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i1_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vmovsh {{.*#+}} xmm1 = [-1.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0] +; X64-AVX512FP16-NEXT: vmaxsh %xmm0, %xmm1, %xmm0 +; X64-AVX512FP16-NEXT: vxorps %xmm1, %xmm1, %xmm1 +; X64-AVX512FP16-NEXT: vminsh %xmm0, %xmm1, %xmm0 +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: # kill: def $al killed $al killed $eax +; X64-AVX512FP16-NEXT: retq + %x = call i1 @llvm.fptosi.sat.i1.f16(half %f) + ret i1 %x +} + +; FIXME: Can be optimizated with maxss + minss +define i8 @test_signed_i8_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i8_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: subl $12, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fists {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movb $-128, %dl +; X86-X87-NEXT: jb .LBB1_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx +; X86-X87-NEXT: .LBB1_2: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movb $127, %cl +; X86-X87-NEXT: ja .LBB1_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %edx, %ecx +; X86-X87-NEXT: .LBB1_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jnp .LBB1_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: .LBB1_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $12, %esp +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i8_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: cvttss2si %xmm0, %ecx +; X86-SSE-NEXT: cmovnpl %ecx, %eax +; X86-SSE-NEXT: # kill: def $al killed $al killed $eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i8_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cvttss2si %xmm0, %ecx +; X64-NEXT: cmovnpl %ecx, %eax +; X64-NEXT: # kill: def $al killed $al killed $eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i8_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vmovsh {{.*#+}} xmm1 = [-1.28E+2,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0] +; X64-AVX512FP16-NEXT: vmaxsh %xmm0, %xmm1, %xmm0 +; X64-AVX512FP16-NEXT: vmovsh {{.*#+}} xmm1 = [1.27E+2,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0] +; X64-AVX512FP16-NEXT: vminsh %xmm0, %xmm1, %xmm0 +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: # kill: def $al killed $al killed $eax +; X64-AVX512FP16-NEXT: retq + %x = call i8 @llvm.fptosi.sat.i8.f16(half %f) + ret i8 %x +} + +; FIXME: Can be optimizated with maxss + minss +define i13 @test_signed_i13_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i13_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: subl $12, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fists {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $61440, %ecx # imm = 0xF000 +; X86-X87-NEXT: jb .LBB2_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: .LBB2_2: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $4095, %edx # imm = 0xFFF +; X86-X87-NEXT: ja .LBB2_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %ecx, %edx +; X86-X87-NEXT: .LBB2_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jp .LBB2_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edx, %ecx +; X86-X87-NEXT: .LBB2_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $12, %esp +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i13_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: cvttss2si %xmm0, %ecx +; X86-SSE-NEXT: cmovnpl %ecx, %eax +; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i13_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cvttss2si %xmm0, %ecx +; X64-NEXT: cmovnpl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i13_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: vmovsh {{.*#+}} xmm1 = [-4.096E+3,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0] +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm1 +; X64-AVX512FP16-NEXT: movl $61440, %ecx # imm = 0xF000 +; X64-AVX512FP16-NEXT: cmovbel %eax, %ecx +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movl $4095, %eax # imm = 0xFFF +; X64-AVX512FP16-NEXT: cmovbel %ecx, %eax +; X64-AVX512FP16-NEXT: # kill: def $ax killed $ax killed $eax +; X64-AVX512FP16-NEXT: retq + %x = call i13 @llvm.fptosi.sat.i13.f16(half %f) + ret i13 %x +} + +; FIXME: Can be optimizated with maxss + minss +define i16 @test_signed_i16_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i16_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: subl $12, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fists {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $32768, %ecx # imm = 0x8000 +; X86-X87-NEXT: jb .LBB3_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: .LBB3_2: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $32767, %edx # imm = 0x7FFF +; X86-X87-NEXT: ja .LBB3_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %ecx, %edx +; X86-X87-NEXT: .LBB3_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jp .LBB3_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edx, %ecx +; X86-X87-NEXT: .LBB3_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $12, %esp +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i16_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: cvttss2si %xmm0, %ecx +; X86-SSE-NEXT: cmovnpl %ecx, %eax +; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i16_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cvttss2si %xmm0, %ecx +; X64-NEXT: cmovnpl %ecx, %eax +; X64-NEXT: # kill: def $ax killed $ax killed $eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i16_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: vmovsh {{.*#+}} xmm1 = [-3.2768E+4,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0,0.0E+0] +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm1 +; X64-AVX512FP16-NEXT: movl $32768, %ecx # imm = 0x8000 +; X64-AVX512FP16-NEXT: cmovbel %eax, %ecx +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movl $32767, %eax # imm = 0x7FFF +; X64-AVX512FP16-NEXT: cmovbel %ecx, %eax +; X64-AVX512FP16-NEXT: # kill: def $ax killed $ax killed $eax +; X64-AVX512FP16-NEXT: retq + %x = call i16 @llvm.fptosi.sat.i16.f16(half %f) + ret i16 %x +} + +; FIXME: Can be optimizated with maxss + minss +define i19 @test_signed_i19_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i19_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: subl $12, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $-262144, %ecx # imm = 0xFFFC0000 +; X86-X87-NEXT: jb .LBB4_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: .LBB4_2: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF +; X86-X87-NEXT: ja .LBB4_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %ecx, %edx +; X86-X87-NEXT: .LBB4_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jp .LBB4_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edx, %ecx +; X86-X87-NEXT: .LBB4_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $12, %esp +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i19_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: cvttss2si %xmm0, %ecx +; X86-SSE-NEXT: cmovnpl %ecx, %eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i19_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cvttss2si %xmm0, %ecx +; X64-NEXT: cmovnpl %ecx, %eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i19_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movl $-262144, %ecx # imm = 0xFFFC0000 +; X64-AVX512FP16-NEXT: cmovael %eax, %ecx +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movl $262143, %edx # imm = 0x3FFFF +; X64-AVX512FP16-NEXT: cmovbel %ecx, %edx +; X64-AVX512FP16-NEXT: xorl %eax, %eax +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovnpl %edx, %eax +; X64-AVX512FP16-NEXT: retq + %x = call i19 @llvm.fptosi.sat.i19.f16(half %f) + ret i19 %x +} + +define i32 @test_signed_i32_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i32_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: subl $12, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 +; X86-X87-NEXT: jb .LBB5_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: .LBB5_2: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF +; X86-X87-NEXT: ja .LBB5_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl %ecx, %edx +; X86-X87-NEXT: .LBB5_4: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: jp .LBB5_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edx, %ecx +; X86-X87-NEXT: .LBB5_6: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $12, %esp +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i32_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: subl $12, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: cvttss2si %xmm0, %eax +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 +; X86-SSE-NEXT: cmovael %eax, %ecx +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF +; X86-SSE-NEXT: cmovbel %ecx, %edx +; X86-SSE-NEXT: xorl %eax, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: cmovnpl %edx, %eax +; X86-SSE-NEXT: addl $12, %esp +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i32_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: cvttss2si %xmm0, %eax +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 +; X64-NEXT: cmovael %eax, %ecx +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF +; X64-NEXT: cmovbel %ecx, %edx +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: cmovnpl %edx, %eax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i32_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %eax +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movl $2147483647, %ecx # imm = 0x7FFFFFFF +; X64-AVX512FP16-NEXT: cmovbel %eax, %ecx +; X64-AVX512FP16-NEXT: xorl %eax, %eax +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovnpl %ecx, %eax +; X64-AVX512FP16-NEXT: retq + %x = call i32 @llvm.fptosi.sat.i32.f16(half %f) + ret i32 %x +} + +define i50 @test_signed_i50_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i50_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: pushl %edi +; X86-X87-NEXT: pushl %esi +; X86-X87-NEXT: subl $20, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fld %st(0) +; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jb .LBB6_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx +; X86-X87-NEXT: .LBB6_2: +; X86-X87-NEXT: movl $-131072, %edi # imm = 0xFFFE0000 +; X86-X87-NEXT: jb .LBB6_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-X87-NEXT: .LBB6_4: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $131071, %esi # imm = 0x1FFFF +; X86-X87-NEXT: ja .LBB6_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edi, %esi +; X86-X87-NEXT: .LBB6_6: +; X86-X87-NEXT: movl $-1, %edi +; X86-X87-NEXT: ja .LBB6_8 +; X86-X87-NEXT: # %bb.7: +; X86-X87-NEXT: movl %edx, %edi +; X86-X87-NEXT: .LBB6_8: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jp .LBB6_10 +; X86-X87-NEXT: # %bb.9: +; X86-X87-NEXT: movl %edi, %ecx +; X86-X87-NEXT: movl %esi, %edx +; X86-X87-NEXT: .LBB6_10: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $20, %esp +; X86-X87-NEXT: popl %esi +; X86-X87-NEXT: popl %edi +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i50_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: pushl %esi +; X86-SSE-NEXT: subl $24, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: xorl %ecx, %ecx +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-SSE-NEXT: cmovbl %ecx, %esi +; X86-SSE-NEXT: movl $-131072, %eax # imm = 0xFFFE0000 +; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $131071, %edx # imm = 0x1FFFF +; X86-SSE-NEXT: cmovbel %eax, %edx +; X86-SSE-NEXT: movl $-1, %eax +; X86-SSE-NEXT: cmovbel %esi, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: cmovpl %ecx, %eax +; X86-SSE-NEXT: cmovpl %ecx, %edx +; X86-SSE-NEXT: addl $24, %esp +; X86-SSE-NEXT: popl %esi +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i50_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: cvttss2si %xmm0, %rax +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000 +; X64-NEXT: cmovaeq %rax, %rcx +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $562949953421311, %rdx # imm = 0x1FFFFFFFFFFFF +; X64-NEXT: cmovbeq %rcx, %rdx +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: cmovnpq %rdx, %rax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i50_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %rax +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000 +; X64-AVX512FP16-NEXT: cmovaeq %rax, %rcx +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movabsq $562949953421311, %rdx # imm = 0x1FFFFFFFFFFFF +; X64-AVX512FP16-NEXT: cmovbeq %rcx, %rdx +; X64-AVX512FP16-NEXT: xorl %eax, %eax +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovnpq %rdx, %rax +; X64-AVX512FP16-NEXT: retq + %x = call i50 @llvm.fptosi.sat.i50.f16(half %f) + ret i50 %x +} + +define i64 @test_signed_i64_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i64_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: pushl %edi +; X86-X87-NEXT: pushl %esi +; X86-X87-NEXT: subl $20, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: fld %st(0) +; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) +; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: xorl %ecx, %ecx +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jb .LBB7_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx +; X86-X87-NEXT: .LBB7_2: +; X86-X87-NEXT: movl $-2147483648, %edi # imm = 0x80000000 +; X86-X87-NEXT: jb .LBB7_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-X87-NEXT: .LBB7_4: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $2147483647, %esi # imm = 0x7FFFFFFF +; X86-X87-NEXT: ja .LBB7_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl %edi, %esi +; X86-X87-NEXT: .LBB7_6: +; X86-X87-NEXT: movl $-1, %edi +; X86-X87-NEXT: ja .LBB7_8 +; X86-X87-NEXT: # %bb.7: +; X86-X87-NEXT: movl %edx, %edi +; X86-X87-NEXT: .LBB7_8: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jp .LBB7_10 +; X86-X87-NEXT: # %bb.9: +; X86-X87-NEXT: movl %edi, %ecx +; X86-X87-NEXT: movl %esi, %edx +; X86-X87-NEXT: .LBB7_10: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $20, %esp +; X86-X87-NEXT: popl %esi +; X86-X87-NEXT: popl %edi +; X86-X87-NEXT: retl +; +; X86-SSE-LABEL: test_signed_i64_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: pushl %esi +; X86-SSE-NEXT: subl $24, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 +; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) +; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) +; X86-SSE-NEXT: xorl %ecx, %ecx +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-SSE-NEXT: cmovbl %ecx, %esi +; X86-SSE-NEXT: movl $-2147483648, %eax # imm = 0x80000000 +; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF +; X86-SSE-NEXT: cmovbel %eax, %edx +; X86-SSE-NEXT: movl $-1, %eax +; X86-SSE-NEXT: cmovbel %esi, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: cmovpl %ecx, %eax +; X86-SSE-NEXT: cmovpl %ecx, %edx +; X86-SSE-NEXT: addl $24, %esp +; X86-SSE-NEXT: popl %esi +; X86-SSE-NEXT: retl +; +; X64-LABEL: test_signed_i64_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: cvttss2si %xmm0, %rax +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 +; X64-NEXT: cmovaeq %rax, %rcx +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF +; X64-NEXT: cmovbeq %rcx, %rdx +; X64-NEXT: xorl %eax, %eax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: cmovnpq %rdx, %rax +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i64_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: vcvttsh2si %xmm0, %rax +; X64-AVX512FP16-NEXT: vucomish {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movabsq $9223372036854775807, %rcx # imm = 0x7FFFFFFFFFFFFFFF +; X64-AVX512FP16-NEXT: cmovbeq %rax, %rcx +; X64-AVX512FP16-NEXT: xorl %eax, %eax +; X64-AVX512FP16-NEXT: vucomish %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovnpq %rcx, %rax +; X64-AVX512FP16-NEXT: retq + %x = call i64 @llvm.fptosi.sat.i64.f16(half %f) + ret i64 %x +} + +define i100 @test_signed_i100_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i100_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: pushl %ebp +; X86-X87-NEXT: pushl %ebx +; X86-X87-NEXT: pushl %edi +; X86-X87-NEXT: pushl %esi +; X86-X87-NEXT: subl $60, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-X87-NEXT: fucompp +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: movl %eax, %ebx +; X86-X87-NEXT: calll __fixsfti +; X86-X87-NEXT: subl $4, %esp +; X86-X87-NEXT: xorl %edx, %edx +; X86-X87-NEXT: movb %bh, %ah +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $-8, %ebx +; X86-X87-NEXT: jb .LBB8_2 +; X86-X87-NEXT: # %bb.1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-X87-NEXT: .LBB8_2: +; X86-X87-NEXT: movl $0, %ecx +; X86-X87-NEXT: movl $0, %ebp +; X86-X87-NEXT: jb .LBB8_4 +; X86-X87-NEXT: # %bb.3: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebp +; X86-X87-NEXT: .LBB8_4: +; X86-X87-NEXT: movl $0, %edi +; X86-X87-NEXT: jb .LBB8_6 +; X86-X87-NEXT: # %bb.5: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-X87-NEXT: .LBB8_6: +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $-1, %eax +; X86-X87-NEXT: movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-X87-NEXT: movl $-1, %esi +; X86-X87-NEXT: ja .LBB8_8 +; X86-X87-NEXT: # %bb.7: +; X86-X87-NEXT: movl %edi, %eax +; X86-X87-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-X87-NEXT: movl %ecx, %esi +; X86-X87-NEXT: .LBB8_8: +; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: movl $7, %edi +; X86-X87-NEXT: ja .LBB8_10 +; X86-X87-NEXT: # %bb.9: +; X86-X87-NEXT: movl %ebx, %edi +; X86-X87-NEXT: .LBB8_10: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %eax +; X86-X87-NEXT: movl $0, %ebp +; X86-X87-NEXT: movl $0, %ebx +; X86-X87-NEXT: jp .LBB8_12 +; X86-X87-NEXT: # %bb.11: +; X86-X87-NEXT: movl %edi, %edx +; X86-X87-NEXT: movl %esi, %eax +; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload +; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-X87-NEXT: .LBB8_12: +; X86-X87-NEXT: movl %ebx, 8(%ecx) +; X86-X87-NEXT: movl %ebp, 4(%ecx) +; X86-X87-NEXT: movl %eax, (%ecx) +; X86-X87-NEXT: andl $15, %edx +; X86-X87-NEXT: movb %dl, 12(%ecx) +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $60, %esp +; X86-X87-NEXT: popl %esi +; X86-X87-NEXT: popl %edi +; X86-X87-NEXT: popl %ebx +; X86-X87-NEXT: popl %ebp +; X86-X87-NEXT: retl $4 +; +; X86-SSE-LABEL: test_signed_i100_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: pushl %ebp +; X86-SSE-NEXT: pushl %ebx +; X86-SSE-NEXT: pushl %edi +; X86-SSE-NEXT: pushl %esi +; X86-SSE-NEXT: subl $44, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: movl %eax, (%esp) +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: calll __fixsfti +; X86-SSE-NEXT: subl $4, %esp +; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload +; X86-SSE-NEXT: # xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: xorl %ebp, %ebp +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $-8, %ebx +; X86-SSE-NEXT: movl $0, %ecx +; X86-SSE-NEXT: movl $0, %edx +; X86-SSE-NEXT: movl $0, %edi +; X86-SSE-NEXT: jb .LBB8_2 +; X86-SSE-NEXT: # %bb.1: +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-SSE-NEXT: .LBB8_2: +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $-1, %eax +; X86-SSE-NEXT: cmoval %eax, %edi +; X86-SSE-NEXT: cmoval %eax, %edx +; X86-SSE-NEXT: cmoval %eax, %ecx +; X86-SSE-NEXT: movl $7, %eax +; X86-SSE-NEXT: cmovbel %ebx, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: cmovpl %ebp, %eax +; X86-SSE-NEXT: cmovpl %ebp, %ecx +; X86-SSE-NEXT: cmovpl %ebp, %edx +; X86-SSE-NEXT: cmovpl %ebp, %edi +; X86-SSE-NEXT: movl %edi, 8(%esi) +; X86-SSE-NEXT: movl %edx, 4(%esi) +; X86-SSE-NEXT: movl %ecx, (%esi) +; X86-SSE-NEXT: andl $15, %eax +; X86-SSE-NEXT: movb %al, 12(%esi) +; X86-SSE-NEXT: movl %esi, %eax +; X86-SSE-NEXT: addl $44, %esp +; X86-SSE-NEXT: popl %esi +; X86-SSE-NEXT: popl %edi +; X86-SSE-NEXT: popl %ebx +; X86-SSE-NEXT: popl %ebp +; X86-SSE-NEXT: retl $4 +; +; X64-LABEL: test_signed_i100_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; X64-NEXT: callq __fixsfti@PLT +; X64-NEXT: xorl %ecx, %ecx +; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload +; X64-NEXT: # xmm0 = mem[0],zero,zero,zero +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cmovbq %rcx, %rax +; X64-NEXT: movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000 +; X64-NEXT: cmovbq %rsi, %rdx +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF +; X64-NEXT: cmovaq %rsi, %rdx +; X64-NEXT: movq $-1, %rsi +; X64-NEXT: cmovaq %rsi, %rax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: cmovpq %rcx, %rax +; X64-NEXT: cmovpq %rcx, %rdx +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i100_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: pushq %rax +; X64-AVX512FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; X64-AVX512FP16-NEXT: callq __fixsfti@PLT +; X64-AVX512FP16-NEXT: xorl %ecx, %ecx +; X64-AVX512FP16-NEXT: vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload +; X64-AVX512FP16-NEXT: # xmm0 = mem[0],zero,zero,zero +; X64-AVX512FP16-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: cmovbq %rcx, %rax +; X64-AVX512FP16-NEXT: movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000 +; X64-AVX512FP16-NEXT: cmovbq %rsi, %rdx +; X64-AVX512FP16-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF +; X64-AVX512FP16-NEXT: cmovaq %rsi, %rdx +; X64-AVX512FP16-NEXT: movq $-1, %rsi +; X64-AVX512FP16-NEXT: cmovaq %rsi, %rax +; X64-AVX512FP16-NEXT: vucomiss %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovpq %rcx, %rax +; X64-AVX512FP16-NEXT: cmovpq %rcx, %rdx +; X64-AVX512FP16-NEXT: popq %rcx +; X64-AVX512FP16-NEXT: retq + %x = call i100 @llvm.fptosi.sat.i100.f16(half %f) + ret i100 %x +} + +define i128 @test_signed_i128_f16(half %f) nounwind { +; X86-X87-LABEL: test_signed_i128_f16: +; X86-X87: # %bb.0: +; X86-X87-NEXT: pushl %ebp +; X86-X87-NEXT: pushl %ebx +; X86-X87-NEXT: pushl %edi +; X86-X87-NEXT: pushl %esi +; X86-X87-NEXT: subl $60, %esp +; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: calll __extendhfsf2 +; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl %eax, (%esp) +; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: fxch %st(1) +; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-X87-NEXT: fucompp +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: movl %eax, %ebx +; X86-X87-NEXT: calll __fixsfti +; X86-X87-NEXT: subl $4, %esp +; X86-X87-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill +; X86-X87-NEXT: movb %bh, %ah +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %eax +; X86-X87-NEXT: movl $0, %ebx +; X86-X87-NEXT: jae .LBB9_1 +; X86-X87-NEXT: # %bb.2: +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jae .LBB9_3 +; X86-X87-NEXT: .LBB9_4: +; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 +; X86-X87-NEXT: jb .LBB9_6 +; X86-X87-NEXT: .LBB9_5: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: .LBB9_6: +; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} +; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload +; X86-X87-NEXT: fucom %st(1) +; X86-X87-NEXT: fstp %st(1) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF +; X86-X87-NEXT: ja .LBB9_8 +; X86-X87-NEXT: # %bb.7: +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: .LBB9_8: +; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx +; X86-X87-NEXT: movl $-1, %ebp +; X86-X87-NEXT: movl $-1, %edi +; X86-X87-NEXT: movl $-1, %esi +; X86-X87-NEXT: ja .LBB9_10 +; X86-X87-NEXT: # %bb.9: +; X86-X87-NEXT: movl %edx, %ebp +; X86-X87-NEXT: movl %ebx, %edi +; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload +; X86-X87-NEXT: .LBB9_10: +; X86-X87-NEXT: fucomp %st(0) +; X86-X87-NEXT: fnstsw %ax +; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax +; X86-X87-NEXT: sahf +; X86-X87-NEXT: movl $0, %eax +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: movl $0, %ebx +; X86-X87-NEXT: jp .LBB9_12 +; X86-X87-NEXT: # %bb.11: +; X86-X87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-X87-NEXT: movl %edi, %eax +; X86-X87-NEXT: movl %ebp, %edx +; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload +; X86-X87-NEXT: .LBB9_12: +; X86-X87-NEXT: movl %ebx, 12(%ecx) +; X86-X87-NEXT: movl %edx, 8(%ecx) +; X86-X87-NEXT: movl %eax, 4(%ecx) +; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload +; X86-X87-NEXT: movl %eax, (%ecx) +; X86-X87-NEXT: movl %ecx, %eax +; X86-X87-NEXT: addl $60, %esp +; X86-X87-NEXT: popl %esi +; X86-X87-NEXT: popl %edi +; X86-X87-NEXT: popl %ebx +; X86-X87-NEXT: popl %ebp +; X86-X87-NEXT: retl $4 +; X86-X87-NEXT: .LBB9_1: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx +; X86-X87-NEXT: movl $0, %edx +; X86-X87-NEXT: jb .LBB9_4 +; X86-X87-NEXT: .LBB9_3: +; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx +; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 +; X86-X87-NEXT: jae .LBB9_5 +; X86-X87-NEXT: jmp .LBB9_6 +; +; X86-SSE-LABEL: test_signed_i128_f16: +; X86-SSE: # %bb.0: +; X86-SSE-NEXT: pushl %ebp +; X86-SSE-NEXT: pushl %ebx +; X86-SSE-NEXT: pushl %edi +; X86-SSE-NEXT: pushl %esi +; X86-SSE-NEXT: subl $44, %esp +; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi +; X86-SSE-NEXT: pextrw $0, %xmm0, %eax +; X86-SSE-NEXT: movw %ax, (%esp) +; X86-SSE-NEXT: calll __extendhfsf2 +; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: movl %eax, (%esp) +; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) +; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill +; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) +; X86-SSE-NEXT: calll __fixsfti +; X86-SSE-NEXT: subl $4, %esp +; X86-SSE-NEXT: xorl %ecx, %ecx +; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload +; X86-SSE-NEXT: # xmm0 = mem[0],zero,zero,zero +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax +; X86-SSE-NEXT: cmovbl %ecx, %eax +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx +; X86-SSE-NEXT: cmovbl %ecx, %edx +; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi +; X86-SSE-NEXT: cmovbl %ecx, %edi +; X86-SSE-NEXT: movl $-2147483648, %ebp # imm = 0x80000000 +; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %ebp +; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 +; X86-SSE-NEXT: movl $2147483647, %ebx # imm = 0x7FFFFFFF +; X86-SSE-NEXT: cmovbel %ebp, %ebx +; X86-SSE-NEXT: movl $-1, %ebp +; X86-SSE-NEXT: cmoval %ebp, %edi +; X86-SSE-NEXT: cmoval %ebp, %edx +; X86-SSE-NEXT: cmoval %ebp, %eax +; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 +; X86-SSE-NEXT: cmovpl %ecx, %eax +; X86-SSE-NEXT: cmovpl %ecx, %edx +; X86-SSE-NEXT: cmovpl %ecx, %edi +; X86-SSE-NEXT: cmovpl %ecx, %ebx +; X86-SSE-NEXT: movl %ebx, 12(%esi) +; X86-SSE-NEXT: movl %edi, 8(%esi) +; X86-SSE-NEXT: movl %edx, 4(%esi) +; X86-SSE-NEXT: movl %eax, (%esi) +; X86-SSE-NEXT: movl %esi, %eax +; X86-SSE-NEXT: addl $44, %esp +; X86-SSE-NEXT: popl %esi +; X86-SSE-NEXT: popl %edi +; X86-SSE-NEXT: popl %ebx +; X86-SSE-NEXT: popl %ebp +; X86-SSE-NEXT: retl $4 +; +; X64-LABEL: test_signed_i128_f16: +; X64: # %bb.0: +; X64-NEXT: pushq %rax +; X64-NEXT: callq __extendhfsf2@PLT +; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; X64-NEXT: callq __fixsfti@PLT +; X64-NEXT: xorl %ecx, %ecx +; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload +; X64-NEXT: # xmm0 = mem[0],zero,zero,zero +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: cmovbq %rcx, %rax +; X64-NEXT: movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000 +; X64-NEXT: cmovbq %rsi, %rdx +; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF +; X64-NEXT: cmovaq %rsi, %rdx +; X64-NEXT: movq $-1, %rsi +; X64-NEXT: cmovaq %rsi, %rax +; X64-NEXT: ucomiss %xmm0, %xmm0 +; X64-NEXT: cmovpq %rcx, %rax +; X64-NEXT: cmovpq %rcx, %rdx +; X64-NEXT: popq %rcx +; X64-NEXT: retq +; +; X64-AVX512FP16-LABEL: test_signed_i128_f16: +; X64-AVX512FP16: # %bb.0: +; X64-AVX512FP16-NEXT: pushq %rax +; X64-AVX512FP16-NEXT: vcvtsh2ss %xmm0, %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: vmovss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill +; X64-AVX512FP16-NEXT: callq __fixsfti@PLT +; X64-AVX512FP16-NEXT: xorl %ecx, %ecx +; X64-AVX512FP16-NEXT: vmovss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload +; X64-AVX512FP16-NEXT: # xmm0 = mem[0],zero,zero,zero +; X64-AVX512FP16-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: cmovbq %rcx, %rax +; X64-AVX512FP16-NEXT: movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000 +; X64-AVX512FP16-NEXT: cmovbq %rsi, %rdx +; X64-AVX512FP16-NEXT: vucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 +; X64-AVX512FP16-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF +; X64-AVX512FP16-NEXT: cmovaq %rsi, %rdx +; X64-AVX512FP16-NEXT: movq $-1, %rsi +; X64-AVX512FP16-NEXT: cmovaq %rsi, %rax +; X64-AVX512FP16-NEXT: vucomiss %xmm0, %xmm0 +; X64-AVX512FP16-NEXT: cmovpq %rcx, %rax +; X64-AVX512FP16-NEXT: cmovpq %rcx, %rdx +; X64-AVX512FP16-NEXT: popq %rcx +; X64-AVX512FP16-NEXT: retq + %x = call i128 @llvm.fptosi.sat.i128.f16(half %f) + ret i128 %x +} diff --git a/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll b/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll index 9b7a43a29a942..d58047e2f16ad 100644 --- a/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll +++ b/llvm/test/CodeGen/X86/fptosi-sat-scalar.ll @@ -2032,1166 +2032,6 @@ define i128 @test_signed_i128_f64(double %f) nounwind { ret i128 %x } -; -; 16-bit float to signed integer -; - -declare i1 @llvm.fptosi.sat.i1.f16 (half) -declare i8 @llvm.fptosi.sat.i8.f16 (half) -declare i13 @llvm.fptosi.sat.i13.f16 (half) -declare i16 @llvm.fptosi.sat.i16.f16 (half) -declare i19 @llvm.fptosi.sat.i19.f16 (half) -declare i32 @llvm.fptosi.sat.i32.f16 (half) -declare i50 @llvm.fptosi.sat.i50.f16 (half) -declare i64 @llvm.fptosi.sat.i64.f16 (half) -declare i100 @llvm.fptosi.sat.i100.f16(half) -declare i128 @llvm.fptosi.sat.i128.f16(half) - -; FIXME: Can be optimizated with maxss + minss -define i1 @test_signed_i1_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i1_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: pushl %ebx -; X86-X87-NEXT: subl $24, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fists {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fld1 -; X86-X87-NEXT: fchs -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movb $-1, %dl -; X86-X87-NEXT: jb .LBB20_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB20_2: -; X86-X87-NEXT: fldz -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: ja .LBB20_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %edx, %ebx -; X86-X87-NEXT: .LBB20_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB20_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %ebx, %ecx -; X86-X87-NEXT: .LBB20_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $24, %esp -; X86-X87-NEXT: popl %ebx -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i1_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: xorps %xmm1, %xmm1 -; X86-SSE-NEXT: minss %xmm0, %xmm1 -; X86-SSE-NEXT: cvttss2si %xmm1, %ecx -; X86-SSE-NEXT: cmovnpl %ecx, %eax -; X86-SSE-NEXT: # kill: def $al killed $al killed $eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i1_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: xorps %xmm1, %xmm1 -; X64-NEXT: minss %xmm0, %xmm1 -; X64-NEXT: cvttss2si %xmm1, %ecx -; X64-NEXT: cmovnpl %ecx, %eax -; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i1 @llvm.fptosi.sat.i1.f16(half %f) - ret i1 %x -} - -; FIXME: Can be optimizated with maxss + minss -define i8 @test_signed_i8_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i8_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: subl $12, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fists {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movb $-128, %dl -; X86-X87-NEXT: jb .LBB21_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB21_2: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movb $127, %cl -; X86-X87-NEXT: ja .LBB21_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB21_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jnp .LBB21_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: .LBB21_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $12, %esp -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i8_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: cvttss2si %xmm0, %ecx -; X86-SSE-NEXT: cmovnpl %ecx, %eax -; X86-SSE-NEXT: # kill: def $al killed $al killed $eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i8_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cvttss2si %xmm0, %ecx -; X64-NEXT: cmovnpl %ecx, %eax -; X64-NEXT: # kill: def $al killed $al killed $eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i8 @llvm.fptosi.sat.i8.f16(half %f) - ret i8 %x -} - -; FIXME: Can be optimizated with maxss + minss -define i13 @test_signed_i13_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i13_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: subl $12, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fists {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $61440, %ecx # imm = 0xF000 -; X86-X87-NEXT: jb .LBB22_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB22_2: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $4095, %edx # imm = 0xFFF -; X86-X87-NEXT: ja .LBB22_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB22_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB22_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB22_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $12, %esp -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i13_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: cvttss2si %xmm0, %ecx -; X86-SSE-NEXT: cmovnpl %ecx, %eax -; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i13_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cvttss2si %xmm0, %ecx -; X64-NEXT: cmovnpl %ecx, %eax -; X64-NEXT: # kill: def $ax killed $ax killed $eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i13 @llvm.fptosi.sat.i13.f16(half %f) - ret i13 %x -} - -; FIXME: Can be optimizated with maxss + minss -define i16 @test_signed_i16_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i16_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: subl $12, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fists {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $32768, %ecx # imm = 0x8000 -; X86-X87-NEXT: jb .LBB23_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB23_2: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $32767, %edx # imm = 0x7FFF -; X86-X87-NEXT: ja .LBB23_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB23_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB23_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB23_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $12, %esp -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i16_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: cvttss2si %xmm0, %ecx -; X86-SSE-NEXT: cmovnpl %ecx, %eax -; X86-SSE-NEXT: # kill: def $ax killed $ax killed $eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i16_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cvttss2si %xmm0, %ecx -; X64-NEXT: cmovnpl %ecx, %eax -; X64-NEXT: # kill: def $ax killed $ax killed $eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i16 @llvm.fptosi.sat.i16.f16(half %f) - ret i16 %x -} - -; FIXME: Can be optimizated with maxss + minss -define i19 @test_signed_i19_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i19_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: subl $12, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $-262144, %ecx # imm = 0xFFFC0000 -; X86-X87-NEXT: jb .LBB24_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB24_2: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF -; X86-X87-NEXT: ja .LBB24_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB24_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB24_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB24_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $12, %esp -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i19_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: cvttss2si %xmm0, %ecx -; X86-SSE-NEXT: cmovnpl %ecx, %eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i19_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: maxss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: minss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cvttss2si %xmm0, %ecx -; X64-NEXT: cmovnpl %ecx, %eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i19 @llvm.fptosi.sat.i19.f16(half %f) - ret i19 %x -} - -define i32 @test_signed_i32_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i32_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: subl $12, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fistl {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB25_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB25_2: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB25_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB25_4: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB25_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB25_6: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $12, %esp -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i32_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: subl $12, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: cvttss2si %xmm0, %eax -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-SSE-NEXT: cmovael %eax, %ecx -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-SSE-NEXT: cmovbel %ecx, %edx -; X86-SSE-NEXT: xorl %eax, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: cmovnpl %edx, %eax -; X86-SSE-NEXT: addl $12, %esp -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i32_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: cvttss2si %xmm0, %eax -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X64-NEXT: cmovael %eax, %ecx -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X64-NEXT: cmovbel %ecx, %edx -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: cmovnpl %edx, %eax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i32 @llvm.fptosi.sat.i32.f16(half %f) - ret i32 %x -} - -define i50 @test_signed_i50_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i50_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: pushl %edi -; X86-X87-NEXT: pushl %esi -; X86-X87-NEXT: subl $20, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fld %st(0) -; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB26_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB26_2: -; X86-X87-NEXT: movl $-131072, %edi # imm = 0xFFFE0000 -; X86-X87-NEXT: jb .LBB26_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB26_4: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $131071, %esi # imm = 0x1FFFF -; X86-X87-NEXT: ja .LBB26_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edi, %esi -; X86-X87-NEXT: .LBB26_6: -; X86-X87-NEXT: movl $-1, %edi -; X86-X87-NEXT: ja .LBB26_8 -; X86-X87-NEXT: # %bb.7: -; X86-X87-NEXT: movl %edx, %edi -; X86-X87-NEXT: .LBB26_8: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jp .LBB26_10 -; X86-X87-NEXT: # %bb.9: -; X86-X87-NEXT: movl %edi, %ecx -; X86-X87-NEXT: movl %esi, %edx -; X86-X87-NEXT: .LBB26_10: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $20, %esp -; X86-X87-NEXT: popl %esi -; X86-X87-NEXT: popl %edi -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i50_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %esi -; X86-SSE-NEXT: subl $24, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: xorl %ecx, %ecx -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-SSE-NEXT: cmovbl %ecx, %esi -; X86-SSE-NEXT: movl $-131072, %eax # imm = 0xFFFE0000 -; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $131071, %edx # imm = 0x1FFFF -; X86-SSE-NEXT: cmovbel %eax, %edx -; X86-SSE-NEXT: movl $-1, %eax -; X86-SSE-NEXT: cmovbel %esi, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: cmovpl %ecx, %eax -; X86-SSE-NEXT: cmovpl %ecx, %edx -; X86-SSE-NEXT: addl $24, %esp -; X86-SSE-NEXT: popl %esi -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i50_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: cvttss2si %xmm0, %rax -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $-562949953421312, %rcx # imm = 0xFFFE000000000000 -; X64-NEXT: cmovaeq %rax, %rcx -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $562949953421311, %rdx # imm = 0x1FFFFFFFFFFFF -; X64-NEXT: cmovbeq %rcx, %rdx -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: cmovnpq %rdx, %rax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i50 @llvm.fptosi.sat.i50.f16(half %f) - ret i50 %x -} - -define i64 @test_signed_i64_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i64_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: pushl %edi -; X86-X87-NEXT: pushl %esi -; X86-X87-NEXT: subl $20, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-X87-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: fld %st(0) -; X86-X87-NEXT: fistpll {{[0-9]+}}(%esp) -; X86-X87-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB27_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB27_2: -; X86-X87-NEXT: movl $-2147483648, %edi # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB27_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB27_4: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $2147483647, %esi # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB27_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl %edi, %esi -; X86-X87-NEXT: .LBB27_6: -; X86-X87-NEXT: movl $-1, %edi -; X86-X87-NEXT: ja .LBB27_8 -; X86-X87-NEXT: # %bb.7: -; X86-X87-NEXT: movl %edx, %edi -; X86-X87-NEXT: .LBB27_8: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jp .LBB27_10 -; X86-X87-NEXT: # %bb.9: -; X86-X87-NEXT: movl %edi, %ecx -; X86-X87-NEXT: movl %esi, %edx -; X86-X87-NEXT: .LBB27_10: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $20, %esp -; X86-X87-NEXT: popl %esi -; X86-X87-NEXT: popl %edi -; X86-X87-NEXT: retl -; -; X86-SSE-LABEL: test_signed_i64_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %esi -; X86-SSE-NEXT: subl $24, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: flds {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fnstcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: orl $3072, %eax # imm = 0xC00 -; X86-SSE-NEXT: movw %ax, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fistpll {{[0-9]+}}(%esp) -; X86-SSE-NEXT: fldcw {{[0-9]+}}(%esp) -; X86-SSE-NEXT: xorl %ecx, %ecx -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-SSE-NEXT: cmovbl %ecx, %esi -; X86-SSE-NEXT: movl $-2147483648, %eax # imm = 0x80000000 -; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-SSE-NEXT: cmovbel %eax, %edx -; X86-SSE-NEXT: movl $-1, %eax -; X86-SSE-NEXT: cmovbel %esi, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: cmovpl %ecx, %eax -; X86-SSE-NEXT: cmovpl %ecx, %edx -; X86-SSE-NEXT: addl $24, %esp -; X86-SSE-NEXT: popl %esi -; X86-SSE-NEXT: retl -; -; X64-LABEL: test_signed_i64_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: cvttss2si %xmm0, %rax -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $-9223372036854775808, %rcx # imm = 0x8000000000000000 -; X64-NEXT: cmovaeq %rax, %rcx -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF -; X64-NEXT: cmovbeq %rcx, %rdx -; X64-NEXT: xorl %eax, %eax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: cmovnpq %rdx, %rax -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i64 @llvm.fptosi.sat.i64.f16(half %f) - ret i64 %x -} - -define i100 @test_signed_i100_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i100_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: pushl %ebp -; X86-X87-NEXT: pushl %ebx -; X86-X87-NEXT: pushl %edi -; X86-X87-NEXT: pushl %esi -; X86-X87-NEXT: subl $60, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-X87-NEXT: fucompp -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: movl %eax, %ebx -; X86-X87-NEXT: calll __fixsfti -; X86-X87-NEXT: subl $4, %esp -; X86-X87-NEXT: xorl %edx, %edx -; X86-X87-NEXT: movb %bh, %ah -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $-8, %ebx -; X86-X87-NEXT: jb .LBB28_2 -; X86-X87-NEXT: # %bb.1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx -; X86-X87-NEXT: .LBB28_2: -; X86-X87-NEXT: movl $0, %ecx -; X86-X87-NEXT: movl $0, %ebp -; X86-X87-NEXT: jb .LBB28_4 -; X86-X87-NEXT: # %bb.3: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebp -; X86-X87-NEXT: .LBB28_4: -; X86-X87-NEXT: movl $0, %edi -; X86-X87-NEXT: jb .LBB28_6 -; X86-X87-NEXT: # %bb.5: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB28_6: -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $-1, %eax -; X86-X87-NEXT: movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-X87-NEXT: movl $-1, %esi -; X86-X87-NEXT: ja .LBB28_8 -; X86-X87-NEXT: # %bb.7: -; X86-X87-NEXT: movl %edi, %eax -; X86-X87-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-X87-NEXT: movl %ecx, %esi -; X86-X87-NEXT: .LBB28_8: -; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: movl $7, %edi -; X86-X87-NEXT: ja .LBB28_10 -; X86-X87-NEXT: # %bb.9: -; X86-X87-NEXT: movl %ebx, %edi -; X86-X87-NEXT: .LBB28_10: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %eax -; X86-X87-NEXT: movl $0, %ebp -; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jp .LBB28_12 -; X86-X87-NEXT: # %bb.11: -; X86-X87-NEXT: movl %edi, %edx -; X86-X87-NEXT: movl %esi, %eax -; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload -; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-X87-NEXT: .LBB28_12: -; X86-X87-NEXT: movl %ebx, 8(%ecx) -; X86-X87-NEXT: movl %ebp, 4(%ecx) -; X86-X87-NEXT: movl %eax, (%ecx) -; X86-X87-NEXT: andl $15, %edx -; X86-X87-NEXT: movb %dl, 12(%ecx) -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $60, %esp -; X86-X87-NEXT: popl %esi -; X86-X87-NEXT: popl %edi -; X86-X87-NEXT: popl %ebx -; X86-X87-NEXT: popl %ebp -; X86-X87-NEXT: retl $4 -; -; X86-SSE-LABEL: test_signed_i100_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %ebp -; X86-SSE-NEXT: pushl %ebx -; X86-SSE-NEXT: pushl %edi -; X86-SSE-NEXT: pushl %esi -; X86-SSE-NEXT: subl $44, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: movl %eax, (%esp) -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: calll __fixsfti -; X86-SSE-NEXT: subl $4, %esp -; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload -; X86-SSE-NEXT: # xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: xorl %ebp, %ebp -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $-8, %ebx -; X86-SSE-NEXT: movl $0, %ecx -; X86-SSE-NEXT: movl $0, %edx -; X86-SSE-NEXT: movl $0, %edi -; X86-SSE-NEXT: jb .LBB28_2 -; X86-SSE-NEXT: # %bb.1: -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ebx -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-SSE-NEXT: .LBB28_2: -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $-1, %eax -; X86-SSE-NEXT: cmoval %eax, %edi -; X86-SSE-NEXT: cmoval %eax, %edx -; X86-SSE-NEXT: cmoval %eax, %ecx -; X86-SSE-NEXT: movl $7, %eax -; X86-SSE-NEXT: cmovbel %ebx, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: cmovpl %ebp, %eax -; X86-SSE-NEXT: cmovpl %ebp, %ecx -; X86-SSE-NEXT: cmovpl %ebp, %edx -; X86-SSE-NEXT: cmovpl %ebp, %edi -; X86-SSE-NEXT: movl %edi, 8(%esi) -; X86-SSE-NEXT: movl %edx, 4(%esi) -; X86-SSE-NEXT: movl %ecx, (%esi) -; X86-SSE-NEXT: andl $15, %eax -; X86-SSE-NEXT: movb %al, 12(%esi) -; X86-SSE-NEXT: movl %esi, %eax -; X86-SSE-NEXT: addl $44, %esp -; X86-SSE-NEXT: popl %esi -; X86-SSE-NEXT: popl %edi -; X86-SSE-NEXT: popl %ebx -; X86-SSE-NEXT: popl %ebp -; X86-SSE-NEXT: retl $4 -; -; X64-LABEL: test_signed_i100_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill -; X64-NEXT: callq __fixsfti@PLT -; X64-NEXT: xorl %ecx, %ecx -; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload -; X64-NEXT: # xmm0 = mem[0],zero,zero,zero -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cmovbq %rcx, %rax -; X64-NEXT: movabsq $-34359738368, %rsi # imm = 0xFFFFFFF800000000 -; X64-NEXT: cmovbq %rsi, %rdx -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $34359738367, %rsi # imm = 0x7FFFFFFFF -; X64-NEXT: cmovaq %rsi, %rdx -; X64-NEXT: movq $-1, %rsi -; X64-NEXT: cmovaq %rsi, %rax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: cmovpq %rcx, %rax -; X64-NEXT: cmovpq %rcx, %rdx -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i100 @llvm.fptosi.sat.i100.f16(half %f) - ret i100 %x -} - -define i128 @test_signed_i128_f16(half %f) nounwind { -; X86-X87-LABEL: test_signed_i128_f16: -; X86-X87: # %bb.0: -; X86-X87-NEXT: pushl %ebp -; X86-X87-NEXT: pushl %ebx -; X86-X87-NEXT: pushl %edi -; X86-X87-NEXT: pushl %esi -; X86-X87-NEXT: subl $60, %esp -; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: calll __extendhfsf2 -; X86-X87-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl %eax, (%esp) -; X86-X87-NEXT: fsts {{[0-9]+}}(%esp) -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: fxch %st(1) -; X86-X87-NEXT: fsts {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-X87-NEXT: fucompp -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: movl %eax, %ebx -; X86-X87-NEXT: calll __fixsfti -; X86-X87-NEXT: subl $4, %esp -; X86-X87-NEXT: movl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill -; X86-X87-NEXT: movb %bh, %ah -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %eax -; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jae .LBB29_1 -; X86-X87-NEXT: # %bb.2: -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jae .LBB29_3 -; X86-X87-NEXT: .LBB29_4: -; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB29_6 -; X86-X87-NEXT: .LBB29_5: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB29_6: -; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} -; X86-X87-NEXT: flds {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Reload -; X86-X87-NEXT: fucom %st(1) -; X86-X87-NEXT: fstp %st(1) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB29_8 -; X86-X87-NEXT: # %bb.7: -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: .LBB29_8: -; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: movl $-1, %ebp -; X86-X87-NEXT: movl $-1, %edi -; X86-X87-NEXT: movl $-1, %esi -; X86-X87-NEXT: ja .LBB29_10 -; X86-X87-NEXT: # %bb.9: -; X86-X87-NEXT: movl %edx, %ebp -; X86-X87-NEXT: movl %ebx, %edi -; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-X87-NEXT: .LBB29_10: -; X86-X87-NEXT: fucomp %st(0) -; X86-X87-NEXT: fnstsw %ax -; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax -; X86-X87-NEXT: sahf -; X86-X87-NEXT: movl $0, %eax -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jp .LBB29_12 -; X86-X87-NEXT: # %bb.11: -; X86-X87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-X87-NEXT: movl %edi, %eax -; X86-X87-NEXT: movl %ebp, %edx -; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-X87-NEXT: .LBB29_12: -; X86-X87-NEXT: movl %ebx, 12(%ecx) -; X86-X87-NEXT: movl %edx, 8(%ecx) -; X86-X87-NEXT: movl %eax, 4(%ecx) -; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload -; X86-X87-NEXT: movl %eax, (%ecx) -; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: addl $60, %esp -; X86-X87-NEXT: popl %esi -; X86-X87-NEXT: popl %edi -; X86-X87-NEXT: popl %ebx -; X86-X87-NEXT: popl %ebp -; X86-X87-NEXT: retl $4 -; X86-X87-NEXT: .LBB29_1: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx -; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB29_4 -; X86-X87-NEXT: .LBB29_3: -; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jae .LBB29_5 -; X86-X87-NEXT: jmp .LBB29_6 -; -; X86-SSE-LABEL: test_signed_i128_f16: -; X86-SSE: # %bb.0: -; X86-SSE-NEXT: pushl %ebp -; X86-SSE-NEXT: pushl %ebx -; X86-SSE-NEXT: pushl %edi -; X86-SSE-NEXT: pushl %esi -; X86-SSE-NEXT: subl $44, %esp -; X86-SSE-NEXT: pinsrw $0, {{[0-9]+}}(%esp), %xmm0 -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %esi -; X86-SSE-NEXT: pextrw $0, %xmm0, %eax -; X86-SSE-NEXT: movw %ax, (%esp) -; X86-SSE-NEXT: calll __extendhfsf2 -; X86-SSE-NEXT: leal {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: movl %eax, (%esp) -; X86-SSE-NEXT: fstps {{[0-9]+}}(%esp) -; X86-SSE-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: movss %xmm0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill -; X86-SSE-NEXT: movss %xmm0, {{[0-9]+}}(%esp) -; X86-SSE-NEXT: calll __fixsfti -; X86-SSE-NEXT: subl $4, %esp -; X86-SSE-NEXT: xorl %ecx, %ecx -; X86-SSE-NEXT: movss {{[-0-9]+}}(%e{{[sb]}}p), %xmm0 # 4-byte Reload -; X86-SSE-NEXT: # xmm0 = mem[0],zero,zero,zero -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: cmovbl %ecx, %eax -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-SSE-NEXT: cmovbl %ecx, %edx -; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-SSE-NEXT: cmovbl %ecx, %edi -; X86-SSE-NEXT: movl $-2147483648, %ebp # imm = 0x80000000 -; X86-SSE-NEXT: cmovael {{[0-9]+}}(%esp), %ebp -; X86-SSE-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 -; X86-SSE-NEXT: movl $2147483647, %ebx # imm = 0x7FFFFFFF -; X86-SSE-NEXT: cmovbel %ebp, %ebx -; X86-SSE-NEXT: movl $-1, %ebp -; X86-SSE-NEXT: cmoval %ebp, %edi -; X86-SSE-NEXT: cmoval %ebp, %edx -; X86-SSE-NEXT: cmoval %ebp, %eax -; X86-SSE-NEXT: ucomiss %xmm0, %xmm0 -; X86-SSE-NEXT: cmovpl %ecx, %eax -; X86-SSE-NEXT: cmovpl %ecx, %edx -; X86-SSE-NEXT: cmovpl %ecx, %edi -; X86-SSE-NEXT: cmovpl %ecx, %ebx -; X86-SSE-NEXT: movl %ebx, 12(%esi) -; X86-SSE-NEXT: movl %edi, 8(%esi) -; X86-SSE-NEXT: movl %edx, 4(%esi) -; X86-SSE-NEXT: movl %eax, (%esi) -; X86-SSE-NEXT: movl %esi, %eax -; X86-SSE-NEXT: addl $44, %esp -; X86-SSE-NEXT: popl %esi -; X86-SSE-NEXT: popl %edi -; X86-SSE-NEXT: popl %ebx -; X86-SSE-NEXT: popl %ebp -; X86-SSE-NEXT: retl $4 -; -; X64-LABEL: test_signed_i128_f16: -; X64: # %bb.0: -; X64-NEXT: pushq %rax -; X64-NEXT: callq __extendhfsf2@PLT -; X64-NEXT: movss %xmm0, {{[-0-9]+}}(%r{{[sb]}}p) # 4-byte Spill -; X64-NEXT: callq __fixsfti@PLT -; X64-NEXT: xorl %ecx, %ecx -; X64-NEXT: movss {{[-0-9]+}}(%r{{[sb]}}p), %xmm0 # 4-byte Reload -; X64-NEXT: # xmm0 = mem[0],zero,zero,zero -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: cmovbq %rcx, %rax -; X64-NEXT: movabsq $-9223372036854775808, %rsi # imm = 0x8000000000000000 -; X64-NEXT: cmovbq %rsi, %rdx -; X64-NEXT: ucomiss {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0 -; X64-NEXT: movabsq $9223372036854775807, %rsi # imm = 0x7FFFFFFFFFFFFFFF -; X64-NEXT: cmovaq %rsi, %rdx -; X64-NEXT: movq $-1, %rsi -; X64-NEXT: cmovaq %rsi, %rax -; X64-NEXT: ucomiss %xmm0, %xmm0 -; X64-NEXT: cmovpq %rcx, %rax -; X64-NEXT: cmovpq %rcx, %rdx -; X64-NEXT: popq %rcx -; X64-NEXT: retq - %x = call i128 @llvm.fptosi.sat.i128.f16(half %f) - ret i128 %x -} - ; ; 80-bit float to signed integer ; @@ -3229,10 +2069,10 @@ define i1 @test_signed_i1_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movb $-1, %dl -; X86-X87-NEXT: jb .LBB30_2 +; X86-X87-NEXT: jb .LBB20_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB30_2: +; X86-X87-NEXT: .LBB20_2: ; X86-X87-NEXT: fldz ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3242,18 +2082,18 @@ define i1 @test_signed_i1_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: ja .LBB30_4 +; X86-X87-NEXT: ja .LBB20_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %edx, %ebx -; X86-X87-NEXT: .LBB30_4: +; X86-X87-NEXT: .LBB20_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB30_6 +; X86-X87-NEXT: jp .LBB20_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %ebx, %ecx -; X86-X87-NEXT: .LBB30_6: +; X86-X87-NEXT: .LBB20_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: popl %ebx @@ -3342,10 +2182,10 @@ define i8 @test_signed_i8_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movb $-128, %dl -; X86-X87-NEXT: jb .LBB31_2 +; X86-X87-NEXT: jb .LBB21_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movzbl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB31_2: +; X86-X87-NEXT: .LBB21_2: ; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3354,18 +2194,18 @@ define i8 @test_signed_i8_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movb $127, %cl -; X86-X87-NEXT: ja .LBB31_4 +; X86-X87-NEXT: ja .LBB21_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB31_4: +; X86-X87-NEXT: .LBB21_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jnp .LBB31_6 +; X86-X87-NEXT: jnp .LBB21_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: xorl %ecx, %ecx -; X86-X87-NEXT: .LBB31_6: +; X86-X87-NEXT: .LBB21_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: retl @@ -3453,10 +2293,10 @@ define i13 @test_signed_i13_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $61440, %ecx # imm = 0xF000 -; X86-X87-NEXT: jb .LBB32_2 +; X86-X87-NEXT: jb .LBB22_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB32_2: +; X86-X87-NEXT: .LBB22_2: ; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3465,19 +2305,19 @@ define i13 @test_signed_i13_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $4095, %edx # imm = 0xFFF -; X86-X87-NEXT: ja .LBB32_4 +; X86-X87-NEXT: ja .LBB22_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB32_4: +; X86-X87-NEXT: .LBB22_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: xorl %ecx, %ecx ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB32_6 +; X86-X87-NEXT: jp .LBB22_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB32_6: +; X86-X87-NEXT: .LBB22_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: retl @@ -3565,10 +2405,10 @@ define i16 @test_signed_i16_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $32768, %ecx # imm = 0x8000 -; X86-X87-NEXT: jb .LBB33_2 +; X86-X87-NEXT: jb .LBB23_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movzwl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB33_2: +; X86-X87-NEXT: .LBB23_2: ; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3577,19 +2417,19 @@ define i16 @test_signed_i16_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $32767, %edx # imm = 0x7FFF -; X86-X87-NEXT: ja .LBB33_4 +; X86-X87-NEXT: ja .LBB23_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB33_4: +; X86-X87-NEXT: .LBB23_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: xorl %ecx, %ecx ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB33_6 +; X86-X87-NEXT: jp .LBB23_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB33_6: +; X86-X87-NEXT: .LBB23_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: retl @@ -3677,10 +2517,10 @@ define i19 @test_signed_i19_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $-262144, %ecx # imm = 0xFFFC0000 -; X86-X87-NEXT: jb .LBB34_2 +; X86-X87-NEXT: jb .LBB24_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB34_2: +; X86-X87-NEXT: .LBB24_2: ; X86-X87-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3689,19 +2529,19 @@ define i19 @test_signed_i19_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $262143, %edx # imm = 0x3FFFF -; X86-X87-NEXT: ja .LBB34_4 +; X86-X87-NEXT: ja .LBB24_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB34_4: +; X86-X87-NEXT: .LBB24_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: xorl %ecx, %ecx ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB34_6 +; X86-X87-NEXT: jp .LBB24_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB34_6: +; X86-X87-NEXT: .LBB24_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: retl @@ -3722,10 +2562,10 @@ define i19 @test_signed_i19_f80(x86_fp80 %f) nounwind { ; X86-SSE-NEXT: fucomi %st(1), %st ; X86-SSE-NEXT: fstp %st(1) ; X86-SSE-NEXT: movl $-262144, %eax # imm = 0xFFFC0000 -; X86-SSE-NEXT: jb .LBB34_2 +; X86-SSE-NEXT: jb .LBB24_2 ; X86-SSE-NEXT: # %bb.1: ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: .LBB34_2: +; X86-SSE-NEXT: .LBB24_2: ; X86-SSE-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}} ; X86-SSE-NEXT: fxch %st(1) ; X86-SSE-NEXT: fucomi %st(1), %st @@ -3753,10 +2593,10 @@ define i19 @test_signed_i19_f80(x86_fp80 %f) nounwind { ; X64-NEXT: fucomi %st(1), %st ; X64-NEXT: fstp %st(1) ; X64-NEXT: movl $-262144, %eax # imm = 0xFFFC0000 -; X64-NEXT: jb .LBB34_2 +; X64-NEXT: jb .LBB24_2 ; X64-NEXT: # %bb.1: ; X64-NEXT: movl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: .LBB34_2: +; X64-NEXT: .LBB24_2: ; X64-NEXT: flds {{\.?LCPI[0-9]+_[0-9]+}}(%rip) ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st @@ -3791,10 +2631,10 @@ define i32 @test_signed_i32_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB35_2 +; X86-X87-NEXT: jb .LBB25_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB35_2: +; X86-X87-NEXT: .LBB25_2: ; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3803,19 +2643,19 @@ define i32 @test_signed_i32_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $2147483647, %edx # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB35_4 +; X86-X87-NEXT: ja .LBB25_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl %ecx, %edx -; X86-X87-NEXT: .LBB35_4: +; X86-X87-NEXT: .LBB25_4: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: xorl %ecx, %ecx ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf -; X86-X87-NEXT: jp .LBB35_6 +; X86-X87-NEXT: jp .LBB25_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edx, %ecx -; X86-X87-NEXT: .LBB35_6: +; X86-X87-NEXT: .LBB25_6: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $8, %esp ; X86-X87-NEXT: retl @@ -3836,10 +2676,10 @@ define i32 @test_signed_i32_f80(x86_fp80 %f) nounwind { ; X86-SSE-NEXT: fucomi %st(1), %st ; X86-SSE-NEXT: fstp %st(1) ; X86-SSE-NEXT: movl $-2147483648, %eax # imm = 0x80000000 -; X86-SSE-NEXT: jb .LBB35_2 +; X86-SSE-NEXT: jb .LBB25_2 ; X86-SSE-NEXT: # %bb.1: ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %eax -; X86-SSE-NEXT: .LBB35_2: +; X86-SSE-NEXT: .LBB25_2: ; X86-SSE-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} ; X86-SSE-NEXT: fxch %st(1) ; X86-SSE-NEXT: fucomi %st(1), %st @@ -3867,10 +2707,10 @@ define i32 @test_signed_i32_f80(x86_fp80 %f) nounwind { ; X64-NEXT: fucomi %st(1), %st ; X64-NEXT: fstp %st(1) ; X64-NEXT: movl $-2147483648, %eax # imm = 0x80000000 -; X64-NEXT: jb .LBB35_2 +; X64-NEXT: jb .LBB25_2 ; X64-NEXT: # %bb.1: ; X64-NEXT: movl -{{[0-9]+}}(%rsp), %eax -; X64-NEXT: .LBB35_2: +; X64-NEXT: .LBB25_2: ; X64-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip) ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st @@ -3909,15 +2749,15 @@ define i50 @test_signed_i50_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB36_2 +; X86-X87-NEXT: jb .LBB26_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB36_2: +; X86-X87-NEXT: .LBB26_2: ; X86-X87-NEXT: movl $-131072, %edi # imm = 0xFFFE0000 -; X86-X87-NEXT: jb .LBB36_4 +; X86-X87-NEXT: jb .LBB26_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB36_4: +; X86-X87-NEXT: .LBB26_4: ; X86-X87-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -3926,25 +2766,25 @@ define i50 @test_signed_i50_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $131071, %esi # imm = 0x1FFFF -; X86-X87-NEXT: ja .LBB36_6 +; X86-X87-NEXT: ja .LBB26_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edi, %esi -; X86-X87-NEXT: .LBB36_6: +; X86-X87-NEXT: .LBB26_6: ; X86-X87-NEXT: movl $-1, %edi -; X86-X87-NEXT: ja .LBB36_8 +; X86-X87-NEXT: ja .LBB26_8 ; X86-X87-NEXT: # %bb.7: ; X86-X87-NEXT: movl %edx, %edi -; X86-X87-NEXT: .LBB36_8: +; X86-X87-NEXT: .LBB26_8: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jp .LBB36_10 +; X86-X87-NEXT: jp .LBB26_10 ; X86-X87-NEXT: # %bb.9: ; X86-X87-NEXT: movl %edi, %ecx ; X86-X87-NEXT: movl %esi, %edx -; X86-X87-NEXT: .LBB36_10: +; X86-X87-NEXT: .LBB26_10: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $20, %esp ; X86-X87-NEXT: popl %esi @@ -4003,13 +2843,13 @@ define i50 @test_signed_i50_f80(x86_fp80 %f) nounwind { ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st ; X64-NEXT: fstp %st(1) -; X64-NEXT: jb .LBB36_1 +; X64-NEXT: jb .LBB26_1 ; X64-NEXT: # %bb.2: ; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax -; X64-NEXT: jmp .LBB36_3 -; X64-NEXT: .LBB36_1: +; X64-NEXT: jmp .LBB26_3 +; X64-NEXT: .LBB26_1: ; X64-NEXT: movabsq $-562949953421312, %rax # imm = 0xFFFE000000000000 -; X64-NEXT: .LBB36_3: +; X64-NEXT: .LBB26_3: ; X64-NEXT: fldl {{\.?LCPI[0-9]+_[0-9]+}}(%rip) ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st @@ -4048,15 +2888,15 @@ define i64 @test_signed_i64_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB37_2 +; X86-X87-NEXT: jb .LBB27_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx -; X86-X87-NEXT: .LBB37_2: +; X86-X87-NEXT: .LBB27_2: ; X86-X87-NEXT: movl $-2147483648, %edi # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB37_4 +; X86-X87-NEXT: jb .LBB27_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB37_4: +; X86-X87-NEXT: .LBB27_4: ; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fxch %st(1) ; X86-X87-NEXT: fucom %st(1) @@ -4065,25 +2905,25 @@ define i64 @test_signed_i64_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $2147483647, %esi # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB37_6 +; X86-X87-NEXT: ja .LBB27_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl %edi, %esi -; X86-X87-NEXT: .LBB37_6: +; X86-X87-NEXT: .LBB27_6: ; X86-X87-NEXT: movl $-1, %edi -; X86-X87-NEXT: ja .LBB37_8 +; X86-X87-NEXT: ja .LBB27_8 ; X86-X87-NEXT: # %bb.7: ; X86-X87-NEXT: movl %edx, %edi -; X86-X87-NEXT: .LBB37_8: +; X86-X87-NEXT: .LBB27_8: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jp .LBB37_10 +; X86-X87-NEXT: jp .LBB27_10 ; X86-X87-NEXT: # %bb.9: ; X86-X87-NEXT: movl %edi, %ecx ; X86-X87-NEXT: movl %esi, %edx -; X86-X87-NEXT: .LBB37_10: +; X86-X87-NEXT: .LBB27_10: ; X86-X87-NEXT: movl %ecx, %eax ; X86-X87-NEXT: addl $20, %esp ; X86-X87-NEXT: popl %esi @@ -4142,13 +2982,13 @@ define i64 @test_signed_i64_f80(x86_fp80 %f) nounwind { ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st ; X64-NEXT: fstp %st(1) -; X64-NEXT: jb .LBB37_1 +; X64-NEXT: jb .LBB27_1 ; X64-NEXT: # %bb.2: ; X64-NEXT: movq -{{[0-9]+}}(%rsp), %rax -; X64-NEXT: jmp .LBB37_3 -; X64-NEXT: .LBB37_1: +; X64-NEXT: jmp .LBB27_3 +; X64-NEXT: .LBB27_1: ; X64-NEXT: movabsq $-9223372036854775808, %rax # imm = 0x8000000000000000 -; X64-NEXT: .LBB37_3: +; X64-NEXT: .LBB27_3: ; X64-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}}(%rip) ; X64-NEXT: fxch %st(1) ; X64-NEXT: fucomi %st(1), %st @@ -4189,22 +3029,22 @@ define i100 @test_signed_i100_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: movb %bh, %ah ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $-8, %ebx -; X86-X87-NEXT: jb .LBB38_2 +; X86-X87-NEXT: jb .LBB28_2 ; X86-X87-NEXT: # %bb.1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx -; X86-X87-NEXT: .LBB38_2: +; X86-X87-NEXT: .LBB28_2: ; X86-X87-NEXT: movl $0, %ecx ; X86-X87-NEXT: movl $0, %ebp -; X86-X87-NEXT: jb .LBB38_4 +; X86-X87-NEXT: jb .LBB28_4 ; X86-X87-NEXT: # %bb.3: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebp -; X86-X87-NEXT: .LBB38_4: +; X86-X87-NEXT: .LBB28_4: ; X86-X87-NEXT: movl $0, %edi -; X86-X87-NEXT: jb .LBB38_6 +; X86-X87-NEXT: jb .LBB28_6 ; X86-X87-NEXT: # %bb.5: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-X87-NEXT: .LBB38_6: +; X86-X87-NEXT: .LBB28_6: ; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload ; X86-X87-NEXT: fucom %st(1) @@ -4215,19 +3055,19 @@ define i100 @test_signed_i100_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: movl $-1, %eax ; X86-X87-NEXT: movl $-1, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill ; X86-X87-NEXT: movl $-1, %esi -; X86-X87-NEXT: ja .LBB38_8 +; X86-X87-NEXT: ja .LBB28_8 ; X86-X87-NEXT: # %bb.7: ; X86-X87-NEXT: movl %edi, %eax ; X86-X87-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-X87-NEXT: movl %ecx, %esi -; X86-X87-NEXT: .LBB38_8: +; X86-X87-NEXT: .LBB28_8: ; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-X87-NEXT: movl $7, %edi -; X86-X87-NEXT: ja .LBB38_10 +; X86-X87-NEXT: ja .LBB28_10 ; X86-X87-NEXT: # %bb.9: ; X86-X87-NEXT: movl %ebx, %edi -; X86-X87-NEXT: .LBB38_10: +; X86-X87-NEXT: .LBB28_10: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax @@ -4235,13 +3075,13 @@ define i100 @test_signed_i100_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: movl $0, %eax ; X86-X87-NEXT: movl $0, %ebp ; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jp .LBB38_12 +; X86-X87-NEXT: jp .LBB28_12 ; X86-X87-NEXT: # %bb.11: ; X86-X87-NEXT: movl %edi, %edx ; X86-X87-NEXT: movl %esi, %eax ; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload ; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-X87-NEXT: .LBB38_12: +; X86-X87-NEXT: .LBB28_12: ; X86-X87-NEXT: movl %ebx, 8(%ecx) ; X86-X87-NEXT: movl %ebp, 4(%ecx) ; X86-X87-NEXT: movl %eax, (%ecx) @@ -4281,13 +3121,13 @@ define i100 @test_signed_i100_f80(x86_fp80 %f) nounwind { ; X86-SSE-NEXT: movl $0, %ecx ; X86-SSE-NEXT: movl $0, %edx ; X86-SSE-NEXT: movl $0, %edi -; X86-SSE-NEXT: jb .LBB38_2 +; X86-SSE-NEXT: jb .LBB28_2 ; X86-SSE-NEXT: # %bb.1: ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-SSE-NEXT: movl {{[0-9]+}}(%esp), %edi -; X86-SSE-NEXT: .LBB38_2: +; X86-SSE-NEXT: .LBB28_2: ; X86-SSE-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} ; X86-SSE-NEXT: fxch %st(1) ; X86-SSE-NEXT: fucomi %st(1), %st @@ -4376,16 +3216,16 @@ define i128 @test_signed_i128_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $0, %eax ; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jae .LBB39_1 +; X86-X87-NEXT: jae .LBB29_1 ; X86-X87-NEXT: # %bb.2: ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jae .LBB39_3 -; X86-X87-NEXT: .LBB39_4: +; X86-X87-NEXT: jae .LBB29_3 +; X86-X87-NEXT: .LBB29_4: ; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jb .LBB39_6 -; X86-X87-NEXT: .LBB39_5: +; X86-X87-NEXT: jb .LBB29_6 +; X86-X87-NEXT: .LBB29_5: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx -; X86-X87-NEXT: .LBB39_6: +; X86-X87-NEXT: .LBB29_6: ; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-X87-NEXT: fldt {{\.?LCPI[0-9]+_[0-9]+}} ; X86-X87-NEXT: fldt {{[-0-9]+}}(%e{{[sb]}}p) # 10-byte Folded Reload @@ -4395,21 +3235,21 @@ define i128 @test_signed_i128_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax ; X86-X87-NEXT: sahf ; X86-X87-NEXT: movl $2147483647, %eax # imm = 0x7FFFFFFF -; X86-X87-NEXT: ja .LBB39_8 +; X86-X87-NEXT: ja .LBB29_8 ; X86-X87-NEXT: # %bb.7: ; X86-X87-NEXT: movl %ecx, %eax -; X86-X87-NEXT: .LBB39_8: +; X86-X87-NEXT: .LBB29_8: ; X86-X87-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ecx ; X86-X87-NEXT: movl $-1, %ebp ; X86-X87-NEXT: movl $-1, %edi ; X86-X87-NEXT: movl $-1, %esi -; X86-X87-NEXT: ja .LBB39_10 +; X86-X87-NEXT: ja .LBB29_10 ; X86-X87-NEXT: # %bb.9: ; X86-X87-NEXT: movl %edx, %ebp ; X86-X87-NEXT: movl %ebx, %edi ; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Reload -; X86-X87-NEXT: .LBB39_10: +; X86-X87-NEXT: .LBB29_10: ; X86-X87-NEXT: fucomp %st(0) ; X86-X87-NEXT: fnstsw %ax ; X86-X87-NEXT: # kill: def $ah killed $ah killed $ax @@ -4417,13 +3257,13 @@ define i128 @test_signed_i128_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: movl $0, %eax ; X86-X87-NEXT: movl $0, %edx ; X86-X87-NEXT: movl $0, %ebx -; X86-X87-NEXT: jp .LBB39_12 +; X86-X87-NEXT: jp .LBB29_12 ; X86-X87-NEXT: # %bb.11: ; X86-X87-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill ; X86-X87-NEXT: movl %edi, %eax ; X86-X87-NEXT: movl %ebp, %edx ; X86-X87-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload -; X86-X87-NEXT: .LBB39_12: +; X86-X87-NEXT: .LBB29_12: ; X86-X87-NEXT: movl %ebx, 12(%ecx) ; X86-X87-NEXT: movl %edx, 8(%ecx) ; X86-X87-NEXT: movl %eax, 4(%ecx) @@ -4436,16 +3276,16 @@ define i128 @test_signed_i128_f80(x86_fp80 %f) nounwind { ; X86-X87-NEXT: popl %ebx ; X86-X87-NEXT: popl %ebp ; X86-X87-NEXT: retl $4 -; X86-X87-NEXT: .LBB39_1: +; X86-X87-NEXT: .LBB29_1: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %eax ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %ebx ; X86-X87-NEXT: movl $0, %edx -; X86-X87-NEXT: jb .LBB39_4 -; X86-X87-NEXT: .LBB39_3: +; X86-X87-NEXT: jb .LBB29_4 +; X86-X87-NEXT: .LBB29_3: ; X86-X87-NEXT: movl {{[0-9]+}}(%esp), %edx ; X86-X87-NEXT: movl $-2147483648, %ecx # imm = 0x80000000 -; X86-X87-NEXT: jae .LBB39_5 -; X86-X87-NEXT: jmp .LBB39_6 +; X86-X87-NEXT: jae .LBB29_5 +; X86-X87-NEXT: jmp .LBB29_6 ; ; X86-SSE-LABEL: test_signed_i128_f80: ; X86-SSE: # %bb.0: