From 60f84ef0d9cd57a33e68a2d71b0a9532c21e48ab Mon Sep 17 00:00:00 2001 From: dingusdev Date: Sun, 24 Jan 2021 11:59:16 -0700 Subject: [PATCH] Refactoring interpreter value storage --- cpu/ppc/ppcemu.h | 7 ++- cpu/ppc/ppcfpopcodes.cpp | 122 +++++++++++++++++++-------------------- cpu/ppc/ppcopcodes.cpp | 24 ++++---- 3 files changed, 78 insertions(+), 75 deletions(-) diff --git a/cpu/ppc/ppcemu.h b/cpu/ppc/ppcemu.h index d64ee5c..6cd046c 100644 --- a/cpu/ppc/ppcemu.h +++ b/cpu/ppc/ppcemu.h @@ -294,8 +294,11 @@ extern void ppc_grab_regsfpsiab(bool int_rep); extern void ppc_store_result_regd(); extern void ppc_store_result_rega(); -extern void ppc_store_sfpresult(bool int_rep); -extern void ppc_store_dfpresult(bool int_rep); + +extern void ppc_store_sfpresult_int(); +extern void ppc_store_sfpresult_flt(); +extern void ppc_store_dfpresult_int(); +extern void ppc_store_dfpresult_flt(); void ppc_changecrf0(uint32_t set_result); void ppc_fp_changecrf1(); diff --git a/cpu/ppc/ppcfpopcodes.cpp b/cpu/ppc/ppcfpopcodes.cpp index e016f4d..6021f62 100644 --- a/cpu/ppc/ppcfpopcodes.cpp +++ b/cpu/ppc/ppcfpopcodes.cpp @@ -58,20 +58,20 @@ uint64_t fp_return_uint64(uint32_t reg) { return ppc_state.fpr[reg].int64_r; } -void ppc_store_sfpresult(bool int_rep) { - if (int_rep) { - ppc_state.fpr[reg_d].int64_r = ppc_result64_d; - } else { - ppc_state.fpr[reg_d].dbl64_r = ppc_dblresult64_d; - } +inline void ppc_store_sfpresult_int() { + ppc_state.fpr[reg_d].int64_r = ppc_result64_d; } -void ppc_store_dfpresult(bool int_rep) { - if (int_rep) { - ppc_state.fpr[reg_d].int64_r = ppc_result64_d; - } else { - ppc_state.fpr[reg_d].dbl64_r = ppc_dblresult64_d; - } +inline void ppc_store_sfpresult_flt() { + ppc_state.fpr[reg_d].dbl64_r = ppc_dblresult64_d; +} + +inline void ppc_store_dfpresult_int() { + ppc_state.fpr[reg_d].int64_r = ppc_result64_d; +} + +inline void ppc_store_dfpresult_flt() { + ppc_state.fpr[reg_d].dbl64_r = ppc_dblresult64_d; } void ppc_grab_regsfpdb(bool int_rep) { @@ -247,18 +247,18 @@ bool ppc_confirm_inf_nan(uint32_t chosen_reg_1, uint32_t chosen_reg_2, bool is_s switch (op) { case 36: - if ((exp_a == 0xff) & (exp_b == 0xff)) { + if ((exp_a == 0xff) && (exp_b == 0xff)) { ppc_state.fpscr |= 0x80400000; ppc_toggle_fpscr_fex(); return true; - } else if ((input_a == 0) & (input_b == 0)) { + } else if ((input_a == 0) && (input_b == 0)) { ppc_state.fpscr |= 0x80200000; ppc_toggle_fpscr_fex(); return true; } break; case 40: - if ((exp_a == 0xff) & (exp_b == 0xff)) { + if ((exp_a == 0xff) && (exp_b == 0xff)) { ppc_state.fpscr |= 0x80800000; ppc_toggle_fpscr_fex(); return true; @@ -273,7 +273,7 @@ bool ppc_confirm_inf_nan(uint32_t chosen_reg_1, uint32_t chosen_reg_2, bool is_s break; case 56: case 58: - if ((exp_a == 0xff) & (exp_b == 0xff)) { + if ((exp_a == 0xff) && (exp_b == 0xff)) { ppc_state.fpscr |= 0x80800000; ppc_toggle_fpscr_fex(); return true; @@ -290,18 +290,18 @@ bool ppc_confirm_inf_nan(uint32_t chosen_reg_1, uint32_t chosen_reg_2, bool is_s switch (op) { case 36: - if ((exp_a == 0x7ff) & (exp_b == 0x7ff)) { + if ((exp_a == 0x7ff) && (exp_b == 0x7ff)) { ppc_state.fpscr |= 0x80400000; ppc_toggle_fpscr_fex(); return true; - } else if ((input_a == 0) & (input_b == 0)) { + } else if ((input_a == 0) && (input_b == 0)) { ppc_state.fpscr |= 0x80200000; ppc_toggle_fpscr_fex(); return true; } break; case 40: - if ((exp_a == 0x7ff) & (exp_b == 0x7ff)) { + if ((exp_a == 0x7ff) && (exp_b == 0x7ff)) { ppc_state.fpscr |= 0x80800000; ppc_toggle_fpscr_fex(); return true; @@ -316,7 +316,7 @@ bool ppc_confirm_inf_nan(uint32_t chosen_reg_1, uint32_t chosen_reg_2, bool is_s break; case 56: case 58: - if ((exp_a == 0xff) & (exp_b == 0xff)) { + if ((exp_a == 0xff) && (exp_b == 0xff)) { ppc_state.fpscr |= 0x80800000; ppc_toggle_fpscr_fex(); return true; @@ -372,7 +372,7 @@ void dppc_interpreter::ppc_fadd() { if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 58)) { ppc_dblresult64_d = ppc_dblresult64_a + ppc_dblresult64_b; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); } if (rc_flag) @@ -384,7 +384,7 @@ void dppc_interpreter::ppc_fsub() { if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 56)) { ppc_dblresult64_d = ppc_dblresult64_a - ppc_dblresult64_b; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); } if (rc_flag) @@ -396,7 +396,7 @@ void dppc_interpreter::ppc_fdiv() { if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 36)) { ppc_dblresult64_d = ppc_dblresult64_a / ppc_dblresult64_b; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); } if (rc_flag) @@ -406,9 +406,9 @@ void dppc_interpreter::ppc_fdiv() { void dppc_interpreter::ppc_fmul() { ppc_grab_regsfpdac(false); - if (!ppc_confirm_inf_nan(reg_a, reg_b, false, 50)) { + if (!ppc_confirm_inf_nan(reg_a, reg_c, false, 50)) { ppc_dblresult64_d = ppc_dblresult64_a * ppc_dblresult64_c; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); } if (rc_flag) @@ -425,7 +425,7 @@ void dppc_interpreter::ppc_fmadd() { } } - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -441,7 +441,7 @@ void dppc_interpreter::ppc_fmsub() { } } - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -458,7 +458,7 @@ void dppc_interpreter::ppc_fnmadd() { } ppc_dblresult64_d = -ppc_dblresult64_d; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -475,7 +475,7 @@ void dppc_interpreter::ppc_fnmsub() { } ppc_dblresult64_d = -ppc_dblresult64_d; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -487,7 +487,7 @@ void dppc_interpreter::ppc_fadds() { if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 58)) { float intermediate = (float)ppc_dblresult64_a + (float)ppc_dblresult64_b; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } if (rc_flag) @@ -500,7 +500,7 @@ void dppc_interpreter::ppc_fsubs() { if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 56)) { float intermediate = (float)ppc_dblresult64_a - (float)ppc_dblresult64_b; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } if (rc_flag) @@ -510,10 +510,10 @@ void dppc_interpreter::ppc_fsubs() { void dppc_interpreter::ppc_fmuls() { ppc_grab_regsfpdac(false); - if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 50)) { - float intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_b; + if (!ppc_confirm_inf_nan(reg_a, reg_c, true, 50)) { + float intermediate = (float)ppc_dblresult64_a * (float)ppc_dblresult64_c; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } if (rc_flag) @@ -526,7 +526,7 @@ void dppc_interpreter::ppc_fdivs() { if (!ppc_confirm_inf_nan(reg_a, reg_b, true, 36)) { float intermediate = (float)ppc_dblresult64_a / (float)ppc_dblresult64_b; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } if (rc_flag) @@ -544,7 +544,7 @@ void dppc_interpreter::ppc_fmadds() { intermediate += (float)ppc_dblresult64_b; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } } @@ -563,7 +563,7 @@ void dppc_interpreter::ppc_fmsubs() { intermediate -= (float)ppc_dblresult64_b; ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } } @@ -584,7 +584,7 @@ void dppc_interpreter::ppc_fnmadds() { ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } } @@ -605,7 +605,7 @@ void dppc_interpreter::ppc_fnmsubs() { ppc_dblresult64_d = static_cast(intermediate); - ppc_store_dfpresult(false); + ppc_store_sfpresult_flt(); } } @@ -618,7 +618,7 @@ void dppc_interpreter::ppc_fabs() { ppc_dblresult64_d = abs(ppc_dblresult64_b); - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -630,7 +630,7 @@ void dppc_interpreter::ppc_fnabs() { ppc_dblresult64_d = abs(ppc_dblresult64_b); ppc_dblresult64_d = -ppc_dblresult64_d; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -641,7 +641,7 @@ void dppc_interpreter::ppc_fneg() { ppc_dblresult64_d = -ppc_dblresult64_d; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -656,7 +656,7 @@ void dppc_interpreter::ppc_fsel() { ppc_dblresult64_d = ppc_dblresult64_b; } - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -665,7 +665,7 @@ void dppc_interpreter::ppc_fsel() { void dppc_interpreter::ppc_fsqrt() { ppc_grab_regsfpdb(false); ppc_dblresult64_d = std::sqrt(ppc_dblresult64_b); - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -678,7 +678,7 @@ void dppc_interpreter::ppc_fsqrts() { test >>= 1; uint64_t* pre_final = (uint64_t*)&test; ppc_result64_d = *pre_final; - ppc_store_dfpresult(true); + ppc_store_sfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -692,7 +692,7 @@ void dppc_interpreter::ppc_frsqrte() { } ppc_dblresult64_d = testd2; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -703,7 +703,7 @@ void dppc_interpreter::ppc_frsp() { double testd2 = (double)ppc_result64_b; float testf2 = (float)testd2; ppc_dblresult64_d = (double)testf2; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -714,7 +714,7 @@ void dppc_interpreter::ppc_fres() { float testf2 = (float)ppc_dblresult64_b; testf2 = 1 / testf2; ppc_dblresult64_d = (double)testf2; - ppc_store_dfpresult(false); + ppc_store_dfpresult_flt(); if (rc_flag) ppc_changecrf1(); @@ -734,7 +734,7 @@ void dppc_interpreter::ppc_fctiw() { ppc_result64_d = round_to_neg_inf(ppc_dblresult64_b); } - ppc_store_dfpresult(true); + ppc_store_dfpresult_int(); if (rc_flag) ppc_changecrf1(); @@ -744,7 +744,7 @@ void dppc_interpreter::ppc_fctiwz() { ppc_grab_regsfpdb(false); ppc_result64_d = round_to_zero(ppc_dblresult64_b); - ppc_store_result_regd(); + ppc_store_dfpresult_int(); if (rc_flag) ppc_changecrf1(); @@ -757,7 +757,7 @@ void dppc_interpreter::ppc_lfs() { ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_result64_d = mem_grab_dword(ppc_effective_address); - ppc_store_dfpresult(true); + ppc_store_sfpresult_int(); } @@ -768,7 +768,7 @@ void dppc_interpreter::ppc_lfsu() { ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_result64_d = mem_grab_dword(ppc_effective_address); ppc_result_a = ppc_effective_address; - ppc_store_dfpresult(true); + ppc_store_sfpresult_int(); ppc_store_result_rega(); } else { ppc_exception_handler(Except_Type::EXC_PROGRAM, Exc_Cause::ILLEGAL_OP); @@ -779,7 +779,7 @@ 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); + ppc_store_sfpresult_int(); } void dppc_interpreter::ppc_lfsux() { @@ -788,7 +788,7 @@ void dppc_interpreter::ppc_lfsux() { ppc_effective_address = ppc_result_a + ppc_result_b; ppc_result64_d = mem_grab_dword(ppc_effective_address); ppc_result_a = ppc_effective_address; - ppc_store_dfpresult(true); + ppc_store_sfpresult_int(); ppc_store_result_rega(); } else { ppc_exception_handler(Except_Type::EXC_PROGRAM, Exc_Cause::ILLEGAL_OP); @@ -800,7 +800,7 @@ void dppc_interpreter::ppc_lfd() { ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address += (reg_a > 0) ? ppc_result_a : 0; ppc_result64_d = mem_grab_qword(ppc_effective_address); - ppc_store_dfpresult(true); + ppc_store_dfpresult_int(); } void dppc_interpreter::ppc_lfdu() { @@ -809,7 +809,7 @@ void dppc_interpreter::ppc_lfdu() { ppc_effective_address = (int32_t)((int16_t)(ppc_cur_instruction & 0xFFFF)); ppc_effective_address += ppc_result_a; ppc_result64_d = mem_grab_qword(ppc_effective_address); - ppc_store_dfpresult(true); + ppc_store_dfpresult_int(); ppc_result_a = ppc_effective_address; ppc_store_result_rega(); } else { @@ -820,8 +820,8 @@ void dppc_interpreter::ppc_lfdu() { 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); + ppc_result64_d = mem_grab_qword(ppc_effective_address); + ppc_store_dfpresult_int(); } void dppc_interpreter::ppc_lfdux() { @@ -829,7 +829,7 @@ void dppc_interpreter::ppc_lfdux() { if (reg_a != 0) { ppc_effective_address = ppc_result_a + ppc_result_b; ppc_result64_d = mem_grab_qword(ppc_effective_address); - ppc_store_dfpresult(true); + ppc_store_dfpresult_int(); ppc_result_a = ppc_effective_address; ppc_store_result_rega(); } else { @@ -924,7 +924,7 @@ void dppc_interpreter::ppc_stfiwx() { void dppc_interpreter::ppc_fmr() { ppc_grab_regsfpdb(true); ppc_state.fpr[reg_d] = ppc_state.fpr[reg_b]; - ppc_store_dfpresult(true); + ppc_store_dfpresult_int(); } @@ -1028,7 +1028,7 @@ void dppc_interpreter::ppc_mcrfs() { crf_d = crf_d << 2; crf_s = (ppc_cur_instruction >> 18) & 7; crf_s = crf_d << 2; - ppc_state.cr = ~(ppc_state.cr & ((15 << (28 - crf_d)))) & + ppc_state.cr = ~(ppc_state.cr & ((15 << (28 - crf_d)))) + (ppc_state.fpscr & (15 << (28 - crf_s))); } diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index c26b57b..1d9a4ee 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -65,35 +65,35 @@ what endian the numbers are to be stored in. **/ // Storage and register retrieval functions for the integer functions. -void ppc_store_result_regd() { +inline void ppc_store_result_regd() { ppc_state.gpr[reg_d] = ppc_result_d; } -void ppc_store_result_rega() { +inline void ppc_store_result_rega() { ppc_state.gpr[reg_a] = ppc_result_a; } -void ppc_grab_regsdasimm() { +inline void ppc_grab_regsdasimm() { reg_d = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; simm = (int32_t)((int16_t)((ppc_cur_instruction)&65535)); ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regsdauimm() { +inline void ppc_grab_regsdauimm() { reg_d = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; uimm = (uint32_t)((uint16_t)((ppc_cur_instruction)&65535)); ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regsasimm() { +inline void ppc_grab_regsasimm() { reg_a = (ppc_cur_instruction >> 16) & 31; simm = (int32_t)((int16_t)(ppc_cur_instruction & 65535)); ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regssauimm() { +inline void ppc_grab_regssauimm() { reg_s = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; uimm = (uint32_t)((uint16_t)((ppc_cur_instruction)&65535)); @@ -101,7 +101,7 @@ void ppc_grab_regssauimm() { ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regsdab() { +inline void ppc_grab_regsdab() { reg_d = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; reg_b = (ppc_cur_instruction >> 11) & 31; @@ -109,7 +109,7 @@ void ppc_grab_regsdab() { ppc_result_b = ppc_state.gpr[reg_b]; } -void ppc_grab_regssab() { +inline void ppc_grab_regssab() { reg_s = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; reg_b = (ppc_cur_instruction >> 11) & 31; @@ -118,27 +118,27 @@ void ppc_grab_regssab() { ppc_result_b = ppc_state.gpr[reg_b]; } -void ppc_grab_regssa() { +inline void ppc_grab_regssa() { reg_s = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; ppc_result_d = ppc_state.gpr[reg_s]; ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regssb() { +inline void ppc_grab_regssb() { reg_s = (ppc_cur_instruction >> 21) & 31; reg_b = (ppc_cur_instruction >> 11) & 31; ppc_result_d = ppc_state.gpr[reg_s]; ppc_result_b = ppc_state.gpr[reg_b]; } -void ppc_grab_regsda() { +inline void ppc_grab_regsda() { reg_d = (ppc_cur_instruction >> 21) & 31; reg_a = (ppc_cur_instruction >> 16) & 31; ppc_result_a = ppc_state.gpr[reg_a]; } -void ppc_grab_regsdb() { +inline void ppc_grab_regsdb() { reg_d = (ppc_cur_instruction >> 21) & 31; reg_b = (ppc_cur_instruction >> 11) & 31; ppc_result_b = ppc_state.gpr[reg_b];