Skip to content

Commit 7a0d985

Browse files
committed
Fixed the incorrect implementation of acquire and release semantics in RISCV, as well as some syntax errors
1 parent 6563dad commit 7a0d985

File tree

5 files changed

+45
-37
lines changed

5 files changed

+45
-37
lines changed

benchmarks/lockhammer/include/atomics.h

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,7 @@ static inline unsigned long fetchadd64_acquire_release (unsigned long *ptr, unsi
131131
: "memory");
132132
#elif defined(__riscv) && !defined(USE_BUILTIN)
133133
asm volatile("amoadd.d.aqrl %[old], %[val], %[ptr]"
134-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
134+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
135135
: [val] "r" (addend)
136136
: "memory");
137137
#else
@@ -169,7 +169,7 @@ static inline unsigned long fetchadd64_acquire (unsigned long *ptr, unsigned lon
169169
: "memory");
170170
#elif defined(__riscv) && !defined(USE_BUILTIN)
171171
asm volatile("amoadd.d.aq %[old], %[val], %[ptr]"
172-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
172+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
173173
: [val] "r" (addend)
174174
: "memory");
175175
#else
@@ -208,7 +208,7 @@ static inline unsigned long fetchadd64_release (unsigned long *ptr, unsigned lon
208208
: "memory");
209209
#elif defined(__riscv) && !defined(USE_BUILTIN)
210210
asm volatile("amoadd.d.rl %[old], %[val], %[ptr]"
211-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
211+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
212212
: [val] "r" (addend)
213213
: "memory");
214214
#else
@@ -246,7 +246,7 @@ static inline unsigned long fetchadd64 (unsigned long *ptr, unsigned long addend
246246
: "memory");
247247
#elif defined(__riscv) && !defined(USE_BUILTIN)
248248
asm volatile("amoadd.d %[old], %[val], %[ptr]"
249-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
249+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
250250
: [val] "r" (addend)
251251
: "memory");
252252
#else
@@ -288,7 +288,7 @@ static inline unsigned long fetchsub64 (unsigned long *ptr, unsigned long addend
288288
#elif defined(__riscv) && !defined(USE_BUILTIN)
289289
addend = (unsigned long) (-(long) addend);
290290
asm volatile("amoadd.d %[old], %[val], %[ptr]"
291-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
291+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
292292
: [val] "r" (addend)
293293
: "memory");
294294
#else
@@ -323,8 +323,8 @@ static inline unsigned long swap64 (unsigned long *ptr, unsigned long val) {
323323
: [val] "r" (val)
324324
: "memory");
325325
#elif defined(__riscv) && !defined(USE_BUILTIN)
326-
asm volatile("amoswap.d %[old], %[val], %[ptr]"
327-
: [old] "=&r" (old), [ptr] "+m" (*ptr)
326+
asm volatile("amoswap.d.aqrl %[old], %[val], %[ptr]"
327+
: [old] "=&r" (old), [ptr] "+A" (*(ptr))
328328
: [val] "r" (val)
329329
: "memory");
330330
#else
@@ -365,16 +365,16 @@ static inline unsigned long cas64 (unsigned long *ptr, unsigned long newval, uns
365365
unsigned long tmp;
366366

367367
asm volatile ( "1: lr.d %[old], %[ptr]\n"
368-
" bne %[old], %[exp], 2f\n"
369-
" sc.d %[tmp], %[val], %[ptr]\n"
370-
" bnez %[tmp], 1b\n"
371-
"2:"
372-
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+m" (*ptr)
368+
" bne %[old], %[exp], 2f\n"
369+
" sc.d %[tmp], %[val], %[ptr]\n"
370+
" bnez %[tmp], 1b\n"
371+
"2:"
372+
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+A" (*(ptr))
373373
: [exp] "r" (expected), [val] "r" (newval)
374374
: "memory");
375375
#elif defined(__riscv) && !defined(USE_BUILTIN) && defined(__riscv_zacas)
376376
asm volatile("amocas.d %[exp], %[val], %[ptr]"
377-
: [exp] "=&r" (old), [ptr] "+Q" (*ptr)
377+
: [exp] "=&r" (old), [ptr] "+A" (*(ptr))
378378
: "r[exp]" (expected), [val] "r" (newval)
379379
: "memory");
380380
#else
@@ -420,12 +420,12 @@ static inline unsigned long cas64_acquire (unsigned long *ptr, unsigned long val
420420
" sc.d %[tmp], %[newval], %[ptr]\n"
421421
" bnez %[tmp], 1b\n"
422422
"2:"
423-
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+m" (*ptr)
423+
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+A" (*(ptr))
424424
: [exp] "r" (exp), [newval] "r" (val)
425425
: "memory");
426426
#elif defined(__riscv) && !defined(USE_BUILTIN) && defined(__riscv_zacas)
427427
asm volatile("amocas.d %[exp], %[val], %[ptr]"
428-
: [exp] "=&r" (old), [ptr] "+Q" (*ptr)
428+
: [exp] "=&r" (old), [ptr] "+A" (*(ptr))
429429
: "r[exp]" (exp), [val] "r" (val)
430430
: "memory");
431431
#else
@@ -471,12 +471,12 @@ static inline unsigned long cas64_release (unsigned long *ptr, unsigned long val
471471
" sc.d.rl %[tmp], %[val], %[ptr]\n"
472472
" bnez %[tmp], 1b\n"
473473
"2:"
474-
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+m" (*ptr)
474+
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+A" (*(ptr))
475475
: [exp] "r" (exp), [val] "r" (val)
476476
: "memory");
477477
#elif defined(__riscv) && !defined(USE_BUILTIN) && defined(__riscv_zacas)
478478
asm volatile("amocas.d.rl %[exp], %[val], %[ptr]"
479-
: [exp] "=&r" (old), [ptr] "+Q" (*ptr)
479+
: [exp] "=&r" (old), [ptr] "+A" (*(ptr))
480480
: "r[exp]" (exp), [val] "r" (val)
481481
: "memory");
482482
#else
@@ -522,12 +522,12 @@ static inline unsigned long cas64_acquire_release (unsigned long *ptr, unsigned
522522
" sc.d.rl %[tmp], %[val], %[ptr]\n"
523523
" bnez %[tmp], 1b\n"
524524
"2:"
525-
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+m" (*ptr)
525+
: [old] "=&r" (old), [tmp] "=&r" (tmp), [ptr] "+A" (*(ptr))
526526
: [exp] "r" (exp), [val] "r" (val)
527527
: "memory");
528528
#elif defined(__riscv) && !defined(USE_BUILTIN) && defined(__riscv_zacas)
529529
asm volatile("amocas.d.aqrl %[exp], %[val], %[ptr]"
530-
: [exp] "=&r" (old), [ptr] "+Q" (*ptr)
530+
: [exp] "=&r" (old), [ptr] "+A" (*(ptr))
531531
: "r[exp]" (exp), [val] "r" (val)
532532
: "memory");
533533
#else

benchmarks/lockhammer/include/cpu_relax.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,6 @@ static inline void __cpu_relax(void) {
7575

7676
}
7777
}
78-
#endif
78+
#endif // CPU_RELAX_H
7979

8080
/* vim: set tabstop=4 shiftwidth=4 softtabstop=4 expandtab: */

benchmarks/lockhammer/include/perf_timer.h

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -205,9 +205,10 @@ static inline uint64_t __attribute__((always_inline))
205205
get_raw_counter(void) {
206206
uint64_t t;
207207
asm volatile(
208-
"fence rw, rw\n"
208+
"fence.i\n"
209+
"fence r, r\n"
209210
"rdtime %0"
210-
: "=&r"(t) : : "memory");
211+
: "=r"(t) : :);
211212
return t;
212213
}
213214
#endif
@@ -221,9 +222,10 @@ timer_reset_counter()
221222
prev_tsc = rdtscp();
222223
#elif __riscv
223224
asm volatile(
224-
"fence rw, rw\n"
225+
"fence.i\,"
226+
"fence r, r\n"
225227
"rdtime %0"
226-
: "=&r"(prev_tsc) : : "memory");
228+
: "=r"(prev_tsc) : :);
227229
#endif
228230
}
229231

@@ -241,9 +243,10 @@ timer_get_counter()
241243
#elif __riscv
242244
uint64_t counter_value;
243245
asm volatile(
244-
"fence rw, rw\n"
246+
"fence.i\n"
247+
"fence r, r\n"
245248
"rdtime %0"
246-
: "=&r"(counter_value) : : "memory");
249+
: "=r"(counter_value) : :);
247250
#endif
248251
return counter_value;
249252
}
@@ -263,8 +266,10 @@ timer_get_counter_start()
263266
uint64_t counter_value;
264267
asm volatile(
265268
"fence rw, rw\n"
269+
"fence.i\n"
270+
"fence r,r\n"
266271
"rdtime %0"
267-
: "=&r"(counter_value) : : "memory");
272+
: "=r"(counter_value) : :);
268273
#endif
269274
return counter_value;
270275
}
@@ -284,10 +289,12 @@ timer_get_counter_end()
284289
#elif __riscv
285290
uint64_t counter_value;
286291
asm volatile(
287-
"fence rw, rw\n"
292+
"fence.i\n"
293+
"fence r, r\n"
288294
"rdtime %0\n"
289-
"fence rw, rw"
290-
: "=&r"(counter_value) : : "memory");
295+
"fence.i\n"
296+
"fence r, r"
297+
: "=r"(counter_value) : :);
291298
#endif
292299
return counter_value;
293300
}

benchmarks/lockhammer/src/measure.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ void dump_mem(void * p, size_t n) {
6464
}
6565
printf("\n");
6666
}
67+
6768
#ifdef __aarch64__
6869
// The --disable-outline-atomics-lse flag is only relevant to tests built
6970
// using USE_BUILTIN=1 USE_LSE=0 such that the __atomics intrinsics are

ext/linux/include/lk_atomics.h

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -131,12 +131,12 @@ static inline uint32_t atomic_cmpxchg_acquire32(uint32_t *ptr, uint32_t exp, uin
131131
" sc.w %[tmp], %[val], %[ptr]\n"
132132
" bnez %[tmp], 1b\n"
133133
"2:"
134-
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+m" (*(uint32_t *)ptr)
134+
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+A" (*(uint32_t *)(ptr))
135135
: [exp] "r" (exp), [val] "r" (val)
136136
: "memory");
137137
#elif defined(__riscv) && defined(__riscv_zacas)
138138
asm volatile("amocas.w.aq %[exp], %[val], %[ptr]"
139-
: [exp] "=&r" (old), [ptr] "+Q" (*ptr)
139+
: [exp] "=&r" (old), [ptr] "+A" (*(ptr))
140140
: "r[exp]" (exp), [val] "r" (val)
141141
: "memory");
142142
#else
@@ -191,12 +191,12 @@ static inline uint32_t atomic_cmpxchg_release32(uint32_t *ptr, uint32_t exp, uin
191191
" sc.w.rl %[tmp], %[val], %[ptr]\n"
192192
" bnez %[tmp], 1b\n"
193193
"2:"
194-
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+m" (*(uint32_t *)ptr)
194+
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+A" (*(uint32_t *)(ptr))
195195
: [exp] "r" (exp), [val] "r" (val)
196196
: "memory");
197197
#elif defined(__riscv) && defined(__riscv_zacas)
198198
asm volatile("amocas.w.rl %[exp], %[val], %[ptr]"
199-
: [exp] "=&r" (old), [ptr] "+Q" (*(uint32_t *)ptr)
199+
: [exp] "=&r" (old), [ptr] "+A" (*(uint32_t *)(ptr))
200200
: "r[exp]" (exp), [val] "r" (val)
201201
: "memory");
202202
#else
@@ -251,12 +251,12 @@ static inline uint32_t atomic_cmpxchg_relaxed32(uint32_t *ptr, uint32_t exp, uin
251251
" sc.w.rl %[tmp], %[val], %[ptr]\n"
252252
" bnez %[tmp], 1b\n"
253253
"2:"
254-
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+m" (*(uint32_t *)ptr)
254+
: [old] "=&r" (old), [tmp] "=&r" (tmp) , [ptr] "+A" (*(uint32_t *)(ptr))
255255
: [exp] "r" (exp), [val] "r" (val)
256256
: "memory");
257257
#elif defined(__riscv) && defined(__riscv_zacas)
258258
asm volatile("amocas.w.aqrl %[exp], %[val], %[ptr]"
259-
: [exp] "=&r" (old), [ptr] "+Q" (*(uint32_t *)ptr)
259+
: [exp] "=&r" (old), [ptr] "+A" (*(uint32_t *)(ptr))
260260
: "r[exp]" (exp), [val] "r" (val)
261261
: "memory");
262262
#else
@@ -335,7 +335,7 @@ atomic_fetch_or_acquire32(uint32_t i, atomic_t *v)
335335
" sc.w.rl %[tmp], %[val], %[ptr]\n"
336336
" bnez %[tmp], 1b\n"
337337
: [old] "=&r" (old_val), [val] "=&r" (new_val), [tmp] "=&r" (tmp)
338-
: [ptr] "r" (*((uint32_t *)(&v->counter))), [_val] "r" (i)
338+
: [ptr] "A" (*((uint32_t *)(&v->counter))), [_val] "r" (i)
339339
: "memory"
340340
);
341341
return old_val;

0 commit comments

Comments
 (0)