xref: /optee_os/lib/libutils/ext/arch/arm/atomic_a32.S (revision d99255362ca1ede7e30c14ea657082caa60de09c)
11bb92983SJerome Forissier/* SPDX-License-Identifier: BSD-2-Clause */
2e17dd72aSJens Wiklander/*
3e17dd72aSJens Wiklander * Copyright (c) 2015-2016, Linaro Limited
4e17dd72aSJens Wiklander */
5e17dd72aSJens Wiklander
6e17dd72aSJens Wiklander#include <asm.S>
7e17dd72aSJens Wiklander
8*d9925536SJerome Forissier	.section .note.GNU-stack,"",%progbits
9*d9925536SJerome Forissier
10e17dd72aSJens Wiklander/* uint32_t atomic_inc32(uint32_t *v); */
11e17dd72aSJens WiklanderFUNC atomic_inc32 , :
12e17dd72aSJens Wiklander	ldrex	r1, [r0]
13e17dd72aSJens Wiklander	add	r1, r1, #1
14e17dd72aSJens Wiklander	strex	r2, r1, [r0]
15e17dd72aSJens Wiklander	cmp	r2, #0
16e17dd72aSJens Wiklander	bne	atomic_inc32
17e17dd72aSJens Wiklander	mov	r0, r1
18e17dd72aSJens Wiklander	bx	lr
19e17dd72aSJens WiklanderEND_FUNC atomic_inc32
20e17dd72aSJens Wiklander
21e17dd72aSJens Wiklander/* uint32_t atomic_dec32(uint32_t *v); */
22e17dd72aSJens WiklanderFUNC atomic_dec32 , :
23e17dd72aSJens Wiklander	ldrex	r1, [r0]
24e17dd72aSJens Wiklander	sub	r1, r1, #1
25e17dd72aSJens Wiklander	strex	r2, r1, [r0]
26e17dd72aSJens Wiklander	cmp	r2, #0
27e17dd72aSJens Wiklander	bne	atomic_dec32
28e17dd72aSJens Wiklander	mov	r0, r1
29e17dd72aSJens Wiklander	bx	lr
30e17dd72aSJens WiklanderEND_FUNC atomic_dec32
31