Clean-up bc and bcl

Using templating to make the code a touch more readable
This commit is contained in:
dingusdev 2024-03-08 19:22:25 -07:00
parent 5d9194d03d
commit daeecbe99e
3 changed files with 37 additions and 96 deletions

View File

@ -536,14 +536,8 @@ extern void ppc_addicdot();
extern void ppc_addis(); extern void ppc_addis();
extern void ppc_andidot(); extern void ppc_andidot();
extern void ppc_andisdot(); extern void ppc_andisdot();
extern void ppc_b(); template <bool l, bool a> extern void ppc_b();
extern void ppc_ba(); template <bool l, bool a> extern void ppc_bc();
extern void ppc_bl();
extern void ppc_bla();
extern void ppc_bc();
extern void ppc_bca();
extern void ppc_bcl();
extern void ppc_bcla();
extern void ppc_cmpi(); extern void ppc_cmpi();
extern void ppc_cmpli(); extern void ppc_cmpli();
extern void ppc_lbz(); extern void ppc_lbz();

View File

@ -151,16 +151,16 @@ static PPCOpcode OpcodeGrabber[] = {
/** Lookup tables for branch instructions. */ /** Lookup tables for branch instructions. */
static PPCOpcode SubOpcode16Grabber[] = { static PPCOpcode SubOpcode16Grabber[] = {
dppc_interpreter::ppc_bc, dppc_interpreter::ppc_bc<false, false>, //bc
dppc_interpreter::ppc_bcl, dppc_interpreter::ppc_bc<true, false>, //bcl
dppc_interpreter::ppc_bca, dppc_interpreter::ppc_bc<false, true>, //bca
dppc_interpreter::ppc_bcla}; dppc_interpreter::ppc_bc<true, true>}; //bcla
static PPCOpcode SubOpcode18Grabber[] = { static PPCOpcode SubOpcode18Grabber[] = {
dppc_interpreter::ppc_b, dppc_interpreter::ppc_b<false, false>, //b
dppc_interpreter::ppc_bl, dppc_interpreter::ppc_b<true, false>, //bl
dppc_interpreter::ppc_ba, dppc_interpreter::ppc_b<false, true>, //ba
dppc_interpreter::ppc_bla}; dppc_interpreter::ppc_b<true, true>}; //bla
/** Instructions decoding tables for integer, /** Instructions decoding tables for integer,
single floating-point, and double-floating point ops respectively */ single floating-point, and double-floating point ops respectively */

View File

@ -1116,32 +1116,27 @@ void dppc_interpreter::ppc_extsh() {
// Branching Instructions // Branching Instructions
template <bool l, bool a>
void dppc_interpreter::ppc_b() { void dppc_interpreter::ppc_b() {
int32_t adr_li = int32_t(ppc_cur_instruction << 6) >> 6; int32_t adr_li = int32_t((ppc_cur_instruction & ~3UL) << 6) >> 6;
ppc_next_instruction_address = uint32_t(ppc_state.pc + adr_li);
if (a)
ppc_next_instruction_address = adr_li;
else
ppc_next_instruction_address = uint32_t(ppc_state.pc + adr_li);
if (l)
ppc_state.spr[SPR::LR] = uint32_t(ppc_state.pc + 4);
exec_flags = EXEF_BRANCH; exec_flags = EXEF_BRANCH;
} }
void dppc_interpreter::ppc_bl() { template void dppc_interpreter::ppc_b<false, false>();
int32_t adr_li = int32_t((ppc_cur_instruction & ~3UL) << 6) >> 6; template void dppc_interpreter::ppc_b<false, true>();
ppc_next_instruction_address = uint32_t(ppc_state.pc + adr_li); template void dppc_interpreter::ppc_b<true, false>();
ppc_state.spr[SPR::LR] = uint32_t(ppc_state.pc + 4); template void dppc_interpreter::ppc_b<true, true>();
exec_flags = EXEF_BRANCH;
}
void dppc_interpreter::ppc_ba() {
int32_t adr_li = int32_t((ppc_cur_instruction & ~3UL) << 6) >> 6;
ppc_next_instruction_address = adr_li;
exec_flags = EXEF_BRANCH;
}
void dppc_interpreter::ppc_bla() {
int32_t adr_li = int32_t((ppc_cur_instruction & ~3UL) << 6) >> 6;
ppc_next_instruction_address = adr_li;
ppc_state.spr[SPR::LR] = uint32_t(ppc_state.pc + 4);
exec_flags = EXEF_BRANCH;
}
template <bool l, bool a>
void dppc_interpreter::ppc_bc() { void dppc_interpreter::ppc_bc() {
uint32_t ctr_ok; uint32_t ctr_ok;
uint32_t cnd_ok; uint32_t cnd_ok;
@ -1156,69 +1151,21 @@ void dppc_interpreter::ppc_bc() {
cnd_ok = (br_bo & 0x10) | (!(ppc_state.cr & (0x80000000UL >> br_bi)) == !(br_bo & 0x08)); cnd_ok = (br_bo & 0x10) | (!(ppc_state.cr & (0x80000000UL >> br_bi)) == !(br_bo & 0x08));
if (ctr_ok && cnd_ok) { if (ctr_ok && cnd_ok) {
ppc_next_instruction_address = (ppc_state.pc + br_bd); if (a)
ppc_next_instruction_address = br_bd;
else
ppc_next_instruction_address = uint32_t(ppc_state.pc + br_bd);
exec_flags = EXEF_BRANCH; exec_flags = EXEF_BRANCH;
} }
if (l)
ppc_state.spr[SPR::LR] = ppc_state.pc + 4;
} }
void dppc_interpreter::ppc_bca() { template void dppc_interpreter::ppc_b<false, false>();
uint32_t ctr_ok; template void dppc_interpreter::ppc_b<false, true>();
uint32_t cnd_ok; template void dppc_interpreter::ppc_b<true, false>();
uint32_t br_bo = (ppc_cur_instruction >> 21) & 31; template void dppc_interpreter::ppc_b<true, true>();
uint32_t br_bi = (ppc_cur_instruction >> 16) & 31;
int32_t br_bd = int32_t(int16_t(ppc_cur_instruction & ~3UL));
if (!(br_bo & 0x04)) {
(ppc_state.spr[SPR::CTR])--; /* decrement CTR */
}
ctr_ok = (br_bo & 0x04) | ((ppc_state.spr[SPR::CTR] != 0) == !(br_bo & 0x02));
cnd_ok = (br_bo & 0x10) | (!(ppc_state.cr & (0x80000000UL >> br_bi)) == !(br_bo & 0x08));
if (ctr_ok && cnd_ok) {
ppc_next_instruction_address = br_bd;
exec_flags = EXEF_BRANCH;
}
}
void dppc_interpreter::ppc_bcl() {
uint32_t ctr_ok;
uint32_t cnd_ok;
uint32_t br_bo = (ppc_cur_instruction >> 21) & 31;
uint32_t br_bi = (ppc_cur_instruction >> 16) & 31;
int32_t br_bd = int32_t(int16_t(ppc_cur_instruction & ~3UL));
if (!(br_bo & 0x04)) {
(ppc_state.spr[SPR::CTR])--; /* decrement CTR */
}
ctr_ok = (br_bo & 0x04) | ((ppc_state.spr[SPR::CTR] != 0) == !(br_bo & 0x02));
cnd_ok = (br_bo & 0x10) | (!(ppc_state.cr & (0x80000000UL >> br_bi)) == !(br_bo & 0x08));
if (ctr_ok && cnd_ok) {
ppc_next_instruction_address = (ppc_state.pc + br_bd);
exec_flags = EXEF_BRANCH;
}
ppc_state.spr[SPR::LR] = ppc_state.pc + 4;
}
void dppc_interpreter::ppc_bcla() {
uint32_t ctr_ok;
uint32_t cnd_ok;
uint32_t br_bo = (ppc_cur_instruction >> 21) & 31;
uint32_t br_bi = (ppc_cur_instruction >> 16) & 31;
int32_t br_bd = int32_t(int16_t(ppc_cur_instruction & ~3UL));
if (!(br_bo & 0x04)) {
(ppc_state.spr[SPR::CTR])--; /* decrement CTR */
}
ctr_ok = (br_bo & 0x04) | ((ppc_state.spr[SPR::CTR] != 0) == !(br_bo & 0x02));
cnd_ok = (br_bo & 0x10) | (!(ppc_state.cr & (0x80000000UL >> br_bi)) == !(br_bo & 0x08));
if (ctr_ok && cnd_ok) {
ppc_next_instruction_address = br_bd;
exec_flags = EXEF_BRANCH;
}
ppc_state.spr[SPR::LR] = ppc_state.pc + 4;
}
template<bool l, bool for601> template<bool l, bool for601>
void dppc_interpreter::ppc_bcctr() { void dppc_interpreter::ppc_bcctr() {