From 6e9ebc2ad16ac43e76a71903d3cd1075105833b3 Mon Sep 17 00:00:00 2001 From: David Daniel Date: Sun, 15 Aug 2004 21:56:25 +0000 Subject: [PATCH] Adding atomic operations for non-gcc on ia32 This commit was SVN r2152. --- src/include/sys/ia32/atomic.s | 180 ++++++++++++++++++++++++++++++++++ 1 file changed, 180 insertions(+) create mode 100644 src/include/sys/ia32/atomic.s diff --git a/src/include/sys/ia32/atomic.s b/src/include/sys/ia32/atomic.s new file mode 100644 index 0000000000..c7c7d83843 --- /dev/null +++ b/src/include/sys/ia32/atomic.s @@ -0,0 +1,180 @@ + .file "atomic.c" + .text +.globl ompi_atomic_mb + .type ompi_atomic_mb,@function +ompi_atomic_mb: + pushl %ebp + movl %esp, %ebp + leave + ret +.Lfe1: + .size ompi_atomic_mb,.Lfe1-ompi_atomic_mb +.globl ompi_atomic_rmb + .type ompi_atomic_rmb,@function +ompi_atomic_rmb: + pushl %ebp + movl %esp, %ebp + leave + ret +.Lfe2: + .size ompi_atomic_rmb,.Lfe2-ompi_atomic_rmb +.globl ompi_atomic_wmb + .type ompi_atomic_wmb,@function +ompi_atomic_wmb: + pushl %ebp + movl %esp, %ebp + leave + ret +.Lfe3: + .size ompi_atomic_wmb,.Lfe3-ompi_atomic_wmb +.globl ompi_atomic_cmpset_32 + .type ompi_atomic_cmpset_32,@function +ompi_atomic_cmpset_32: + pushl %ebp + movl %esp, %ebp + pushl %ebx + subl $4, %esp + movl 12(%ebp), %eax + movl %eax, -8(%ebp) + movl -8(%ebp), %edx + movl 16(%ebp), %ecx + movl %edx, %eax + movl 8(%ebp), %ebx +#APP + cmpxchgl %ecx,(%ebx) + setz %al + movzbl %al,%eax + +#NO_APP + movl %eax, %edx + movl %edx, -8(%ebp) + movl -8(%ebp), %eax + cmpl 12(%ebp), %eax + sete %al + movzbl %al, %eax + addl $4, %esp + popl %ebx + leave + ret +.Lfe4: + .size ompi_atomic_cmpset_32,.Lfe4-ompi_atomic_cmpset_32 +.globl ompi_atomic_cmpset_acq_32 + .type ompi_atomic_cmpset_acq_32,@function +ompi_atomic_cmpset_acq_32: + pushl %ebp + movl %esp, %ebp + subl $8, %esp + subl $4, %esp + pushl 16(%ebp) + pushl 12(%ebp) + pushl 8(%ebp) + call ompi_atomic_cmpset_32 + addl $16, %esp + leave + ret +.Lfe5: + .size ompi_atomic_cmpset_acq_32,.Lfe5-ompi_atomic_cmpset_acq_32 +.globl ompi_atomic_cmpset_rel_32 + .type ompi_atomic_cmpset_rel_32,@function +ompi_atomic_cmpset_rel_32: + pushl %ebp + movl %esp, %ebp + subl $8, %esp + subl $4, %esp + pushl 16(%ebp) + pushl 12(%ebp) + pushl 8(%ebp) + call ompi_atomic_cmpset_32 + addl $16, %esp + leave + ret +.Lfe6: + .size ompi_atomic_cmpset_rel_32,.Lfe6-ompi_atomic_cmpset_rel_32 +.globl ompi_atomic_cmpset_64 + .type ompi_atomic_cmpset_64,@function +ompi_atomic_cmpset_64: + pushl %ebp + movl %esp, %ebp + pushl %ebx + subl $28, %esp + movl 12(%ebp), %eax + movl 16(%ebp), %edx + movl %eax, -16(%ebp) + movl %edx, -12(%ebp) + movl 20(%ebp), %eax + movl 24(%ebp), %edx + movl %eax, -24(%ebp) + movl %edx, -20(%ebp) + movl -16(%ebp), %eax + movl -12(%ebp), %edx + movl %eax, -32(%ebp) + movl %edx, -28(%ebp) + movl -16(%ebp), %ecx + movl -12(%ebp), %ebx + movl -32(%ebp), %eax + xorl %ecx, %eax + movl -28(%ebp), %edx + xorl %ebx, %edx + orl %edx, %eax + testl %eax, %eax + sete %al + movzbl %al, %eax + addl $28, %esp + popl %ebx + leave + ret +.Lfe7: + .size ompi_atomic_cmpset_64,.Lfe7-ompi_atomic_cmpset_64 +.globl ompi_atomic_cmpset_acq_64 + .type ompi_atomic_cmpset_acq_64,@function +ompi_atomic_cmpset_acq_64: + pushl %ebp + movl %esp, %ebp + subl $24, %esp + movl 12(%ebp), %eax + movl 16(%ebp), %edx + movl %eax, -8(%ebp) + movl %edx, -4(%ebp) + movl 20(%ebp), %eax + movl 24(%ebp), %edx + movl %eax, -16(%ebp) + movl %edx, -12(%ebp) + subl $12, %esp + pushl -12(%ebp) + pushl -16(%ebp) + pushl -4(%ebp) + pushl -8(%ebp) + pushl 8(%ebp) + call ompi_atomic_cmpset_64 + addl $32, %esp + leave + ret +.Lfe8: + .size ompi_atomic_cmpset_acq_64,.Lfe8-ompi_atomic_cmpset_acq_64 +.globl ompi_atomic_cmpset_rel_64 + .type ompi_atomic_cmpset_rel_64,@function +ompi_atomic_cmpset_rel_64: + pushl %ebp + movl %esp, %ebp + subl $24, %esp + movl 12(%ebp), %eax + movl 16(%ebp), %edx + movl %eax, -8(%ebp) + movl %edx, -4(%ebp) + movl 20(%ebp), %eax + movl 24(%ebp), %edx + movl %eax, -16(%ebp) + movl %edx, -12(%ebp) + subl $12, %esp + pushl -12(%ebp) + pushl -16(%ebp) + pushl -4(%ebp) + pushl -8(%ebp) + pushl 8(%ebp) + call ompi_atomic_cmpset_64 + addl $32, %esp + leave + ret +.Lfe9: + .size ompi_atomic_cmpset_rel_64,.Lfe9-ompi_atomic_cmpset_rel_64 + .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"