diff options
| author | Tillmann Karras <tilkax@gmail.com> | 2015-08-21 21:49:09 +0200 |
|---|---|---|
| committer | Tillmann Karras <tilkax@gmail.com> | 2015-08-26 05:41:18 +0200 |
| commit | ee4a12ffe2cccb41c1cfc136e55903dc03a3e17c (patch) | |
| tree | 2b09b3cfa48a7c0b94079ef9f0e00b2ef02c80a0 /Source/Core/Common/x64Emitter.cpp | |
| parent | 6015e2d812db80557810aaa39ce473bb1af21056 (diff) | |
Jit64: some byte-swapping changes
Diffstat (limited to 'Source/Core/Common/x64Emitter.cpp')
| -rw-r--r-- | Source/Core/Common/x64Emitter.cpp | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/Source/Core/Common/x64Emitter.cpp b/Source/Core/Common/x64Emitter.cpp index 280e58d82a..f2763d83a8 100644 --- a/Source/Core/Common/x64Emitter.cpp +++ b/Source/Core/Common/x64Emitter.cpp @@ -887,21 +887,46 @@ void XEmitter::WriteMOVBE(int bits, u8 op, X64Reg reg, const OpArg& arg) void XEmitter::MOVBE(int bits, X64Reg dest, const OpArg& src) {WriteMOVBE(bits, 0xF0, dest, src);} void XEmitter::MOVBE(int bits, const OpArg& dest, X64Reg src) {WriteMOVBE(bits, 0xF1, src, dest);} -void XEmitter::LoadAndSwap(int size, X64Reg dst, const OpArg& src) +void XEmitter::LoadAndSwap(int size, X64Reg dst, const OpArg& src, bool sign_extend) { - if (cpu_info.bMOVBE) - { - MOVBE(size, dst, src); - } - else + switch (size) { - MOV(size, R(dst), src); - BSWAP(size, dst); + case 8: + if (sign_extend) + MOVSX(32, 8, dst, src); + else + MOVZX(32, 8, dst, src); + break; + case 16: + MOVZX(32, 16, dst, src); + if (sign_extend) + { + BSWAP(32, dst); + SAR(32, R(dst), Imm8(16)); + } + else + { + ROL(16, R(dst), Imm8(8)); + } + break; + case 32: + case 64: + if (cpu_info.bMOVBE) + { + MOVBE(size, dst, src); + } + else + { + MOV(size, R(dst), src); + BSWAP(size, dst); + } + break; } } -void XEmitter::SwapAndStore(int size, const OpArg& dst, X64Reg src) +u8* XEmitter::SwapAndStore(int size, const OpArg& dst, X64Reg src) { + u8* mov_location = GetWritableCodePtr(); if (cpu_info.bMOVBE) { MOVBE(size, dst, src); @@ -909,8 +934,10 @@ void XEmitter::SwapAndStore(int size, const OpArg& dst, X64Reg src) else { BSWAP(size, src); + mov_location = GetWritableCodePtr(); MOV(size, dst, R(src)); } + return mov_location; } |
