master
 1/// absv - absolute oVerflow
 2/// * @panic if value can not be represented
 3pub inline fn absv(comptime ST: type, a: ST) ST {
 4    const UT = switch (ST) {
 5        i32 => u32,
 6        i64 => u64,
 7        i128 => u128,
 8        else => unreachable,
 9    };
10    // taken from  Bit Twiddling Hacks
11    // compute the integer absolute value (abs) without branching
12    var x: ST = a;
13    const N: UT = @bitSizeOf(ST);
14    const sign: ST = a >> N - 1;
15    x +%= sign;
16    x ^= sign;
17    if (x < 0)
18        @panic("compiler_rt absv: overflow");
19    return x;
20}
21
22test {
23    _ = @import("absvsi2_test.zig");
24    _ = @import("absvdi2_test.zig");
25    _ = @import("absvti2_test.zig");
26}