mirror of
https://github.com/ziglang/zig.git
synced 2024-11-30 09:02:32 +00:00
c99c085d70
The purpose of this branch is to switch to using an object file for each independent function, in order to make linking simpler - instead of relying on `-ffunction-sections` and `--gc-sections`, which involves the linker doing the work of linking everything and then undoing work via garbage collection, this will allow the linker to only include the compilation units that are depended on in the first place. This commit makes progress towards that goal.
27 lines
671 B
Zig
27 lines
671 B
Zig
/// absv - absolute oVerflow
|
|
/// * @panic if value can not be represented
|
|
pub inline fn absv(comptime ST: type, a: ST) ST {
|
|
const UT = switch (ST) {
|
|
i32 => u32,
|
|
i64 => u64,
|
|
i128 => u128,
|
|
else => unreachable,
|
|
};
|
|
// taken from Bit Twiddling Hacks
|
|
// compute the integer absolute value (abs) without branching
|
|
var x: ST = a;
|
|
const N: UT = @bitSizeOf(ST);
|
|
const sign: ST = a >> N - 1;
|
|
x +%= sign;
|
|
x ^= sign;
|
|
if (x < 0)
|
|
@panic("compiler_rt absv: overflow");
|
|
return x;
|
|
}
|
|
|
|
test {
|
|
_ = @import("absvsi2_test.zig");
|
|
_ = @import("absvdi2_test.zig");
|
|
_ = @import("absvti2_test.zig");
|
|
}
|