diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/x64/xbyak_abi.h | 23 |
1 files changed, 12 insertions, 11 deletions
diff --git a/src/common/x64/xbyak_abi.h b/src/common/x64/xbyak_abi.h index 1dcd147b6..33a96d6cb 100644 --- a/src/common/x64/xbyak_abi.h +++ b/src/common/x64/xbyak_abi.h | |||
| @@ -11,7 +11,7 @@ | |||
| 11 | 11 | ||
| 12 | namespace Common::X64 { | 12 | namespace Common::X64 { |
| 13 | 13 | ||
| 14 | inline int RegToIndex(const Xbyak::Reg& reg) { | 14 | inline std::size_t RegToIndex(const Xbyak::Reg& reg) { |
| 15 | using Kind = Xbyak::Reg::Kind; | 15 | using Kind = Xbyak::Reg::Kind; |
| 16 | ASSERT_MSG((reg.getKind() & (Kind::REG | Kind::XMM)) != 0, | 16 | ASSERT_MSG((reg.getKind() & (Kind::REG | Kind::XMM)) != 0, |
| 17 | "RegSet only support GPRs and XMM registers."); | 17 | "RegSet only support GPRs and XMM registers."); |
| @@ -19,17 +19,17 @@ inline int RegToIndex(const Xbyak::Reg& reg) { | |||
| 19 | return reg.getIdx() + (reg.getKind() == Kind::REG ? 0 : 16); | 19 | return reg.getIdx() + (reg.getKind() == Kind::REG ? 0 : 16); |
| 20 | } | 20 | } |
| 21 | 21 | ||
| 22 | inline Xbyak::Reg64 IndexToReg64(int reg_index) { | 22 | inline Xbyak::Reg64 IndexToReg64(std::size_t reg_index) { |
| 23 | ASSERT(reg_index < 16); | 23 | ASSERT(reg_index < 16); |
| 24 | return Xbyak::Reg64(reg_index); | 24 | return Xbyak::Reg64(static_cast<int>(reg_index)); |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | inline Xbyak::Xmm IndexToXmm(int reg_index) { | 27 | inline Xbyak::Xmm IndexToXmm(std::size_t reg_index) { |
| 28 | ASSERT(reg_index >= 16 && reg_index < 32); | 28 | ASSERT(reg_index >= 16 && reg_index < 32); |
| 29 | return Xbyak::Xmm(reg_index - 16); | 29 | return Xbyak::Xmm(static_cast<int>(reg_index - 16)); |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | inline Xbyak::Reg IndexToReg(int reg_index) { | 32 | inline Xbyak::Reg IndexToReg(std::size_t reg_index) { |
| 33 | if (reg_index < 16) { | 33 | if (reg_index < 16) { |
| 34 | return IndexToReg64(reg_index); | 34 | return IndexToReg64(reg_index); |
| 35 | } else { | 35 | } else { |
| @@ -181,7 +181,7 @@ inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::b | |||
| 181 | 181 | ||
| 182 | for (std::size_t i = 0; i < regs.size(); ++i) { | 182 | for (std::size_t i = 0; i < regs.size(); ++i) { |
| 183 | if (regs[i] && ABI_ALL_GPRS[i]) { | 183 | if (regs[i] && ABI_ALL_GPRS[i]) { |
| 184 | code.push(IndexToReg64(static_cast<int>(i))); | 184 | code.push(IndexToReg64(i)); |
| 185 | } | 185 | } |
| 186 | } | 186 | } |
| 187 | 187 | ||
| @@ -191,7 +191,7 @@ inline size_t ABI_PushRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::b | |||
| 191 | 191 | ||
| 192 | for (std::size_t i = 0; i < regs.size(); ++i) { | 192 | for (std::size_t i = 0; i < regs.size(); ++i) { |
| 193 | if (regs[i] && ABI_ALL_XMMS[i]) { | 193 | if (regs[i] && ABI_ALL_XMMS[i]) { |
| 194 | code.movaps(code.xword[code.rsp + xmm_offset], IndexToXmm(static_cast<int>(i))); | 194 | code.movaps(code.xword[code.rsp + xmm_offset], IndexToXmm(i)); |
| 195 | xmm_offset += 0x10; | 195 | xmm_offset += 0x10; |
| 196 | } | 196 | } |
| 197 | } | 197 | } |
| @@ -206,7 +206,7 @@ inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bits | |||
| 206 | 206 | ||
| 207 | for (std::size_t i = 0; i < regs.size(); ++i) { | 207 | for (std::size_t i = 0; i < regs.size(); ++i) { |
| 208 | if (regs[i] && ABI_ALL_XMMS[i]) { | 208 | if (regs[i] && ABI_ALL_XMMS[i]) { |
| 209 | code.movaps(IndexToXmm(static_cast<int>(i)), code.xword[code.rsp + xmm_offset]); | 209 | code.movaps(IndexToXmm(i), code.xword[code.rsp + xmm_offset]); |
| 210 | xmm_offset += 0x10; | 210 | xmm_offset += 0x10; |
| 211 | } | 211 | } |
| 212 | } | 212 | } |
| @@ -216,8 +216,9 @@ inline void ABI_PopRegistersAndAdjustStack(Xbyak::CodeGenerator& code, std::bits | |||
| 216 | } | 216 | } |
| 217 | 217 | ||
| 218 | // GPRs need to be popped in reverse order | 218 | // GPRs need to be popped in reverse order |
| 219 | for (int i = 15; i >= 0; i--) { | 219 | for (std::size_t j = 0; j < regs.size(); ++j) { |
| 220 | if (regs[i]) { | 220 | const std::size_t i = regs.size() - j - 1; |
| 221 | if (regs[i] && ABI_ALL_GPRS[i]) { | ||
| 221 | code.pop(IndexToReg64(i)); | 222 | code.pop(IndexToReg64(i)); |
| 222 | } | 223 | } |
| 223 | } | 224 | } |