| author | |
| committer | |
| log | ec2a81a081f6c6d77de1bbeebf1d87754a4fae67 |
| tree | 74307f2b144f15d7a2ef8415fde14001f88467cf |
| parent | 7270f35c934ab5075c9d9128b5f5752c11d77056 |
6 files changed, 46 insertions(+), 9 deletions(-)
std/os/time.zig+1-1| ... | ... | @@ -281,7 +281,7 @@ test "os.time.Timer" { |
| 281 | 281 | debug.assert(time_0 > 0 and time_0 < margin); |
| 282 | 282 | |
| 283 | 283 | const time_1 = timer.lap(); |
| 284 | debug.assert(time_1 > time_0); | |
| 284 | debug.assert(time_1 >= time_0); | |
| 285 | 285 | |
| 286 | 286 | timer.reset(); |
| 287 | 287 | debug.assert(timer.read() < time_1); |
std/special/compiler_rt/index.zig+17-4| ... | ... | @@ -32,10 +32,6 @@ comptime { |
| 32 | 32 | @export("__fixunstfti", @import("fixunstfti.zig").__fixunstfti, linkage); |
| 33 | 33 | |
| 34 | 34 | @export("__udivmoddi4", @import("udivmoddi4.zig").__udivmoddi4, linkage); |
| 35 | @export("__udivmodti4", @import("udivmodti4.zig").__udivmodti4, linkage); | |
| 36 | ||
| 37 | @export("__udivti3", @import("udivti3.zig").__udivti3, linkage); | |
| 38 | @export("__umodti3", @import("umodti3.zig").__umodti3, linkage); | |
| 39 | 35 | |
| 40 | 36 | @export("__udivsi3", __udivsi3, linkage); |
| 41 | 37 | @export("__udivdi3", __udivdi3, linkage); |
| ... | ... | @@ -62,9 +58,16 @@ comptime { |
| 62 | 58 | @export("__chkstk", __chkstk, strong_linkage); |
| 63 | 59 | @export("___chkstk_ms", ___chkstk_ms, linkage); |
| 64 | 60 | } |
| 61 | @export("__udivti3", @import("udivti3.zig").__udivti3_windows_x86_64, linkage); | |
| 62 | @export("__udivmodti4", @import("udivmodti4.zig").__udivmodti4_windows_x86_64, linkage); | |
| 63 | @export("__umodti3", @import("umodti3.zig").__umodti3_windows_x86_64, linkage); | |
| 65 | 64 | }, |
| 66 | 65 | else => {}, |
| 67 | 66 | } |
| 67 | } else { | |
| 68 | @export("__udivti3", @import("udivti3.zig").__udivti3, linkage); | |
| 69 | @export("__udivmodti4", @import("udivmodti4.zig").__udivmodti4, linkage); | |
| 70 | @export("__umodti3", @import("umodti3.zig").__umodti3, linkage); | |
| 68 | 71 | } |
| 69 | 72 | } |
| 70 | 73 | |
| ... | ... | @@ -83,6 +86,16 @@ pub fn panic(msg: []const u8, error_return_trace: ?&builtin.StackTrace) noreturn |
| 83 | 86 | } |
| 84 | 87 | } |
| 85 | 88 | |
| 89 | pub fn setXmm0(comptime T: type, value: T) void { | |
| 90 | comptime assert(builtin.arch == builtin.Arch.x86_64); | |
| 91 | const aligned_value: T align(16) = value; | |
| 92 | asm volatile ( | |
| 93 | \\movaps (%[ptr]), %%xmm0 | |
| 94 | : | |
| 95 | : [ptr] "r" (&aligned_value) | |
| 96 | : "xmm0"); | |
| 97 | } | |
| 98 | ||
| 86 | 99 | extern fn __udivdi3(a: u64, b: u64) u64 { |
| 87 | 100 | @setRuntimeSafety(is_test); |
| 88 | 101 | return __udivmoddi4(a, b, null); |
std/special/compiler_rt/udivmodti4.zig+6| ... | ... | @@ -1,11 +1,17 @@ |
| 1 | 1 | const udivmod = @import("udivmod.zig").udivmod; |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | const compiler_rt = @import("index.zig"); | |
| 3 | 4 | |
| 4 | 5 | pub extern fn __udivmodti4(a: u128, b: u128, maybe_rem: ?&u128) u128 { |
| 5 | 6 | @setRuntimeSafety(builtin.is_test); |
| 6 | 7 | return udivmod(u128, a, b, maybe_rem); |
| 7 | 8 | } |
| 8 | 9 | |
| 10 | pub extern fn __udivmodti4_windows_x86_64(a: &const u128, b: &const u128, maybe_rem: ?&u128) void { | |
| 11 | @setRuntimeSafety(builtin.is_test); | |
| 12 | compiler_rt.setXmm0(u128, udivmod(u128, *a, *b, maybe_rem)); | |
| 13 | } | |
| 14 | ||
| 9 | 15 | test "import udivmodti4" { |
| 10 | 16 | _ = @import("udivmodti4_test.zig"); |
| 11 | 17 | } |
std/special/compiler_rt/udivti3.zig+7-2| ... | ... | @@ -1,7 +1,12 @@ |
| 1 | const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4; | |
| 1 | const udivmodti4 = @import("udivmodti4.zig"); | |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | 3 | |
| 4 | 4 | pub extern fn __udivti3(a: u128, b: u128) u128 { |
| 5 | 5 | @setRuntimeSafety(builtin.is_test); |
| 6 | return __udivmodti4(a, b, null); | |
| 6 | return udivmodti4.__udivmodti4(a, b, null); | |
| 7 | } | |
| 8 | ||
| 9 | pub extern fn __udivti3_windows_x86_64(a: &const u128, b: &const u128) void { | |
| 10 | @setRuntimeSafety(builtin.is_test); | |
| 11 | udivmodti4.__udivmodti4_windows_x86_64(a, b, null); | |
| 7 | 12 | } |
std/special/compiler_rt/umodti3.zig+8-2| ... | ... | @@ -1,9 +1,15 @@ |
| 1 | const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4; | |
| 1 | const udivmodti4 = @import("udivmodti4.zig"); | |
| 2 | 2 | const builtin = @import("builtin"); |
| 3 | const compiler_rt = @import("index.zig"); | |
| 3 | 4 | |
| 4 | 5 | pub extern fn __umodti3(a: u128, b: u128) u128 { |
| 5 | 6 | @setRuntimeSafety(builtin.is_test); |
| 6 | 7 | var r: u128 = undefined; |
| 7 | _ = __udivmodti4(a, b, &r); | |
| 8 | _ = udivmodti4.__udivmodti4(a, b, &r); | |
| 8 | 9 | return r; |
| 9 | 10 | } |
| 11 | ||
| 12 | pub extern fn __umodti3_windows_x86_64(a: &const u128, b: &const u128) void { | |
| 13 | @setRuntimeSafety(builtin.is_test); | |
| 14 | compiler_rt.setXmm0(u128, __umodti3(*a, *b)); | |
| 15 | } |
test/cases/eval.zig+7| ... | ... | @@ -529,3 +529,10 @@ test "comptime shlWithOverflow" { |
| 529 | 529 | |
| 530 | 530 | assert(ct_shifted == rt_shifted); |
| 531 | 531 | } |
| 532 | ||
| 533 | test "runtime 128 bit integer division" { | |
| 534 | var a: u128 = 152313999999999991610955792383; | |
| 535 | var b: u128 = 10000000000000000000; | |
| 536 | var c = a / b; | |
| 537 | assert(c == 15231399999); | |
| 538 | } |