authorgravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2022-12-16 21:41:52-05:00
committergravatar for kcbanner@gmail.comCasey Banner <kcbanner@gmail.com> 2023-01-01 16:44:28-05:00
logb6f0af57a2bb9f7d2f74d1cb4a89af501bc1e885
tree3edb0cf2970c836545f8c419fa9e72b90ed083ae
parent2d34477dbb895b7a37284b50ebc1feb23ef77a64

cbe: fix shl/shr

- zig_shr_u128 was actually shifting left - handle shifting by zero explicitly (shifting u64 by 64 is undefined behaviour)

1 files changed, 7 insertions(+), 4 deletions(-)

lib/zig.h+7-4
...@@ -1327,17 +1327,20 @@ static inline zig_i128 zig_not_i128(zig_i128 val, zig_u8 bits) {...@@ -1327,17 +1327,20 @@ static inline zig_i128 zig_not_i128(zig_i128 val, zig_u8 bits) {
1327}1327}
13281328
1329static inline zig_u128 zig_shr_u128(zig_u128 lhs, zig_u8 rhs) {1329static inline zig_u128 zig_shr_u128(zig_u128 lhs, zig_u8 rhs) {
1330 if (rhs >= zig_as_u8(64)) return (zig_u128){ .hi = lhs.hi << (rhs - zig_as_u8(64)), .lo = zig_minInt_u64 };1330 if (rhs == zig_as_u8(0)) return lhs;
1331 return (zig_u128){ .hi = lhs.hi << rhs | lhs.lo >> (zig_as_u8(64) - rhs), .lo = lhs.lo << rhs };1331 if (rhs >= zig_as_u8(64)) return (zig_u128){ .hi = zig_minInt_u64, .lo = lhs.hi >> (rhs - zig_as_u8(64)) };
1332 return (zig_u128){ .hi = lhs.hi >> rhs, .lo = lhs.hi << (zig_as_u8(64) - rhs) | lhs.lo >> rhs };
1332}1333}
13331334
1334static inline zig_u128 zig_shl_u128(zig_u128 lhs, zig_u8 rhs) {1335static inline zig_u128 zig_shl_u128(zig_u128 lhs, zig_u8 rhs) {
1335 if (rhs >= zig_as_u8(64)) return (zig_u128){ .hi = lhs.hi << (rhs - zig_as_u8(64)), .lo = zig_minInt_u64 };1336 if (rhs == zig_as_u8(0)) return lhs;
1337 if (rhs >= zig_as_u8(64)) return (zig_u128){ .hi = lhs.lo << rhs, .lo = zig_minInt_u64 };
1336 return (zig_u128){ .hi = lhs.hi << rhs | lhs.lo >> (zig_as_u8(64) - rhs), .lo = lhs.lo << rhs };1338 return (zig_u128){ .hi = lhs.hi << rhs | lhs.lo >> (zig_as_u8(64) - rhs), .lo = lhs.lo << rhs };
1337}1339}
13381340
1339static inline zig_i128 zig_shl_i128(zig_i128 lhs, zig_u8 rhs) {1341static inline zig_i128 zig_shl_i128(zig_i128 lhs, zig_u8 rhs) {
1340 if (rhs >= zig_as_u8(64)) return (zig_i128){ .hi = lhs.hi << (rhs - zig_as_u8(64)), .lo = zig_minInt_u64 };1342 if (rhs == zig_as_u8(0)) return lhs;
1343 if (rhs >= zig_as_u8(64)) return (zig_i128){ .hi = lhs.hi << (rhs - zig_as_u8(64)), .lo = zig_minInt_u64 }; // TODO: Fix?
1341 return (zig_i128){ .hi = lhs.hi << rhs | lhs.lo >> (zig_as_u8(64) - rhs), .lo = lhs.lo << rhs };1344 return (zig_i128){ .hi = lhs.hi << rhs | lhs.lo >> (zig_as_u8(64) - rhs), .lo = lhs.lo << rhs };
1342}1345}
13431346