From 3df9389215b365a83b1a509e55086595105c1f58 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Sat, 14 May 2016 20:04:04 -0700 Subject: [PATCH] compiler-rt: add __aeabi_uldivmod --- std/compiler_rt.zig | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/std/compiler_rt.zig b/std/compiler_rt.zig index 17f105b5fc0a224f3648ef5730ba7a839d69600a..a2feee3ea36146c70fa8c333b646787b0c4db84d 100644 --- a/std/compiler_rt.zig +++ b/std/compiler_rt.zig @@ -1,6 +1,6 @@ const CHAR_BIT = 8; -const du_int = c_ulonglong; -const di_int = c_longlong; +const du_int = u64; +const di_int = i64; const si_int = c_int; const su_int = c_uint; @@ -204,11 +204,11 @@ export fn __udivmoddi4(a: du_int, b: du_int, maybe_rem: ?&du_int) -> du_int { */ const s: di_int = (di_int)(*(&du_int)(&d[0]) - *(&du_int)(&r[0]) - 1) >> (n_udword_bits - 1); carry = su_int(s & 1); - *(&du_int)(&r[0]) -= *(&du_int)(&d[0]) & c_ulonglong(s); + *(&du_int)(&r[0]) -= *(&du_int)(&d[0]) & u64(s); sr -= 1; } - *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | carry; + *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | u64(carry); if (var rem ?= maybe_rem) { *rem = *(&du_int)(&r[0]); } @@ -222,6 +222,17 @@ export fn __umoddi3(a: du_int, b: du_int) -> du_int { return r; } +struct AeabiUlDivModResult { + quot: u64, + rem: u64, +} +#debug_safety(false) +export fn __aeabi_uldivmod(numerator: u64, denominator: u64) -> AeabiUlDivModResult{ + var result: AeabiUlDivModResult = undefined; + result.quot = __udivmoddi4(numerator, denominator, &result.rem); + return result; +} + #attribute("test") fn test_umoddi3() { -- 2.54.0