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" {
471471 //etc.
472472}
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
474496nakedcc fn __aeabi_memcpy() noreturn {
475497 @setRuntimeSafety(false);
476498 if (use_thumb_1) {
......@@ -505,7 +527,16 @@ nakedcc fn __aeabi_memmove() noreturn {
505527
506528nakedcc fn __aeabi_memset() noreturn {
507529 @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) {
509540 asm volatile (
510541 \\ mov r3, r1
511542 \\ mov r1, r2
......@@ -527,7 +558,15 @@ nakedcc fn __aeabi_memset() noreturn {
527558
528559nakedcc fn __aeabi_memclr() noreturn {
529560 @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) {
531570 asm volatile (
532571 \\ mov r2, r1
533572 \\ movs r1, #0