ppcexec: Make separate enum for shift instructions.

This commit is contained in:
joevt 2024-03-26 18:53:11 -07:00 committed by dingusdev
parent 64df253053
commit 5b4ed01bec
3 changed files with 15 additions and 10 deletions

View File

@ -377,6 +377,11 @@ typedef enum {
SHFT1,
} field_shift;
typedef enum {
RIGHT0,
LEFT1,
} field_direction;
typedef enum {
RC0,
RC1,
@ -486,7 +491,7 @@ template <field_rc rec> extern void ppc_mulhwu();
template <field_rc rec> extern void ppc_mulhw();
template <field_rc rec, field_ov ov> extern void ppc_mullw();
template <field_rc rec, field_ov ov> extern void ppc_neg();
template <field_shift shift, field_rc rec> extern void ppc_shift();
template <field_direction shift, field_rc rec> extern void ppc_shift();
template <field_rc rec> extern void ppc_sraw();
template <field_rc rec> extern void ppc_srawi();
template <class T> extern void ppc_stx();

View File

@ -695,7 +695,7 @@ void initialize_ppc_opcode_tables() {
OP31(310, ppc_eciwx);
OP31(438, ppc_ecowx);
OP31dc(24, ppc_shift, SHFT1);
OP31dc(24, ppc_shift, LEFT1); // slw
OP31dc(28, ppc_logical, ppc_and);
OP31dc(60, ppc_logical, ppc_andc);
OP31dc(124, ppc_logical, ppc_nor);
@ -704,7 +704,7 @@ void initialize_ppc_opcode_tables() {
OP31dc(412, ppc_logical, ppc_orc);
OP31dc(444, ppc_logical, ppc_or);
OP31dc(476, ppc_logical, ppc_nand);
OP31dc(536, ppc_shift, SHFT0);
OP31dc(536, ppc_shift, RIGHT0); // srw
OP31d(792, ppc_sraw);
OP31d(824, ppc_srawi);
OP31dc(922, ppc_exts, int16_t);

View File

@ -595,15 +595,15 @@ template void dppc_interpreter::ppc_divwu<RC1, OV1>();
// Value shifting
template <field_shift shift, field_rc rec>
template <field_direction isleft, field_rc rec>
void dppc_interpreter::ppc_shift() {
ppc_grab_regssab(ppc_cur_instruction);
if (ppc_result_b & 0x20) {
ppc_result_a = 0;
}
else {
ppc_result_a = shift ? (ppc_result_d << (ppc_result_b & 0x1F))
: (ppc_result_d >> (ppc_result_b & 0x1F));
ppc_result_a = isleft ? (ppc_result_d << (ppc_result_b & 0x1F))
: (ppc_result_d >> (ppc_result_b & 0x1F));
}
if (rec)
@ -612,10 +612,10 @@ void dppc_interpreter::ppc_shift() {
ppc_store_iresult_reg(reg_a, ppc_result_a);
}
template void dppc_interpreter::ppc_shift<SHFT0, RC0>();
template void dppc_interpreter::ppc_shift<SHFT0, RC1>();
template void dppc_interpreter::ppc_shift<SHFT1, RC0>();
template void dppc_interpreter::ppc_shift<SHFT1, RC1>();
template void dppc_interpreter::ppc_shift<RIGHT0, RC0>();
template void dppc_interpreter::ppc_shift<RIGHT0, RC1>();
template void dppc_interpreter::ppc_shift<LEFT1, RC0>();
template void dppc_interpreter::ppc_shift<LEFT1, RC1>();
template <field_rc rec>
void dppc_interpreter::ppc_sraw() {