From f2ecfc99adc8510a646c65abf7b3e4da45a4e5ff Mon Sep 17 00:00:00 2001 From: Gregory Hainaut Date: Sun, 17 Jan 2016 12:06:08 +0100 Subject: [PATCH] x86emitter: align EmitRex interface on EmitSibMagic --- common/include/x86emitter/internal.h | 11 ++-- common/src/x86emitter/x86emitter.cpp | 82 +++++++++++++++++----------- 2 files changed, 57 insertions(+), 36 deletions(-) diff --git a/common/include/x86emitter/internal.h b/common/include/x86emitter/internal.h index 6bf573ead8..52251e2391 100644 --- a/common/include/x86emitter/internal.h +++ b/common/include/x86emitter/internal.h @@ -31,11 +31,12 @@ namespace x86Emitter { extern void EmitSibMagic( const xRegisterBase& reg1, const void* src ); extern void EmitSibMagic( const xRegisterBase& reg1, const xIndirectVoid& sib ); - void EmitRex( const xRegisterBase& reg1, const xRegisterBase& reg2 ); - void EmitRex( const xRegisterBase& reg1, const void* src ); - void EmitRex( const xRegisterBase& reg1, const xIndirectVoid& sib ); - void EmitRex( const xRegisterBase& reg1 ); - void EmitRex( const xIndirectVoid& sib ); + extern void EmitRex( uint regfield, const void* address ); + extern void EmitRex( uint regfield, const xIndirectVoid& info ); + extern void EmitRex( uint reg1, const xRegisterBase& reg2 ); + extern void EmitRex( const xRegisterBase& reg1, const xRegisterBase& reg2 ); + extern void EmitRex( const xRegisterBase& reg1, const void* src ); + extern void EmitRex( const xRegisterBase& reg1, const xIndirectVoid& sib ); extern void _xMovRtoR( const xRegisterInt& to, const xRegisterInt& from ); diff --git a/common/src/x86emitter/x86emitter.cpp b/common/src/x86emitter/x86emitter.cpp index f5b0af32c6..bd2484e9ef 100644 --- a/common/src/x86emitter/x86emitter.cpp +++ b/common/src/x86emitter/x86emitter.cpp @@ -406,51 +406,71 @@ void EmitSibMagic( const xRegisterBase& reg1, const xIndirectVoid& sib ) } ////////////////////////////////////////////////////////////////////////////////////////// +__emitinline static void EmitRex(bool w, bool r, bool x, bool b) +{ +#ifdef __x86_64__ + u8 rex = 0x40 | (w << 3) | (r << 2) | (x << 1) | b; + if (rex != 0x40) + xWrite8(rex); +#endif +} + +void EmitRex( uint regfield, const void* address ) +{ + pxAssert(0); + bool w = false; + bool r = false; + bool x = false; + bool b = false; + EmitRex(w, r, x, b); +} + +void EmitRex( uint regfield, const xIndirectVoid& info ) +{ + bool w = info.Base.IsWide(); + bool r = false; + bool x = false; + bool b = info.IsExtended(); + EmitRex(w, r, x, b); +} + +void EmitRex( uint reg1, const xRegisterBase& reg2 ) +{ + bool w = reg2.IsWide(); + bool r = false; + bool x = false; + bool b = reg2.IsExtended(); + EmitRex(w, r, x, b); +} + void EmitRex( const xRegisterBase& reg1, const xRegisterBase& reg2 ) { - u8 w = reg1.IsWide() << 3; - u8 r = reg1.IsExtended() << 2; - u8 x = 0; - u8 b = reg2.IsExtended(); - xWrite8( 0x40 | w | r | x | b ); + bool w = reg1.IsWide(); + bool r = reg1.IsExtended(); + bool x = false; + bool b = reg2.IsExtended(); + EmitRex(w, r, x, b); } void EmitRex( const xRegisterBase& reg1, const void* src ) { pxAssert(0); //see fixme - u8 w = reg1.IsWide() << 3; - u8 r = reg1.IsExtended() << 2; - u8 x = 0; - u8 b = 0; // FIXME src.IsExtended(); - xWrite8( 0x40 | w | r | x | b ); + bool w = reg1.IsWide(); + bool r = reg1.IsExtended(); + bool x = false; + bool b = false; // FIXME src.IsExtended(); + EmitRex(w, r, x, b); } void EmitRex( const xRegisterBase& reg1, const xIndirectVoid& sib ) { - u8 w = reg1.IsWide() << 3; - u8 r = reg1.IsExtended() << 2; - u8 x = sib.Index.IsExtended() << 1; + u8 w = reg1.IsWide(); + u8 r = reg1.IsExtended(); + u8 x = sib.Index.IsExtended(); u8 b = sib.Base.IsExtended(); - xWrite8( 0x40 | w | r | x | b ); + EmitRex(w, r, x, b); } -void EmitRex( const xRegisterBase& reg1) -{ - u8 w = reg1.IsWide() << 3; - u8 r = 0; - u8 x = 0; - u8 b = reg1.IsExtended(); - xWrite8( 0x40 | w | r | x | b ); -} - -void EmitRex( const xIndirectVoid& sib) -{ - u8 w = sib.Base.IsWide() << 3; - u8 r = 0; - u8 x = 0; - u8 b = sib.IsExtended(); - xWrite8( 0x40 | w | r | x | b ); -} // -------------------------------------------------------------------------------------- // xSetPtr / xAlignPtr / xGetPtr / xAdvancePtr