mirror of
https://github.com/dingusdev/dingusppc.git
synced 2024-12-22 15:29:58 +00:00
Further refactoring to clean up the interpreter
This commit is contained in:
parent
dc58386237
commit
1fe9ffe3e5
@ -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");
|
||||
}
|
@ -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
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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
@ -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();
|
||||
|
Loading…
Reference in New Issue
Block a user