mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-13 04:30:23 +00:00
Fix PR15632: No support for ppcf128 floating-point remainder on PowerPC.
For this we need to use a libcall. Previously LLVM didn't implement libcall support for frem, so I've added it in the usual straightforward manner. A test case from the bug report is included. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@178639 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
4385f5dfce
commit
cd7a1558ed
@ -824,6 +824,7 @@ void DAGTypeLegalizer::ExpandFloatResult(SDNode *N, unsigned ResNo) {
|
||||
case ISD::LOAD: ExpandFloatRes_LOAD(N, Lo, Hi); break;
|
||||
case ISD::SINT_TO_FP:
|
||||
case ISD::UINT_TO_FP: ExpandFloatRes_XINT_TO_FP(N, Lo, Hi); break;
|
||||
case ISD::FREM: ExpandFloatRes_FREM(N, Lo, Hi); break;
|
||||
}
|
||||
|
||||
// If Lo/Hi is null, the sub-method took care of registering results etc.
|
||||
@ -1051,6 +1052,16 @@ void DAGTypeLegalizer::ExpandFloatRes_FPOWI(SDNode *N,
|
||||
GetPairElements(Call, Lo, Hi);
|
||||
}
|
||||
|
||||
void DAGTypeLegalizer::ExpandFloatRes_FREM(SDNode *N,
|
||||
SDValue &Lo, SDValue &Hi) {
|
||||
SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
|
||||
RTLIB::REM_F32, RTLIB::REM_F64,
|
||||
RTLIB::REM_F80, RTLIB::REM_F128,
|
||||
RTLIB::REM_PPCF128),
|
||||
N, false);
|
||||
GetPairElements(Call, Lo, Hi);
|
||||
}
|
||||
|
||||
void DAGTypeLegalizer::ExpandFloatRes_FRINT(SDNode *N,
|
||||
SDValue &Lo, SDValue &Hi) {
|
||||
SDValue Call = LibCallify(GetFPLibCall(N->getValueType(0),
|
||||
|
@ -465,6 +465,7 @@ private:
|
||||
void ExpandFloatRes_FP_EXTEND (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FPOW (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FPOWI (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FREM (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FRINT (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FSIN (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
void ExpandFloatRes_FSQRT (SDNode *N, SDValue &Lo, SDValue &Hi);
|
||||
|
@ -116,6 +116,7 @@ PPCTargetLowering::PPCTargetLowering(PPCTargetMachine &TM)
|
||||
setOperationAction(ISD::FTRUNC, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FRINT, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FNEARBYINT, MVT::ppcf128, Expand);
|
||||
setOperationAction(ISD::FREM, MVT::ppcf128, Expand);
|
||||
|
||||
// PowerPC has no SREM/UREM instructions
|
||||
setOperationAction(ISD::SREM, MVT::i32, Expand);
|
||||
|
15
test/CodeGen/PowerPC/pr15632.ll
Normal file
15
test/CodeGen/PowerPC/pr15632.ll
Normal file
@ -0,0 +1,15 @@
|
||||
; RUN: llc -mcpu=pwr7 -O0 < %s | FileCheck %s
|
||||
|
||||
target datalayout = "E-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v128:128:128-n32:64"
|
||||
target triple = "powerpc64-unknown-linux-gnu"
|
||||
|
||||
declare void @other(ppc_fp128 %tmp70)
|
||||
|
||||
define void @bug() {
|
||||
entry:
|
||||
%tmp70 = frem ppc_fp128 0xM00000000000000000000000000000000, undef
|
||||
call void @other(ppc_fp128 %tmp70)
|
||||
unreachable
|
||||
}
|
||||
|
||||
; CHECK: bl fmodl
|
Loading…
Reference in New Issue
Block a user