diff options
author | Chad Rosier <mcrosier@apple.com> | 2012-02-03 19:42:52 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2012-02-03 19:42:52 +0000 |
commit | 36b7beb42921c428fc9f5b5a9cc9feb7fe7dd4b3 (patch) | |
tree | bb2b694c760d1f8c788a410c4c480759878bb0c9 /lib/Target/ARM/ARMFastISel.cpp | |
parent | b95d1ff43726ff8a2fd5845fb4f3685a0daec58e (diff) |
[fast-isel] Add support for selecting UIToFP.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@149704 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Target/ARM/ARMFastISel.cpp')
-rw-r--r-- | lib/Target/ARM/ARMFastISel.cpp | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/lib/Target/ARM/ARMFastISel.cpp b/lib/Target/ARM/ARMFastISel.cpp index e8ba801d84..48cd5f4b57 100644 --- a/lib/Target/ARM/ARMFastISel.cpp +++ b/lib/Target/ARM/ARMFastISel.cpp @@ -161,7 +161,7 @@ class ARMFastISel : public FastISel { bool SelectFPExt(const Instruction *I); bool SelectFPTrunc(const Instruction *I); bool SelectBinaryOp(const Instruction *I, unsigned ISDOpcode); - bool SelectSIToFP(const Instruction *I); + bool SelectIToFP(const Instruction *I, bool isZExt); bool SelectFPToSI(const Instruction *I); bool SelectSDiv(const Instruction *I); bool SelectSRem(const Instruction *I); @@ -1535,7 +1535,7 @@ bool ARMFastISel::SelectFPTrunc(const Instruction *I) { return true; } -bool ARMFastISel::SelectSIToFP(const Instruction *I) { +bool ARMFastISel::SelectIToFP(const Instruction *I, bool isZExt) { // Make sure we have VFP. if (!Subtarget->hasVFP2()) return false; @@ -1555,7 +1555,7 @@ bool ARMFastISel::SelectSIToFP(const Instruction *I) { // Handle sign-extension. if (SrcVT == MVT::i16 || SrcVT == MVT::i8) { EVT DestVT = MVT::i32; - unsigned ResultReg = ARMEmitIntExt(SrcVT, SrcReg, DestVT, /*isZExt*/ false); + unsigned ResultReg = ARMEmitIntExt(SrcVT, SrcReg, DestVT, isZExt); if (ResultReg == 0) return false; SrcReg = ResultReg; } @@ -1566,8 +1566,8 @@ bool ARMFastISel::SelectSIToFP(const Instruction *I) { if (FP == 0) return false; unsigned Opc; - if (Ty->isFloatTy()) Opc = ARM::VSITOS; - else if (Ty->isDoubleTy()) Opc = ARM::VSITOD; + if (Ty->isFloatTy()) Opc = isZExt ? ARM::VUITOS : ARM::VSITOS; + else if (Ty->isDoubleTy()) Opc = isZExt ? ARM::VUITOD : ARM::VSITOD; else return false; unsigned ResultReg = createResultReg(TLI.getRegClassFor(DstVT)); @@ -2449,7 +2449,9 @@ bool ARMFastISel::TargetSelectInstruction(const Instruction *I) { case Instruction::FPTrunc: return SelectFPTrunc(I); case Instruction::SIToFP: - return SelectSIToFP(I); + return SelectIToFP(I, /*isZExt*/ false); + case Instruction::UIToFP: + return SelectIToFP(I, /*isZExt*/ true); case Instruction::FPToSI: return SelectFPToSI(I); case Instruction::FAdd: |