#include "atomic_op_asm.h"
#if defined(_ARM_ARCH_6)
ENTRY_NP(_atomic_sub_16)
negs r1, r1
ENTRY_NP(_atomic_add_16)
mov ip, r0
1: ldrexh r0, [ip]
adds r3, r0, r1
strexh r2, r3, [ip]
cmp r2, #0
bne 1b
RET
END(_atomic_add_16)
END(_atomic_sub_16)
ATOMIC_OP_ALIAS(atomic_add_16,_atomic_add_16)
ATOMIC_OP_ALIAS(atomic_add_short,_atomic_add_16)
ATOMIC_OP_ALIAS(atomic_add_ushort,_atomic_add_16)
CRT_ALIAS(__atomic_fetch_add_2,_atomic_add_16)
STRONG_ALIAS(_atomic_add_short,_atomic_add_16)
STRONG_ALIAS(_atomic_add_ushort,_atomic_add_16)
ATOMIC_OP_ALIAS(atomic_sub_16,_atomic_sub_16)
ATOMIC_OP_ALIAS(atomic_sub_short,_atomic_sub_16)
ATOMIC_OP_ALIAS(atomic_sub_ushort,_atomic_sub_16)
CRT_ALIAS(__atomic_fetch_sub_2,_atomic_sub_16)
STRONG_ALIAS(_atomic_sub_short,_atomic_sub_16)
STRONG_ALIAS(_atomic_sub_ushort,_atomic_sub_16)
ENTRY_NP(__sync_fetch_and_add_2)
push {r4, lr}
DMB
bl _atomic_add_16
DMB
pop {r4, pc}
END(__sync_fetch_and_add_2)
ENTRY_NP(__sync_fetch_and_sub_2)
push {r4, lr}
DMB
bl _atomic_sub_16
DMB
pop {r4, pc}
END(__sync_fetch_and_sub_2)
ENTRY_NP(_atomic_sub_16_nv)
negs r1, r1
ENTRY_NP(_atomic_add_16_nv)
mov ip, r0
1: ldrexh r0, [ip]
adds r0, r0, r1
strexh r2, r0, [ip]
cmp r2, #0
bne 1b
RET
END(_atomic_add_16_nv)
END(_atomic_sub_16_nv)
ATOMIC_OP_ALIAS(atomic_add_16_nv,_atomic_add_16_nv)
ATOMIC_OP_ALIAS(atomic_add_short_nv,_atomic_add_16_nv)
ATOMIC_OP_ALIAS(atomic_add_ushort_nv,_atomic_add_16_nv)
STRONG_ALIAS(_atomic_add_short_nv,_atomic_add_16_nv)
STRONG_ALIAS(_atomic_add_ushort_nv,_atomic_add_16_nv)
ATOMIC_OP_ALIAS(atomic_sub_16_nv,_atomic_sub_16_nv)
ATOMIC_OP_ALIAS(atomic_sub_short_nv,_atomic_sub_16_nv)
ATOMIC_OP_ALIAS(atomic_sub_ushort_nv,_atomic_sub_16_nv)
STRONG_ALIAS(_atomic_sub_short_nv,_atomic_sub_16_nv)
STRONG_ALIAS(_atomic_sub_ushort_nv,_atomic_sub_16_nv)
ENTRY_NP(__sync_add_and_fetch_2)
push {r4, lr}
DMB
bl _atomic_add_16_nv
DMB
pop {r4, pc}
END(__sync_add_and_fetch_2)
ENTRY_NP(__sync_sub_and_fetch_2)
push {r4, lr}
DMB
bl _atomic_sub_16_nv
DMB
pop {r4, pc}
END(__sync_sub_and_fetch_2)
#endif