Skip to content

Commit fd13573

Browse files
committed
Refactor the atomic instruction bindings for wasm, this to make more clear these function calls are builtin, and to avoid future name conflicts.
1 parent efbb322 commit fd13573

File tree

8 files changed

+120
-120
lines changed

8 files changed

+120
-120
lines changed

sys/arch/wasm/include/atomic.h

Lines changed: 26 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -66,27 +66,27 @@ void wasm32_atomic_fence(void);
6666
__attribute__((always_inline))
6767
static inline void wasm_atomic_add_32(volatile uint32_t *p, uint32_t val)
6868
{
69-
atomic_add32(p, val);
69+
__builtin_atomic_rmw_add32(p, val);
7070
}
7171

7272
__attribute__((always_inline))
7373
static inline void wasm_atomic_add_64(volatile uint64_t *p, uint64_t val)
7474
{
75-
atomic_add64(p, val);
75+
__builtin_atomic_rmw_add64(p, val);
7676
}
7777

7878
__attribute__((always_inline))
7979
static inline uint32_t wasm_atomic_add_32_nv(volatile uint32_t *p, uint32_t val)
8080
{
81-
uint32_t ret = atomic_add32(p, val);
81+
uint32_t ret = __builtin_atomic_rmw_add32(p, val);
8282
ret += val;
8383
return ret;
8484
}
8585

8686
__attribute__((always_inline))
8787
static inline uint64_t wasm_atomic_add_64_nv(volatile uint64_t *p, uint64_t val)
8888
{
89-
uint64_t ret = atomic_add64(p, val);
89+
uint64_t ret = __builtin_atomic_rmw_add64(p, val);
9090
ret += val;
9191
return ret;
9292
}
@@ -95,28 +95,28 @@ static inline uint64_t wasm_atomic_add_64_nv(volatile uint64_t *p, uint64_t val)
9595
__attribute__((always_inline))
9696
static inline void wasm_atomic_and_32(volatile uint32_t *p, uint32_t val)
9797
{
98-
atomic_and32(p, val);
98+
__builtin_atomic_rmw_and32(p, val);
9999
}
100100

101101

102102
__attribute__((always_inline))
103103
static inline void wasm_atomic_and_64(volatile uint64_t *p, uint64_t val)
104104
{
105-
atomic_and64(p, val);
105+
__builtin_atomic_rmw_add64(p, val);
106106
}
107107

108108
__attribute__((always_inline))
109109
static inline uint32_t wasm_atomic_and_32_nv(volatile uint32_t *p, uint32_t val)
110110
{
111-
uint32_t ret = atomic_and32(p, val);
111+
uint32_t ret = __builtin_atomic_rmw_and32(p, val);
112112
ret &= val;
113113
return ret;
114114
}
115115

116116
__attribute__((always_inline))
117117
static inline uint64_t wasm_atomic_and_64_nv(volatile uint64_t *p, uint64_t val)
118118
{
119-
uint64_t ret = atomic_and64(p, val);
119+
uint64_t ret = __builtin_atomic_rmw_add64(p, val);
120120
ret &= val;
121121
return ret;
122122
}
@@ -127,97 +127,97 @@ static inline uint64_t wasm_atomic_and_64_nv(volatile uint64_t *p, uint64_t val)
127127
__attribute__((always_inline))
128128
static inline void wasm_atomic_or_32(volatile uint32_t *p, uint32_t val)
129129
{
130-
atomic_or32(p, val);
130+
__builtin_atomic_rmw_or32(p, val);
131131
}
132132

133133
__attribute__((always_inline))
134134
static inline void wasm_atomic_or_u32(volatile uint32_t *p, uint32_t val)
135135
{
136-
atomic_or32(p, val);
136+
__builtin_atomic_rmw_or32(p, val);
137137
}
138138

139139

140140
__attribute__((always_inline))
141141
static inline void wasm_atomic_or_64(volatile uint64_t *p, uint64_t val)
142142
{
143-
atomic_or64(p, val);
143+
__builtin_atomic_rmw_or64(p, val);
144144
}
145145

146146
__attribute__((always_inline))
147147
static inline uint32_t wasm_atomic_or_32_nv(volatile uint32_t *p, uint32_t val)
148148
{
149-
uint32_t ret = atomic_or32(p, val);
149+
uint32_t ret = __builtin_atomic_rmw_or32(p, val);
150150
ret |= val;
151151
return ret;
152152
}
153153

154154
__attribute__((always_inline))
155155
static inline uint32_t wasm_atomic_or_u32_nv(volatile uint32_t *p, uint32_t val)
156156
{
157-
uint32_t ret = atomic_or32(p, val);
157+
uint32_t ret = __builtin_atomic_rmw_or32(p, val);
158158
ret |= val;
159159
return ret;
160160
}
161161

162162
__attribute__((always_inline))
163163
static inline uint64_t wasm_atomic_or_64_nv(volatile uint64_t *p, uint64_t val)
164164
{
165-
uint64_t ret = atomic_or64(p, val);
165+
uint64_t ret = __builtin_atomic_rmw_or64(p, val);
166166
ret |= val;
167167
return ret;
168168
}
169169

170170
__attribute__((always_inline))
171171
static inline uint32_t wasm_atomic_cas_32(volatile uint32_t *p, uint32_t expected, uint32_t replacement)
172172
{
173-
return atomic_cmpxchg32(p, expected, replacement);
173+
return __builtin_atomic_rmw_cmpxchg32(p, expected, replacement);
174174
}
175175

176176
__attribute__((always_inline))
177177
static inline uint64_t wasm_atomic_cas_64(volatile uint64_t *p, uint64_t expected, uint64_t replacement)
178178
{
179-
return atomic_cmpxchg64(p, expected, replacement);
179+
return __builtin_atomic_rmw_cmpxchg64(p, expected, replacement);
180180
}
181181

182182

183183
__attribute__((always_inline))
184184
static inline uint32_t wasm_atomic_swap_32(volatile uint32_t *p, uint32_t val)
185185
{
186-
return atomic_xchg32(p, val);
186+
return __builtin_atomic_rmw_xchg32(p, val);
187187
}
188188

189189
__attribute__((always_inline))
190190
static inline uint64_t wasm_atomic_swap_64(volatile uint64_t *p, uint64_t val)
191191
{
192-
return atomic_xchg64(p, val);
192+
return __builtin_atomic_rmw_xchg64(p, val);
193193
}
194194

195195

196196

197197
__attribute__((always_inline))
198198
static inline void wasm_atomic_dec_32(volatile uint32_t *p)
199199
{
200-
atomic_sub32(p, 1);
200+
__builtin_atomic_rmw_sub32(p, 1);
201201
}
202202

203203
__attribute__((always_inline))
204204
static inline void wasm_atomic_dec_64(volatile uint64_t *p)
205205
{
206-
atomic_sub64(p, 1);
206+
__builtin_atomic_rmw_sub64(p, 1);
207207
}
208208

209209
__attribute__((always_inline))
210210
static inline uint32_t wasm_atomic_dec_32_nv(volatile uint32_t *p)
211211
{
212-
uint32_t ret = atomic_sub32(p, 1);
212+
uint32_t ret = __builtin_atomic_rmw_sub32(p, 1);
213213
ret = ret - 1;
214214
return ret;
215215
}
216216

217217
__attribute__((always_inline))
218218
static inline uint64_t wasm_atomic_dec_64_nv(volatile uint64_t *p)
219219
{
220-
uint32_t ret = atomic_sub64(p, 1);
220+
uint32_t ret = __builtin_atomic_rmw_sub64(p, 1);
221221
ret = ret - 1;
222222
return ret;
223223
}
@@ -226,27 +226,27 @@ static inline uint64_t wasm_atomic_dec_64_nv(volatile uint64_t *p)
226226
__attribute__((always_inline))
227227
static inline void wasm_atomic_inc_32(volatile uint32_t *p)
228228
{
229-
atomic_add32(p, 1);
229+
__builtin_atomic_rmw_add32(p, 1);
230230
}
231231

232232
__attribute__((always_inline))
233233
static inline void wasm_atomic_inc_64(volatile uint64_t *p)
234234
{
235-
atomic_add64(p, 1);
235+
__builtin_atomic_rmw_add64(p, 1);
236236
}
237237

238238
__attribute__((always_inline))
239239
static inline uint32_t wasm_atomic_inc_32_nv(volatile uint32_t *p)
240240
{
241-
uint32_t ret = atomic_add32(p, 1);
241+
uint32_t ret = __builtin_atomic_rmw_add32(p, 1);
242242
ret = ret + 1;
243243
return ret;
244244
}
245245

246246
__attribute__((always_inline))
247247
static inline uint64_t wasm_atomic_inc_64_nv(volatile uint64_t *p)
248248
{
249-
uint32_t ret = atomic_add64(p, 1);
249+
uint32_t ret = __builtin_atomic_rmw_add64(p, 1);
250250
ret = ret + 1;
251251
return ret;
252252
}

sys/arch/wasm/include/wasm_inst.h

Lines changed: 43 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ void membar_exit(void) __WASM_BUILTIN(atomic_fence);
2727
/**
2828
* @return Returns the number of woken up agents
2929
*/
30-
uint32_t atomic_notify(const uint32_t *valp, uint32_t count) __WASM_BUILTIN(memory_atomic_notify);
30+
uint32_t __builtin_futex_notify(const uint32_t *valp, uint32_t count) __WASM_BUILTIN(memory_atomic_notify);
3131

3232
void atomic_fence(void) __WASM_BUILTIN(atomic_fence);
3333

@@ -43,37 +43,37 @@ enum wait_result {
4343
* @see https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#wait
4444
* @param timeout specifies a timeout in nanoseconds, timeout < 0 never expires.
4545
*/
46-
enum wait_result atomic_wait32(volatile uint32_t *valp, uint32_t expected, int64_t timeout) __WASM_BUILTIN(memory_atomic_wait32);
47-
48-
uint8_t atomic_load8(const uint8_t *valp) __WASM_BUILTIN(i32_atomic_load8_u);
49-
void atomic_store8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_store8);
50-
uint8_t atomic_add8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_add_u);
51-
uint8_t atomic_sub8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_sub_u);
52-
uint8_t atomic_and8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_and_u);
53-
uint8_t atomic_or8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_or_u);
54-
uint8_t atomic_xor8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_xor_u);
55-
uint8_t atomic_xchg8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_xchg_u);
56-
uint8_t atomic_cmpxchg8(volatile uint8_t *valp, uint8_t expected, uint8_t replacement) __WASM_BUILTIN(i32_atomic_rmw8_cmpxchg_u);
57-
58-
uint16_t atomic_load16(const uint16_t *valp) __WASM_BUILTIN(i32_atomic_load16_u);
59-
void atomic_store16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_store16);
60-
uint16_t atomic_add16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_add_u);
61-
uint16_t atomic_sub16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_sub_u);
62-
uint16_t atomic_and16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_and_u);
63-
uint16_t atomic_or16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_or_u);
64-
uint16_t atomic_xor16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_xor_u);
65-
uint16_t atomic_xchg16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_xchg_u);
66-
uint16_t atomic_cmpxchg16(volatile uint16_t *valp, uint16_t expected, uint16_t replacement) __WASM_BUILTIN(i32_atomic_rmw16_cmpxchg_u);
67-
68-
uint32_t atomic_load32(const uint32_t *valp) __WASM_BUILTIN(i32_atomic_load);
69-
void atomic_store32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_store);
70-
uint32_t atomic_add32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_add);
71-
uint32_t atomic_sub32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_sub);
72-
uint32_t atomic_and32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_and);
73-
uint32_t atomic_or32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_or);
74-
uint32_t atomic_xor32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_xor);
75-
uint32_t atomic_xchg32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_xchg);
76-
uint32_t atomic_cmpxchg32(volatile uint32_t *valp, uint32_t expected, uint32_t replacement) __WASM_BUILTIN(i32_atomic_rmw_cmpxchg);
46+
enum wait_result __builtin_futex_wait32(volatile uint32_t *valp, uint32_t expected, int64_t timeout) __WASM_BUILTIN(memory_atomic_wait32);
47+
48+
uint8_t __builtin_atomic_load8_u(const uint8_t *valp) __WASM_BUILTIN(i32_atomic_load8_u);
49+
void __builtin_atomic_store8(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_store8);
50+
uint8_t __builtin_atomic_rmw_add8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_add_u);
51+
uint8_t __builtin_atomic_rmw_sub8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_sub_u);
52+
uint8_t __builtin_atomic_rmw_and8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_and_u);
53+
uint8_t __builtin_atomic_rmw_or8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_or_u);
54+
uint8_t __builtin_atomic_rmw_xor8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_xor_u);
55+
uint8_t __builtin_atomic_rmw_xchg8_u(volatile uint8_t *valp, uint8_t val) __WASM_BUILTIN(i32_atomic_rmw8_xchg_u);
56+
uint8_t __builtin_atomic_rmw_cmpxchg8_u(volatile uint8_t *valp, uint8_t expected, uint8_t replacement) __WASM_BUILTIN(i32_atomic_rmw8_cmpxchg_u);
57+
58+
uint16_t __builtin_atomic_load16_u(const uint16_t *valp) __WASM_BUILTIN(i32_atomic_load16_u);
59+
void __builtin_atomic_store16(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_store16);
60+
uint16_t __builtin_atomic_rmw_add16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_add_u);
61+
uint16_t __builtin_atomic_rmw_sub16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_sub_u);
62+
uint16_t __builtin_atomic_rmw_and16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_and_u);
63+
uint16_t __builtin_atomic_rmw_or16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_or_u);
64+
uint16_t __builtin_atomic_rmw_xor16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_xor_u);
65+
uint16_t __builtin_atomic_rmw_xchg16_u(volatile uint16_t *valp, uint16_t val) __WASM_BUILTIN(i32_atomic_rmw16_xchg_u);
66+
uint16_t __builtin_atomic_rmw_cmpxchg16_u(volatile uint16_t *valp, uint16_t expected, uint16_t replacement) __WASM_BUILTIN(i32_atomic_rmw16_cmpxchg_u);
67+
68+
uint32_t __builtin_atomic_load32(const uint32_t *valp) __WASM_BUILTIN(i32_atomic_load);
69+
void __builtin_atomic_store32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_store);
70+
uint32_t __builtin_atomic_rmw_add32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_add);
71+
uint32_t __builtin_atomic_rmw_sub32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_sub);
72+
uint32_t __builtin_atomic_rmw_and32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_and);
73+
uint32_t __builtin_atomic_rmw_or32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_or);
74+
uint32_t __builtin_atomic_rmw_xor32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_xor);
75+
uint32_t __builtin_atomic_rmw_xchg32(volatile uint32_t *valp, uint32_t val) __WASM_BUILTIN(i32_atomic_rmw_xchg);
76+
uint32_t __builtin_atomic_rmw_cmpxchg32(volatile uint32_t *valp, uint32_t expected, uint32_t replacement) __WASM_BUILTIN(i32_atomic_rmw_cmpxchg);
7777

7878
// 64-bit
7979

@@ -82,17 +82,17 @@ uint32_t atomic_cmpxchg32(volatile uint32_t *valp, uint32_t expected, uint32_t r
8282
* @see https://github.com/WebAssembly/threads/blob/main/proposals/threads/Overview.md#wait
8383
* @param timeout specifies a timeout in nanoseconds, timeout < 0 never expires.
8484
*/
85-
enum wait_result atomic_wait64(volatile uint64_t *valp, uint64_t expected, int64_t timeout) __WASM_BUILTIN(memory_atomic_wait64);
86-
87-
uint64_t atomic_load64(const uint64_t *valp) __WASM_BUILTIN(i64_atomic_load);
88-
void atomic_store64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_store);
89-
uint64_t atomic_add64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_add);
90-
uint64_t atomic_sub64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_sub);
91-
uint64_t atomic_and64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_and);
92-
uint64_t atomic_or64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_or);
93-
uint64_t atomic_xor64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_xor);
94-
uint64_t atomic_xchg64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_xchg);
95-
uint64_t atomic_cmpxchg64(volatile uint64_t *valp, uint64_t expected, uint64_t replacement) __WASM_BUILTIN(i64_atomic_rmw_cmpxchg);
85+
enum wait_result __builtin_futex_wait64(volatile uint64_t *valp, uint64_t expected, int64_t timeout) __WASM_BUILTIN(memory_atomic_wait64);
86+
87+
uint64_t __builtin_atomic_load64(const uint64_t *valp) __WASM_BUILTIN(i64_atomic_load);
88+
void __builtin_atomic_store64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_store);
89+
uint64_t __builtin_atomic_rmw_add64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_add);
90+
uint64_t __builtin_atomic_rmw_sub64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_sub);
91+
uint64_t __builtin_atomic_rmw_and64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_and);
92+
uint64_t __builtin_atomic_rmw_or64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_or);
93+
uint64_t __builtin_atomic_rmw_xor64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_xor);
94+
uint64_t __builtin_atomic_rmw_xchg64(volatile uint64_t *valp, uint64_t val) __WASM_BUILTIN(i64_atomic_rmw_xchg);
95+
uint64_t __builtin_atomic_rmw_cmpxchg64(volatile uint64_t *valp, uint64_t expected, uint64_t replacement) __WASM_BUILTIN(i64_atomic_rmw_cmpxchg);
9696

9797
void wasm_inst_nop(void);
9898

sys/arch/wasm/mm/malloc.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1254,7 +1254,7 @@ malloc_arena_grow(struct mm_arena *arena, size_t nb)
12541254
}
12551255
pg = paddr_to_page(tbase + tsize - 1);
12561256
arena->last_page = pg;
1257-
atomic_add32(&arena->page_count, pagecnt);
1257+
__builtin_atomic_rmw_add32(&arena->page_count, pagecnt);
12581258
}
12591259

12601260

@@ -1778,7 +1778,7 @@ void mm_arena_destroy(struct mm_arena *vm)
17781778
kmem_page_free(vm->first_page, vm->page_count);
17791779
vm->first_page = NULL;
17801780
vm->last_page = NULL;
1781-
atomic_store32(&vm->page_count, 0);
1781+
__builtin_atomic_store32(&vm->page_count, 0);
17821782
}
17831783

17841784

0 commit comments

Comments
 (0)