mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[ARM64][fast-isel] Fast-isel doesn't know how to handle f128.
llvm-svn: 207659
This commit is contained in:
parent
e4629386df
commit
ccc0a640e3
@ -197,6 +197,9 @@ unsigned ARM64FastISel::TargetMaterializeAlloca(const AllocaInst *AI) {
|
||||
}
|
||||
|
||||
unsigned ARM64FastISel::ARM64MaterializeFP(const ConstantFP *CFP, MVT VT) {
|
||||
if (VT != MVT::f32 && VT != MVT::f64)
|
||||
return 0;
|
||||
|
||||
const APFloat Val = CFP->getValueAPF();
|
||||
bool is64bit = (VT == MVT::f64);
|
||||
|
||||
@ -418,7 +421,11 @@ bool ARM64FastISel::isTypeLegal(Type *Ty, MVT &VT) {
|
||||
return false;
|
||||
VT = evt.getSimpleVT();
|
||||
|
||||
// Handle all legal types, i.e. a register that will directly hold this
|
||||
// This is a legal type, but it's not something we handle in fast-isel.
|
||||
if (VT == MVT::f128)
|
||||
return false;
|
||||
|
||||
// Handle all other legal types, i.e. a register that will directly hold this
|
||||
// value.
|
||||
return TLI.isTypeLegal(VT);
|
||||
}
|
||||
@ -1107,6 +1114,8 @@ bool ARM64FastISel::SelectFPToInt(const Instruction *I, bool Signed) {
|
||||
return false;
|
||||
|
||||
EVT SrcVT = TLI.getValueType(I->getOperand(0)->getType(), true);
|
||||
if (SrcVT == MVT::f128)
|
||||
return false;
|
||||
|
||||
unsigned Opc;
|
||||
if (SrcVT == MVT::f64) {
|
||||
@ -1132,6 +1141,8 @@ bool ARM64FastISel::SelectIntToFP(const Instruction *I, bool Signed) {
|
||||
MVT DestVT;
|
||||
if (!isTypeLegal(I->getType(), DestVT) || DestVT.isVector())
|
||||
return false;
|
||||
assert ((DestVT == MVT::f32 || DestVT == MVT::f64) &&
|
||||
"Unexpected value type.");
|
||||
|
||||
unsigned SrcReg = getRegForValue(I->getOperand(0));
|
||||
if (SrcReg == 0)
|
||||
@ -1578,6 +1589,8 @@ bool ARM64FastISel::SelectRet(const Instruction *I) {
|
||||
if (!RVEVT.isSimple())
|
||||
return false;
|
||||
MVT RVVT = RVEVT.getSimpleVT();
|
||||
if (RVVT == MVT::f128)
|
||||
return false;
|
||||
MVT DestVT = VA.getValVT();
|
||||
// Special handling for extended integers.
|
||||
if (RVVT != DestVT) {
|
||||
|
@ -33,4 +33,36 @@ define <2 x i64> @test_fptosi(<2 x double> %in) {
|
||||
|
||||
%res = fptosi <2 x double> %in to <2 x i64>
|
||||
ret <2 x i64> %res
|
||||
}
|
||||
}
|
||||
|
||||
define fp128 @uitofp_i32_fp128(i32 %a) {
|
||||
entry:
|
||||
; CHECK-LABEL: uitofp_i32_fp128
|
||||
; CHECK: bl ___floatunsitf
|
||||
%conv = uitofp i32 %a to fp128
|
||||
ret fp128 %conv
|
||||
}
|
||||
|
||||
define fp128 @uitofp_i64_fp128(i64 %a) {
|
||||
entry:
|
||||
; CHECK-LABEL: uitofp_i64_fp128
|
||||
; CHECK: bl ___floatunditf
|
||||
%conv = uitofp i64 %a to fp128
|
||||
ret fp128 %conv
|
||||
}
|
||||
|
||||
define i32 @uitofp_fp128_i32(fp128 %a) {
|
||||
entry:
|
||||
; CHECK-LABEL: uitofp_fp128_i32
|
||||
; CHECK: ___fixunstfsi
|
||||
%conv = fptoui fp128 %a to i32
|
||||
ret i32 %conv
|
||||
}
|
||||
|
||||
define i64 @uitofp_fp128_i64(fp128 %a) {
|
||||
entry:
|
||||
; CHECK-LABEL: uitofp_fp128_i64
|
||||
; CHECK: ___fixunstfdi
|
||||
%conv = fptoui fp128 %a to i64
|
||||
ret i64 %conv
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user