| Index: src/IceTargetLoweringMIPS32.h
|
| diff --git a/src/IceTargetLoweringMIPS32.h b/src/IceTargetLoweringMIPS32.h
|
| index 3366dcea677cec844f82fdebbc75e05d8250ee9f..4348a7c7d3e441e6d173c711f1c184fa94169a7f 100644
|
| --- a/src/IceTargetLoweringMIPS32.h
|
| +++ b/src/IceTargetLoweringMIPS32.h
|
| @@ -459,6 +459,43 @@ public:
|
|
|
| Operand *legalizeUndef(Operand *From, RegNumT RegNum = RegNumT());
|
|
|
| + /// Helper class that understands the Calling Convention and register
|
| + /// assignments as per MIPS O32 abi.
|
| + class CallingConv {
|
| + CallingConv(const CallingConv &) = delete;
|
| + CallingConv &operator=(const CallingConv &) = delete;
|
| +
|
| + public:
|
| + CallingConv();
|
| + ~CallingConv() = default;
|
| +
|
| + /// argInReg returns true if there is a Register available for the requested
|
| + /// type, and false otherwise. If it returns true, Reg is set to the
|
| + /// appropriate register number. Note that, when Ty == IceType_i64, Reg will
|
| + /// be an I64 register pair.
|
| + bool argInReg(Type Ty, uint32_t ArgNo, RegNumT *Reg);
|
| +
|
| + private:
|
| + // argInGPR is used to find if any GPR register is available for argument of
|
| + // type Ty
|
| + bool argInGPR(Type Ty, RegNumT *Reg);
|
| + /// argInVFP is to floating-point/vector types what argInGPR is for integer
|
| + /// types.
|
| + bool argInVFP(Type Ty, RegNumT *Reg);
|
| + inline void discardNextGPRAndItsAliases(CfgVector<RegNumT> *Regs);
|
| + void discardUnavailableGPRsAndTheirAliases(CfgVector<RegNumT> *Regs);
|
| + SmallBitVector GPRegsUsed;
|
| + CfgVector<RegNumT> GPRArgs;
|
| + CfgVector<RegNumT> I64Args;
|
| +
|
| + void discardUnavailableVFPRegsAndTheirAliases(CfgVector<RegNumT> *Regs);
|
| + SmallBitVector VFPRegsUsed;
|
| + CfgVector<RegNumT> FP32Args;
|
| + CfgVector<RegNumT> FP64Args;
|
| + // UseFPRegs is a flag indicating if FP registers can be used
|
| + bool UseFPRegs = false;
|
| + };
|
| +
|
| protected:
|
| explicit TargetMIPS32(Cfg *Func);
|
|
|
|
|