1  /* Copyright (C) 2000-2023 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__))
      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 */