1 /* Copyright (C) 2000-2022 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3 
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8 
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13 
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library.  If not, see
16    <https://www.gnu.org/licenses/>.  */
17 
18 #ifndef _SYS_TAS_H
19 #define _SYS_TAS_H 1
20 
21 #include <features.h>
22 #include <sgidefs.h>
23 
24 __BEGIN_DECLS
25 
26 extern int _test_and_set (int *__p, int __v)
27      __THROW __attribute__ ((__nomips16__));
28 
29 #ifdef __USE_EXTERN_INLINES
30 
31 # ifndef _EXTERN_INLINE
32 #  define _EXTERN_INLINE __extern_inline
33 # endif
34 
35 _EXTERN_INLINE int __attribute__ ((__nomips16__))
__NTH(_test_and_set (int * __p,int __v))36 __NTH (_test_and_set (int *__p, int __v))
37 {
38   int __r, __t;
39 
40   /* The R5900 reports itself as MIPS III but it does not have LL/SC.  */
41   __asm__ __volatile__
42     ("/* Inline test and set */\n"
43      ".set	push\n\t"
44 #if _MIPS_SIM == _ABIO32 && (__mips < 2 || defined (_MIPS_ARCH_R5900))
45      ".set	mips2\n\t"
46 #endif
47      "sync\n\t"
48      "1:\n\t"
49      "ll	%0,%3\n\t"
50      "move	%1,%4\n\t"
51      "beq	%0,%4,2f\n\t"
52      "sc	%1,%2\n\t"
53      "beqz	%1,1b\n"
54      "sync\n\t"
55      ".set	pop\n\t"
56      "2:\n\t"
57      "/* End test and set */"
58      : "=&r" (__r), "=&r" (__t), "=m" (*__p)
59      : "m" (*__p), "r" (__v)
60      : "memory");
61 
62   return __r;
63 }
64 
65 #endif /* __USE_EXTERN_INLINES */
66 
67 __END_DECLS
68 
69 #endif /* sys/tas.h */
70