mirror of
https://github.com/dingusdev/dingusppc.git
synced 2025-01-13 03:30:31 +00:00
Continued fixes for tables
This commit is contained in:
parent
5631485465
commit
30802affd4
@ -261,23 +261,23 @@ void ppc_opcode19() {
|
||||
break;
|
||||
case 1056:
|
||||
if (for601)
|
||||
ppc_bcctr<false, true>();
|
||||
ppc_bcctr<RC0, IS601>();
|
||||
else
|
||||
ppc_bcctr<false, false>();
|
||||
ppc_bcctr<RC1, NOT601>();
|
||||
break;
|
||||
case 1057:
|
||||
if (for601)
|
||||
ppc_bcctr<true, true>();
|
||||
ppc_bcctr<RC0, IS601>();
|
||||
else
|
||||
ppc_bcctr<true, false>();
|
||||
ppc_bcctr<RC1, NOT601>();
|
||||
break;
|
||||
default:
|
||||
ppc_illegalop();
|
||||
}
|
||||
}
|
||||
|
||||
template void ppc_opcode19<false>();
|
||||
template void ppc_opcode19<true>();
|
||||
template void ppc_opcode19<NOT601>();
|
||||
template void ppc_opcode19<IS601>();
|
||||
|
||||
void ppc_opcode31() {
|
||||
uint16_t subop_grab = ppc_cur_instruction & 0x7FFUL;
|
||||
@ -603,15 +603,15 @@ void initialize_ppc_opcode_tables() {
|
||||
SubOpcode31Grabber[1040] = ppc_subf<CARRY1, RC0, OV1>;
|
||||
SubOpcode31Grabber[1041] = ppc_subf<CARRY1, RC1, OV1>;
|
||||
SubOpcode31Grabber[1104] = ppc_subf<CARRY0, RC0, OV1>;
|
||||
SubOpcode31Grabber[1105] = ppc_subf<CARRY0, RC0, OV1>;
|
||||
SubOpcode31Grabber[1105] = ppc_subf<CARRY0, RC1, OV1>;
|
||||
SubOpcode31Grabber[1232] = ppc_neg<RC0, OV1>;
|
||||
SubOpcode31Grabber[1233] = ppc_neg<RC1, OV1>;
|
||||
SubOpcode31Grabber[1296] = ppc_subfe<RC0, OV1>;
|
||||
SubOpcode31Grabber[1297] = ppc_subfe<RC1, OV1>;
|
||||
SubOpcode31Grabber[1424] = ppc_subfze<RC0, OV1>;
|
||||
SubOpcode31Grabber[1425] = ppc_subfze<RC1, OV1>;
|
||||
SubOpcode31Grabber[464] = ppc_subfme<RC0, OV1>;
|
||||
SubOpcode31Grabber[465] = ppc_subfme<RC1, OV1>;
|
||||
SubOpcode31Grabber[1488] = ppc_subfme<RC0, OV1>;
|
||||
SubOpcode31Grabber[1489] = ppc_subfme<RC1, OV1>;
|
||||
|
||||
SubOpcode31Grabber[20] = ppc_add<CARRY1, RC0, OV0>;
|
||||
SubOpcode31Grabber[21] = ppc_add<CARRY1, RC1, OV0>;
|
||||
@ -650,8 +650,8 @@ void initialize_ppc_opcode_tables() {
|
||||
SubOpcode31Grabber[1495] = ppc_mullw<RC1, OV1>;
|
||||
SubOpcode31Grabber[1942] = ppc_divwu<RC0, OV1>;
|
||||
SubOpcode31Grabber[1943] = ppc_divwu<RC1, OV1>;
|
||||
SubOpcode31Grabber[2006] = ppc_divw<RC0, OV0>;
|
||||
SubOpcode31Grabber[2007] = ppc_divw<RC1, OV0>;
|
||||
SubOpcode31Grabber[2006] = ppc_divw<RC0, OV1>;
|
||||
SubOpcode31Grabber[2007] = ppc_divw<RC1, OV1>;
|
||||
|
||||
SubOpcode31Grabber[40] = ppc_lwarx;
|
||||
SubOpcode31Grabber[46] = ppc_lzx<uint32_t>;
|
||||
@ -707,16 +707,18 @@ void initialize_ppc_opcode_tables() {
|
||||
SubOpcode31Grabber[825] = ppc_do_bool<bool_orc, RC1>;
|
||||
SubOpcode31Grabber[888] = ppc_do_bool<bool_or, RC0>;
|
||||
SubOpcode31Grabber[889] = ppc_do_bool<bool_or, RC1>;
|
||||
SubOpcode31Grabber[952] = ppc_do_bool<bool_nand, RC0>;
|
||||
SubOpcode31Grabber[953] = ppc_do_bool<bool_nand, RC1>;
|
||||
SubOpcode31Grabber[1072] = ppc_shift<SHFT0, RC0>;
|
||||
SubOpcode31Grabber[1073] = ppc_shift<SHFT0, RC1>;
|
||||
SubOpcode31Grabber[1584] = ppc_sraw<RC0>;
|
||||
SubOpcode31Grabber[1585] = ppc_sraw<RC1>;
|
||||
SubOpcode31Grabber[1648] = ppc_srawi<RC0>;
|
||||
SubOpcode31Grabber[1649] = ppc_srawi<RC1>;
|
||||
SubOpcode31Grabber[1844] = ppc_exts<int8_t, RC0>;
|
||||
SubOpcode31Grabber[1845] = ppc_exts<int8_t, RC1>;
|
||||
SubOpcode31Grabber[1908] = ppc_exts<int16_t, RC0>;
|
||||
SubOpcode31Grabber[1909] = ppc_exts<int16_t, RC1>;
|
||||
SubOpcode31Grabber[1844] = ppc_exts<int16_t, RC0>;
|
||||
SubOpcode31Grabber[1845] = ppc_exts<int16_t, RC1>;
|
||||
SubOpcode31Grabber[1908] = ppc_exts<int8_t, RC0>;
|
||||
SubOpcode31Grabber[1909] = ppc_exts<int8_t, RC1>;
|
||||
|
||||
SubOpcode31Grabber[52] = ppc_cntlzw<RC0>;
|
||||
SubOpcode31Grabber[53] = ppc_cntlzw<RC1>;
|
||||
@ -880,7 +882,7 @@ void initialize_ppc_opcode_tables() {
|
||||
SubOpcode63Grabber[i + 46] = ppc_fsel<RC0>;
|
||||
SubOpcode63Grabber[i + 47] = ppc_fsel<RC1>;
|
||||
SubOpcode63Grabber[i + 50] = ppc_fmul<RC0>;
|
||||
SubOpcode63Grabber[i + 50] = ppc_fmul<RC1>;
|
||||
SubOpcode63Grabber[i + 51] = ppc_fmul<RC1>;
|
||||
SubOpcode63Grabber[i + 56] = ppc_fmsub<RC0>;
|
||||
SubOpcode63Grabber[i + 57] = ppc_fmsub<RC1>;
|
||||
SubOpcode63Grabber[i + 58] = ppc_fmadd<RC0>;
|
||||
|
@ -30,12 +30,8 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
#include <cmath>
|
||||
#include <cfloat>
|
||||
|
||||
// Used for FP calcs
|
||||
|
||||
// Storage and register retrieval functions for the floating point functions.
|
||||
|
||||
#define GET_FPR(reg) ppc_state.fpr[(reg)].dbl64_r
|
||||
|
||||
double fp_return_double(uint32_t reg) {
|
||||
return ppc_state.fpr[reg].dbl64_r;
|
||||
}
|
||||
|
@ -112,6 +112,9 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
int reg_d = (opcode >> 21) & 31; \
|
||||
int reg_b = (opcode >> 11) & 31;
|
||||
|
||||
#define GET_FPR(reg) \
|
||||
ppc_state.fpr[(reg)].dbl64_r
|
||||
|
||||
#define ppc_grab_regsfpdiab(opcode) \
|
||||
int reg_d = (opcode >> 21) & 31; \
|
||||
int reg_a = (opcode >> 16) & 31; \
|
||||
|
@ -166,10 +166,10 @@ void dppc_interpreter::ppc_adde() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_adde<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_adde<false, true>();
|
||||
template void dppc_interpreter::ppc_adde<true, false>();
|
||||
template void dppc_interpreter::ppc_adde<true, true>();
|
||||
template void dppc_interpreter::ppc_adde<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_adde<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_adde<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_adde<RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_addme() {
|
||||
@ -191,10 +191,10 @@ void dppc_interpreter::ppc_addme() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_addme<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_addme<false, true>();
|
||||
template void dppc_interpreter::ppc_addme<true, false>();
|
||||
template void dppc_interpreter::ppc_addme<true, true>();
|
||||
template void dppc_interpreter::ppc_addme<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_addme<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_addme<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_addme<RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_addze() {
|
||||
@ -216,10 +216,10 @@ void dppc_interpreter::ppc_addze() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_addze<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_addze<false, true>();
|
||||
template void dppc_interpreter::ppc_addze<true, false>();
|
||||
template void dppc_interpreter::ppc_addze<true, true>();
|
||||
template void dppc_interpreter::ppc_addze<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_addze<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_addze<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_addze<RC1, OV1>();
|
||||
|
||||
void dppc_interpreter::ppc_subfic() {
|
||||
ppc_grab_regsdasimm(ppc_cur_instruction);
|
||||
@ -246,14 +246,14 @@ void dppc_interpreter::ppc_subf() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_subf<false, false, false>();
|
||||
template void dppc_interpreter::ppc_subf<false, false, true>();
|
||||
template void dppc_interpreter::ppc_subf<false, true, false>();
|
||||
template void dppc_interpreter::ppc_subf<false, true, true>();
|
||||
template void dppc_interpreter::ppc_subf<true, false, false>();
|
||||
template void dppc_interpreter::ppc_subf<true, false, true>();
|
||||
template void dppc_interpreter::ppc_subf<true, true, false>();
|
||||
template void dppc_interpreter::ppc_subf<true, true, true>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY0, RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY0, RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY0, RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY0, RC1, OV1>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY1, RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY1, RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY1, RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_subf<CARRY1, RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_subfe() {
|
||||
@ -273,10 +273,10 @@ void dppc_interpreter::ppc_subfe() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_subfe<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_subfe<false, true>();
|
||||
template void dppc_interpreter::ppc_subfe<true, false>();
|
||||
template void dppc_interpreter::ppc_subfe<true, true>();
|
||||
template void dppc_interpreter::ppc_subfe<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_subfe<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_subfe<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_subfe<RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_subfme() {
|
||||
@ -302,10 +302,10 @@ void dppc_interpreter::ppc_subfme() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_subfme<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_subfme<false, true>();
|
||||
template void dppc_interpreter::ppc_subfme<true, false>();
|
||||
template void dppc_interpreter::ppc_subfme<true, true>();
|
||||
template void dppc_interpreter::ppc_subfme<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_subfme<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_subfme<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_subfme<RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_subfze() {
|
||||
@ -331,10 +331,10 @@ void dppc_interpreter::ppc_subfze() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_subfze<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_subfze<false, true>();
|
||||
template void dppc_interpreter::ppc_subfze<true, false>();
|
||||
template void dppc_interpreter::ppc_subfze<true, true>();
|
||||
template void dppc_interpreter::ppc_subfze<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_subfze<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_subfze<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_subfze<RC1, OV1>();
|
||||
|
||||
template <bool shift>
|
||||
void dppc_interpreter::ppc_andirc() {
|
||||
@ -350,7 +350,7 @@ template void dppc_interpreter::ppc_andirc<SHFT1>();
|
||||
template <bool shift>
|
||||
void dppc_interpreter::ppc_ori() {
|
||||
ppc_grab_regssauimm(ppc_cur_instruction);
|
||||
ppc_result_a = shift ? (ppc_result_d ^ (uimm << 16)) : (ppc_result_d ^ uimm);
|
||||
ppc_result_a = shift ? (ppc_result_d | (uimm << 16)) : (ppc_result_d | uimm);
|
||||
ppc_store_iresult_reg(reg_a, ppc_result_a);
|
||||
}
|
||||
|
||||
@ -393,22 +393,22 @@ void dppc_interpreter::ppc_do_bool() {
|
||||
ppc_store_iresult_reg(reg_a, ppc_result_a);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_do_bool<bool_and, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_andc, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_eqv, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nand, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nor, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_or, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_orc, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_xor, false>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_and, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_andc, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_eqv, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nand, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nor, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_or, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_orc, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_xor, true>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_and, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_andc, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_eqv, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nand, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nor, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_or, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_orc, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_xor, RC0>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_and, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_andc, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_eqv, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nand, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_nor, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_or, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_orc, RC1>();
|
||||
template void dppc_interpreter::ppc_do_bool<bool_xor, RC1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_neg() {
|
||||
@ -429,9 +429,9 @@ void dppc_interpreter::ppc_neg() {
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_neg<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_neg<false, true>();
|
||||
template void dppc_interpreter::ppc_neg<true, false>();
|
||||
template void dppc_interpreter::ppc_neg<true, true>();
|
||||
template void dppc_interpreter::ppc_neg<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_neg<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_neg<RC1, OV1>();
|
||||
|
||||
template <bool rec>
|
||||
void dppc_interpreter::ppc_cntlzw() {
|
||||
@ -514,10 +514,10 @@ void dppc_interpreter::ppc_mullw() {
|
||||
ppc_store_iresult_reg(reg_d, ppc_result_d);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_mullw<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_mullw<false, true>();
|
||||
template void dppc_interpreter::ppc_mullw<true, false>();
|
||||
template void dppc_interpreter::ppc_mullw<true, true>();
|
||||
template void dppc_interpreter::ppc_mullw<RC0, OV0>();
|
||||
template void dppc_interpreter::ppc_mullw<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_mullw<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_mullw<RC1, OV1>();
|
||||
|
||||
void dppc_interpreter::ppc_mulli() {
|
||||
ppc_grab_regsdasimm(ppc_cur_instruction);
|
||||
@ -558,9 +558,9 @@ void dppc_interpreter::ppc_divw() {
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_divw<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_divw<false, true>();
|
||||
template void dppc_interpreter::ppc_divw<true, false>();
|
||||
template void dppc_interpreter::ppc_divw<true, true>();
|
||||
template void dppc_interpreter::ppc_divw<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_divw<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_divw<RC1, OV1>();
|
||||
|
||||
template <bool rec, bool ov>
|
||||
void dppc_interpreter::ppc_divwu() {
|
||||
@ -589,9 +589,9 @@ void dppc_interpreter::ppc_divwu() {
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_divwu<RC0, OV0>();;
|
||||
template void dppc_interpreter::ppc_divwu<false, true>();
|
||||
template void dppc_interpreter::ppc_divwu<true, false>();
|
||||
template void dppc_interpreter::ppc_divwu<true, true>();
|
||||
template void dppc_interpreter::ppc_divwu<RC0, OV1>();
|
||||
template void dppc_interpreter::ppc_divwu<RC1, OV0>();
|
||||
template void dppc_interpreter::ppc_divwu<RC1, OV1>();
|
||||
|
||||
// Value shifting
|
||||
|
||||
@ -626,7 +626,7 @@ void dppc_interpreter::ppc_sraw() {
|
||||
|
||||
if (ppc_result_b & 0x20) {
|
||||
// fill rA with the sign bit of rS
|
||||
uint32_t ppc_result_a = int32_t(ppc_result_d) >> 31;
|
||||
ppc_result_a = int32_t(ppc_result_d) >> 31;
|
||||
if (ppc_result_a) // if rA is negative
|
||||
ppc_state.spr[SPR::XER] |= XER::CA;
|
||||
} else {
|
||||
@ -1032,10 +1032,10 @@ void dppc_interpreter::ppc_exts() {
|
||||
ppc_store_iresult_reg(reg_a, ppc_result_a);
|
||||
}
|
||||
|
||||
template void dppc_interpreter::ppc_exts<int8_t, false>();
|
||||
template void dppc_interpreter::ppc_exts<int16_t, false>();
|
||||
template void dppc_interpreter::ppc_exts<int8_t, true>();
|
||||
template void dppc_interpreter::ppc_exts<int16_t, true>();
|
||||
template void dppc_interpreter::ppc_exts<int8_t, RC0>();
|
||||
template void dppc_interpreter::ppc_exts<int16_t, RC0>();
|
||||
template void dppc_interpreter::ppc_exts<int8_t, RC1>();
|
||||
template void dppc_interpreter::ppc_exts<int16_t, RC1>();
|
||||
|
||||
// Branching Instructions
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user