From fa2e88da1c8b8d98c2f0ffeba963f0eaa3a18e9c Mon Sep 17 00:00:00 2001 From: Chad Rosier Date: Wed, 30 Apr 2014 15:29:57 +0000 Subject: [PATCH] [ARM64][fast-isel] Fast-isel doesn't know how to handle f128. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@207659 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/ARM64/ARM64FastISel.cpp | 15 +++++++++- test/CodeGen/ARM64/fast-isel-noconvert.ll | 34 ++++++++++++++++++++++- 2 files changed, 47 insertions(+), 2 deletions(-) diff --git a/lib/Target/ARM64/ARM64FastISel.cpp b/lib/Target/ARM64/ARM64FastISel.cpp index 0fce1cc64e3..c43f2af15be 100644 --- a/lib/Target/ARM64/ARM64FastISel.cpp +++ b/lib/Target/ARM64/ARM64FastISel.cpp @@ -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) { diff --git a/test/CodeGen/ARM64/fast-isel-noconvert.ll b/test/CodeGen/ARM64/fast-isel-noconvert.ll index 35179700161..483d1799f9c 100644 --- a/test/CodeGen/ARM64/fast-isel-noconvert.ll +++ b/test/CodeGen/ARM64/fast-isel-noconvert.ll @@ -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 -} \ No newline at end of file +} + +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 +}