summaryrefslogtreecommitdiffstats
path: root/libc/arch-x86/bionic/atomics_x86.S
diff options
context:
space:
mode:
Diffstat (limited to 'libc/arch-x86/bionic/atomics_x86.S')
-rw-r--r--libc/arch-x86/bionic/atomics_x86.S140
1 files changed, 0 insertions, 140 deletions
diff --git a/libc/arch-x86/bionic/atomics_x86.S b/libc/arch-x86/bionic/atomics_x86.S
deleted file mode 100644
index 2370f23..0000000
--- a/libc/arch-x86/bionic/atomics_x86.S
+++ /dev/null
@@ -1,140 +0,0 @@
-#include <sys/linux-syscalls.h>
-
-#define FUTEX_WAIT 0
-#define FUTEX_WAKE 1
-
-
-/*
- * int __futex_wait(volatile void *ftx, int val, const struct timespec *timeout)
- */
-.text
-.globl __futex_wait
-.type __futex_wait, @function
-.align 4
-__futex_wait:
- pushl %ebx
- pushl %esi
- mov 12(%esp), %ebx /* ftx */
- movl $FUTEX_WAIT, %ecx
- mov 16(%esp), %edx /* val */
- mov 20(%esp), %esi /* timeout */
- movl $__NR_futex, %eax
- int $0x80
- popl %esi
- popl %ebx
- ret
-
-
-/* int __futex_wake(volatile void *ftx, int count) */
-
-.text
-.globl __futex_wake
-.type __futex_wake, @function
-.align 4
-__futex_wake:
- pushl %ebx
- mov 8(%esp), %ebx /* ftx */
- movl $FUTEX_WAKE, %ecx
- mov 12(%esp), %edx /* count */
- movl $__NR_futex, %eax
- int $0x80
- popl %ebx
- ret
-
-
-/* int __atomic_cmpxchg(int old, int new, volatile int* addr) */
-
-.text
-.globl __atomic_cmpxchg
-.type __atomic_cmpxchg, @function
-.align 4
-__atomic_cmpxchg:
- mov 4(%esp), %eax /* old */
- mov 8(%esp), %ecx /* new */
- mov 12(%esp), %edx /* addr */
- lock cmpxchg %ecx, (%edx)
- jnz 1f
- xor %eax, %eax
- jmp 2f
-1:
- movl $1, %eax
-2:
- ret /* 0 == success, 1 == failure */
-
-
-/* int __atomic_swap(int new, volatile int* addr) */
-
-.text
-.globl __atomic_swap
-.type __atomic_swap, @function
-.align 4
-__atomic_swap:
- mov 4(%esp), %ecx /* new */
- mov 8(%esp), %edx /* addr */
- lock xchg %ecx, (%edx)
- mov %ecx, %eax
- ret
-
-
-/*
- * int __atomic_dec(volatile int* addr)
- *
- * My x86 asm is really rusty.. this is probably suboptimal
- */
-
-.text
-.globl __atomic_dec
-.type __atomic_dec, @function
-.align 4
-__atomic_dec:
- pushl %ebx
- pushl %esi
- movl 12(%esp), %ebx /* addr */
-
-1:
- movl (%ebx), %esi /* old = *addr */
- movl %esi, %edx
- subl $1, %edx /* new = old - 1 */
-
- pushl %ebx
- pushl %edx
- pushl %esi
- call __atomic_cmpxchg
- addl $12, %esp
- test %eax, %eax
- jnz 1b
-
- movl %esi, %eax /* return old */
- popl %esi
- popl %ebx
- ret
-
-
-.text
-/* int __atomic_inc(volatile int* addr) */
-.globl __atomic_inc
-.type __atomic_inc, @function
-.align 4
-__atomic_inc:
- pushl %ebx
- pushl %esi
- movl 12(%esp), %ebx /* addr */
-
-1:
- movl (%ebx), %esi /* old = *addr */
- movl %esi, %edx
- addl $1, %edx /* new = old + 1 */
-
- pushl %ebx
- pushl %edx
- pushl %esi
- call __atomic_cmpxchg
- addl $12, %esp
- test %eax, %eax
- jnz 1b
-
- movl %esi, %eax /* return old */
- popl %esi
- popl %ebx
- ret
-