summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/x64/xbyak_abi.h23
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
12namespace Common::X64 { 12namespace Common::X64 {
13 13
14inline int RegToIndex(const Xbyak::Reg& reg) { 14inline 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
22inline Xbyak::Reg64 IndexToReg64(int reg_index) { 22inline 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
27inline Xbyak::Xmm IndexToXmm(int reg_index) { 27inline 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
32inline Xbyak::Reg IndexToReg(int reg_index) { 32inline 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 }