@@ -6209,10 +6209,16 @@ class StubGenerator: public StubCodeGenerator {
6209
6209
__ ret (lr);
6210
6210
}
6211
6211
6212
- void gen_ldaddal_entry (Assembler::operand_size size) {
6212
+ void gen_ldadd_entry (Assembler::operand_size size, atomic_memory_order order ) {
6213
6213
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
+ }
6216
6222
if (size == Assembler::xword) {
6217
6223
__ mov (r0, prev);
6218
6224
} else {
@@ -6242,12 +6248,21 @@ class StubGenerator: public StubCodeGenerator {
6242
6248
StubCodeMark mark (this , " StubRoutines" , " atomic entry points" );
6243
6249
address first_entry = __ pc ();
6244
6250
6245
- // All memory_order_conservative
6251
+ // ADD, memory_order_conservative
6246
6252
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 );
6248
6254
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);
6250
6264
6265
+ // XCHG, memory_order_conservative
6251
6266
AtomicStubMark mark_xchg_4 (_masm, &aarch64_atomic_xchg_4_impl);
6252
6267
gen_swpal_entry (Assembler::word);
6253
6268
AtomicStubMark mark_xchg_8_impl (_masm, &aarch64_atomic_xchg_8_impl);
@@ -7447,6 +7462,8 @@ void StubGenerator_generate(CodeBuffer* code, bool all) {
7447
7462
7448
7463
DEFAULT_ATOMIC_OP (fetch_add, 4 , )
7449
7464
DEFAULT_ATOMIC_OP(fetch_add, 8 , )
7465
+ DEFAULT_ATOMIC_OP(fetch_add, 4 , _relaxed)
7466
+ DEFAULT_ATOMIC_OP(fetch_add, 8 , _relaxed)
7450
7467
DEFAULT_ATOMIC_OP(xchg, 4 , )
7451
7468
DEFAULT_ATOMIC_OP(xchg, 8 , )
7452
7469
DEFAULT_ATOMIC_OP(cmpxchg, 1 , )
0 commit comments