1  /* Copyright (C) 2003-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  #ifdef __ASSEMBLER__
      19  
      20  #define _IMP1 #1
      21  #define _IMM1 #-1
      22  #define _IMM4 #-4
      23  #define _IMM6 #-6
      24  #define _IMM8 #-8
      25  
      26  #define	INC(mem, reg) \
      27  	.align	2; \
      28  	mova	99f, r0; \
      29  	mov	r15, r1; \
      30  	mov	_IMM6, r15; \
      31  98:	mov.l	mem, reg; \
      32  	add	_IMP1, reg; \
      33  	mov.l	reg, mem; \
      34  99:	mov	r1, r15
      35  
      36  #define	DEC(mem, reg) \
      37  	.align	2; \
      38  	mova	99f, r0; \
      39  	mov	r15, r1; \
      40  	mov	_IMM6, r15; \
      41  98:	mov.l	mem, reg; \
      42  	add	_IMM1, reg; \
      43  	mov.l	reg, mem; \
      44  99:	mov	r1, r15
      45  
      46  #define	XADD(reg, mem, old, tmp) \
      47  	.align	2; \
      48  	mova	99f, r0; \
      49  	nop; \
      50  	mov	r15, r1; \
      51  	mov	_IMM8, r15; \
      52  98:	mov.l	mem, old; \
      53  	mov	reg, tmp; \
      54  	add	old, tmp; \
      55  	mov.l	tmp, mem; \
      56  99:	mov	r1, r15
      57  
      58  #define	XCHG(reg, mem, old) \
      59  	.align	2; \
      60  	mova	99f, r0; \
      61  	nop; \
      62  	mov	r15, r1; \
      63  	mov	_IMM4, r15; \
      64  98:	mov.l	mem, old; \
      65  	mov.l	reg, mem; \
      66  99:	mov	r1, r15
      67  
      68  #define	CMPXCHG(reg, mem, new, old) \
      69  	.align	2; \
      70  	mova	99f, r0; \
      71  	nop; \
      72  	mov	r15, r1; \
      73  	mov	_IMM8, r15; \
      74  98:	mov.l	mem, old; \
      75  	cmp/eq	old, reg; \
      76  	bf	99f; \
      77  	mov.l	new, mem; \
      78  99:	mov	r1, r15
      79  
      80  #endif  /* __ASSEMBLER__ */