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);
405405
406406fn usesThumb1(arch: builtin.Arch) bool {
407407 return switch (arch) {
408 .arm => switch (arch.arm) {
408 .arm => |sub_arch| switch (sub_arch) {
409409 .v6m => true,
410410 else => false,
411411 },
412 .armeb => switch (arch.armeb) {
412 .armeb => |sub_arch| switch (sub_arch) {
413413 .v6m => true,
414414 else => false,
415415 },
416 .thumb => switch (arch.thumb) {
416 .thumb => |sub_arch| switch (sub_arch) {
417417 .v5,
418418 .v5te,
419419 .v4t,
......@@ -423,7 +423,7 @@ fn usesThumb1(arch: builtin.Arch) bool {
423423 => true,
424424 else => false,
425425 },
426 .thumbeb => switch (arch.thumbeb) {
426 .thumbeb => |sub_arch| switch (sub_arch) {
427427 .v5,
428428 .v5te,
429429 .v4t,
......@@ -471,6 +471,22 @@ 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 => |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
474490nakedcc fn __aeabi_memcpy() noreturn {
475491 @setRuntimeSafety(false);
476492 if (use_thumb_1) {
......@@ -505,7 +521,16 @@ nakedcc fn __aeabi_memmove() noreturn {
505521
506522nakedcc fn __aeabi_memset() noreturn {
507523 @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) {
509534 asm volatile (
510535 \\ mov r3, r1
511536 \\ mov r1, r2
......@@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn {
527552
528553nakedcc fn __aeabi_memclr() noreturn {
529554 @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) {
531564 asm volatile (
532565 \\ mov r2, r1
533566 \\ movs r1, #0