| 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,7 +281,7 @@ test "os.time.Timer" { |
| 281 | debug.assert(time_0 > 0 and time_0 < margin); | 281 | debug.assert(time_0 > 0 and time_0 < margin); |
| 282 | 282 | ||
| 283 | const time_1 = timer.lap(); | 283 | const time_1 = timer.lap(); |
| 284 | debug.assert(time_1 > time_0); | 284 | debug.assert(time_1 >= time_0); |
| 285 | 285 | ||
| 286 | timer.reset(); | 286 | timer.reset(); |
| 287 | debug.assert(timer.read() < time_1); | 287 | debug.assert(timer.read() < time_1); |
std/special/compiler_rt/index.zig+17-4| ... | @@ -32,10 +32,6 @@ comptime { | ... | @@ -32,10 +32,6 @@ comptime { |
| 32 | @export("__fixunstfti", @import("fixunstfti.zig").__fixunstfti, linkage); | 32 | @export("__fixunstfti", @import("fixunstfti.zig").__fixunstfti, linkage); |
| 33 | 33 | ||
| 34 | @export("__udivmoddi4", @import("udivmoddi4.zig").__udivmoddi4, linkage); | 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 | @export("__udivsi3", __udivsi3, linkage); | 36 | @export("__udivsi3", __udivsi3, linkage); |
| 41 | @export("__udivdi3", __udivdi3, linkage); | 37 | @export("__udivdi3", __udivdi3, linkage); |
| ... | @@ -62,9 +58,16 @@ comptime { | ... | @@ -62,9 +58,16 @@ comptime { |
| 62 | @export("__chkstk", __chkstk, strong_linkage); | 58 | @export("__chkstk", __chkstk, strong_linkage); |
| 63 | @export("___chkstk_ms", ___chkstk_ms, linkage); | 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 | else => {}, | 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,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 | extern fn __udivdi3(a: u64, b: u64) u64 { | 99 | extern fn __udivdi3(a: u64, b: u64) u64 { |
| 87 | @setRuntimeSafety(is_test); | 100 | @setRuntimeSafety(is_test); |
| 88 | return __udivmoddi4(a, b, null); | 101 | return __udivmoddi4(a, b, null); |
std/special/compiler_rt/udivmodti4.zig+6| ... | @@ -1,11 +1,17 @@ | ... | @@ -1,11 +1,17 @@ |
| 1 | const udivmod = @import("udivmod.zig").udivmod; | 1 | const udivmod = @import("udivmod.zig").udivmod; |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | const compiler_rt = @import("index.zig"); | ||
| 3 | 4 | ||
| 4 | pub extern fn __udivmodti4(a: u128, b: u128, maybe_rem: ?&u128) u128 { | 5 | pub extern fn __udivmodti4(a: u128, b: u128, maybe_rem: ?&u128) u128 { |
| 5 | @setRuntimeSafety(builtin.is_test); | 6 | @setRuntimeSafety(builtin.is_test); |
| 6 | return udivmod(u128, a, b, maybe_rem); | 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 | test "import udivmodti4" { | 15 | test "import udivmodti4" { |
| 10 | _ = @import("udivmodti4_test.zig"); | 16 | _ = @import("udivmodti4_test.zig"); |
| 11 | } | 17 | } |
std/special/compiler_rt/udivti3.zig+7-2| ... | @@ -1,7 +1,12 @@ | ... | @@ -1,7 +1,12 @@ |
| 1 | const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4; | 1 | const udivmodti4 = @import("udivmodti4.zig"); |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | 3 | ||
| 4 | pub extern fn __udivti3(a: u128, b: u128) u128 { | 4 | pub extern fn __udivti3(a: u128, b: u128) u128 { |
| 5 | @setRuntimeSafety(builtin.is_test); | 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,9 +1,15 @@ |
| 1 | const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4; | 1 | const udivmodti4 = @import("udivmodti4.zig"); |
| 2 | const builtin = @import("builtin"); | 2 | const builtin = @import("builtin"); |
| 3 | const compiler_rt = @import("index.zig"); | ||
| 3 | 4 | ||
| 4 | pub extern fn __umodti3(a: u128, b: u128) u128 { | 5 | pub extern fn __umodti3(a: u128, b: u128) u128 { |
| 5 | @setRuntimeSafety(builtin.is_test); | 6 | @setRuntimeSafety(builtin.is_test); |
| 6 | var r: u128 = undefined; | 7 | var r: u128 = undefined; |
| 7 | _ = __udivmodti4(a, b, &r); | 8 | _ = udivmodti4.__udivmodti4(a, b, &r); |
| 8 | return r; | 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,3 +529,10 @@ test "comptime shlWithOverflow" { |
| 529 | 529 | ||
| 530 | assert(ct_shifted == rt_shifted); | 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 | } |