| ... | ... | @@ -111,6 +111,7 @@ comptime { |
| 111 | 111 | @export("__udivmoddi4", @import("compiler_rt/udivmoddi4.zig").__udivmoddi4, linkage); |
| 112 | 112 | @export("__popcountdi2", @import("compiler_rt/popcountdi2.zig").__popcountdi2, linkage); |
| 113 | 113 | |
| 114 | @export("__divmoddi4", __divmoddi4, linkage); |
| 114 | 115 | @export("__divsi3", __divsi3, linkage); |
| 115 | 116 | @export("__divdi3", __divdi3, linkage); |
| 116 | 117 | @export("__udivsi3", __udivsi3, linkage); |
| ... | ... | @@ -126,10 +127,11 @@ comptime { |
| 126 | 127 | @export("__negdf2", @import("compiler_rt/negXf2.zig").__negdf2, linkage); |
| 127 | 128 | |
| 128 | 129 | if (is_arm_arch and !is_arm_64) { |
| 130 | @export("__aeabi_ldivmod", __aeabi_ldivmod, linkage); |
| 129 | 131 | @export("__aeabi_uldivmod", __aeabi_uldivmod, linkage); |
| 130 | 132 | |
| 131 | 133 | @export("__aeabi_idiv", __divsi3, linkage); |
| 132 | | @export("__aeabi_idivmod", __divmodsi4, linkage); |
| 134 | @export("__aeabi_idivmod", __aeabi_idivmod, linkage); |
| 133 | 135 | @export("__aeabi_uidiv", __udivsi3, linkage); |
| 134 | 136 | @export("__aeabi_uidivmod", __aeabi_uidivmod, linkage); |
| 135 | 137 | |
| ... | ... | @@ -256,6 +258,14 @@ pub fn panic(msg: []const u8, error_return_trace: ?*builtin.StackTrace) noreturn |
| 256 | 258 | } |
| 257 | 259 | } |
| 258 | 260 | |
| 261 | extern 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 | |
| 259 | 269 | extern fn __divdi3(a: i64, b: i64) i64 { |
| 260 | 270 | @setRuntimeSafety(is_test); |
| 261 | 271 | |
| ... | ... | @@ -296,14 +306,35 @@ extern fn __umoddi3(a: u64, b: u64) u64 { |
| 296 | 306 | return r; |
| 297 | 307 | } |
| 298 | 308 | |
| 299 | | const AeabiUlDivModResult = extern struct { |
| 300 | | quot: u64, |
| 301 | | rem: u64, |
| 302 | | }; |
| 303 | | extern fn __aeabi_uldivmod(numerator: u64, denominator: u64) AeabiUlDivModResult { |
| 309 | extern fn __aeabi_uidivmod(n: u32, d: u32) extern struct{q: u32, r: u32} { |
| 304 | 310 | @setRuntimeSafety(is_test); |
| 305 | | var result: AeabiUlDivModResult = undefined; |
| 306 | | result.quot = __udivmoddi4(numerator, denominator, &result.rem); |
| 311 | |
| 312 | var result: @typeOf(__aeabi_uidivmod).ReturnType = undefined; |
| 313 | result.q = __udivmodsi4(n, d, &result.r); |
| 314 | return result; |
| 315 | } |
| 316 | |
| 317 | extern 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 | |
| 325 | extern 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 | |
| 333 | extern 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 | 338 | return result; |
| 308 | 339 | } |
| 309 | 340 | |
| ... | ... | @@ -397,22 +428,6 @@ test "usesThumb1" { |
| 397 | 428 | //etc. |
| 398 | 429 | } |
| 399 | 430 | |
| 400 | | nakedcc 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 | | |
| 416 | 431 | nakedcc fn __aeabi_memcpy() noreturn { |
| 417 | 432 | @setRuntimeSafety(false); |
| 418 | 433 | if (use_thumb_1) { |