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 @@
11const CHAR_BIT = 8;
2const du_int = c_ulonglong;
3const di_int = c_longlong;
2const du_int = u64;
3const di_int = i64;
44const si_int = c_int;
55const su_int = c_uint;
66
......@@ -204,11 +204,11 @@ export fn __udivmoddi4(a: du_int, b: du_int, maybe_rem: ?&du_int) -> du_int {
204204 */
205205 const s: di_int = (di_int)(*(&du_int)(&d[0]) - *(&du_int)(&r[0]) - 1) >> (n_udword_bits - 1);
206206 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
209209 sr -= 1;
210210 }
211 *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | carry;
211 *(&du_int)(&q[0]) = (*(&du_int)(&q[0]) << 1) | u64(carry);
212212 if (var rem ?= maybe_rem) {
213213 *rem = *(&du_int)(&r[0]);
214214 }
......@@ -222,6 +222,17 @@ export fn __umoddi3(a: du_int, b: du_int) -> du_int {
222222 return r;
223223}
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
226237#attribute("test")
227238fn test_umoddi3() {