authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-14 20:04:04-07:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2016-05-15 12:02:37-07:00
log3df9389215b365a83b1a509e55086595105c1f58
treee7258b8b5ca3ebbe230fc2468a8592503d61e205
parent7b0052abbb0919339315be7ae4eb293ef83566cd

compiler-rt: add __aeabi_uldivmod


1 files changed, 15 insertions(+), 4 deletions(-)

std/compiler_rt.zig+15-4
...@@ -1,6 +1,6 @@...@@ -1,6 +1,6 @@
1const CHAR_BIT = 8;1const CHAR_BIT = 8;
2const du_int = c_ulonglong;2const du_int = u64;
3const di_int = c_longlong;3const di_int = i64;
4const si_int = c_int;4const si_int = c_int;
5const su_int = c_uint;5const su_int = c_uint;
66
...@@ -204,11 +204,11 @@ export fn __udivmoddi4(a: du_int, b: du_int, maybe_rem: ?&du_int) -> du_int {...@@ -204,11 +204,11 @@ export fn __udivmoddi4(a: du_int, b: du_int, maybe_rem: ?&du_int) -> du_int {
204 */204 */
205 const s: di_int = (di_int)(*(&du_int)(&d[0]) - *(&du_int)(&r[0]) - 1) >> (n_udword_bits - 1);205 const s: di_int = (di_int)(*(&du_int)(&d[0]) - *(&du_int)(&r[0]) - 1) >> (n_udword_bits - 1);
206 carry = su_int(s & 1);206 carry = su_int(s & 1);
207 *(&du_int)(&r[0]) -= *(&du_int)(&d[0]) & c_ulonglong(s);207 *(&du_int)(&r[0]) -= *(&du_int)(&d[0]) & u64(s);
208208
209 sr -= 1;209 sr -= 1;
210 }210 }
211 *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | carry;211 *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | u64(carry);
212 if (var rem ?= maybe_rem) {212 if (var rem ?= maybe_rem) {
213 *rem = *(&du_int)(&r[0]);213 *rem = *(&du_int)(&r[0]);
214 }214 }
...@@ -222,6 +222,17 @@ export fn __umoddi3(a: du_int, b: du_int) -> du_int {...@@ -222,6 +222,17 @@ export fn __umoddi3(a: du_int, b: du_int) -> du_int {
222 return r;222 return r;
223}223}
224224
225struct AeabiUlDivModResult {
226 quot: u64,
227 rem: u64,
228}
229#debug_safety(false)
230export fn __aeabi_uldivmod(numerator: u64, denominator: u64) -> AeabiUlDivModResult{
231 var result: AeabiUlDivModResult = undefined;
232 result.quot = __udivmoddi4(numerator, denominator, &result.rem);
233 return result;
234}
235
225236
226#attribute("test")237#attribute("test")
227fn test_umoddi3() {238fn test_umoddi3() {