From eb80fe8ff684121c8130db716fe4a7cb5ca3ac0d Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 30 Aug 2005 22:59:48 +0000 Subject: [PATCH] now that physregs can exist in the same dag with multiple types, remove some ugly hacks git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23162 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/PowerPC/PPCISelDAGToDAG.cpp | 35 ++++++-------------------- 1 file changed, 8 insertions(+), 27 deletions(-) diff --git a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp index 2d797d7d1bb..69a33ebd2b6 100644 --- a/lib/Target/PowerPC/PPCISelDAGToDAG.cpp +++ b/lib/Target/PowerPC/PPCISelDAGToDAG.cpp @@ -1506,26 +1506,19 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { for (unsigned i = 2, e = N->getNumOperands(); i != e; ++i) { unsigned DestReg = 0; - MVT::ValueType RegTy; - if (N->getOperand(i).getValueType() == MVT::i32) { + MVT::ValueType RegTy = N->getOperand(i).getValueType(); + if (RegTy == MVT::i32) { assert(GPR_idx < 8 && "Too many int args"); DestReg = GPR[GPR_idx++]; - RegTy = MVT::i32; } else { assert(MVT::isFloatingPoint(N->getOperand(i).getValueType()) && "Unpromoted integer arg?"); assert(FPR_idx < 13 && "Too many fp args"); DestReg = FPR[FPR_idx++]; - RegTy = MVT::f64; // Even if this is really f32! } if (N->getOperand(i).getOpcode() != ISD::UNDEF) { SDOperand Val = Select(N->getOperand(i)); - if (Val.getValueType() != RegTy) { - // Use a register-register copy to handle f32 values in f64 registers. - assert(Val.getValueType() == MVT::f32 && RegTy == MVT::f64); - Val = CurDAG->getTargetNode(PPC::FMR, MVT::f64, Val); - } Chain = CurDAG->getCopyToReg(Chain, DestReg, Val, InFlag); InFlag = Chain.getValue(1); CallOperands.push_back(CurDAG->getRegister(DestReg, RegTy)); @@ -1563,14 +1556,9 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { break; case MVT::f32: case MVT::f64: - Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, MVT::f64, + Chain = CurDAG->getCopyFromReg(Chain, PPC::F1, N->getValueType(0), Chain.getValue(1)).getValue(1); - if (N->getValueType(0) == MVT::f64) - CallResults.push_back(Chain.getValue(0)); - else - // Insert an FMR to convert the result to f32 from f64. - CallResults.push_back(CurDAG->getTargetNode(PPC::FMR, MVT::f32, - Chain.getValue(0))); + CallResults.push_back(Chain.getValue(0)); break; } @@ -1583,18 +1571,11 @@ SDOperand PPC32DAGToDAGISel::Select(SDOperand Op) { if (N->getNumOperands() > 1) { SDOperand Val = Select(N->getOperand(1)); - switch (N->getOperand(1).getValueType()) { - default: assert(0 && "Unknown return type!"); - case MVT::f32: - // Insert a copy to get the type right. - Val = CurDAG->getTargetNode(PPC::FMR, MVT::f64, Val); - // FALL THROUGH - case MVT::f64: - Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val); - break; - case MVT::i32: + if (N->getOperand(1).getValueType() == MVT::i32) { Chain = CurDAG->getCopyToReg(Chain, PPC::R3, Val); - break; + } else { + assert(MVT::isFloatingPoint(N->getOperand(1).getValueType())); + Chain = CurDAG->getCopyToReg(Chain, PPC::F1, Val); } if (N->getNumOperands() > 2) {