From fc26660f1176411541c4123457077ce558692ffc Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Wed, 17 Jul 2019 17:40:19 +0200 Subject: [PATCH] ppcopcodes: partial fix for XER[CA] updates. --- ppcopcodes.cpp | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/ppcopcodes.cpp b/ppcopcodes.cpp index a5068e2..38e8b29 100644 --- a/ppcopcodes.cpp +++ b/ppcopcodes.cpp @@ -168,7 +168,7 @@ void ppc_changecrf0(uint32_t set_result){ //Affects the XER register's Carry Bit void ppc_carry(uint32_t a, uint32_t b){ - if (b > ~a){ + if (b < a){ // TODO: ensure it works everywhere ppc_state.ppc_spr[1] |= 0x20000000; } else{ @@ -384,9 +384,9 @@ void ppc_addcodot(){ void ppc_adde(){ ppc_grab_regsdab(); - uint32_t grab_xer = ppc_state.ppc_spr[1] & 0x20000000; - ppc_result_d = ppc_result_a + ppc_result_b + grab_xer; - if (((grab_xer != 0) && (grab_xer > (~(ppc_result_b + ppc_result_a)))) || (ppc_result_d > ~ppc_result_a)){ + uint32_t xer_ca = !!(ppc_state.ppc_spr[1] & 0x20000000); + ppc_result_d = ppc_result_a + ppc_result_b + xer_ca; + if ((ppc_result_d < ppc_result_a) || (xer_ca && (ppc_result_d == ppc_result_a))){ ppc_state.ppc_spr[1] |= 0x20000000; } else{ @@ -646,7 +646,7 @@ void ppc_subfic(){ ppc_grab_regsdasimm(); not_this = ~ppc_result_a; ppc_result_d = not_this + simm + 1; - if (ppc_result_d < (not_this + 1)){ + if (ppc_result_d <= not_this) { ppc_state.ppc_spr[1] |= 0x20000000; } else{