| ... | ... | @@ -471,6 +471,28 @@ test "usesThumb1" { |
| 471 | 471 | //etc. |
| 472 | 472 | } |
| 473 | 473 | |
| 474 | const use_thumb_1_pre_armv6 = usesThumb1PreArmv6(builtin.arch); |
| 475 | |
| 476 | fn usesThumb1PreArmv6(arch: builtin.Arch) bool { |
| 477 | return switch (arch) { |
| 478 | .thumb => switch (arch.thumb) { |
| 479 | .v5, |
| 480 | .v5te, |
| 481 | .v4t, |
| 482 | => true, |
| 483 | else => false, |
| 484 | }, |
| 485 | .thumbeb => switch (arch.thumbeb) { |
| 486 | .v5, |
| 487 | .v5te, |
| 488 | .v4t, |
| 489 | => true, |
| 490 | else => false, |
| 491 | }, |
| 492 | else => false, |
| 493 | }; |
| 494 | } |
| 495 | |
| 474 | 496 | nakedcc fn __aeabi_memcpy() noreturn { |
| 475 | 497 | @setRuntimeSafety(false); |
| 476 | 498 | if (use_thumb_1) { |
| ... | ... | @@ -505,7 +527,16 @@ nakedcc fn __aeabi_memmove() noreturn { |
| 505 | 527 | |
| 506 | 528 | nakedcc fn __aeabi_memset() noreturn { |
| 507 | 529 | @setRuntimeSafety(false); |
| 508 | | if (use_thumb_1) { |
| 530 | if (use_thumb_1_pre_armv6) { |
| 531 | asm volatile ( |
| 532 | \\ eors r1, r2 |
| 533 | \\ eors r2, r1 |
| 534 | \\ eors r1, r2 |
| 535 | \\ push {r7, lr} |
| 536 | \\ b memset |
| 537 | \\ pop {r7, pc} |
| 538 | ); |
| 539 | } else if (use_thumb_1) { |
| 509 | 540 | asm volatile ( |
| 510 | 541 | \\ mov r3, r1 |
| 511 | 542 | \\ mov r1, r2 |
| ... | ... | @@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn { |
| 527 | 558 | |
| 528 | 559 | nakedcc fn __aeabi_memclr() noreturn { |
| 529 | 560 | @setRuntimeSafety(false); |
| 530 | | if (use_thumb_1) { |
| 561 | if (use_thumb_1_pre_armv6) { |
| 562 | asm volatile ( |
| 563 | \\ adds r2, r1, #0 |
| 564 | \\ movs r1, #0 |
| 565 | \\ push {r7, lr} |
| 566 | \\ bl memset |
| 567 | \\ pop {r7, pc} |
| 568 | ); |
| 569 | } else if (use_thumb_1) { |
| 531 | 570 | asm volatile ( |
| 532 | 571 | \\ mov r2, r1 |
| 533 | 572 | \\ movs r1, #0 |