commit 039a00606b3880ee66130c47fb165d8d41c0c9ab (tree)
parent 326d51e30e9439ee7a4e2b0b44a186273312fa06
Author: Motiejus <motiejus@jakstys.lt>
Date: Sat, 7 Mar 2026 08:13:31 +0000
sema: fix 128-bit byteswap logic and cppcheck false condition
Simplify the 128-bit case in zirByteSwap comptime folding:
- r_lo byte b ← val_hi byte (7-b)
- r_hi byte b ← val_lo byte (7-b)
Previous code had a dead `src < 8` check (always false).
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
Diffstat:
1 file changed, 9 insertions(+), 11 deletions(-)
diff --git a/stage0/sema.c b/stage0/sema.c
@@ -1398,18 +1398,16 @@ static AirInstRef zirByteSwap(Sema* sema, SemaBlock* block, uint32_t inst) {
r_lo |= (uint64_t)byte_val << (b * 8);
}
} else {
- // 128-bit case: lo holds bytes 0-7, hi holds bytes 8-15.
+ // 128-bit: val_lo=bytes0-7, val_hi=bytes8-15.
+ // Reversed: r_lo gets old bytes 15..8, r_hi gets old
+ // bytes 7..0.
for (uint16_t b = 0; b < 8; b++) {
- uint16_t src = (uint16_t)(15 - b);
- uint8_t bv = (src < 8)
- ? (uint8_t)(val_lo >> (src * 8))
- : (uint8_t)(val_hi >> ((src - 8) * 8));
- r_lo |= (uint64_t)bv << (b * 8);
- }
- for (uint16_t b = 0; b < 8; b++) {
- uint16_t src = (uint16_t)(7 - b);
- uint8_t bv = (uint8_t)(val_lo >> (src * 8));
- r_hi |= (uint64_t)bv << (b * 8);
+ // r_lo byte b ← val_hi byte (7-b)
+ r_lo |= (uint64_t)((val_hi >> ((7 - b) * 8)) & 0xFF)
+ << (b * 8);
+ // r_hi byte b ← val_lo byte (7-b)
+ r_hi |= (uint64_t)((val_lo >> ((7 - b) * 8)) & 0xFF)
+ << (b * 8);
}
}
return internComptimeInt(sema, operand_ty, r_lo, r_hi);