mirror of
https://github.com/mirror/tinycc.git
synced 2024-12-26 03:50:07 +08:00
675046bd59
271 insertions(+), 292 deletions(-), -21 lines, -5 files Also: - tccdefs.h: WIN32: less (no) __builtins - libtcc.c: simply ignore -arch
68 lines
1.6 KiB
ArmAsm
68 lines
1.6 KiB
ArmAsm
/* ---------------------------------------------- */
|
|
#if defined __arm__
|
|
|
|
.text
|
|
.align 2
|
|
.global fetch_and_add_arm
|
|
.type fetch_and_add_arm, %function
|
|
fetch_and_add_arm:
|
|
mcr p15, #0, r0, c7, c10, #5
|
|
.L0:
|
|
ldrex r3, [r0]
|
|
add r3, r3, r1
|
|
strex r2, r3, [r0]
|
|
cmp r2, #0
|
|
bne .L0
|
|
mcr p15, #0, r0, c7, c10, #5
|
|
bx lr
|
|
.size fetch_and_add_arm, .-fetch_and_add_arm
|
|
|
|
/* ---------------------------------------------- */
|
|
#elif defined __aarch64__
|
|
|
|
.text
|
|
.align 2
|
|
.global fetch_and_add_arm64
|
|
.type fetch_and_add_arm64, %function
|
|
fetch_and_add_arm64:
|
|
#ifdef __TINYC__
|
|
.int 0x885f7c02
|
|
.int 0x0b010042
|
|
.int 0x8803fc02
|
|
.int 0x35ffffa3
|
|
.int 0xd5033bbf
|
|
.int 0xd65f03c0
|
|
#else
|
|
ldxr w2, [x0]
|
|
add w2, w2, w1
|
|
stlxr w3, w2, [x0]
|
|
cbnz w3, fetch_and_add_arm64
|
|
dmb ish
|
|
ret
|
|
#endif
|
|
|
|
.size fetch_and_add_arm64, .-fetch_and_add_arm64
|
|
|
|
/* ---------------------------------------------- */
|
|
#elif defined __riscv
|
|
|
|
.text
|
|
.align 2
|
|
.global fetch_and_add_riscv64
|
|
.type fetch_and_add_riscv64, %function
|
|
fetch_and_add_riscv64:
|
|
#ifdef __TINYC__
|
|
.int 0x0f50000f
|
|
.int 0x004b5202f
|
|
.short 0x8082
|
|
#else
|
|
fence iorw,ow
|
|
amoadd.w.aq zero,a1,0(a0)
|
|
ret
|
|
#endif
|
|
|
|
.size fetch_and_add_riscv64, .-fetch_and_add_riscv64
|
|
|
|
/* ---------------------------------------------- */
|
|
#endif
|