42 lines
949 B
Zig
42 lines
949 B
Zig
const builtin = @import("builtin");
|
|
const compiler_rt = @import("../compiler_rt.zig");
|
|
|
|
pub extern fn __lshrti3(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 = 0;
|
|
} else {
|
|
// 0 <= b < 64
|
|
if (b == 0) return a;
|
|
result.s.low = input.s.high << @intCast(u6, 64 - b);
|
|
result.s.low |= 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: u64,
|
|
high: u64,
|
|
}
|
|
else
|
|
struct {
|
|
high: u64,
|
|
low: u64,
|
|
};
|
|
};
|
|
|
|
test "import lshrti3" {
|
|
_ = @import("lshrti3_test.zig");
|
|
}
|