diff options
| -rw-r--r-- | emu/Linux/arm-tas-v5.S | 18 | ||||
| -rw-r--r-- | emu/Linux/arm-tas-v7.S | 27 |
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 |
