Avoid "anonymous" code in pthread_spin_lock.

This commit is contained in:
Paul Pluzhnikov 2012-05-02 13:58:40 -07:00
parent 0be196adda
commit b93d565a51
4 changed files with 62 additions and 31 deletions

View File

@ -1,3 +1,10 @@
2012-05-02 Paul Pluzhnikov <ppluzhnikov@google.com>
* sysdeps/i386/pthread_spin_lock.S: New.
* sysdeps/i386/pthread_spin_lock.c: Delete.
* sysdeps/x86_64/pthread_spin_lock.S: New.
* sysdeps/x86_64/pthread_spin_lock.c: Delete.
2012-04-28 Andreas Schwab <schwab@linux-m68k.org>
* Makefile ($(objpfx)tst-stack3-mem, $(objpfx)tst-tls6.out): Don't

View File

@ -1,6 +1,5 @@
/* Copyright (C) 2002,2003,2004 Free Software Foundation, Inc.
/* Copyright (C) 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@redhat.com>, 2002.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
@ -16,33 +15,23 @@
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include "pthreadP.h"
#include <lowlevellock.h>
#ifndef LOCK_PREFIX
# ifdef UP
# define LOCK_PREFIX /* nothing */
# else
# define LOCK_PREFIX "lock;"
# endif
#endif
.globl pthread_spin_lock
.type pthread_spin_lock,@function
.align 16
pthread_spin_lock:
mov 4(%esp), %eax
1: LOCK
decl 0(%eax)
jne 2f
xor %eax, %eax
ret
int
pthread_spin_lock (lock)
pthread_spinlock_t *lock;
{
asm ("\n"
"1:\t" LOCK_PREFIX "decl %0\n\t"
"jne 2f\n\t"
".subsection 1\n\t"
".align 16\n"
"2:\trep; nop\n\t"
"cmpl $0, %0\n\t"
"jg 1b\n\t"
"jmp 2b\n\t"
".previous"
: "=m" (*lock)
: "m" (*lock));
return 0;
}
.align 16
2: rep
nop
cmpl $0, 0(%eax)
jg 1b
jmp 2b
.size pthread_spin_lock,.-pthread_spin_lock

View File

@ -0,0 +1,36 @@
/* Copyright (C) 2012 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with the GNU C Library; if not, see
<http://www.gnu.org/licenses/>. */
#include <lowlevellock.h>
.globl pthread_spin_lock
.type pthread_spin_lock,@function
.align 16
pthread_spin_lock:
1: LOCK
decl 0(%rdi)
jne 2f
xor %eax, %eax
ret
.align 16
2: rep
nop
cmpl $0, 0(%rdi)
jg 1b
jmp 2b
.size pthread_spin_lock,.-pthread_spin_lock

View File

@ -1 +0,0 @@
#include "../i386/pthread_spin_lock.c"