From 0273867c49fcb8bddfd8e0a9c8cd0c14973f6e94 Mon Sep 17 00:00:00 2001 From: joevt Date: Mon, 8 Apr 2024 22:18:54 -0700 Subject: [PATCH] ppcopcodes: Cleanup ppc_changecrf0. - Use one assignment to set ppc_state.cr. - Use enums for CR and XER bits. - Use < to check sign bit. --- cpu/ppc/ppcopcodes.cpp | 25 +++++++++++-------------- 1 file changed, 11 insertions(+), 14 deletions(-) diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index 8a96d12..41198ad 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -33,20 +33,17 @@ along with this program. If not, see . // Affects CR Field 0 - For integer operations void ppc_changecrf0(uint32_t set_result) { - ppc_state.cr &= 0x0FFFFFFFUL; - - if (set_result == 0) { - ppc_state.cr |= 0x20000000UL; - } else { - if (set_result & 0x80000000) { - ppc_state.cr |= 0x80000000UL; - } else { - ppc_state.cr |= 0x40000000UL; - } - } - - /* copy XER[SO] into CR0[SO]. */ - ppc_state.cr |= (ppc_state.spr[SPR::XER] >> 3) & 0x10000000UL; + ppc_state.cr = + (ppc_state.cr & 0x0FFFFFFFU) // clear CR0 + | ( + (set_result == 0) ? + CRx_bit::CR_EQ + : (int32_t(set_result) < 0) ? + CRx_bit::CR_LT + : + CRx_bit::CR_GT + ) + | ((ppc_state.spr[SPR::XER] & XER::SO) >> 3); // copy XER[SO] into CR0[SO]. } // Affects the XER register's Carry Bit