| ... | @@ -471,6 +471,28 @@ test "usesThumb1" { | ... | @@ -471,6 +471,28 @@ test "usesThumb1" { |
| 471 | //etc. | 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 | nakedcc fn __aeabi_memcpy() noreturn { | 496 | nakedcc fn __aeabi_memcpy() noreturn { |
| 475 | @setRuntimeSafety(false); | 497 | @setRuntimeSafety(false); |
| 476 | if (use_thumb_1) { | 498 | if (use_thumb_1) { |
| ... | @@ -505,7 +527,16 @@ nakedcc fn __aeabi_memmove() noreturn { | ... | @@ -505,7 +527,16 @@ nakedcc fn __aeabi_memmove() noreturn { |
| 505 | | 527 | |
| 506 | nakedcc fn __aeabi_memset() noreturn { | 528 | nakedcc fn __aeabi_memset() noreturn { |
| 507 | @setRuntimeSafety(false); | 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 | asm volatile ( | 540 | asm volatile ( |
| 510 | \\ mov r3, r1 | 541 | \\ mov r3, r1 |
| 511 | \\ mov r1, r2 | 542 | \\ mov r1, r2 |
| ... | @@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn { | ... | @@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn { |
| 527 | | 558 | |
| 528 | nakedcc fn __aeabi_memclr() noreturn { | 559 | nakedcc fn __aeabi_memclr() noreturn { |
| 529 | @setRuntimeSafety(false); | 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 | asm volatile ( | 570 | asm volatile ( |
| 532 | \\ mov r2, r1 | 571 | \\ mov r2, r1 |
| 533 | \\ movs r1, #0 | 572 | \\ movs r1, #0 |