diff options
| author | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-01-18 19:48:14 -0600 |
|---|---|---|
| committer | Ryan Houdek <Sonicadvance1@gmail.com> | 2015-01-18 19:48:14 -0600 |
| commit | 7e64869185d47a835d22016c232cef09a3a53615 (patch) | |
| tree | d8f5d19bf319be9a25ae46917d6341b02a89d18c /Source/Core/Common/x64Emitter.cpp | |
| parent | 5357b9c95ff2458e3b8c3112e303924a0d460ce6 (diff) | |
| parent | d3f49097c5226dc9ff0dd2fa37dc4896a38d9448 (diff) | |
Merge pull request #1887 from Tilka/vertex_loader_jit
VertexLoader: rewrite x64 JIT
Diffstat (limited to 'Source/Core/Common/x64Emitter.cpp')
| -rw-r--r-- | Source/Core/Common/x64Emitter.cpp | 42 |
1 files changed, 28 insertions, 14 deletions
diff --git a/Source/Core/Common/x64Emitter.cpp b/Source/Core/Common/x64Emitter.cpp index fccbd2770e..618ec40b18 100644 --- a/Source/Core/Common/x64Emitter.cpp +++ b/Source/Core/Common/x64Emitter.cpp @@ -870,35 +870,49 @@ void XEmitter::MOVZX(int dbits, int sbits, X64Reg dest, OpArg src) src.WriteRest(this); } -void XEmitter::MOVBE(int bits, const OpArg& dest, const OpArg& src) +void XEmitter::WriteMOVBE(int bits, u8 op, X64Reg reg, OpArg arg) { _assert_msg_(DYNA_REC, cpu_info.bMOVBE, "Generating MOVBE on a system that does not support it."); if (bits == 8) { - MOV(bits, dest, src); + MOV(8, op & 1 ? arg : R(reg), op & 1 ? R(reg) : arg); return; } - if (bits == 16) Write8(0x66); + _assert_msg_(DYNA_REC, !arg.IsSimpleReg() && !arg.IsImm(), "MOVBE: need r<-m or m<-r!"); + arg.WriteRex(this, bits, bits, reg); + Write8(0x0F); + Write8(0x38); + Write8(op); + arg.WriteRest(this, 0, reg); +} +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);} - if (dest.IsSimpleReg()) +void XEmitter::LoadAndSwap(int size, Gen::X64Reg dst, const Gen::OpArg& src) +{ + if (cpu_info.bMOVBE) + { + MOVBE(size, dst, src); + } + else { - _assert_msg_(DYNA_REC, !src.IsSimpleReg() && !src.IsImm(), "MOVBE: Loading from !mem"); - src.WriteRex(this, bits, bits, dest.GetSimpleReg()); - Write8(0x0F); Write8(0x38); Write8(0xF0); - src.WriteRest(this, 0, dest.GetSimpleReg()); + MOV(size, R(dst), src); + BSWAP(size, dst); } - else if (src.IsSimpleReg()) +} + +void XEmitter::SwapAndStore(int size, const Gen::OpArg& dst, Gen::X64Reg src) +{ + if (cpu_info.bMOVBE) { - _assert_msg_(DYNA_REC, !dest.IsSimpleReg() && !dest.IsImm(), "MOVBE: Storing to !mem"); - dest.WriteRex(this, bits, bits, src.GetSimpleReg()); - Write8(0x0F); Write8(0x38); Write8(0xF1); - dest.WriteRest(this, 0, src.GetSimpleReg()); + MOVBE(size, dst, src); } else { - _assert_msg_(DYNA_REC, 0, "MOVBE: Not loading or storing to mem"); + BSWAP(size, src); + MOV(size, dst, R(src)); } } |
