Simplify disassembly of memory access with zero offset

This commit is contained in:
Kingcom 2014-08-22 23:28:28 +02:00
parent b72963ee5f
commit d1619af18c
1 changed files with 51 additions and 25 deletions

View File

@ -820,32 +820,58 @@ void BLEZL( std::string& output ) { _sap("blezl\t%s, ") GPR_REG[DECO
void BGTZL( std::string& output ) { _sap("bgtzl\t%s, ") GPR_REG[DECODE_RS]); offset_decode(output); } void BGTZL( std::string& output ) { _sap("bgtzl\t%s, ") GPR_REG[DECODE_RS]); offset_decode(output); }
void DADDI( std::string& output ) { _sap("daddi\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); } void DADDI( std::string& output ) { _sap("daddi\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); }
void DADDIU( std::string& output ) { _sap("daddiu\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); } void DADDIU( std::string& output ) { _sap("daddiu\t%s, %s, 0x%04X") GPR_REG[DECODE_RT], GPR_REG[DECODE_RS], DECODE_IMMED); }
void LDL( std::string& output ) { _sap("ldl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LDR( std::string& output ) { _sap("ldr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } void disMemAccess( std::string& output, const char* name, int cop = 0)
void LB( std::string& output ) { _sap("lb\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } {
void LH( std::string& output ) { _sap("lh\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } const char* rt;
void LWL( std::string& output ) { _sap("lwl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } switch (cop)
void LW( std::string& output ) { _sap("lw\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } {
void LBU( std::string& output ) { _sap("lbu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } case 0:
void LHU( std::string& output ) { _sap("lhu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } rt = GPR_REG[DECODE_RT];
void LWR( std::string& output ) { _sap("lwr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } break;
void LWU( std::string& output ) { _sap("lwu\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } case 1:
void SB( std::string& output ) { _sap("sb\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } rt = COP1_REG_FP[DECODE_FT];
void SH( std::string& output ) { _sap("sh\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } break;
void SWL( std::string& output ) { _sap("swl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } case 2:
void SW( std::string& output ) { _sap("sw\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } rt = COP2_REG_FP[DECODE_FT];
void SDL( std::string& output ) { _sap("sdl\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } break;
void SDR( std::string& output ) { _sap("sdr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } }
void SWR( std::string& output ) { _sap("swr\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void LD( std::string& output ) { _sap("ld\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } const char* rs = GPR_REG[DECODE_RS];
void SD( std::string& output ) { _sap("sd\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } s16 imm = DECODE_IMMED;
void LQ( std::string& output ) { _sap("lq\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); }
void SQ( std::string& output ) { _sap("sq\t%s, %s(%s)") GPR_REG[DECODE_RT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } if (disSimplify && imm == 0)
void SWC1( std::string& output ) { _sap("swc1\t%s, %s(%s)") COP1_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } ssappendf(output, "%s\t%s,(%s)",name,rt,rs);
void SQC2( std::string& output ) { _sap("sqc2\t%s, %s(%s)") COP2_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } else
ssappendf(output, "%s\t%s, %s(%s)",name,rt,signedImmediate(imm,4),rs);
}
void LDL( std::string& output ) { disMemAccess(output,"ldl"); }
void LDR( std::string& output ) { disMemAccess(output,"ldr"); }
void LB( std::string& output ) { disMemAccess(output,"lb"); }
void LH( std::string& output ) { disMemAccess(output,"lh"); }
void LWL( std::string& output ) { disMemAccess(output,"lwl"); }
void LW( std::string& output ) { disMemAccess(output,"lw"); }
void LBU( std::string& output ) { disMemAccess(output,"lbu"); }
void LHU( std::string& output ) { disMemAccess(output,"lhu"); }
void LWR( std::string& output ) { disMemAccess(output,"lwr"); }
void LWU( std::string& output ) { disMemAccess(output,"lwu"); }
void SB( std::string& output ) { disMemAccess(output,"sb"); }
void SH( std::string& output ) { disMemAccess(output,"sh"); }
void SWL( std::string& output ) { disMemAccess(output,"swl"); }
void SW( std::string& output ) { disMemAccess(output,"sw"); }
void SDL( std::string& output ) { disMemAccess(output,"sdl"); }
void SDR( std::string& output ) { disMemAccess(output,"sdr"); }
void SWR( std::string& output ) { disMemAccess(output,"swr"); }
void LD( std::string& output ) { disMemAccess(output,"ld"); }
void SD( std::string& output ) { disMemAccess(output,"sd"); }
void LQ( std::string& output ) { disMemAccess(output,"lq"); }
void SQ( std::string& output ) { disMemAccess(output,"sq"); }
void SWC1( std::string& output ) { disMemAccess(output,"swc1",1); }
void SQC2( std::string& output ) { disMemAccess(output,"sqc2",2); }
void PREF( std::string& output ) { output += "pref ---"; /*_sap("PREF\t%s, 0x%04X(%s)") GPR_REG[DECODE_RT], DECODE_IMMED, GPR_REG[RS]); */} void PREF( std::string& output ) { output += "pref ---"; /*_sap("PREF\t%s, 0x%04X(%s)") GPR_REG[DECODE_RT], DECODE_IMMED, GPR_REG[RS]); */}
void LWC1( std::string& output ) { _sap("lwc1\t%s, %s(%s)") COP1_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } void LWC1( std::string& output ) { disMemAccess(output,"lwc1",1); }
void LQC2( std::string& output ) { _sap("lqc2\t%s, %s(%s)") COP2_REG_FP[DECODE_FT], signedImmediate(DECODE_IMMED,4), GPR_REG[DECODE_RS]); } void LQC2( std::string& output ) { disMemAccess(output,"lqc2",2); }
//********************END OF STANDARD OPCODES************************* //********************END OF STANDARD OPCODES*************************
void SLL( std::string& output ) void SLL( std::string& output )