zig

fork of https://codeberg.org/ziglang/zig
Log | Files | Refs | README | LICENSE

divti3.zig (1113B) - Raw


      1 const std = @import("std");
      2 const builtin = @import("builtin");
      3 const udivmod = @import("udivmod.zig").udivmod;
      4 const arch = builtin.cpu.arch;
      5 const common = @import("common.zig");
      6 
      7 pub const panic = common.panic;
      8 
      9 comptime {
     10     if (common.want_windows_v2u64_abi) {
     11         @export(&__divti3_windows_x86_64, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
     12     } else {
     13         @export(&__divti3, .{ .name = "__divti3", .linkage = common.linkage, .visibility = common.visibility });
     14     }
     15 }
     16 
     17 pub fn __divti3(a: i128, b: i128) callconv(.c) i128 {
     18     return div(a, b);
     19 }
     20 
     21 const v128 = @Vector(2, u64);
     22 
     23 fn __divti3_windows_x86_64(a: v128, b: v128) callconv(.c) v128 {
     24     return @bitCast(div(@bitCast(a), @bitCast(b)));
     25 }
     26 
     27 inline fn div(a: i128, b: i128) i128 {
     28     const s_a = a >> (128 - 1);
     29     const s_b = b >> (128 - 1);
     30 
     31     const an = (a ^ s_a) -% s_a;
     32     const bn = (b ^ s_b) -% s_b;
     33 
     34     const r = udivmod(u128, @bitCast(an), @bitCast(bn), null);
     35     const s = s_a ^ s_b;
     36     return (@as(i128, @bitCast(r)) ^ s) -% s;
     37 }
     38 
     39 test {
     40     _ = @import("divti3_test.zig");
     41 }