ArmEmitter: make it more readable

This commit is contained in:
Tillmann Karras 2014-02-27 18:28:00 +01:00
parent 46e7c0657f
commit 7a66a3ded1
2 changed files with 51 additions and 59 deletions

View File

@ -335,7 +335,7 @@ void ARMXEmitter::NOP(int count)
void ARMXEmitter::SETEND(bool BE) void ARMXEmitter::SETEND(bool BE)
{ {
//SETEND is non-conditional //SETEND is non-conditional
Write32( 0xF1010000 | (BE << 9)); Write32(0xF1010000 | (BE << 9));
} }
void ARMXEmitter::BKPT(u16 arg) void ARMXEmitter::BKPT(u16 arg)
{ {
@ -380,8 +380,7 @@ FixupBranch ARMXEmitter::B_CC(CCFlags Cond)
void ARMXEmitter::B_CC(CCFlags Cond, const void *fnptr) void ARMXEmitter::B_CC(CCFlags Cond, const void *fnptr)
{ {
s32 distance = (s32)fnptr - (s32(code) + 8); s32 distance = (s32)fnptr - (s32(code) + 8);
_dbg_assert_msg_(DYNA_REC, distance > -33554432 _dbg_assert_msg_(DYNA_REC, distance > -0x2000000 && distance <= 0x2000000,
&& distance <= 33554432,
"B_CC out of range (%p calls %p)", code, fnptr); "B_CC out of range (%p calls %p)", code, fnptr);
Write32((Cond << 28) | 0x0A000000 | ((distance >> 2) & 0x00FFFFFF)); Write32((Cond << 28) | 0x0A000000 | ((distance >> 2) & 0x00FFFFFF));
@ -399,22 +398,16 @@ FixupBranch ARMXEmitter::BL_CC(CCFlags Cond)
void ARMXEmitter::SetJumpTarget(FixupBranch const &branch) void ARMXEmitter::SetJumpTarget(FixupBranch const &branch)
{ {
s32 distance = (s32(code) - 8) - (s32)branch.ptr; s32 distance = (s32(code) - 8) - (s32)branch.ptr;
_dbg_assert_msg_(DYNA_REC, distance > -33554432 _dbg_assert_msg_(DYNA_REC, distance > -0x2000000 && distance <= 0x2000000,
&& distance <= 33554432, "SetJumpTarget out of range (%p calls %p)", code, branch.ptr);
"SetJumpTarget out of range (%p calls %p)", code, u32 instr = (u32)(branch.condition | ((distance >> 2) & 0x00FFFFFF));
branch.ptr); instr |= branch.type ? /* B */ 0x0A000000 : /* BL */ 0x0B000000;
if(branch.type == 0) // B *(u32*)branch.ptr = instr;
*(u32*)branch.ptr = (u32)(branch.condition | (10 << 24) | ((distance >> 2) &
0x00FFFFFF));
else // BL
*(u32*)branch.ptr = (u32)(branch.condition | 0x0B000000 | ((distance >> 2)
& 0x00FFFFFF));
} }
void ARMXEmitter::B (const void *fnptr) void ARMXEmitter::B(const void *fnptr)
{ {
s32 distance = (s32)fnptr - (s32(code) + 8); s32 distance = (s32)fnptr - (s32(code) + 8);
_dbg_assert_msg_(DYNA_REC, distance > -33554432 _dbg_assert_msg_(DYNA_REC, distance > -0x2000000 && distance <= 0x2000000,
&& distance <= 33554432,
"B out of range (%p calls %p)", code, fnptr); "B out of range (%p calls %p)", code, fnptr);
Write32(condition | 0x0A000000 | ((distance >> 2) & 0x00FFFFFF)); Write32(condition | 0x0A000000 | ((distance >> 2) & 0x00FFFFFF));
@ -427,7 +420,7 @@ void ARMXEmitter::B(ARMReg src)
bool ARMXEmitter::BLInRange(const void *fnptr) { bool ARMXEmitter::BLInRange(const void *fnptr) {
s32 distance = (s32)fnptr - (s32(code) + 8); s32 distance = (s32)fnptr - (s32(code) + 8);
if (distance <= -33554432 || distance > 33554432) if (distance <= -0x2000000 || distance > 0x2000000)
return false; return false;
else else
return true; return true;
@ -436,8 +429,7 @@ bool ARMXEmitter::BLInRange(const void *fnptr) {
void ARMXEmitter::BL(const void *fnptr) void ARMXEmitter::BL(const void *fnptr)
{ {
s32 distance = (s32)fnptr - (s32(code) + 8); s32 distance = (s32)fnptr - (s32(code) + 8);
_dbg_assert_msg_(DYNA_REC, distance > -33554432 _dbg_assert_msg_(DYNA_REC, distance > -0x2000000 && distance <= 0x2000000,
&& distance <= 33554432,
"BL out of range (%p calls %p)", code, fnptr); "BL out of range (%p calls %p)", code, fnptr);
Write32(condition | 0x0B000000 | ((distance >> 2) & 0x00FFFFFF)); Write32(condition | 0x0B000000 | ((distance >> 2) & 0x00FFFFFF));
} }
@ -506,7 +498,7 @@ const s32 InstOps[][4] = {{16, 0, 0, 0}, // AND(s)
{26, -1, -1, -1}, // MOVT {26, -1, -1, -1}, // MOVT
}; };
const char *InstNames[] = { "AND", const char *InstNames[] = {"AND",
"EOR", "EOR",
"SUB", "SUB",
"RSB", "RSB",