Workaround of getCopyToRegs and getCopyFromRegs bugs for big-endian machines.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@37935 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Evan Cheng 2007-07-06 01:47:35 +00:00
parent 991262834d
commit 86da6600ae

View File

@ -2984,8 +2984,10 @@ void SelectionDAGLowering::visitCall(CallInst &I) {
/// If the Flag pointer is NULL, no flag is used. /// If the Flag pointer is NULL, no flag is used.
SDOperand RegsForValue::getCopyFromRegs(SelectionDAG &DAG, SDOperand RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
SDOperand &Chain, SDOperand *Flag)const{ SDOperand &Chain, SDOperand *Flag)const{
// Get the list of registers. // Get the list of registers, in the appropriate order.
std::vector<unsigned> R(Regs); std::vector<unsigned> R(Regs);
if (!DAG.getTargetLoweringInfo().isLittleEndian())
std::reverse(R.begin(), R.end());
// Copy the legal parts from the registers. // Copy the legal parts from the registers.
unsigned NumParts = Regs.size(); unsigned NumParts = Regs.size();
@ -3001,7 +3003,7 @@ SDOperand RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
} }
// Assemble the legal parts into the final value. // Assemble the legal parts into the final value.
return getCopyFromParts(DAG, &Parts[0], NumParts, RegVT, ValueVT, true); return getCopyFromParts(DAG, &Parts[0], NumParts, RegVT, ValueVT, false);
} }
/// getCopyToRegs - Emit a series of CopyToReg nodes that copies the /// getCopyToRegs - Emit a series of CopyToReg nodes that copies the
@ -3010,13 +3012,15 @@ SDOperand RegsForValue::getCopyFromRegs(SelectionDAG &DAG,
/// If the Flag pointer is NULL, no flag is used. /// If the Flag pointer is NULL, no flag is used.
void RegsForValue::getCopyToRegs(SDOperand Val, SelectionDAG &DAG, void RegsForValue::getCopyToRegs(SDOperand Val, SelectionDAG &DAG,
SDOperand &Chain, SDOperand *Flag) const { SDOperand &Chain, SDOperand *Flag) const {
// Get the list of registers. // Get the list of registers, in the appropriate order.
std::vector<unsigned> R(Regs); std::vector<unsigned> R(Regs);
if (!DAG.getTargetLoweringInfo().isLittleEndian())
std::reverse(R.begin(), R.end());
// Get the list of the values's legal parts. // Get the list of the values's legal parts.
unsigned NumParts = Regs.size(); unsigned NumParts = Regs.size();
SmallVector<SDOperand, 8> Parts(NumParts); SmallVector<SDOperand, 8> Parts(NumParts);
getCopyToParts(DAG, Val, &Parts[0], NumParts, RegVT, true); getCopyToParts(DAG, Val, &Parts[0], NumParts, RegVT, false);
// Copy the parts into the registers. // Copy the parts into the registers.
for (unsigned i = 0; i != NumParts; ++i) { for (unsigned i = 0; i != NumParts; ++i) {