ed36dbbd9c
that's all this commit does. further commits will fix cli flags and such. see #2221
43 lines
1.0 KiB
Zig
43 lines
1.0 KiB
Zig
const builtin = @import("builtin");
|
|
const compiler_rt = @import("../compiler_rt.zig");
|
|
|
|
pub extern fn __ashrti3(a: i128, b: i32) i128 {
|
|
var input = twords{ .all = a };
|
|
var result: twords = undefined;
|
|
|
|
if (b > 63) {
|
|
// 64 <= b < 128
|
|
result.s.low = input.s.high >> @intCast(u6, b - 64);
|
|
result.s.high = input.s.high >> 63;
|
|
} else {
|
|
// 0 <= b < 64
|
|
if (b == 0) return a;
|
|
result.s.low = input.s.high << @intCast(u6, 64 - b);
|
|
// Avoid sign-extension here
|
|
result.s.low |= @bitCast(i64, @bitCast(u64, input.s.low) >> @intCast(u6, b));
|
|
result.s.high = input.s.high >> @intCast(u6, b);
|
|
}
|
|
|
|
return result.all;
|
|
}
|
|
|
|
const twords = extern union {
|
|
all: i128,
|
|
s: S,
|
|
|
|
const S = if (builtin.endian == builtin.Endian.Little)
|
|
struct {
|
|
low: i64,
|
|
high: i64,
|
|
}
|
|
else
|
|
struct {
|
|
high: i64,
|
|
low: i64,
|
|
};
|
|
};
|
|
|
|
test "import ashrti3" {
|
|
_ = @import("ashrti3_test.zig");
|
|
}
|