| ... | @@ -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); |
| 113 | | 113 | |
| | 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); |
| 127 | | 128 | |
| 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); |
| 130 | | 132 | |
| 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); |
| 135 | | 137 | |
| ... | @@ -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 | } |
| 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 | extern fn __divdi3(a: i64, b: i64) i64 { | 269 | extern fn __divdi3(a: i64, b: i64) i64 { |
| 260 | @setRuntimeSafety(is_test); | 270 | @setRuntimeSafety(is_test); |
| 261 | | 271 | |
| ... | @@ -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 | } |
| 298 | | 308 | |
| 299 | const AeabiUlDivModResult = extern struct { | 309 | extern fn __aeabi_uidivmod(n: u32, d: u32) extern struct{q: u32, r: u32} { |
| 300 | quot: u64, | | |
| 301 | rem: u64, | | |
| 302 | }; | | |
| 303 | extern 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 | |
| | 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 | return result; | 338 | return result; |
| 308 | } | 339 | } |
| 309 | | 340 | |
| ... | @@ -397,22 +428,6 @@ test "usesThumb1" { | ... | @@ -397,22 +428,6 @@ test "usesThumb1" { |
| 397 | //etc. | 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 | nakedcc fn __aeabi_memcpy() noreturn { | 431 | nakedcc fn __aeabi_memcpy() noreturn { |
| 417 | @setRuntimeSafety(false); | 432 | @setRuntimeSafety(false); |
| 418 | if (use_thumb_1) { | 433 | if (use_thumb_1) { |