summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--emu/Linux/arm-tas-v5.S18
-rw-r--r--emu/Linux/arm-tas-v7.S27
2 files changed, 45 insertions, 0 deletions
diff --git a/emu/Linux/arm-tas-v5.S b/emu/Linux/arm-tas-v5.S
new file mode 100644
index 00000000..4bd13c2d
--- /dev/null
+++ b/emu/Linux/arm-tas-v5.S
@@ -0,0 +1,18 @@
+
+ .file "arm-tas-v5.S"
+/*
+ * ulong _tas(ulong*);
+ */
+ .align 2
+ .global _tas
+ .type _tas, %function
+_tas:
+ @ args = 0, pretend = 0, frame = 0
+ @ frame_needed = 0, uses_anonymous_args = 0
+ @ link register save eliminated.
+ @ lr needed for prologue
+ mov r3, #1
+ mov r1, r0
+ swp r0, r3, [r1]
+ bx lr
+ .size _tas, .-_tas
diff --git a/emu/Linux/arm-tas-v7.S b/emu/Linux/arm-tas-v7.S
new file mode 100644
index 00000000..30515607
--- /dev/null
+++ b/emu/Linux/arm-tas-v7.S
@@ -0,0 +1,27 @@
+ .file "arm-tas-v7.S"
+#ifndef ARMv7
+#define DMB mcr p15, 0, r0, c7, c10, 5
+#else
+#define DMB dmb
+#endif
+.align 2
+.global _tas
+.type _tas, %function
+_tas:
+ @ args = 0, pretend = 0, frame = 0
+ @ frame_needed = 0, uses_anonymous_args = 0
+ @ link register save eliminated.
+ @ lr needed for prologue
+ DMB
+ mov r1, r0
+ mov r2, #0xaa
+tas1:
+ ldrex r0, [r1]
+ cmp r0, #0
+ bxne lr
+ strex r4, r2, [r1]
+ cmp r4, #0
+ bne tas1
+ DMB
+ bx lr
+ .size _tas, .-_tas