diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-06-26 11:03:42 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-06-26 11:03:42 -0400 |
| commit | e79e8993e695f6c384f742d09060823f421758ca (patch) | |
| tree | 842c6fe2ed3c57ea2209730f79d354d32c0280b9 /std | |
| parent | f5af349bd6ab644139ecf4bc0b0761a13a5e6458 (diff) | |
| parent | f9e26d98711ead110a4c2d2f3032978a5a8c2d9d (diff) | |
| download | zig-e79e8993e695f6c384f742d09060823f421758ca.tar.gz zig-e79e8993e695f6c384f742d09060823f421758ca.zip | |
Merge pull request #2750 from cartr/thumbv4-aeabi
compiler-rt: Support thumb versions older than armv6
Diffstat (limited to 'std')
| -rw-r--r-- | std/special/compiler_rt.zig | 45 |
1 files changed, 39 insertions, 6 deletions
diff --git a/std/special/compiler_rt.zig b/std/special/compiler_rt.zig index 46607a3adf..914f9dcb00 100644 --- a/std/special/compiler_rt.zig +++ b/std/special/compiler_rt.zig @@ -405,15 +405,15 @@ const use_thumb_1 = usesThumb1(builtin.arch); fn usesThumb1(arch: builtin.Arch) bool { return switch (arch) { - .arm => switch (arch.arm) { + .arm => |sub_arch| switch (sub_arch) { .v6m => true, else => false, }, - .armeb => switch (arch.armeb) { + .armeb => |sub_arch| switch (sub_arch) { .v6m => true, else => false, }, - .thumb => switch (arch.thumb) { + .thumb => |sub_arch| switch (sub_arch) { .v5, .v5te, .v4t, @@ -423,7 +423,7 @@ fn usesThumb1(arch: builtin.Arch) bool { => true, else => false, }, - .thumbeb => switch (arch.thumbeb) { + .thumbeb => |sub_arch| switch (sub_arch) { .v5, .v5te, .v4t, @@ -471,6 +471,22 @@ test "usesThumb1" { //etc. } +const use_thumb_1_pre_armv6 = usesThumb1PreArmv6(builtin.arch); + +fn usesThumb1PreArmv6(arch: builtin.Arch) bool { + return switch (arch) { + .thumb => |sub_arch| switch (sub_arch) { + .v5, .v5te, .v4t => true, + else => false, + }, + .thumbeb => |sub_arch| switch (sub_arch) { + .v5, .v5te, .v4t => true, + else => false, + }, + else => false, + }; +} + nakedcc fn __aeabi_memcpy() noreturn { @setRuntimeSafety(false); if (use_thumb_1) { @@ -505,7 +521,16 @@ nakedcc fn __aeabi_memmove() noreturn { nakedcc fn __aeabi_memset() noreturn { @setRuntimeSafety(false); - if (use_thumb_1) { + if (use_thumb_1_pre_armv6) { + asm volatile ( + \\ eors r1, r2 + \\ eors r2, r1 + \\ eors r1, r2 + \\ push {r7, lr} + \\ b memset + \\ pop {r7, pc} + ); + } else if (use_thumb_1) { asm volatile ( \\ mov r3, r1 \\ mov r1, r2 @@ -527,7 +552,15 @@ nakedcc fn __aeabi_memset() noreturn { nakedcc fn __aeabi_memclr() noreturn { @setRuntimeSafety(false); - if (use_thumb_1) { + if (use_thumb_1_pre_armv6) { + asm volatile ( + \\ adds r2, r1, #0 + \\ movs r1, #0 + \\ push {r7, lr} + \\ bl memset + \\ pop {r7, pc} + ); + } else if (use_thumb_1) { asm volatile ( \\ mov r2, r1 \\ movs r1, #0 |
