From 99641b1b5efed51b9637748a11b3bd86760ff55c Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Mon, 7 Dec 2020 14:26:55 +0100 Subject: [PATCH] ppcopcodes: fix cntlzw with __builtin_clz. The result of __builtin_clz is undefined when the source operand is zero. Add a check for this case and handle it accordingly. --- cpu/ppc/ppcopcodes.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/cpu/ppc/ppcopcodes.cpp b/cpu/ppc/ppcopcodes.cpp index 82ecf96..21c3e21 100644 --- a/cpu/ppc/ppcopcodes.cpp +++ b/cpu/ppc/ppcopcodes.cpp @@ -516,15 +516,15 @@ void dppc_interpreter::ppc_neg() { void dppc_interpreter::ppc_cntlzw() { ppc_grab_regssa(); - uint32_t lead = 0; + uint32_t lead; uint32_t bit_check = ppc_result_d; #ifdef USE_GCC_BUILTINS - lead = __builtin_clz(bit_check); + lead = !bit_check ? 32 : __builtin_clz(bit_check); #elif defined USE_VS_BUILTINS lead = __lzcnt(bit_check); #else - for (uint32_t mask = 0x80000000UL; mask; lead++, mask >>= 1) { + for (uint32_t mask = 0x80000000UL, lead = 0; mask; lead++, mask >>= 1) { if (bit_check & mask) break; }