| ... | @@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch); | ... | @@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch); |
| 405 | | 405 | |
| 406 | fn usesThumb1(arch: builtin.Arch) bool { | 406 | fn usesThumb1(arch: builtin.Arch) bool { |
| 407 | return switch (arch) { | 407 | return switch (arch) { |
| 408 | .arm => switch (arch.arm) { | 408 | .arm => |sub_arch| switch (sub_arch) { |
| 409 | .v6m => true, | 409 | .v6m => true, |
| 410 | else => false, | 410 | else => false, |
| 411 | }, | 411 | }, |
| 412 | .armeb => switch (arch.armeb) { | 412 | .armeb => |sub_arch| switch (sub_arch) { |
| 413 | .v6m => true, | 413 | .v6m => true, |
| 414 | else => false, | 414 | else => false, |
| 415 | }, | 415 | }, |
| 416 | .thumb => switch (arch.thumb) { | 416 | .thumb => |sub_arch| switch (sub_arch) { |
| 417 | .v5, | 417 | .v5, |
| 418 | .v5te, | 418 | .v5te, |
| 419 | .v4t, | 419 | .v4t, |
| ... | @@ -423,7 +423,7 @@ fn usesThumb1(arch: builtin.Arch) bool { | ... | @@ -423,7 +423,7 @@ fn usesThumb1(arch: builtin.Arch) bool { |
| 423 | => true, | 423 | => true, |
| 424 | else => false, | 424 | else => false, |
| 425 | }, | 425 | }, |
| 426 | .thumbeb => switch (arch.thumbeb) { | 426 | .thumbeb => |sub_arch| switch (sub_arch) { |
| 427 | .v5, | 427 | .v5, |
| 428 | .v5te, | 428 | .v5te, |
| 429 | .v4t, | 429 | .v4t, |
| ... | @@ -471,6 +471,22 @@ test "usesThumb1" { | ... | @@ -471,6 +471,22 @@ 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 => |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 | nakedcc fn __aeabi_memcpy() noreturn { | 490 | nakedcc fn __aeabi_memcpy() noreturn { |
| 475 | @setRuntimeSafety(false); | 491 | @setRuntimeSafety(false); |
| 476 | if (use_thumb_1) { | 492 | if (use_thumb_1) { |
| ... | @@ -505,7 +521,16 @@ nakedcc fn __aeabi_memmove() noreturn { | ... | @@ -505,7 +521,16 @@ nakedcc fn __aeabi_memmove() noreturn { |
| 505 | | 521 | |
| 506 | nakedcc fn __aeabi_memset() noreturn { | 522 | nakedcc fn __aeabi_memset() noreturn { |
| 507 | @setRuntimeSafety(false); | 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 | asm volatile ( | 534 | asm volatile ( |
| 510 | \\ mov r3, r1 | 535 | \\ mov r3, r1 |
| 511 | \\ mov r1, r2 | 536 | \\ mov r1, r2 |
| ... | @@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn { | ... | @@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn { |
| 527 | | 552 | |
| 528 | nakedcc fn __aeabi_memclr() noreturn { | 553 | nakedcc fn __aeabi_memclr() noreturn { |
| 529 | @setRuntimeSafety(false); | 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 | asm volatile ( | 564 | asm volatile ( |
| 532 | \\ mov r2, r1 | 565 | \\ mov r2, r1 |
| 533 | \\ movs r1, #0 | 566 | \\ movs r1, #0 |