authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-06-26 11:03:42-04:00
committergravatar for noreply@github.comGitHub <noreply@github.com> 2019-06-26 11:03:42-04:00
loge79e8993e695f6c384f742d09060823f421758ca
tree842c6fe2ed3c57ea2209730f79d354d32c0280b9
parentf5af349bd6ab644139ecf4bc0b0761a13a5e6458
parentf9e26d98711ead110a4c2d2f3032978a5a8c2d9d
signaturebadge-question-mark Signed by PGP key 4AEE18F83AFDEB23

Merge pull request #2750 from cartr/thumbv4-aeabi

compiler-rt: Support thumb versions older than armv6

1 files changed, 39 insertions(+), 6 deletions(-)

std/special/compiler_rt.zig+39-6
...@@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch);...@@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch);
405405
406fn usesThumb1(arch: builtin.Arch) bool {406fn 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}
473473
474const use_thumb_1_pre_armv6 = usesThumb1PreArmv6(builtin.arch);
475
476fn 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
474nakedcc fn __aeabi_memcpy() noreturn {490nakedcc 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 {
505521
506nakedcc fn __aeabi_memset() noreturn {522nakedcc 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, r1535 \\ mov r3, r1
511 \\ mov r1, r2536 \\ mov r1, r2
...@@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn {...@@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn {
527552
528nakedcc fn __aeabi_memclr() noreturn {553nakedcc 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, r1565 \\ mov r2, r1
533 \\ movs r1, #0566 \\ movs r1, #0