Independent reviewer of the P4 branch found two issues: (1) BLOCKING — subfx and subfcx OE handlers still called the legacy `overflow::sum_overflow_64(true_diff, result32 as u64)` while batch 6 had migrated all add* sites to the inline `true_sum != (result32 as i32) as i128` form. The legacy helper compares `true_diff` against `(result32 as u64) as i64 as i128`, which views any bit-31-set result as a positive i64 (e.g. result=0x80000000 → +2147483648 in i64). For a legitimate i32::MIN result with no actual 32-bit overflow, this caused spurious OV=1. Concrete repro now caught by `subfo_no_spurious_ov_when_result_has_bit31_set`: r3=1, r4=0x80000001 → result=0x80000000, true_diff=-2147483648, no OV. Pre-fix: spurious OV=1. (2) Minor — `mulli_overflow_wraps_to_32` rubber-stamped: with ra=0x80000000 and imm=2, both pre-fix (`as i64 as u64`) and post-fix (`as u32 as u64`) write the same value. Replaced with ra=u64::MAX (polluted upper bits) where pre-fix writes 0xFFFFFFFF_FFFFFFFE and post-fix writes 0x00000000_FFFFFFFE. Fixes: - interpreter.rs subfx/subfcx OE: switch to inline 32-bit predicate matching the rest of batch 6. - subfo_sets_xer_ov_on_min_minus_one: renamed and updated to test 32-bit overflow (r4=0x80000000 - 1 = 0x7FFFFFFF, OV=1). - New: subfo_no_spurious_ov_when_result_has_bit31_set (PPCBUG-017 review-fix regression). - New: subfco_no_spurious_ov_when_result_has_bit31_set (same for PPCBUG-007). - mulli_overflow_wraps_to_32: redesigned with polluted upper bits to actually discriminate pre/post fix. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
306 KiB
306 KiB