diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/common/x64/emitter.h | 36 |
1 files changed, 17 insertions, 19 deletions
diff --git a/src/common/x64/emitter.h b/src/common/x64/emitter.h index a1d8ab31f..865b724a8 100644 --- a/src/common/x64/emitter.h +++ b/src/common/x64/emitter.h | |||
| @@ -236,43 +236,41 @@ private: | |||
| 236 | u16 operandReg = 0; | 236 | u16 operandReg = 0; |
| 237 | }; | 237 | }; |
| 238 | 238 | ||
| 239 | inline OpArg M(const void *ptr) {return OpArg((u64)ptr, (int)SCALE_RIP);} | ||
| 240 | template <typename T> | 239 | template <typename T> |
| 241 | inline OpArg M(const T *ptr) {return OpArg((u64)(const void *)ptr, (int)SCALE_RIP);} | 240 | inline OpArg M(const T *ptr) { return OpArg(reinterpret_cast<u64>(ptr), static_cast<int>(SCALE_RIP)); } |
| 242 | inline OpArg R(X64Reg value) {return OpArg(0, SCALE_NONE, value);} | 241 | constexpr OpArg R(X64Reg value) { return OpArg(0, SCALE_NONE, value); } |
| 243 | inline OpArg MatR(X64Reg value) {return OpArg(0, SCALE_ATREG, value);} | 242 | constexpr OpArg MatR(X64Reg value) { return OpArg(0, SCALE_ATREG, value); } |
| 244 | 243 | ||
| 245 | inline OpArg MDisp(X64Reg value, int offset) | 244 | constexpr OpArg MDisp(X64Reg value, int offset) |
| 246 | { | 245 | { |
| 247 | return OpArg((u32)offset, SCALE_ATREG, value); | 246 | return OpArg(static_cast<u32>(offset), SCALE_ATREG, value); |
| 248 | } | 247 | } |
| 249 | 248 | ||
| 250 | inline OpArg MComplex(X64Reg base, X64Reg scaled, int scale, int offset) | 249 | constexpr OpArg MComplex(X64Reg base, X64Reg scaled, int scale, int offset) |
| 251 | { | 250 | { |
| 252 | return OpArg(offset, scale, base, scaled); | 251 | return OpArg(offset, scale, base, scaled); |
| 253 | } | 252 | } |
| 254 | 253 | ||
| 255 | inline OpArg MScaled(X64Reg scaled, int scale, int offset) | 254 | constexpr OpArg MScaled(X64Reg scaled, int scale, int offset) |
| 256 | { | 255 | { |
| 257 | if (scale == SCALE_1) | 256 | return scale == SCALE_1 |
| 258 | return OpArg(offset, SCALE_ATREG, scaled); | 257 | ? OpArg(offset, SCALE_ATREG, scaled) |
| 259 | else | 258 | : OpArg(offset, scale | 0x20, RAX, scaled); |
| 260 | return OpArg(offset, scale | 0x20, RAX, scaled); | ||
| 261 | } | 259 | } |
| 262 | 260 | ||
| 263 | inline OpArg MRegSum(X64Reg base, X64Reg offset) | 261 | constexpr OpArg MRegSum(X64Reg base, X64Reg offset) |
| 264 | { | 262 | { |
| 265 | return MComplex(base, offset, 1, 0); | 263 | return MComplex(base, offset, 1, 0); |
| 266 | } | 264 | } |
| 267 | 265 | ||
| 268 | inline OpArg Imm8 (u8 imm) {return OpArg(imm, SCALE_IMM8);} | 266 | constexpr OpArg Imm8 (u8 imm) { return OpArg(imm, SCALE_IMM8); } |
| 269 | inline OpArg Imm16(u16 imm) {return OpArg(imm, SCALE_IMM16);} //rarely used | 267 | constexpr OpArg Imm16(u16 imm) { return OpArg(imm, SCALE_IMM16); } //rarely used |
| 270 | inline OpArg Imm32(u32 imm) {return OpArg(imm, SCALE_IMM32);} | 268 | constexpr OpArg Imm32(u32 imm) { return OpArg(imm, SCALE_IMM32); } |
| 271 | inline OpArg Imm64(u64 imm) {return OpArg(imm, SCALE_IMM64);} | 269 | constexpr OpArg Imm64(u64 imm) { return OpArg(imm, SCALE_IMM64); } |
| 272 | inline OpArg UImmAuto(u32 imm) { | 270 | constexpr OpArg UImmAuto(u32 imm) { |
| 273 | return OpArg(imm, imm >= 128 ? SCALE_IMM32 : SCALE_IMM8); | 271 | return OpArg(imm, imm >= 128 ? SCALE_IMM32 : SCALE_IMM8); |
| 274 | } | 272 | } |
| 275 | inline OpArg SImmAuto(s32 imm) { | 273 | constexpr OpArg SImmAuto(s32 imm) { |
| 276 | return OpArg(imm, (imm >= 128 || imm < -128) ? SCALE_IMM32 : SCALE_IMM8); | 274 | return OpArg(imm, (imm >= 128 || imm < -128) ? SCALE_IMM32 : SCALE_IMM8); |
| 277 | } | 275 | } |
| 278 | 276 | ||