| ... | ... | @@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch); |
| 405 | 405 | |
| 406 | 406 | fn usesThumb1(arch: builtin.Arch) bool { |
| 407 | 407 | return switch (arch) { |
| 408 | | .arm => switch (arch.arm) { |
| 408 | .arm => |sub_arch| switch (sub_arch) { |
| 409 | 409 | .v6m => true, |
| 410 | 410 | else => false, |
| 411 | 411 | }, |
| 412 | | .armeb => switch (arch.armeb) { |
| 412 | .armeb => |sub_arch| switch (sub_arch) { |
| 413 | 413 | .v6m => true, |
| 414 | 414 | else => false, |
| 415 | 415 | }, |
| 416 | | .thumb => switch (arch.thumb) { |
| 416 | .thumb => |sub_arch| switch (sub_arch) { |
| 417 | 417 | .v5, |
| 418 | 418 | .v5te, |
| 419 | 419 | .v4t, |
| ... | ... | @@ -423,7 +423,7 @@ fn usesThumb1(arch: builtin.Arch) bool { |
| 423 | 423 | => true, |
| 424 | 424 | else => false, |
| 425 | 425 | }, |
| 426 | | .thumbeb => switch (arch.thumbeb) { |
| 426 | .thumbeb => |sub_arch| switch (sub_arch) { |
| 427 | 427 | .v5, |
| 428 | 428 | .v5te, |
| 429 | 429 | .v4t, |
| ... | ... | @@ -471,6 +471,22 @@ 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 => |sub_arch| switch (sub_arch) { |
| 479 | .v5, .v5te, .v4t => true, |
| 480 | else => false, |
| 481 | }, |
| 482 | .thumbeb => |sub_arch| switch (sub_arch) { |
| 483 | .v5, .v5te, .v4t => true, |
| 484 | else => false, |
| 485 | }, |
| 486 | else => false, |
| 487 | }; |
| 488 | } |
| 489 | |
| 474 | 490 | nakedcc fn __aeabi_memcpy() noreturn { |
| 475 | 491 | @setRuntimeSafety(false); |
| 476 | 492 | if (use_thumb_1) { |
| ... | ... | @@ -505,7 +521,16 @@ nakedcc fn __aeabi_memmove() noreturn { |
| 505 | 521 | |
| 506 | 522 | nakedcc fn __aeabi_memset() noreturn { |
| 507 | 523 | @setRuntimeSafety(false); |
| 508 | | if (use_thumb_1) { |
| 524 | if (use_thumb_1_pre_armv6) { |
| 525 | asm volatile ( |
| 526 | \\ eors r1, r2 |
| 527 | \\ eors r2, r1 |
| 528 | \\ eors r1, r2 |
| 529 | \\ push {r7, lr} |
| 530 | \\ b memset |
| 531 | \\ pop {r7, pc} |
| 532 | ); |
| 533 | } else if (use_thumb_1) { |
| 509 | 534 | asm volatile ( |
| 510 | 535 | \\ mov r3, r1 |
| 511 | 536 | \\ mov r1, r2 |
| ... | ... | @@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn { |
| 527 | 552 | |
| 528 | 553 | nakedcc fn __aeabi_memclr() noreturn { |
| 529 | 554 | @setRuntimeSafety(false); |
| 530 | | if (use_thumb_1) { |
| 555 | if (use_thumb_1_pre_armv6) { |
| 556 | asm volatile ( |
| 557 | \\ adds r2, r1, #0 |
| 558 | \\ movs r1, #0 |
| 559 | \\ push {r7, lr} |
| 560 | \\ bl memset |
| 561 | \\ pop {r7, pc} |
| 562 | ); |
| 563 | } else if (use_thumb_1) { |
| 531 | 564 | asm volatile ( |
| 532 | 565 | \\ mov r2, r1 |
| 533 | 566 | \\ movs r1, #0 |