Chromium Code Reviews| Index: src/IceTargetLoweringARM32.h |
| diff --git a/src/IceTargetLoweringARM32.h b/src/IceTargetLoweringARM32.h |
| index 57e0b5ab6fa1811f34639f4a3df73e37af500f02..7e54372b3c55c0662b32e6555459beb43d93fce1 100644 |
| --- a/src/IceTargetLoweringARM32.h |
| +++ b/src/IceTargetLoweringARM32.h |
| @@ -21,6 +21,8 @@ |
| #include "IceRegistersARM32.h" |
| #include "IceTargetLowering.h" |
| +#include "llvm/ADT/SmallBitVector.h" |
| + |
| namespace Ice { |
| // Class encapsulating ARM cpu features / instruction set. |
| @@ -476,7 +478,19 @@ protected: |
| CallingConv &operator=(const CallingConv &) = delete; |
| public: |
| - CallingConv() {} |
| + CallingConv() |
| + : VFPRegsFree(ARM32_MAX_FP_REG_UNITS, true), |
| + ValidF64Regs(ARM32_MAX_FP_REG_UNITS), |
| + ValidV128Regs(ARM32_MAX_FP_REG_UNITS) { |
| + for (uint32_t i = 0; i < ARM32_MAX_FP_REG_UNITS; ++i) { |
|
Jim Stichnoth
2015/09/16 21:31:54
Whoa! This is almost FizzBuzz!
:)
|
| + if ((i % 2) == 0) { |
| + ValidF64Regs[i] = true; |
| + } |
| + if ((i % 4) == 0) { |
| + ValidV128Regs[i] = true; |
| + } |
| + } |
| + } |
| ~CallingConv() = default; |
| bool I64InRegs(std::pair<int32_t, int32_t> *Regs); |
| @@ -484,12 +498,14 @@ protected: |
| bool FPInReg(Type Ty, int32_t *Reg); |
| static constexpr uint32_t ARM32_MAX_GPR_ARG = 4; |
| - // Units of S registers still available to S/D/Q arguments. |
| + // TODO(jpp): comment. |
| static constexpr uint32_t ARM32_MAX_FP_REG_UNITS = 16; |
| private: |
| uint32_t NumGPRRegsUsed = 0; |
| - uint32_t NumFPRegUnits = 0; |
| + llvm::SmallBitVector VFPRegsFree; |
| + llvm::SmallBitVector ValidF64Regs; |
| + llvm::SmallBitVector ValidV128Regs; |
| }; |
| private: |