Commit eec5621d by Mohit Bhakkad Committed by Jim Stichnoth

SubZero: Adding support for all Reg pairs in getI64PairFirst/SecondGPRNum

R=stichnot@chromium.org Review URL: https://codereview.chromium.org/2197233002 . Patch from Mohit Bhakkad <mohit.bhakkad@imgtec.com>.
parent 53c8fbdf
...@@ -89,22 +89,32 @@ static inline bool isFPRReg(RegNumT RegNum) { ...@@ -89,22 +89,32 @@ static inline bool isFPRReg(RegNumT RegNum) {
const char *getRegName(RegNumT RegNum); const char *getRegName(RegNumT RegNum);
static inline RegNumT getI64PairFirstGPRNum(RegNumT RegNum) { static inline RegNumT get64PairFirstRegNum(RegNumT RegNum) {
// For now it works only for argument register pairs assert(unsigned(RegNum) >= Reg_I64PAIR_First);
// TODO(mohit.bhakkad): Change this to support all the register pairs once we assert(unsigned(RegNum) <= Reg_F64PAIR_Last);
// have table-driven approach ready if (unsigned(RegNum) >= Reg_F64PAIR_First &&
assert(RegNum == Reg_A0A1 || RegNum == Reg_A2A3); unsigned(RegNum) <= Reg_F64PAIR_Last)
return (RegNum == RegMIPS32::Reg_A0A1) ? RegMIPS32::Reg_A0 return RegNumT::fixme(((RegNum - Reg_F64PAIR_First) * 2) +
: RegMIPS32::Reg_A2; unsigned(Reg_FPR_First));
if (unsigned(RegNum) >= Reg_I64PAIR_First &&
unsigned(RegNum) <= Reg_T8T9)
return RegNumT::fixme(((RegNum - Reg_I64PAIR_First) * 2) +
unsigned(Reg_V0));
return RegMIPS32::Reg_LO;
} }
static inline RegNumT getI64PairSecondGPRNum(RegNumT RegNum) { static inline RegNumT get64PairSecondRegNum(RegNumT RegNum) {
// For now it works only for argument register pairs assert(unsigned(RegNum) >= Reg_I64PAIR_First);
// TODO(mohit.bhakkad): Change this to support all the register pairs once we assert(unsigned(RegNum) <= Reg_F64PAIR_Last);
// have table-driven approach ready if (unsigned(RegNum) >= Reg_F64PAIR_First &&
assert(RegNum == Reg_A0A1 || RegNum == Reg_A2A3); unsigned(RegNum) <= Reg_F64PAIR_Last)
return (RegNum == RegMIPS32::Reg_A0A1) ? RegMIPS32::Reg_A1 return RegNumT::fixme(((RegNum - Reg_F64PAIR_First) * 2) +
: RegMIPS32::Reg_A3; unsigned(Reg_FPR_First) + 1);
if (unsigned(RegNum) >= Reg_I64PAIR_First &&
unsigned(RegNum) <= Reg_T8T9)
return RegNumT::fixme(((RegNum - Reg_I64PAIR_First) * 2) +
unsigned(Reg_V1));
return RegMIPS32::Reg_HI;
} }
} // end of namespace RegMIPS32 } // end of namespace RegMIPS32
......
...@@ -696,9 +696,9 @@ void TargetMIPS32::lowerArguments() { ...@@ -696,9 +696,9 @@ void TargetMIPS32::lowerArguments() {
auto *RegisterArg64 = llvm::cast<Variable64On32>(RegisterArg); auto *RegisterArg64 = llvm::cast<Variable64On32>(RegisterArg);
RegisterArg64->initHiLo(Func); RegisterArg64->initHiLo(Func);
RegisterArg64->getLo()->setRegNum( RegisterArg64->getLo()->setRegNum(
RegNumT::fixme(RegMIPS32::getI64PairFirstGPRNum(RegNum))); RegNumT::fixme(RegMIPS32::get64PairFirstRegNum(RegNum)));
RegisterArg64->getHi()->setRegNum( RegisterArg64->getHi()->setRegNum(
RegNumT::fixme(RegMIPS32::getI64PairSecondGPRNum(RegNum))); RegNumT::fixme(RegMIPS32::get64PairSecondRegNum(RegNum)));
} break; } break;
} }
Context.insert<InstAssign>(Arg, RegisterArg); Context.insert<InstAssign>(Arg, RegisterArg);
...@@ -1710,9 +1710,9 @@ void TargetMIPS32::lowerCall(const InstCall *Instr) { ...@@ -1710,9 +1710,9 @@ void TargetMIPS32::lowerCall(const InstCall *Instr) {
Operand *Lo = loOperand(Arg); Operand *Lo = loOperand(Arg);
Operand *Hi = hiOperand(Arg); Operand *Hi = hiOperand(Arg);
GPRArgs.push_back( GPRArgs.push_back(
std::make_pair(Lo, RegMIPS32::getI64PairFirstGPRNum(Reg))); std::make_pair(Lo, RegMIPS32::get64PairFirstRegNum(Reg)));
GPRArgs.push_back( GPRArgs.push_back(
std::make_pair(Hi, RegMIPS32::getI64PairSecondGPRNum(Reg))); std::make_pair(Hi, RegMIPS32::get64PairSecondRegNum(Reg)));
} else if (isScalarIntegerType(Ty)) { } else if (isScalarIntegerType(Ty)) {
GPRArgs.push_back(std::make_pair(Arg, Reg)); GPRArgs.push_back(std::make_pair(Arg, Reg));
} else { } else {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment