tcc/lib: reduce number of files
[tinycc.git] / lib / fetch_and_add.S
blobec96a03c80ccf5028038c07e8d7e9ba1fac3e067
1 /* ---------------------------------------------- */
2 #if defined __arm__
4         .text
5         .align  2
6         .global fetch_and_add_arm
7         .type   fetch_and_add_arm, %function
8 fetch_and_add_arm:
9         mcr     p15, #0, r0, c7, c10, #5
10 .L0:
11         ldrex   r3, [r0]
12         add     r3, r3, r1
13         strex   r2, r3, [r0]
14         cmp     r2, #0
15         bne     .L0
16         mcr     p15, #0, r0, c7, c10, #5
17         bx      lr
18         .size   fetch_and_add_arm, .-fetch_and_add_arm
20 /* ---------------------------------------------- */
21 #elif defined __aarch64__
23         .text
24         .align  2
25         .global fetch_and_add_arm64
26         .type   fetch_and_add_arm64, %function
27 fetch_and_add_arm64:
28 #ifdef __TINYC__
29         .int 0x885f7c02
30         .int 0x0b010042
31         .int 0x8803fc02
32         .int 0x35ffffa3
33         .int 0xd5033bbf
34         .int 0xd65f03c0
35 #else
36         ldxr    w2, [x0]
37         add     w2, w2, w1
38         stlxr   w3, w2, [x0]
39         cbnz    w3, fetch_and_add_arm64
40         dmb     ish
41         ret
42 #endif
44         .size   fetch_and_add_arm64, .-fetch_and_add_arm64
46 /* ---------------------------------------------- */
47 #elif defined __riscv
49         .text
50         .align  2
51         .global fetch_and_add_riscv64
52         .type   fetch_and_add_riscv64, %function
53 fetch_and_add_riscv64:
54 #ifdef __TINYC__
55         .int   0x0f50000f
56         .int   0x004b5202f
57         .short 0x8082
58 #else
59         fence iorw,ow
60         amoadd.w.aq zero,a1,0(a0)
61         ret
62 #endif
64         .size   fetch_and_add_riscv64, .-fetch_and_add_riscv64
66 /* ---------------------------------------------- */
67 #endif