authorgravatar for carter.sande@duodecima.technologyCarter Sande <carter.sande@duodecima.technology> 2019-06-24 22:32:50-07:00
committergravatar for carter.sande@duodecima.technologyCarter Sande <carter.sande@duodecima.technology> 2019-06-24 22:32:50-07:00
logcd02630da82b6b0a59583160b12c286a7aec7f8c
treef3bfbcfc37aac71290e98e364361e9454134c271
parentde2b0cd722ca8fe98d16c86825db4cb2a70931c6

compiler-rt: Support thumb versions older than armv6

Add versions of __aeabi_memset and __aeabi_memclr which do not use mov instructions between low registers, as this is unsupported on thumbv4t and thumbv5.

1 files changed, 41 insertions(+), 2 deletions(-)

std/special/compiler_rt.zig+41-2
...@@ -471,6 +471,28 @@ test "usesThumb1" {...@@ -471,6 +471,28 @@ test "usesThumb1" {
471 //etc.471 //etc.
472}472}
473473
474const use_thumb_1_pre_armv6 = usesThumb1PreArmv6(builtin.arch);
475
476fn 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
474nakedcc fn __aeabi_memcpy() noreturn {496nakedcc 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 {
505527
506nakedcc fn __aeabi_memset() noreturn {528nakedcc 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, r1541 \\ mov r3, r1
511 \\ mov r1, r2542 \\ mov r1, r2
...@@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn {...@@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn {
527558
528nakedcc fn __aeabi_memclr() noreturn {559nakedcc 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, r1571 \\ mov r2, r1
533 \\ movs r1, #0572 \\ movs r1, #0