1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

[X86] In FP_TO_INTHelper, when moving data from SSE register to X87 register file via the stack, use the same stack slot we use for the integer conversion.

No need for a separate stack slot. The lifetimes don't overlap.

Also fix the MachinePointerInfo for the final load after the integer conversion to indicate it came from the stack slot.

llvm-svn: 354234
This commit is contained in:
Craig Topper 2019-02-17 19:23:49 +00:00
parent cbdfe61ea5
commit 39e018707b
3 changed files with 82 additions and 86 deletions

View File

@ -18104,7 +18104,7 @@ X86TargetLowering::FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
// We lower FP->int64 into FISTP64 followed by a load from a temporary
// stack slot.
MachineFunction &MF = DAG.getMachineFunction();
unsigned MemSize = DstTy.getSizeInBits()/8;
unsigned MemSize = DstTy.getStoreSize();
int SSFI = MF.getFrameInfo().CreateStackObject(MemSize, MemSize, false);
SDValue StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
@ -18160,37 +18160,33 @@ X86TargetLowering::FP_TO_INTHelper(SDValue Op, SelectionDAG &DAG,
Value = DAG.getSelect(DL, TheVT, Cmp, Value, Sub);
}
MachinePointerInfo MPI = MachinePointerInfo::getFixedStack(MF, SSFI);
// FIXME This causes a redundant load/store if the SSE-class value is already
// in memory, such as if it is on the callstack.
if (isScalarFPTypeInSSEReg(TheVT)) {
assert(DstTy == MVT::i64 && "Invalid FP_TO_SINT to lower!");
Chain = DAG.getStore(Chain, DL, Value, StackSlot,
MachinePointerInfo::getFixedStack(MF, SSFI));
Chain = DAG.getStore(Chain, DL, Value, StackSlot, MPI);
SDVTList Tys = DAG.getVTList(TheVT, MVT::Other);
SDValue Ops[] = { Chain, StackSlot };
unsigned FLDSize = TheVT.getStoreSize();
assert(FLDSize <= MemSize && "Stack slot not big enough");
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(MF, SSFI),
MachineMemOperand::MOLoad, FLDSize, FLDSize);
MachineMemOperand *MMO = MF.getMachineMemOperand(
MPI, MachineMemOperand::MOLoad, FLDSize, FLDSize);
Value = DAG.getMemIntrinsicNode(X86ISD::FLD, DL, Tys, Ops, TheVT, MMO);
Chain = Value.getValue(1);
SSFI = MF.getFrameInfo().CreateStackObject(MemSize, MemSize, false);
StackSlot = DAG.getFrameIndex(SSFI, PtrVT);
}
// Build the FP_TO_INT*_IN_MEM
MachineMemOperand *MMO =
MF.getMachineMemOperand(MachinePointerInfo::getFixedStack(MF, SSFI),
MachineMemOperand::MOStore, MemSize, MemSize);
MachineMemOperand *MMO = MF.getMachineMemOperand(
MPI, MachineMemOperand::MOStore, MemSize, MemSize);
SDValue Ops[] = { Chain, Value, StackSlot };
SDValue FIST = DAG.getMemIntrinsicNode(X86ISD::FP_TO_INT_IN_MEM, DL,
DAG.getVTList(MVT::Other),
Ops, DstTy, MMO);
SDValue Res = DAG.getLoad(Op.getValueType(), SDLoc(Op), FIST, StackSlot,
MachinePointerInfo());
SDValue Res = DAG.getLoad(Op.getValueType(), SDLoc(Op), FIST, StackSlot, MPI);
// If we need an unsigned fixup, XOR the result with adjust.
if (UnsignedFixup)

View File

@ -85,14 +85,14 @@ define i64 @f_to_u64(float %a) nounwind {
; AVX512F_32_WIN-NEXT: pushl %ebp
; AVX512F_32_WIN-NEXT: movl %esp, %ebp
; AVX512F_32_WIN-NEXT: andl $-8, %esp
; AVX512F_32_WIN-NEXT: subl $16, %esp
; AVX512F_32_WIN-NEXT: subl $8, %esp
; AVX512F_32_WIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; AVX512F_32_WIN-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; AVX512F_32_WIN-NEXT: vcmpltss %xmm1, %xmm0, %k1
; AVX512F_32_WIN-NEXT: vsubss %xmm1, %xmm0, %xmm2
; AVX512F_32_WIN-NEXT: vmovss %xmm0, %xmm0, %xmm2 {%k1}
; AVX512F_32_WIN-NEXT: vmovss %xmm2, {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: flds {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: vmovss %xmm2, (%esp)
; AVX512F_32_WIN-NEXT: flds (%esp)
; AVX512F_32_WIN-NEXT: fisttpll (%esp)
; AVX512F_32_WIN-NEXT: xorl %edx, %edx
; AVX512F_32_WIN-NEXT: vucomiss %xmm0, %xmm1
@ -106,14 +106,14 @@ define i64 @f_to_u64(float %a) nounwind {
;
; AVX512F_32_LIN-LABEL: f_to_u64:
; AVX512F_32_LIN: # %bb.0:
; AVX512F_32_LIN-NEXT: subl $20, %esp
; AVX512F_32_LIN-NEXT: subl $12, %esp
; AVX512F_32_LIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; AVX512F_32_LIN-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; AVX512F_32_LIN-NEXT: vcmpltss %xmm1, %xmm0, %k1
; AVX512F_32_LIN-NEXT: vsubss %xmm1, %xmm0, %xmm2
; AVX512F_32_LIN-NEXT: vmovss %xmm0, %xmm0, %xmm2 {%k1}
; AVX512F_32_LIN-NEXT: vmovss %xmm2, {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: flds {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: vmovss %xmm2, (%esp)
; AVX512F_32_LIN-NEXT: flds (%esp)
; AVX512F_32_LIN-NEXT: fisttpll (%esp)
; AVX512F_32_LIN-NEXT: xorl %edx, %edx
; AVX512F_32_LIN-NEXT: vucomiss %xmm0, %xmm1
@ -121,7 +121,7 @@ define i64 @f_to_u64(float %a) nounwind {
; AVX512F_32_LIN-NEXT: shll $31, %edx
; AVX512F_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; AVX512F_32_LIN-NEXT: movl (%esp), %eax
; AVX512F_32_LIN-NEXT: addl $20, %esp
; AVX512F_32_LIN-NEXT: addl $12, %esp
; AVX512F_32_LIN-NEXT: retl
;
; SSE3_32_WIN-LABEL: f_to_u64:
@ -129,7 +129,7 @@ define i64 @f_to_u64(float %a) nounwind {
; SSE3_32_WIN-NEXT: pushl %ebp
; SSE3_32_WIN-NEXT: movl %esp, %ebp
; SSE3_32_WIN-NEXT: andl $-8, %esp
; SSE3_32_WIN-NEXT: subl $16, %esp
; SSE3_32_WIN-NEXT: subl $8, %esp
; SSE3_32_WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE3_32_WIN-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; SSE3_32_WIN-NEXT: movaps %xmm0, %xmm2
@ -141,8 +141,8 @@ define i64 @f_to_u64(float %a) nounwind {
; SSE3_32_WIN-NEXT: subss %xmm1, %xmm0
; SSE3_32_WIN-NEXT: andnps %xmm0, %xmm3
; SSE3_32_WIN-NEXT: orps %xmm3, %xmm2
; SSE3_32_WIN-NEXT: movss %xmm2, {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: flds {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: movss %xmm2, (%esp)
; SSE3_32_WIN-NEXT: flds (%esp)
; SSE3_32_WIN-NEXT: fisttpll (%esp)
; SSE3_32_WIN-NEXT: setbe %dl
; SSE3_32_WIN-NEXT: shll $31, %edx
@ -154,7 +154,7 @@ define i64 @f_to_u64(float %a) nounwind {
;
; SSE3_32_LIN-LABEL: f_to_u64:
; SSE3_32_LIN: # %bb.0:
; SSE3_32_LIN-NEXT: subl $20, %esp
; SSE3_32_LIN-NEXT: subl $12, %esp
; SSE3_32_LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE3_32_LIN-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; SSE3_32_LIN-NEXT: movaps %xmm0, %xmm2
@ -166,14 +166,14 @@ define i64 @f_to_u64(float %a) nounwind {
; SSE3_32_LIN-NEXT: subss %xmm1, %xmm0
; SSE3_32_LIN-NEXT: andnps %xmm0, %xmm3
; SSE3_32_LIN-NEXT: orps %xmm3, %xmm2
; SSE3_32_LIN-NEXT: movss %xmm2, {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: flds {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: movss %xmm2, (%esp)
; SSE3_32_LIN-NEXT: flds (%esp)
; SSE3_32_LIN-NEXT: fisttpll (%esp)
; SSE3_32_LIN-NEXT: setbe %dl
; SSE3_32_LIN-NEXT: shll $31, %edx
; SSE3_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; SSE3_32_LIN-NEXT: movl (%esp), %eax
; SSE3_32_LIN-NEXT: addl $20, %esp
; SSE3_32_LIN-NEXT: addl $12, %esp
; SSE3_32_LIN-NEXT: retl
;
; SSE3_64-LABEL: f_to_u64:
@ -194,7 +194,7 @@ define i64 @f_to_u64(float %a) nounwind {
; SSE2_32_WIN-NEXT: pushl %ebp
; SSE2_32_WIN-NEXT: movl %esp, %ebp
; SSE2_32_WIN-NEXT: andl $-8, %esp
; SSE2_32_WIN-NEXT: subl $24, %esp
; SSE2_32_WIN-NEXT: subl $16, %esp
; SSE2_32_WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE2_32_WIN-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; SSE2_32_WIN-NEXT: movaps %xmm0, %xmm2
@ -226,7 +226,7 @@ define i64 @f_to_u64(float %a) nounwind {
;
; SSE2_32_LIN-LABEL: f_to_u64:
; SSE2_32_LIN: # %bb.0:
; SSE2_32_LIN-NEXT: subl $28, %esp
; SSE2_32_LIN-NEXT: subl $20, %esp
; SSE2_32_LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE2_32_LIN-NEXT: movss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; SSE2_32_LIN-NEXT: movaps %xmm0, %xmm2
@ -252,7 +252,7 @@ define i64 @f_to_u64(float %a) nounwind {
; SSE2_32_LIN-NEXT: shll $31, %edx
; SSE2_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2_32_LIN-NEXT: addl $28, %esp
; SSE2_32_LIN-NEXT: addl $20, %esp
; SSE2_32_LIN-NEXT: retl
;
; SSE2_64-LABEL: f_to_u64:
@ -388,10 +388,10 @@ define i64 @f_to_s64(float %a) nounwind {
; AVX512F_32_WIN-NEXT: pushl %ebp
; AVX512F_32_WIN-NEXT: movl %esp, %ebp
; AVX512F_32_WIN-NEXT: andl $-8, %esp
; AVX512F_32_WIN-NEXT: subl $16, %esp
; AVX512F_32_WIN-NEXT: subl $8, %esp
; AVX512F_32_WIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; AVX512F_32_WIN-NEXT: vmovss %xmm0, {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: flds {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: vmovss %xmm0, (%esp)
; AVX512F_32_WIN-NEXT: flds (%esp)
; AVX512F_32_WIN-NEXT: fisttpll (%esp)
; AVX512F_32_WIN-NEXT: movl (%esp), %eax
; AVX512F_32_WIN-NEXT: movl {{[0-9]+}}(%esp), %edx
@ -401,14 +401,14 @@ define i64 @f_to_s64(float %a) nounwind {
;
; AVX512F_32_LIN-LABEL: f_to_s64:
; AVX512F_32_LIN: # %bb.0:
; AVX512F_32_LIN-NEXT: subl $20, %esp
; AVX512F_32_LIN-NEXT: subl $12, %esp
; AVX512F_32_LIN-NEXT: vmovss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; AVX512F_32_LIN-NEXT: vmovss %xmm0, {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: flds {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: vmovss %xmm0, (%esp)
; AVX512F_32_LIN-NEXT: flds (%esp)
; AVX512F_32_LIN-NEXT: fisttpll (%esp)
; AVX512F_32_LIN-NEXT: movl (%esp), %eax
; AVX512F_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; AVX512F_32_LIN-NEXT: addl $20, %esp
; AVX512F_32_LIN-NEXT: addl $12, %esp
; AVX512F_32_LIN-NEXT: retl
;
; SSE3_32_WIN-LABEL: f_to_s64:
@ -416,10 +416,10 @@ define i64 @f_to_s64(float %a) nounwind {
; SSE3_32_WIN-NEXT: pushl %ebp
; SSE3_32_WIN-NEXT: movl %esp, %ebp
; SSE3_32_WIN-NEXT: andl $-8, %esp
; SSE3_32_WIN-NEXT: subl $16, %esp
; SSE3_32_WIN-NEXT: subl $8, %esp
; SSE3_32_WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE3_32_WIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: flds {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: movss %xmm0, (%esp)
; SSE3_32_WIN-NEXT: flds (%esp)
; SSE3_32_WIN-NEXT: fisttpll (%esp)
; SSE3_32_WIN-NEXT: movl (%esp), %eax
; SSE3_32_WIN-NEXT: movl {{[0-9]+}}(%esp), %edx
@ -429,14 +429,14 @@ define i64 @f_to_s64(float %a) nounwind {
;
; SSE3_32_LIN-LABEL: f_to_s64:
; SSE3_32_LIN: # %bb.0:
; SSE3_32_LIN-NEXT: subl $20, %esp
; SSE3_32_LIN-NEXT: subl $12, %esp
; SSE3_32_LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE3_32_LIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: flds {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: movss %xmm0, (%esp)
; SSE3_32_LIN-NEXT: flds (%esp)
; SSE3_32_LIN-NEXT: fisttpll (%esp)
; SSE3_32_LIN-NEXT: movl (%esp), %eax
; SSE3_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; SSE3_32_LIN-NEXT: addl $20, %esp
; SSE3_32_LIN-NEXT: addl $12, %esp
; SSE3_32_LIN-NEXT: retl
;
; SSE3_64-LABEL: f_to_s64:
@ -449,7 +449,7 @@ define i64 @f_to_s64(float %a) nounwind {
; SSE2_32_WIN-NEXT: pushl %ebp
; SSE2_32_WIN-NEXT: movl %esp, %ebp
; SSE2_32_WIN-NEXT: andl $-8, %esp
; SSE2_32_WIN-NEXT: subl $24, %esp
; SSE2_32_WIN-NEXT: subl $16, %esp
; SSE2_32_WIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE2_32_WIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
; SSE2_32_WIN-NEXT: flds {{[0-9]+}}(%esp)
@ -468,7 +468,7 @@ define i64 @f_to_s64(float %a) nounwind {
;
; SSE2_32_LIN-LABEL: f_to_s64:
; SSE2_32_LIN: # %bb.0:
; SSE2_32_LIN-NEXT: subl $28, %esp
; SSE2_32_LIN-NEXT: subl $20, %esp
; SSE2_32_LIN-NEXT: movss {{.*#+}} xmm0 = mem[0],zero,zero,zero
; SSE2_32_LIN-NEXT: movss %xmm0, {{[0-9]+}}(%esp)
; SSE2_32_LIN-NEXT: flds {{[0-9]+}}(%esp)
@ -481,7 +481,7 @@ define i64 @f_to_s64(float %a) nounwind {
; SSE2_32_LIN-NEXT: fldcw {{[0-9]+}}(%esp)
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; SSE2_32_LIN-NEXT: addl $28, %esp
; SSE2_32_LIN-NEXT: addl $20, %esp
; SSE2_32_LIN-NEXT: retl
;
; SSE2_64-LABEL: f_to_s64:
@ -575,14 +575,14 @@ define i64 @d_to_u64(double %a) nounwind {
; AVX512F_32_WIN-NEXT: pushl %ebp
; AVX512F_32_WIN-NEXT: movl %esp, %ebp
; AVX512F_32_WIN-NEXT: andl $-8, %esp
; AVX512F_32_WIN-NEXT: subl $16, %esp
; AVX512F_32_WIN-NEXT: subl $8, %esp
; AVX512F_32_WIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
; AVX512F_32_WIN-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
; AVX512F_32_WIN-NEXT: vcmpltsd %xmm1, %xmm0, %k1
; AVX512F_32_WIN-NEXT: vsubsd %xmm1, %xmm0, %xmm2
; AVX512F_32_WIN-NEXT: vmovsd %xmm0, %xmm0, %xmm2 {%k1}
; AVX512F_32_WIN-NEXT: vmovsd %xmm2, {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: fldl {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: vmovsd %xmm2, (%esp)
; AVX512F_32_WIN-NEXT: fldl (%esp)
; AVX512F_32_WIN-NEXT: fisttpll (%esp)
; AVX512F_32_WIN-NEXT: xorl %edx, %edx
; AVX512F_32_WIN-NEXT: vucomisd %xmm0, %xmm1
@ -596,14 +596,14 @@ define i64 @d_to_u64(double %a) nounwind {
;
; AVX512F_32_LIN-LABEL: d_to_u64:
; AVX512F_32_LIN: # %bb.0:
; AVX512F_32_LIN-NEXT: subl $20, %esp
; AVX512F_32_LIN-NEXT: subl $12, %esp
; AVX512F_32_LIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
; AVX512F_32_LIN-NEXT: vmovsd {{.*#+}} xmm1 = mem[0],zero
; AVX512F_32_LIN-NEXT: vcmpltsd %xmm1, %xmm0, %k1
; AVX512F_32_LIN-NEXT: vsubsd %xmm1, %xmm0, %xmm2
; AVX512F_32_LIN-NEXT: vmovsd %xmm0, %xmm0, %xmm2 {%k1}
; AVX512F_32_LIN-NEXT: vmovsd %xmm2, {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: fldl {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: vmovsd %xmm2, (%esp)
; AVX512F_32_LIN-NEXT: fldl (%esp)
; AVX512F_32_LIN-NEXT: fisttpll (%esp)
; AVX512F_32_LIN-NEXT: xorl %edx, %edx
; AVX512F_32_LIN-NEXT: vucomisd %xmm0, %xmm1
@ -611,7 +611,7 @@ define i64 @d_to_u64(double %a) nounwind {
; AVX512F_32_LIN-NEXT: shll $31, %edx
; AVX512F_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; AVX512F_32_LIN-NEXT: movl (%esp), %eax
; AVX512F_32_LIN-NEXT: addl $20, %esp
; AVX512F_32_LIN-NEXT: addl $12, %esp
; AVX512F_32_LIN-NEXT: retl
;
; SSE3_32_WIN-LABEL: d_to_u64:
@ -619,7 +619,7 @@ define i64 @d_to_u64(double %a) nounwind {
; SSE3_32_WIN-NEXT: pushl %ebp
; SSE3_32_WIN-NEXT: movl %esp, %ebp
; SSE3_32_WIN-NEXT: andl $-8, %esp
; SSE3_32_WIN-NEXT: subl $16, %esp
; SSE3_32_WIN-NEXT: subl $8, %esp
; SSE3_32_WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE3_32_WIN-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
; SSE3_32_WIN-NEXT: movapd %xmm0, %xmm2
@ -631,8 +631,8 @@ define i64 @d_to_u64(double %a) nounwind {
; SSE3_32_WIN-NEXT: subsd %xmm1, %xmm0
; SSE3_32_WIN-NEXT: andnpd %xmm0, %xmm3
; SSE3_32_WIN-NEXT: orpd %xmm3, %xmm2
; SSE3_32_WIN-NEXT: movsd %xmm2, {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: fldl {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: movsd %xmm2, (%esp)
; SSE3_32_WIN-NEXT: fldl (%esp)
; SSE3_32_WIN-NEXT: fisttpll (%esp)
; SSE3_32_WIN-NEXT: setbe %dl
; SSE3_32_WIN-NEXT: shll $31, %edx
@ -644,7 +644,7 @@ define i64 @d_to_u64(double %a) nounwind {
;
; SSE3_32_LIN-LABEL: d_to_u64:
; SSE3_32_LIN: # %bb.0:
; SSE3_32_LIN-NEXT: subl $20, %esp
; SSE3_32_LIN-NEXT: subl $12, %esp
; SSE3_32_LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE3_32_LIN-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
; SSE3_32_LIN-NEXT: movapd %xmm0, %xmm2
@ -656,14 +656,14 @@ define i64 @d_to_u64(double %a) nounwind {
; SSE3_32_LIN-NEXT: subsd %xmm1, %xmm0
; SSE3_32_LIN-NEXT: andnpd %xmm0, %xmm3
; SSE3_32_LIN-NEXT: orpd %xmm3, %xmm2
; SSE3_32_LIN-NEXT: movsd %xmm2, {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: fldl {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: movsd %xmm2, (%esp)
; SSE3_32_LIN-NEXT: fldl (%esp)
; SSE3_32_LIN-NEXT: fisttpll (%esp)
; SSE3_32_LIN-NEXT: setbe %dl
; SSE3_32_LIN-NEXT: shll $31, %edx
; SSE3_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; SSE3_32_LIN-NEXT: movl (%esp), %eax
; SSE3_32_LIN-NEXT: addl $20, %esp
; SSE3_32_LIN-NEXT: addl $12, %esp
; SSE3_32_LIN-NEXT: retl
;
; SSE3_64-LABEL: d_to_u64:
@ -684,7 +684,7 @@ define i64 @d_to_u64(double %a) nounwind {
; SSE2_32_WIN-NEXT: pushl %ebp
; SSE2_32_WIN-NEXT: movl %esp, %ebp
; SSE2_32_WIN-NEXT: andl $-8, %esp
; SSE2_32_WIN-NEXT: subl $24, %esp
; SSE2_32_WIN-NEXT: subl $16, %esp
; SSE2_32_WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE2_32_WIN-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
; SSE2_32_WIN-NEXT: movapd %xmm0, %xmm2
@ -716,7 +716,7 @@ define i64 @d_to_u64(double %a) nounwind {
;
; SSE2_32_LIN-LABEL: d_to_u64:
; SSE2_32_LIN: # %bb.0:
; SSE2_32_LIN-NEXT: subl $28, %esp
; SSE2_32_LIN-NEXT: subl $20, %esp
; SSE2_32_LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE2_32_LIN-NEXT: movsd {{.*#+}} xmm1 = mem[0],zero
; SSE2_32_LIN-NEXT: movapd %xmm0, %xmm2
@ -742,7 +742,7 @@ define i64 @d_to_u64(double %a) nounwind {
; SSE2_32_LIN-NEXT: shll $31, %edx
; SSE2_32_LIN-NEXT: xorl {{[0-9]+}}(%esp), %edx
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2_32_LIN-NEXT: addl $28, %esp
; SSE2_32_LIN-NEXT: addl $20, %esp
; SSE2_32_LIN-NEXT: retl
;
; SSE2_64-LABEL: d_to_u64:
@ -878,10 +878,10 @@ define i64 @d_to_s64(double %a) nounwind {
; AVX512F_32_WIN-NEXT: pushl %ebp
; AVX512F_32_WIN-NEXT: movl %esp, %ebp
; AVX512F_32_WIN-NEXT: andl $-8, %esp
; AVX512F_32_WIN-NEXT: subl $16, %esp
; AVX512F_32_WIN-NEXT: subl $8, %esp
; AVX512F_32_WIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
; AVX512F_32_WIN-NEXT: vmovsd %xmm0, {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: fldl {{[0-9]+}}(%esp)
; AVX512F_32_WIN-NEXT: vmovsd %xmm0, (%esp)
; AVX512F_32_WIN-NEXT: fldl (%esp)
; AVX512F_32_WIN-NEXT: fisttpll (%esp)
; AVX512F_32_WIN-NEXT: movl (%esp), %eax
; AVX512F_32_WIN-NEXT: movl {{[0-9]+}}(%esp), %edx
@ -891,14 +891,14 @@ define i64 @d_to_s64(double %a) nounwind {
;
; AVX512F_32_LIN-LABEL: d_to_s64:
; AVX512F_32_LIN: # %bb.0:
; AVX512F_32_LIN-NEXT: subl $20, %esp
; AVX512F_32_LIN-NEXT: subl $12, %esp
; AVX512F_32_LIN-NEXT: vmovsd {{.*#+}} xmm0 = mem[0],zero
; AVX512F_32_LIN-NEXT: vmovsd %xmm0, {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: fldl {{[0-9]+}}(%esp)
; AVX512F_32_LIN-NEXT: vmovsd %xmm0, (%esp)
; AVX512F_32_LIN-NEXT: fldl (%esp)
; AVX512F_32_LIN-NEXT: fisttpll (%esp)
; AVX512F_32_LIN-NEXT: movl (%esp), %eax
; AVX512F_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; AVX512F_32_LIN-NEXT: addl $20, %esp
; AVX512F_32_LIN-NEXT: addl $12, %esp
; AVX512F_32_LIN-NEXT: retl
;
; SSE3_32_WIN-LABEL: d_to_s64:
@ -906,10 +906,10 @@ define i64 @d_to_s64(double %a) nounwind {
; SSE3_32_WIN-NEXT: pushl %ebp
; SSE3_32_WIN-NEXT: movl %esp, %ebp
; SSE3_32_WIN-NEXT: andl $-8, %esp
; SSE3_32_WIN-NEXT: subl $16, %esp
; SSE3_32_WIN-NEXT: subl $8, %esp
; SSE3_32_WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE3_32_WIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: fldl {{[0-9]+}}(%esp)
; SSE3_32_WIN-NEXT: movsd %xmm0, (%esp)
; SSE3_32_WIN-NEXT: fldl (%esp)
; SSE3_32_WIN-NEXT: fisttpll (%esp)
; SSE3_32_WIN-NEXT: movl (%esp), %eax
; SSE3_32_WIN-NEXT: movl {{[0-9]+}}(%esp), %edx
@ -919,14 +919,14 @@ define i64 @d_to_s64(double %a) nounwind {
;
; SSE3_32_LIN-LABEL: d_to_s64:
; SSE3_32_LIN: # %bb.0:
; SSE3_32_LIN-NEXT: subl $20, %esp
; SSE3_32_LIN-NEXT: subl $12, %esp
; SSE3_32_LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE3_32_LIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: fldl {{[0-9]+}}(%esp)
; SSE3_32_LIN-NEXT: movsd %xmm0, (%esp)
; SSE3_32_LIN-NEXT: fldl (%esp)
; SSE3_32_LIN-NEXT: fisttpll (%esp)
; SSE3_32_LIN-NEXT: movl (%esp), %eax
; SSE3_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; SSE3_32_LIN-NEXT: addl $20, %esp
; SSE3_32_LIN-NEXT: addl $12, %esp
; SSE3_32_LIN-NEXT: retl
;
; SSE3_64-LABEL: d_to_s64:
@ -939,7 +939,7 @@ define i64 @d_to_s64(double %a) nounwind {
; SSE2_32_WIN-NEXT: pushl %ebp
; SSE2_32_WIN-NEXT: movl %esp, %ebp
; SSE2_32_WIN-NEXT: andl $-8, %esp
; SSE2_32_WIN-NEXT: subl $24, %esp
; SSE2_32_WIN-NEXT: subl $16, %esp
; SSE2_32_WIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE2_32_WIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)
; SSE2_32_WIN-NEXT: fldl {{[0-9]+}}(%esp)
@ -958,7 +958,7 @@ define i64 @d_to_s64(double %a) nounwind {
;
; SSE2_32_LIN-LABEL: d_to_s64:
; SSE2_32_LIN: # %bb.0:
; SSE2_32_LIN-NEXT: subl $28, %esp
; SSE2_32_LIN-NEXT: subl $20, %esp
; SSE2_32_LIN-NEXT: movsd {{.*#+}} xmm0 = mem[0],zero
; SSE2_32_LIN-NEXT: movsd %xmm0, {{[0-9]+}}(%esp)
; SSE2_32_LIN-NEXT: fldl {{[0-9]+}}(%esp)
@ -971,7 +971,7 @@ define i64 @d_to_s64(double %a) nounwind {
; SSE2_32_LIN-NEXT: fldcw {{[0-9]+}}(%esp)
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %eax
; SSE2_32_LIN-NEXT: movl {{[0-9]+}}(%esp), %edx
; SSE2_32_LIN-NEXT: addl $28, %esp
; SSE2_32_LIN-NEXT: addl $20, %esp
; SSE2_32_LIN-NEXT: retl
;
; SSE2_64-LABEL: d_to_s64:

View File

@ -190,8 +190,8 @@ define <2 x i16> @cvt_v2f32_v2u16(<2 x float> %src) {
define <2 x i32> @cvt_v2f32_v2u32(<2 x float> %src) {
; CHECK-LABEL: cvt_v2f32_v2u32:
; CHECK: ## %bb.0:
; CHECK-NEXT: subl $68, %esp
; CHECK-NEXT: .cfi_def_cfa_offset 72
; CHECK-NEXT: subl $36, %esp
; CHECK-NEXT: .cfi_def_cfa_offset 40
; CHECK-NEXT: vmovshdup {{.*#+}} xmm2 = xmm0[1,1,3,3]
; CHECK-NEXT: vmovss {{.*#+}} xmm1 = mem[0],zero,zero,zero
; CHECK-NEXT: vucomiss %xmm1, %xmm2
@ -199,8 +199,8 @@ define <2 x i32> @cvt_v2f32_v2u32(<2 x float> %src) {
; CHECK-NEXT: ## %bb.1:
; CHECK-NEXT: vsubss %xmm1, %xmm2, %xmm2
; CHECK-NEXT: LBB11_2:
; CHECK-NEXT: vmovss %xmm2, {{[0-9]+}}(%esp)
; CHECK-NEXT: flds {{[0-9]+}}(%esp)
; CHECK-NEXT: vmovss %xmm2, (%esp)
; CHECK-NEXT: flds (%esp)
; CHECK-NEXT: fisttpll (%esp)
; CHECK-NEXT: setae %al
; CHECK-NEXT: movzbl %al, %eax
@ -222,7 +222,7 @@ define <2 x i32> @cvt_v2f32_v2u32(<2 x float> %src) {
; CHECK-NEXT: vpinsrd $1, %ecx, %xmm0, %xmm0
; CHECK-NEXT: vpinsrd $2, (%esp), %xmm0, %xmm0
; CHECK-NEXT: vpinsrd $3, %eax, %xmm0, %xmm0
; CHECK-NEXT: addl $68, %esp
; CHECK-NEXT: addl $36, %esp
; CHECK-NEXT: retl
;
; CHECK-WIDE-LABEL: cvt_v2f32_v2u32: