zig/lib/std/special/compiler_rt/ashrti3.zig
Andrew Kelley ed36dbbd9c
mv std/ lib/
that's all this commit does. further commits will fix cli flags and
such.

see #2221
2019-09-25 23:35:41 -04:00

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");
}