aboutsummaryrefslogtreecommitdiff
path: root/std
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-06-26 11:03:42 -0400
committerGitHub <noreply@github.com>2019-06-26 11:03:42 -0400
commite79e8993e695f6c384f742d09060823f421758ca (patch)
tree842c6fe2ed3c57ea2209730f79d354d32c0280b9 /std
parentf5af349bd6ab644139ecf4bc0b0761a13a5e6458 (diff)
parentf9e26d98711ead110a4c2d2f3032978a5a8c2d9d (diff)
downloadzig-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.zig45
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