diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/Mips/MipsFastISel.cpp | 18 |
1 files changed, 17 insertions, 1 deletions
diff --git a/llvm/lib/Target/Mips/MipsFastISel.cpp b/llvm/lib/Target/Mips/MipsFastISel.cpp index e7b11392d0b..94531642492 100644 --- a/llvm/lib/Target/Mips/MipsFastISel.cpp +++ b/llvm/lib/Target/Mips/MipsFastISel.cpp @@ -976,9 +976,13 @@ bool MipsFastISel::selectFPExt(const Instruction *I) { bool MipsFastISel::selectSelect(const Instruction *I) { assert(isa<SelectInst>(I) && "Expected a select instruction."); + DEBUG(dbgs() << "selectSelect\n"); + MVT VT; - if (!isTypeSupported(I->getType(), VT)) + if (!isTypeSupported(I->getType(), VT) || UnsupportedFPMode) { + DEBUG(dbgs() << ".. .. gave up (!isTypeSupported || UnsupportedFPMode)\n"); return false; + } unsigned CondMovOpc; const TargetRegisterClass *RC; @@ -1376,6 +1380,10 @@ bool MipsFastISel::fastLowerArguments() { break; case MVT::f64: + if (UnsupportedFPMode) { + DEBUG(dbgs() << ".. .. gave up (UnsupportedFPMode\n"); + return false; + } if (NextAFGR64 == AFGR64ArgRegs.end()) { DEBUG(dbgs() << ".. .. gave up (ran out of AFGR64 arguments)\n"); return false; @@ -1617,6 +1625,8 @@ bool MipsFastISel::selectRet(const Instruction *I) { const Function &F = *I->getParent()->getParent(); const ReturnInst *Ret = cast<ReturnInst>(I); + DEBUG(dbgs() << "selectRet\n"); + if (!FuncInfo.CanLowerReturn) return false; @@ -1677,6 +1687,12 @@ bool MipsFastISel::selectRet(const Instruction *I) { if (RVVT == MVT::f128) return false; + // Do not handle FGR64 returns for now. + if (RVVT == MVT::f64 && UnsupportedFPMode) { + DEBUG(dbgs() << ".. .. gave up (UnsupportedFPMode\n"); + return false; + } + MVT DestVT = VA.getValVT(); // Special handling for extended integers. if (RVVT != DestVT) { |

