authorgravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-05-08 22:30:20+02:00
committergravatar for thatlemon@gmail.comLemonBoy <thatlemon@gmail.com> 2019-05-08 22:30:20+02:00
logc00167e91a452bb3c051c66157686e11487df94b
tree3f5afabce6adfea2078547eda99fde3f6343d9ea
parent917103710e6f2a6c5a28a3630e25f59a46e3cd21

compiler-rt: More division intrinsics


1 files changed, 39 insertions(+), 24 deletions(-)

std/special/compiler_rt.zig+39-24
...@@ -111,6 +111,7 @@ comptime {...@@ -111,6 +111,7 @@ comptime {
111 @export("__udivmoddi4", @import("compiler_rt/udivmoddi4.zig").__udivmoddi4, linkage);111 @export("__udivmoddi4", @import("compiler_rt/udivmoddi4.zig").__udivmoddi4, linkage);
112 @export("__popcountdi2", @import("compiler_rt/popcountdi2.zig").__popcountdi2, linkage);112 @export("__popcountdi2", @import("compiler_rt/popcountdi2.zig").__popcountdi2, linkage);
113113
114 @export("__divmoddi4", __divmoddi4, linkage);
114 @export("__divsi3", __divsi3, linkage);115 @export("__divsi3", __divsi3, linkage);
115 @export("__divdi3", __divdi3, linkage);116 @export("__divdi3", __divdi3, linkage);
116 @export("__udivsi3", __udivsi3, linkage);117 @export("__udivsi3", __udivsi3, linkage);
...@@ -126,10 +127,11 @@ comptime {...@@ -126,10 +127,11 @@ comptime {
126 @export("__negdf2", @import("compiler_rt/negXf2.zig").__negdf2, linkage);127 @export("__negdf2", @import("compiler_rt/negXf2.zig").__negdf2, linkage);
127128
128 if (is_arm_arch and !is_arm_64) {129 if (is_arm_arch and !is_arm_64) {
130 @export("__aeabi_ldivmod", __aeabi_ldivmod, linkage);
129 @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);131 @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage);
130132
131 @export("__aeabi_idiv", __divsi3, linkage);133 @export("__aeabi_idiv", __divsi3, linkage);
132 @export("__aeabi_idivmod", __divmodsi4, linkage);134 @export("__aeabi_idivmod", __aeabi_idivmod, linkage);
133 @export("__aeabi_uidiv", __udivsi3, linkage);135 @export("__aeabi_uidiv", __udivsi3, linkage);
134 @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);136 @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage);
135137
...@@ -256,6 +258,14 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn...@@ -256,6 +258,14 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn
256 }258 }
257}259}
258260
261extern fn __divmoddi4(a: i64, b: i64, rem: *i64) i64 {
262 @setRuntimeSafety(is_test);
263
264 const d = __divdi3(a, b);
265 rem.* = a -% (d *% b);
266 return d;
267}
268
259extern fn __divdi3(a: i64, b: i64) i64 {269extern fn __divdi3(a: i64, b: i64) i64 {
260 @setRuntimeSafety(is_test);270 @setRuntimeSafety(is_test);
261271
...@@ -296,14 +306,35 @@ extern fn __umoddi3(a: u64, b: u64) u64 {...@@ -296,14 +306,35 @@ extern fn __umoddi3(a: u64, b: u64) u64 {
296 return r;306 return r;
297}307}
298308
299const AeabiUlDivModResult = extern struct {309extern fn __aeabi_uidivmod(n: u32, d: u32) extern struct{q: u32, r: u32} {
300 quot: u64,
301 rem: u64,
302};
303extern fn __aeabi_uldivmod(numerator: u64, denominator: u64) AeabiUlDivModResult {
304 @setRuntimeSafety(is_test);310 @setRuntimeSafety(is_test);
305 var result: AeabiUlDivModResult = undefined;311
306 result.quot = __udivmoddi4(numerator, denominator, &result.rem);312 var result: @typeOf(__aeabi_uidivmod).ReturnType = undefined;
313 result.q = __udivmodsi4(n, d, &result.r);
314 return result;
315}
316
317extern fn __aeabi_uldivmod(n: u64, d: u64) extern struct{q: u64, r: u64} {
318 @setRuntimeSafety(is_test);
319
320 var result: @typeOf(__aeabi_uldivmod).ReturnType = undefined;
321 result.q = __udivmoddi4(n, d, &result.r);
322 return result;
323}
324
325extern fn __aeabi_idivmod(n: i32, d: i32) extern struct{q: i32, r: i32} {
326 @setRuntimeSafety(is_test);
327
328 var result: @typeOf(__aeabi_idivmod).ReturnType = undefined;
329 result.q = __divmodsi4(n, d, &result.r);
330 return result;
331}
332
333extern fn __aeabi_ldivmod(n: i64, d: i64) extern struct{q: i64, r:i64} {
334 @setRuntimeSafety(is_test);
335
336 var result: @typeOf(__aeabi_ldivmod).ReturnType = undefined;
337 result.q = __divmoddi4(n, d, &result.r);
307 return result;338 return result;
308}339}
309340
...@@ -397,22 +428,6 @@ test "usesThumb1" {...@@ -397,22 +428,6 @@ test "usesThumb1" {
397 //etc.428 //etc.
398}429}
399430
400nakedcc fn __aeabi_uidivmod() void {
401 @setRuntimeSafety(false);
402 asm volatile (
403 \\ push { lr }
404 \\ sub sp, sp, #4
405 \\ mov r2, sp
406 \\ bl __udivmodsi4
407 \\ ldr r1, [sp]
408 \\ add sp, sp, #4
409 \\ pop { pc }
410 :
411 :
412 : "r2", "r1"
413 );
414}
415
416nakedcc fn __aeabi_memcpy() noreturn {431nakedcc fn __aeabi_memcpy() noreturn {
417 @setRuntimeSafety(false);432 @setRuntimeSafety(false);
418 if (use_thumb_1) {433 if (use_thumb_1) {