mirror of
https://github.com/RPCS3/llvm.git
synced 2024-12-30 16:34:03 +00:00
[X86] Fix a bug in WIN_FTOL_32/64 handling.
Duplicating an FP register "as itself" is a bad idea, since it violates the invariant that every FP register is mapped to at most one FPU stack slot. Use the scratch FP register instead. This fixes PR23957. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@241069 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
e143a3abc2
commit
f8b3b92eb8
@ -1530,7 +1530,7 @@ void FPS::handleSpecialFP(MachineBasicBlock::iterator &Inst) {
|
||||
if (Op.isKill())
|
||||
moveToTop(FPReg, Inst);
|
||||
else
|
||||
duplicateToTop(FPReg, FPReg, Inst);
|
||||
duplicateToTop(FPReg, ScratchFPReg, Inst);
|
||||
|
||||
// Emit the call. This will pop the operand.
|
||||
BuildMI(*MBB, Inst, MI->getDebugLoc(), TII->get(X86::CALLpcrel32))
|
||||
|
@ -142,3 +142,25 @@ define i64 @double_ui64_5(double %X) {
|
||||
%tmp.1 = fptoui double %X to i64
|
||||
ret i64 %tmp.1
|
||||
}
|
||||
|
||||
define double @pr23957_32(double %A) {
|
||||
; FTOL-LABEL: @pr23957_32
|
||||
; FTOL: fldl
|
||||
; FTOL-NEXT: fld %st(0)
|
||||
; FTOL-NEXT: calll __ftol2
|
||||
%B = fptoui double %A to i32
|
||||
%C = uitofp i32 %B to double
|
||||
%D = fsub double %C, %A
|
||||
ret double %D
|
||||
}
|
||||
|
||||
define double @pr23957_64(double %A) {
|
||||
; FTOL-LABEL: @pr23957_64
|
||||
; FTOL: fldl
|
||||
; FTOL-NEXT: fld %st(0)
|
||||
; FTOL-NEXT: calll __ftol2
|
||||
%B = fptoui double %A to i64
|
||||
%C = uitofp i64 %B to double
|
||||
%D = fsub double %C, %A
|
||||
ret double %D
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user