Skip to content

Commit 8de2636

Browse files
author
Kim Barrett
committedOct 12, 2021
8274615: Support relaxed atomic add for linux-aarch64
Reviewed-by: aph, dholmes
1 parent 7d2633f commit 8de2636

File tree

4 files changed

+64
-13
lines changed

4 files changed

+64
-13
lines changed
 

‎src/hotspot/cpu/aarch64/atomic_aarch64.hpp

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ typedef uint64_t (*aarch64_atomic_stub_t)(volatile void *ptr, uint64_t arg1, uin
3737
// Pointers to stubs
3838
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_4_impl;
3939
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_8_impl;
40+
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_4_relaxed_impl;
41+
extern aarch64_atomic_stub_t aarch64_atomic_fetch_add_8_relaxed_impl;
4042
extern aarch64_atomic_stub_t aarch64_atomic_xchg_4_impl;
4143
extern aarch64_atomic_stub_t aarch64_atomic_xchg_8_impl;
4244
extern aarch64_atomic_stub_t aarch64_atomic_cmpxchg_1_impl;

‎src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

+23-6
Original file line numberDiff line numberDiff line change
@@ -6209,10 +6209,16 @@ class StubGenerator: public StubCodeGenerator {
62096209
__ ret(lr);
62106210
}
62116211

6212-
void gen_ldaddal_entry(Assembler::operand_size size) {
6212+
void gen_ldadd_entry(Assembler::operand_size size, atomic_memory_order order) {
62136213
Register prev = r2, addr = c_rarg0, incr = c_rarg1;
6214-
__ ldaddal(size, incr, prev, addr);
6215-
__ membar(Assembler::StoreStore|Assembler::StoreLoad);
6214+
// If not relaxed, then default to conservative. Relaxed is the only
6215+
// case we use enough to be worth specializing.
6216+
if (order == memory_order_relaxed) {
6217+
__ ldadd(size, incr, prev, addr);
6218+
} else {
6219+
__ ldaddal(size, incr, prev, addr);
6220+
__ membar(Assembler::StoreStore|Assembler::StoreLoad);
6221+
}
62166222
if (size == Assembler::xword) {
62176223
__ mov(r0, prev);
62186224
} else {
@@ -6242,12 +6248,21 @@ class StubGenerator: public StubCodeGenerator {
62426248
StubCodeMark mark(this, "StubRoutines", "atomic entry points");
62436249
address first_entry = __ pc();
62446250

6245-
// All memory_order_conservative
6251+
// ADD, memory_order_conservative
62466252
AtomicStubMark mark_fetch_add_4(_masm, &aarch64_atomic_fetch_add_4_impl);
6247-
gen_ldaddal_entry(Assembler::word);
6253+
gen_ldadd_entry(Assembler::word, memory_order_conservative);
62486254
AtomicStubMark mark_fetch_add_8(_masm, &aarch64_atomic_fetch_add_8_impl);
6249-
gen_ldaddal_entry(Assembler::xword);
6255+
gen_ldadd_entry(Assembler::xword, memory_order_conservative);
6256+
6257+
// ADD, memory_order_relaxed
6258+
AtomicStubMark mark_fetch_add_4_relaxed
6259+
(_masm, &aarch64_atomic_fetch_add_4_relaxed_impl);
6260+
gen_ldadd_entry(MacroAssembler::word, memory_order_relaxed);
6261+
AtomicStubMark mark_fetch_add_8_relaxed
6262+
(_masm, &aarch64_atomic_fetch_add_8_relaxed_impl);
6263+
gen_ldadd_entry(MacroAssembler::xword, memory_order_relaxed);
62506264

6265+
// XCHG, memory_order_conservative
62516266
AtomicStubMark mark_xchg_4(_masm, &aarch64_atomic_xchg_4_impl);
62526267
gen_swpal_entry(Assembler::word);
62536268
AtomicStubMark mark_xchg_8_impl(_masm, &aarch64_atomic_xchg_8_impl);
@@ -7447,6 +7462,8 @@ void StubGenerator_generate(CodeBuffer* code, bool all) {
74477462

74487463
DEFAULT_ATOMIC_OP(fetch_add, 4, )
74497464
DEFAULT_ATOMIC_OP(fetch_add, 8, )
7465+
DEFAULT_ATOMIC_OP(fetch_add, 4, _relaxed)
7466+
DEFAULT_ATOMIC_OP(fetch_add, 8, _relaxed)
74507467
DEFAULT_ATOMIC_OP(xchg, 4, )
74517468
DEFAULT_ATOMIC_OP(xchg, 8, )
74527469
DEFAULT_ATOMIC_OP(cmpxchg, 1, )

‎src/hotspot/os_cpu/linux_aarch64/atomic_linux_aarch64.S

+22
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,28 @@ aarch64_atomic_fetch_add_4_default_impl:
4747
mov w0, w2
4848
ret
4949

50+
.global aarch64_atomic_fetch_add_8_relaxed_default_impl
51+
.align 5
52+
aarch64_atomic_fetch_add_8_relaxed_default_impl:
53+
prfm pstl1strm, [x0]
54+
0: ldxr x2, [x0]
55+
add x8, x2, x1
56+
stxr w9, x8, [x0]
57+
cbnz w9, 0b
58+
mov x0, x2
59+
ret
60+
61+
.global aarch64_atomic_fetch_add_4_relaxed_default_impl
62+
.align 5
63+
aarch64_atomic_fetch_add_4_relaxed_default_impl:
64+
prfm pstl1strm, [x0]
65+
0: ldxr w2, [x0]
66+
add w8, w2, w1
67+
stxr w9, w8, [x0]
68+
cbnz w9, 0b
69+
mov w0, w2
70+
ret
71+
5072
.globl aarch64_atomic_xchg_4_default_impl
5173
.align 5
5274
aarch64_atomic_xchg_4_default_impl:

‎src/hotspot/os_cpu/linux_aarch64/atomic_linux_aarch64.hpp

+17-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 1999, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 1999, 2021, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, 2021, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -87,9 +87,14 @@ inline D Atomic::PlatformAdd<4>::fetch_and_add(D volatile* dest, I add_value,
8787
atomic_memory_order order) const {
8888
STATIC_ASSERT(4 == sizeof(I));
8989
STATIC_ASSERT(4 == sizeof(D));
90-
D old_value
91-
= atomic_fastcall(aarch64_atomic_fetch_add_4_impl, dest, add_value);
92-
return old_value;
90+
aarch64_atomic_stub_t stub;
91+
switch (order) {
92+
case memory_order_relaxed:
93+
stub = aarch64_atomic_fetch_add_4_relaxed_impl; break;
94+
default:
95+
stub = aarch64_atomic_fetch_add_4_impl; break;
96+
}
97+
return atomic_fastcall(stub, dest, add_value);
9398
}
9499

95100
template<>
@@ -98,9 +103,14 @@ inline D Atomic::PlatformAdd<8>::fetch_and_add(D volatile* dest, I add_value,
98103
atomic_memory_order order) const {
99104
STATIC_ASSERT(8 == sizeof(I));
100105
STATIC_ASSERT(8 == sizeof(D));
101-
D old_value
102-
= atomic_fastcall(aarch64_atomic_fetch_add_8_impl, dest, add_value);
103-
return old_value;
106+
aarch64_atomic_stub_t stub;
107+
switch (order) {
108+
case memory_order_relaxed:
109+
stub = aarch64_atomic_fetch_add_8_relaxed_impl; break;
110+
default:
111+
stub = aarch64_atomic_fetch_add_8_impl; break;
112+
}
113+
return atomic_fastcall(stub, dest, add_value);
104114
}
105115

106116
template<>

0 commit comments

Comments
 (0)
Please sign in to comment.