zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

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:
Mstage0/sema.c | 20+++++++++-----------
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);