diff options
Diffstat (limited to 'contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp')
-rw-r--r-- | contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp b/contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp index 03a545605fe1..ae92604d47ba 100644 --- a/contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp +++ b/contrib/llvm-project/llvm/lib/Target/Mips/MipsSEISelDAGToDAG.cpp @@ -956,6 +956,38 @@ bool MipsSEDAGToDAGISel::trySelect(SDNode *Node) { break; } + case MipsISD::FAbs: { + MVT ResTy = Node->getSimpleValueType(0); + assert((ResTy == MVT::f64 || ResTy == MVT::f32) && + "Unsupported float type!"); + unsigned Opc = 0; + if (ResTy == MVT::f64) + Opc = (Subtarget->isFP64bit() ? Mips::FABS_D64 : Mips::FABS_D32); + else + Opc = Mips::FABS_S; + + if (Subtarget->inMicroMipsMode()) { + switch (Opc) { + case Mips::FABS_D64: + Opc = Mips::FABS_D64_MM; + break; + case Mips::FABS_D32: + Opc = Mips::FABS_D32_MM; + break; + case Mips::FABS_S: + Opc = Mips::FABS_S_MM; + break; + default: + llvm_unreachable("Unknown opcode for MIPS floating point abs!"); + } + } + + ReplaceNode(Node, + CurDAG->getMachineNode(Opc, DL, ResTy, Node->getOperand(0))); + + return true; + } + // Manually match MipsISD::Ins nodes to get the correct instruction. It has // to be done in this fashion so that we respect the differences between // dins and dinsm, as the difference is that the size operand has the range |