diff --git a/cpu/ppc/test/ppctests.cpp b/cpu/ppc/test/ppctests.cpp index 5d5ffba..fb8fe28 100644 --- a/cpu/ppc/test/ppctests.cpp +++ b/cpu/ppc/test/ppctests.cpp @@ -11,6 +11,53 @@ using namespace std; int ntested; /* number of tested instructions */ int nfailed; /* number of failed instructions */ +void xer_ov_test(string mnem, uint32_t opcode) +{ + ppc_state.ppc_gpr[3] = 2; + ppc_state.ppc_gpr[4] = 2; + ppc_state.ppc_spr[SPR::XER] = 0xFFFFFFFF; + ppc_cur_instruction = opcode; + ppc_main_opcode(); + if (ppc_state.ppc_spr[SPR::XER] & 0x40000000UL) { + cout << "Invalid " << mnem << " emulation! XER[OV] should not be set." + << endl; + nfailed++; + } + ntested++; +} + +void xer_update_test() +{ + xer_ov_test("ADDCO", 0x7C632414); + xer_ov_test("ADDCO.", 0x7C632415); + xer_ov_test("ADDO", 0x7C632614); + xer_ov_test("ADDO.", 0x7C632615); + xer_ov_test("ADDEO", 0x7C632514); + xer_ov_test("ADDEO.", 0x7C632515); + xer_ov_test("ADDMEO", 0x7C6305D4); + xer_ov_test("ADDMEO.", 0x7C6305D5); + xer_ov_test("ADDZEO", 0x7C630594); + xer_ov_test("ADDZEO.", 0x7C630595); + xer_ov_test("DIVWO", 0x7C6327D6); + xer_ov_test("DIVWO.", 0x7C6327D7); + xer_ov_test("DIVWUO", 0x7C632796); + xer_ov_test("DIVWUO.", 0x7C632797); + xer_ov_test("MULLWO", 0x7C6325D6); + xer_ov_test("MULLWO.", 0x7C6325D7); + xer_ov_test("NEGO", 0x7C6304D0); + xer_ov_test("NEGO.", 0x7C6304D1); + xer_ov_test("SUBFO", 0x7C632450); + xer_ov_test("SUBFO.", 0x7C632451); + xer_ov_test("SUBFCO", 0x7C632410); + xer_ov_test("SUBFCO.", 0x7C632411); + xer_ov_test("SUBFEO", 0x7C632510); + xer_ov_test("SUBFEO.", 0x7C632511); + xer_ov_test("SUBFMEO", 0x7C6305D0); + xer_ov_test("SUBFMEO.", 0x7C6305D1); + xer_ov_test("SUBFZEO", 0x7C630590); + xer_ov_test("SUBFZEO.", 0x7C630591); +} + /** testing vehicle */ void read_test_data() { @@ -105,10 +152,15 @@ int main() cout << "Running DingusPPC emulator tests..." << endl << endl; - cout << "Testing integer instructions:" << endl; - + ntested = 0; nfailed = 0; + cout << "Testing XER[OV] updating..." << endl << endl; + + xer_update_test(); + + cout << endl << "Testing integer instructions:" << endl; + read_test_data(); cout << "... completed." << endl;