Further refactoring to clean up the interpreter

This commit is contained in:
dingusdev 2020-10-17 21:46:38 -07:00
parent dc58386237
commit 1fe9ffe3e5
7 changed files with 251 additions and 300 deletions

View File

@ -42,7 +42,7 @@ inline void power_setsoov(uint32_t a, uint32_t b, uint32_t d) {
}
}
void power_abs() {
void dppc_interpreter::power_abs() {
ppc_grab_regsda();
if (ppc_result_a == 0x80000000) {
ppc_result_d = ppc_result_a;
@ -59,7 +59,7 @@ void power_abs() {
ppc_store_result_regd();
}
void power_clcs() {
void dppc_interpreter::power_clcs() {
ppc_grab_regsda();
switch (reg_a) {
case 12:
@ -80,7 +80,7 @@ void power_clcs() {
ppc_store_result_regd();
}
void power_div() {
void dppc_interpreter::power_div() {
ppc_grab_regsdab();
ppc_result_d = (ppc_result_a | ppc_state.spr[SPR::MQ]) / ppc_result_b;
ppc_state.spr[SPR::MQ] = (ppc_result_a | ppc_state.spr[SPR::MQ]) % ppc_result_b;
@ -93,7 +93,7 @@ void power_div() {
ppc_store_result_regd();
}
void power_divs() {
void dppc_interpreter::power_divs() {
ppc_grab_regsdab();
ppc_result_d = ppc_result_a / ppc_result_b;
ppc_state.spr[SPR::MQ] = (ppc_result_a % ppc_result_b);
@ -106,7 +106,7 @@ void power_divs() {
ppc_store_result_regd();
}
void power_doz() {
void dppc_interpreter::power_doz() {
ppc_grab_regsdab();
if (((int32_t)ppc_result_a) > ((int32_t)ppc_result_b)) {
ppc_result_d = 0;
@ -120,7 +120,7 @@ void power_doz() {
ppc_store_result_rega();
}
void power_dozi() {
void dppc_interpreter::power_dozi() {
ppc_grab_regsdab();
if (((int32_t)ppc_result_a) > simm) {
ppc_result_d = 0;
@ -130,7 +130,7 @@ void power_dozi() {
ppc_store_result_rega();
}
void power_lscbx() {
void dppc_interpreter::power_lscbx() {
ppc_grab_regsdab();
uint32_t bytes_copied = 0;
bool match_found = false;
@ -191,7 +191,7 @@ void power_lscbx() {
ppc_store_result_regd();
}
void power_maskg() {
void dppc_interpreter::power_maskg() {
ppc_grab_regssab();
uint32_t mask_start = ppc_result_d & 31;
uint32_t mask_end = ppc_result_b & 31;
@ -218,7 +218,7 @@ void power_maskg() {
ppc_store_result_rega();
}
void power_maskir() {
void dppc_interpreter::power_maskir() {
ppc_grab_regssab();
uint32_t mask_insert = ppc_result_a;
uint32_t insert_rot = 0x80000000;
@ -238,7 +238,7 @@ void power_maskir() {
ppc_store_result_rega();
}
void power_mul() {
void dppc_interpreter::power_mul() {
ppc_grab_regsdab();
uint64_t product;
@ -252,7 +252,7 @@ void power_mul() {
ppc_store_result_regd();
}
void power_nabs() {
void dppc_interpreter::power_nabs() {
ppc_grab_regsda();
ppc_result_d = (0x80000000 | ppc_result_a);
@ -262,7 +262,7 @@ void power_nabs() {
ppc_store_result_regd();
}
void power_rlmi() {
void dppc_interpreter::power_rlmi() {
ppc_grab_regssab();
unsigned rot_mb = (ppc_cur_instruction >> 6) & 31;
unsigned rot_me = (ppc_cur_instruction >> 1) & 31;
@ -287,7 +287,7 @@ void power_rlmi() {
ppc_store_result_rega();
}
void power_rrib() {
void dppc_interpreter::power_rrib() {
ppc_grab_regssab();
if (ppc_result_d & 0x80000000) {
@ -302,7 +302,7 @@ void power_rrib() {
ppc_store_result_rega();
}
void power_sle() {
void dppc_interpreter::power_sle() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
uint32_t rot_amt = ppc_result_b & 31;
@ -319,7 +319,7 @@ void power_sle() {
ppc_store_result_rega();
}
void power_sleq() {
void dppc_interpreter::power_sleq() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
uint32_t rot_amt = ppc_result_b & 31;
@ -345,7 +345,7 @@ void power_sleq() {
ppc_store_result_rega();
}
void power_sliq() {
void dppc_interpreter::power_sliq() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
unsigned rot_sh = (ppc_cur_instruction >> 11) & 31;
@ -371,7 +371,7 @@ void power_sliq() {
ppc_store_result_rega();
}
void power_slliq() {
void dppc_interpreter::power_slliq() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
unsigned rot_sh = (ppc_cur_instruction >> 11) & 31;
@ -397,23 +397,23 @@ void power_slliq() {
ppc_store_result_rega();
}
void power_sllq() {
void dppc_interpreter::power_sllq() {
LOG_F(WARNING, "OOPS! Placeholder for sllq!!! \n");
}
void power_slq() {
void dppc_interpreter::power_slq() {
LOG_F(WARNING, "OOPS! Placeholder for slq!!! \n");
}
void power_sraiq() {
void dppc_interpreter::power_sraiq() {
LOG_F(WARNING, "OOPS! Placeholder for sraiq!!! \n");
}
void power_sraq() {
void dppc_interpreter::power_sraq() {
LOG_F(WARNING, "OOPS! Placeholder for sraq!!! \n");
}
void power_sre() {
void dppc_interpreter::power_sre() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
uint32_t rot_amt = ppc_result_b & 31;
@ -428,11 +428,11 @@ void power_sre() {
ppc_store_result_rega();
}
void power_srea() {
void dppc_interpreter::power_srea() {
LOG_F(WARNING, "OOPS! Placeholder for srea!!! \n");
}
void power_sreq() {
void dppc_interpreter::power_sreq() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
unsigned rot_sh = ppc_result_b & 31;
@ -458,7 +458,7 @@ void power_sreq() {
ppc_store_result_rega();
}
void power_sriq() {
void dppc_interpreter::power_sriq() {
ppc_grab_regssa();
uint32_t insert_mask = 0;
unsigned rot_sh = (ppc_cur_instruction >> 11) & 31;
@ -484,14 +484,14 @@ void power_sriq() {
ppc_store_result_rega();
}
void power_srliq() {
void dppc_interpreter::power_srliq() {
LOG_F(WARNING, "OOPS! Placeholder for slriq!!! \n");
}
void power_srlq() {
void dppc_interpreter::power_srlq() {
LOG_F(WARNING, "OOPS! Placeholder for slrq!!! \n");
}
void power_srq() {
void dppc_interpreter::power_srq() {
LOG_F(WARNING, "OOPS! Placeholder for srq!!! \n");
}

View File

@ -303,6 +303,7 @@ void ppc_fp_changecrf1();
extern MemCtrlBase* mem_ctrl_instance;
// The functions used by the PowerPC processor
namespace dppc_interpreter {
extern void ppc_bcctr();
extern void ppc_bcctrl();
extern void ppc_bclr();
@ -541,12 +542,7 @@ extern void power_sriq();
extern void power_srliq();
extern void power_srlq();
extern void power_srq();
// Gekko instructions
extern void ppc_psq_l();
extern void ppc_psq_lu();
extern void ppc_psq_st();
extern void ppc_psq_stu();
} // namespace dppc_interpreter
// AltiVec instructions

View File

@ -35,6 +35,7 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
#define NEW_TBR_UPDATE_ALGO
using namespace std;
using namespace dppc_interpreter;
MemCtrlBase* mem_ctrl_instance = 0;
@ -72,17 +73,17 @@ uint8_t tbr_factor; /* cycles_count to TBR freq ratio in 2^x units */
/** Primary opcode (bits 0...5) lookup table. */
static PPCOpcode OpcodeGrabber[] = {
ppc_illegalop, ppc_illegalop, ppc_illegalop, ppc_twi, ppc_opcode4, ppc_illegalop,
ppc_illegalop, ppc_mulli, ppc_subfic, power_dozi, ppc_cmpli, ppc_cmpi,
ppc_addic, ppc_addicdot, ppc_addi, ppc_addis, ppc_opcode16, ppc_sc,
ppc_opcode18, ppc_opcode19, ppc_rlwimi, ppc_rlwinm, power_rlmi, ppc_rlwnm,
ppc_ori, ppc_oris, ppc_xori, ppc_xoris, ppc_andidot, ppc_andisdot,
ppc_illegalop, ppc_opcode31, ppc_lwz, ppc_lwzu, ppc_lbz, ppc_lbzu,
ppc_stw, ppc_stwu, ppc_stb, ppc_stbu, ppc_lhz, ppc_lhzu,
ppc_lha, ppc_lhau, ppc_sth, ppc_sthu, ppc_lmw, ppc_stmw,
ppc_lfs, ppc_lfsu, ppc_lfd, ppc_lfdu, ppc_stfs, ppc_stfsu,
ppc_stfd, ppc_stfdu, ppc_psq_l, ppc_psq_lu, ppc_illegalop, ppc_illegalop,
ppc_psq_st, ppc_psq_stu, ppc_illegalop, ppc_opcode63};
ppc_illegalop, ppc_illegalop, ppc_illegalop, ppc_twi, ppc_opcode4, ppc_illegalop,
ppc_illegalop, ppc_mulli, ppc_subfic, power_dozi, ppc_cmpli, ppc_cmpi,
ppc_addic, ppc_addicdot, ppc_addi, ppc_addis, ppc_opcode16, ppc_sc,
ppc_opcode18, ppc_opcode19, ppc_rlwimi, ppc_rlwinm, power_rlmi, ppc_rlwnm,
ppc_ori, ppc_oris, ppc_xori, ppc_xoris, ppc_andidot, ppc_andisdot,
ppc_illegalop, ppc_opcode31, ppc_lwz, ppc_lwzu, ppc_lbz, ppc_lbzu,
ppc_stw, ppc_stwu, ppc_stb, ppc_stbu, ppc_lhz, ppc_lhzu,
ppc_lha, ppc_lhau, ppc_sth, ppc_sthu, ppc_lmw, ppc_stmw,
ppc_lfs, ppc_lfsu, ppc_lfd, ppc_lfdu, ppc_stfs, ppc_stfsu,
ppc_stfd, ppc_stfdu, ppc_illegalop, ppc_illegalop, ppc_illegalop, ppc_illegalop,
ppc_illegalop, ppc_illegalop, ppc_illegalop, ppc_opcode63};
/** Lookup tables for branch instructions. */
static PPCOpcode SubOpcode16Grabber[] = {ppc_bc, ppc_bcl, ppc_bca, ppc_bcla};
@ -577,29 +578,29 @@ void initialize_ppc_opcode_tables() {
SubOpcode31Grabber[978] = ppc_tlbld;
SubOpcode31Grabber[1010] = ppc_tlbli;
SubOpcode63Grabber[18] = ppc_fdivs;
SubOpcode63Grabber[20] = ppc_fsubs;
SubOpcode63Grabber[22] = ppc_fsqrts;
SubOpcode63Grabber[24] = ppc_fres;
SubOpcode59Grabber[18] = ppc_fdivs;
SubOpcode59Grabber[20] = ppc_fsubs;
SubOpcode59Grabber[22] = ppc_fsqrts;
SubOpcode59Grabber[24] = ppc_fres;
for (int i = 25; i < 1024; i += 32) {
SubOpcode63Grabber[i] = ppc_fmults;
SubOpcode59Grabber[i] = ppc_fmults;
}
for (int i = 28; i < 1024; i += 32) {
SubOpcode63Grabber[i] = ppc_fmsubs;
SubOpcode59Grabber[i] = ppc_fmsubs;
}
for (int i = 29; i < 1024; i += 32) {
SubOpcode63Grabber[i] = ppc_fmadds;
SubOpcode59Grabber[i] = ppc_fmadds;
}
for (int i = 30; i < 1024; i += 32) {
SubOpcode63Grabber[i] = ppc_fnmsubs;
SubOpcode59Grabber[i] = ppc_fnmsubs;
}
for (int i = 31; i < 1024; i += 32) {
SubOpcode63Grabber[i] = ppc_fnmadds;
SubOpcode59Grabber[i] = ppc_fnmadds;
}
SubOpcode63Grabber[0] = ppc_fcmpu;

View File

@ -371,7 +371,7 @@ void ppc_changecrf1() {
}
// Floating Point Arithmetic
void ppc_fadd() {
void dppc_interpreter::ppc_fadd() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) {
@ -383,7 +383,7 @@ void ppc_fadd() {
ppc_changecrf1();
}
void ppc_fsub() {
void dppc_interpreter::ppc_fsub() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 56)) {
@ -395,7 +395,7 @@ void ppc_fsub() {
ppc_changecrf1();
}
void ppc_fdiv() {
void dppc_interpreter::ppc_fdiv() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 36)) {
@ -407,7 +407,7 @@ void ppc_fdiv() {
ppc_changecrf1();
}
void ppc_fmult() {
void dppc_interpreter::ppc_fmult() {
ppc_grab_regsfpdac(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 50)) {
@ -419,7 +419,7 @@ void ppc_fmult() {
ppc_changecrf1();
}
void ppc_fmadd() {
void dppc_interpreter::ppc_fmadd() {
ppc_grab_regsfpdabc(false);
if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
@ -435,7 +435,7 @@ void ppc_fmadd() {
ppc_changecrf1();
}
void ppc_fmsub() {
void dppc_interpreter::ppc_fmsub() {
ppc_grab_regsfpdabc(false);
if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
@ -451,7 +451,7 @@ void ppc_fmsub() {
ppc_changecrf1();
}
void ppc_fnmadd() {
void dppc_interpreter::ppc_fnmadd() {
ppc_grab_regsfpdabc(false);
if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
@ -468,7 +468,7 @@ void ppc_fnmadd() {
ppc_changecrf1();
}
void ppc_fnmsub() {
void dppc_interpreter::ppc_fnmsub() {
ppc_grab_regsfpdabc(false);
if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) {
@ -485,7 +485,7 @@ void ppc_fnmsub() {
ppc_changecrf1();
}
void ppc_fadds() {
void dppc_interpreter::ppc_fadds() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) {
@ -498,7 +498,7 @@ void ppc_fadds() {
ppc_changecrf1();
}
void ppc_fsubs() {
void dppc_interpreter::ppc_fsubs() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 56)) {
@ -511,7 +511,7 @@ void ppc_fsubs() {
ppc_changecrf1();
}
void ppc_fmults() {
void dppc_interpreter::ppc_fmults() {
ppc_grab_regsfpdac(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 50)) {
@ -524,7 +524,7 @@ void ppc_fmults() {
ppc_changecrf1();
}
void ppc_fdivs() {
void dppc_interpreter::ppc_fdivs() {
ppc_grab_regsfpdab(false);
if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 36)) {
@ -537,7 +537,7 @@ void ppc_fdivs() {
ppc_changecrf1();
}
void ppc_fmadds() {
void dppc_interpreter::ppc_fmadds() {
ppc_grab_regsfpdabc(false);
float intermediate;
@ -556,7 +556,7 @@ void ppc_fmadds() {
ppc_changecrf1();
}
void ppc_fmsubs() {
void dppc_interpreter::ppc_fmsubs() {
ppc_grab_regsfpdabc(false);
float intermediate;
@ -575,7 +575,7 @@ void ppc_fmsubs() {
ppc_changecrf1();
}
void ppc_fnmadds() {
void dppc_interpreter::ppc_fnmadds() {
ppc_grab_regsfpdabc(false);
float intermediate;
@ -596,7 +596,7 @@ void ppc_fnmadds() {
ppc_changecrf1();
}
void ppc_fnmsubs() {
void dppc_interpreter::ppc_fnmsubs() {
ppc_grab_regsfpdabc(false);
float intermediate;
@ -617,7 +617,7 @@ void ppc_fnmsubs() {
ppc_changecrf1();
}
void ppc_fabs() {
void dppc_interpreter::ppc_fabs() {
ppc_grab_regsfpdb(false);
ppc_dblresult64_d = abs(ppc_dblresult64_b);
@ -628,7 +628,7 @@ void ppc_fabs() {
ppc_changecrf1();
}
void ppc_fnabs() {
void dppc_interpreter::ppc_fnabs() {
ppc_grab_regsfpdb(false);
ppc_dblresult64_d = abs(ppc_dblresult64_b);
@ -640,7 +640,7 @@ void ppc_fnabs() {
ppc_changecrf1();
}
void ppc_fneg() {
void dppc_interpreter::ppc_fneg() {
ppc_grab_regsfpdb(false);
ppc_dblresult64_d = -ppc_dblresult64_d;
@ -651,7 +651,7 @@ void ppc_fneg() {
ppc_changecrf1();
}
void ppc_fsel() {
void dppc_interpreter::ppc_fsel() {
ppc_grab_regsfpdabc(false);
if (ppc_dblresult64_a >= 0.0) {
@ -666,7 +666,7 @@ void ppc_fsel() {
ppc_changecrf1();
}
void ppc_fsqrt() {
void dppc_interpreter::ppc_fsqrt() {
ppc_grab_regsfpdb(false);
ppc_dblresult64_d = std::sqrt(ppc_dblresult64_b);
ppc_store_dfpresult(false);
@ -675,7 +675,7 @@ void ppc_fsqrt() {
ppc_changecrf1();
}
void ppc_fsqrts() {
void dppc_interpreter::ppc_fsqrts() {
ppc_grab_regsfpdb(true);
uint32_t test = (uint32_t)ppc_result64_b;
test += 127 << 23;
@ -688,7 +688,7 @@ void ppc_fsqrts() {
ppc_changecrf1();
}
void ppc_frsqrte() {
void dppc_interpreter::ppc_frsqrte() {
ppc_grab_regsfpdb(false);
double testd2 = (double)ppc_result64_b;
for (int i = 0; i < 10; i++) {
@ -702,7 +702,7 @@ void ppc_frsqrte() {
ppc_changecrf1();
}
void ppc_frsp() {
void dppc_interpreter::ppc_frsp() {
ppc_grab_regsfpdb(false);
double testd2 = (double)ppc_result64_b;
float testf2 = (float)testd2;
@ -713,7 +713,7 @@ void ppc_frsp() {
ppc_changecrf1();
}
void ppc_fres() {
void dppc_interpreter::ppc_fres() {
ppc_grab_regsfpdb(false);
float testf2 = (float)ppc_dblresult64_b;
testf2 = 1 / testf2;
@ -724,7 +724,7 @@ void ppc_fres() {
ppc_changecrf1();
}
void ppc_fctiw() {
void dppc_interpreter::ppc_fctiw() {
ppc_grab_regsfpdb(false);
switch (ppc_state.fpscr & 0x3) {
@ -744,7 +744,7 @@ void ppc_fctiw() {
ppc_changecrf1();
}
void ppc_fctiwz() {
void dppc_interpreter::ppc_fctiwz() {
ppc_grab_regsfpdb(false);
ppc_result64_d = round_to_zero(ppc_dblresult64_b);
@ -756,7 +756,7 @@ void ppc_fctiwz() {
// Floating Point Store and Load
void ppc_lfs() {
void dppc_interpreter::ppc_lfs() {
ppc_grab_regsfpdia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
@ -765,7 +765,7 @@ void ppc_lfs() {
}
void ppc_lfsu() {
void dppc_interpreter::ppc_lfsu() {
ppc_grab_regsfpdia(true);
if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
@ -779,14 +779,14 @@ void ppc_lfsu() {
}
}
void ppc_lfsx() {
void dppc_interpreter::ppc_lfsx() {
ppc_grab_regsfpdiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
ppc_result64_d = mem_grab_dword(ppc_effective_address);
ppc_store_dfpresult(true);
}
void ppc_lfsux() {
void dppc_interpreter::ppc_lfsux() {
ppc_grab_regsfpdiab(true);
if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b;
@ -799,7 +799,7 @@ void ppc_lfsux() {
}
}
void ppc_lfd() {
void dppc_interpreter::ppc_lfd() {
ppc_grab_regsfpdia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
@ -807,7 +807,7 @@ void ppc_lfd() {
ppc_store_dfpresult(true);
}
void ppc_lfdu() {
void dppc_interpreter::ppc_lfdu() {
ppc_grab_regsfpdia(true);
if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
@ -821,14 +821,14 @@ void ppc_lfdu() {
}
}
void ppc_lfdx() {
void dppc_interpreter::ppc_lfdx() {
ppc_grab_regsfpdia(true);
ppc_effective_address += (reg_a > 0) ? ppc_result_a + ppc_result_b : ppc_result_b;
ppc_result64_d = mem_grab_qword(ppc_effective_address);
ppc_store_dfpresult(true);
}
void ppc_lfdux() {
void dppc_interpreter::ppc_lfdux() {
ppc_grab_regsfpdiab(true);
if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b;
@ -841,14 +841,14 @@ void ppc_lfdux() {
}
}
void ppc_stfs() {
void dppc_interpreter::ppc_stfs() {
ppc_grab_regsfpsia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
mem_write_dword(ppc_effective_address, uint32_t(ppc_state.fpr[reg_s].int64_r));
}
void ppc_stfsu() {
void dppc_interpreter::ppc_stfsu() {
ppc_grab_regsfpsia(true);
if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
@ -861,13 +861,13 @@ void ppc_stfsu() {
}
}
void ppc_stfsx() {
void dppc_interpreter::ppc_stfsx() {
ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
mem_write_dword(ppc_effective_address, uint32_t(ppc_state.fpr[reg_s].int64_r));
}
void ppc_stfsux() {
void dppc_interpreter::ppc_stfsux() {
ppc_grab_regsfpsiab(true);
if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b;
@ -879,14 +879,14 @@ void ppc_stfsux() {
}
}
void ppc_stfd() {
void dppc_interpreter::ppc_stfd() {
ppc_grab_regsfpsia(true);
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0;
mem_write_qword(ppc_effective_address, ppc_state.fpr[reg_s].int64_r);
}
void ppc_stfdu() {
void dppc_interpreter::ppc_stfdu() {
ppc_grab_regsfpsia(true);
if (reg_a == 0) {
ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF));
@ -899,13 +899,13 @@ void ppc_stfdu() {
}
}
void ppc_stfdx() {
void dppc_interpreter::ppc_stfdx() {
ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
mem_write_qword(ppc_effective_address, ppc_state.fpr[reg_s].int64_r);
}
void ppc_stfdux() {
void dppc_interpreter::ppc_stfdux() {
ppc_grab_regsfpsiab(true);
if (reg_a == 0) {
ppc_effective_address = ppc_result_a + ppc_result_b;
@ -917,7 +917,7 @@ void ppc_stfdux() {
}
}
void ppc_stfiwx() {
void dppc_interpreter::ppc_stfiwx() {
ppc_grab_regsfpsiab(true);
ppc_effective_address = (reg_a == 0) ? ppc_result_b : ppc_result_a + ppc_result_b;
mem_write_dword(ppc_effective_address, (uint32_t)(ppc_state.fpr[reg_s].int64_r));
@ -925,14 +925,14 @@ void ppc_stfiwx() {
// Floating Point Register Transfer
void ppc_fmr() {
void dppc_interpreter::ppc_fmr() {
ppc_grab_regsfpdb(true);
ppc_state.fpr[reg_d] = ppc_state.fpr[reg_b];
ppc_store_dfpresult(true);
}
void ppc_mffs() {
void dppc_interpreter::ppc_mffs() {
ppc_grab_regsda();
uint64_t fpstore1 = ppc_state.fpr[reg_d].int64_r & 0xFFFFFFFF00000000;
uint64_t fpstore2 = ppc_state.fpscr & 0x00000000FFFFFFFF;
@ -940,7 +940,7 @@ void ppc_mffs() {
fp_save_uint64(fpstore1);
}
void ppc_mffsdot() {
void dppc_interpreter::ppc_mffsdot() {
ppc_grab_regsda();
uint64_t fpstore1 = ppc_state.fpr[reg_d].int64_r & 0xFFFFFFFF00000000;
uint64_t fpstore2 = ppc_state.fpscr & 0x00000000FFFFFFFF;
@ -949,7 +949,7 @@ void ppc_mffsdot() {
ppc_fp_changecrf1();
}
void ppc_mtfsf() {
void dppc_interpreter::ppc_mtfsf() {
reg_b = (ppc_cur_instruction >> 11) & 31;
uint32_t fm_mask = (ppc_cur_instruction >> 17) & 255;
crm += ((fm_mask & 1) == 1) ? 0xF0000000 : 0x00000000;
@ -964,7 +964,7 @@ void ppc_mtfsf() {
ppc_state.fpscr = (quickfprval & crm) | (quickfprval & ~(crm));
}
void ppc_mtfsfdot() {
void dppc_interpreter::ppc_mtfsfdot() {
reg_b = (ppc_cur_instruction >> 11) & 31;
uint32_t fm_mask = (ppc_cur_instruction >> 17) & 255;
crm += ((fm_mask & 1) == 1) ? 0xF0000000 : 0x00000000;
@ -980,7 +980,7 @@ void ppc_mtfsfdot() {
ppc_fp_changecrf1();
}
void ppc_mtfsfi() {
void dppc_interpreter::ppc_mtfsfi() {
ppc_result_b = (ppc_cur_instruction >> 11) & 15;
crf_d = (ppc_cur_instruction >> 23) & 7;
crf_d = crf_d << 2;
@ -988,7 +988,7 @@ void ppc_mtfsfi() {
((ppc_state.spr[SPR::XER] & 0xF0000000UL) >> crf_d);
}
void ppc_mtfsfidot() {
void dppc_interpreter::ppc_mtfsfidot() {
ppc_result_b = (ppc_cur_instruction >> 11) & 15;
crf_d = (ppc_cur_instruction >> 23) & 7;
crf_d = crf_d << 2;
@ -997,14 +997,14 @@ void ppc_mtfsfidot() {
ppc_fp_changecrf1();
}
void ppc_mtfsb0() {
void dppc_interpreter::ppc_mtfsb0() {
crf_d = (ppc_cur_instruction >> 21) & 0x31;
if ((crf_d == 0) || (crf_d > 2)) {
ppc_state.fpscr &= ~(1 << (31 - crf_d));
}
}
void ppc_mtfsb0dot() {
void dppc_interpreter::ppc_mtfsb0dot() {
crf_d = (ppc_cur_instruction >> 21) & 0x31;
if ((crf_d == 0) || (crf_d > 2)) {
ppc_state.fpscr &= ~(1 << crf_d);
@ -1012,14 +1012,14 @@ void ppc_mtfsb0dot() {
ppc_fp_changecrf1();
}
void ppc_mtfsb1() {
void dppc_interpreter::ppc_mtfsb1() {
crf_d = (ppc_cur_instruction >> 21) & 0x31;
if ((crf_d == 0) || (crf_d > 2)) {
ppc_state.fpscr |= (1 << crf_d);
}
}
void ppc_mtfsb1dot() {
void dppc_interpreter::ppc_mtfsb1dot() {
crf_d = ~(ppc_cur_instruction >> 21) & 0x31;
if ((crf_d == 0) || (crf_d > 2)) {
ppc_state.fpscr |= (1 << crf_d);
@ -1027,7 +1027,7 @@ void ppc_mtfsb1dot() {
ppc_fp_changecrf1();
}
void ppc_mcrfs() {
void dppc_interpreter::ppc_mcrfs() {
crf_d = (ppc_cur_instruction >> 23) & 7;
crf_d = crf_d << 2;
crf_s = (ppc_cur_instruction >> 18) & 7;
@ -1038,7 +1038,7 @@ void ppc_mcrfs() {
// Floating Point Comparisons
void ppc_fcmpo() {
void dppc_interpreter::ppc_fcmpo() {
ppc_grab_regsfpsab(true);
crf_d = (ppc_cur_instruction >> 23) & 7;
@ -1072,7 +1072,7 @@ void ppc_fcmpo() {
}
}
void ppc_fcmpu() {
void dppc_interpreter::ppc_fcmpu() {
ppc_grab_regsfpsab(true);
crf_d = (ppc_cur_instruction >> 23) & 7;

View File

@ -1,46 +0,0 @@
/*
DingusPPC - The Experimental PowerPC Macintosh emulator
Copyright (C) 2018-20 divingkatae and maximum
(theweirdo) spatium
(Contact divingkatae#1017 or powermax#2286 on Discord for more info)
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
// The uniquely Gekko opcodes for the processor - ppcgekkoopcodes.cpp
#include "ppcemu.h"
#include <iostream>
#include <stdio.h>
void ppc_psq_l() {
printf("Hello. There's no GameCube emulation...yet. Goodbye.");
exit(0);
}
void ppc_psq_lu() {
printf("Hello. There's no GameCube emulation...yet. Goodbye.");
exit(0);
}
void ppc_psq_st() {
printf("Hello. There's no GameCube emulation...yet. Goodbye.");
exit(0);
}
void ppc_psq_stu() {
printf("Hello. There's no GameCube emulation...yet. Goodbye.");
exit(0);
}

File diff suppressed because it is too large Load Diff

View File

@ -51,7 +51,7 @@ void round_robin_bench() {
std::chrono::high_resolution_clock::time_point dummy = std::chrono::high_resolution_clock::now();
for (int i = 0; i < 4096; i++) {
ppc_ori(); //execute NOPs as a basic test
dppc_interpreter::ppc_ori(); //execute NOPs as a basic test
}
std::chrono::high_resolution_clock::time_point dummy2 = std::chrono::high_resolution_clock::now();