Skip to content

Commit a13af65

Browse files
author
Dmitry Chuyko
committed
8282322: AArch64: Provide a means to eliminate all STREX family of instructions
Reviewed-by: ngasson, aph
1 parent f1967cf commit a13af65

File tree

2 files changed

+83
-9
lines changed

2 files changed

+83
-9
lines changed

src/hotspot/cpu/aarch64/stubGenerator_aarch64.cpp

+3-3
Original file line numberDiff line numberDiff line change
@@ -6414,7 +6414,7 @@ class StubGenerator: public StubCodeGenerator {
64146414
return start;
64156415
}
64166416

6417-
#ifdef LINUX
6417+
#if defined (LINUX) && !defined (__ARM_FEATURE_ATOMICS)
64186418

64196419
// ARMv8.1 LSE versions of the atomic stubs used by Atomic::PlatformXX.
64206420
//
@@ -7989,7 +7989,7 @@ class StubGenerator: public StubCodeGenerator {
79897989

79907990
StubRoutines::aarch64::_spin_wait = generate_spin_wait();
79917991

7992-
#ifdef LINUX
7992+
#if defined (LINUX) && !defined (__ARM_FEATURE_ATOMICS)
79937993

79947994
generate_atomic_entry_points();
79957995

@@ -8019,7 +8019,7 @@ void StubGenerator_generate(CodeBuffer* code, int phase) {
80198019
}
80208020

80218021

8022-
#ifdef LINUX
8022+
#if defined (LINUX)
80238023

80248024
// Define pointers to atomic stubs and initialize them to point to the
80258025
// code in atomic_aarch64.S.

src/hotspot/os_cpu/linux_aarch64/atomic_linux_aarch64.S

+80-6
Original file line numberDiff line numberDiff line change
@@ -26,74 +26,102 @@
2626
.globl aarch64_atomic_fetch_add_8_default_impl
2727
.align 5
2828
aarch64_atomic_fetch_add_8_default_impl:
29+
#ifdef __ARM_FEATURE_ATOMICS
30+
ldaddal x1, x2, [x0]
31+
#else
2932
prfm pstl1strm, [x0]
3033
0: ldaxr x2, [x0]
3134
add x8, x2, x1
3235
stlxr w9, x8, [x0]
3336
cbnz w9, 0b
37+
#endif
3438
dmb ish
3539
mov x0, x2
3640
ret
3741

3842
.globl aarch64_atomic_fetch_add_4_default_impl
3943
.align 5
4044
aarch64_atomic_fetch_add_4_default_impl:
45+
#ifdef __ARM_FEATURE_ATOMICS
46+
ldaddal w1, w2, [x0]
47+
#else
4148
prfm pstl1strm, [x0]
4249
0: ldaxr w2, [x0]
4350
add w8, w2, w1
4451
stlxr w9, w8, [x0]
4552
cbnz w9, 0b
53+
#endif
4654
dmb ish
4755
mov w0, w2
4856
ret
4957

5058
.global aarch64_atomic_fetch_add_8_relaxed_default_impl
5159
.align 5
5260
aarch64_atomic_fetch_add_8_relaxed_default_impl:
61+
#ifdef __ARM_FEATURE_ATOMICS
62+
ldadd x1, x2, [x0]
63+
#else
5364
prfm pstl1strm, [x0]
5465
0: ldxr x2, [x0]
5566
add x8, x2, x1
5667
stxr w9, x8, [x0]
5768
cbnz w9, 0b
69+
#endif
5870
mov x0, x2
5971
ret
6072

6173
.global aarch64_atomic_fetch_add_4_relaxed_default_impl
6274
.align 5
6375
aarch64_atomic_fetch_add_4_relaxed_default_impl:
76+
#ifdef __ARM_FEATURE_ATOMICS
77+
ldadd w1, w2, [x0]
78+
#else
6479
prfm pstl1strm, [x0]
6580
0: ldxr w2, [x0]
6681
add w8, w2, w1
6782
stxr w9, w8, [x0]
6883
cbnz w9, 0b
84+
#endif
6985
mov w0, w2
7086
ret
7187

7288
.globl aarch64_atomic_xchg_4_default_impl
7389
.align 5
7490
aarch64_atomic_xchg_4_default_impl:
91+
#ifdef __ARM_FEATURE_ATOMICS
92+
swpal w1, w2, [x0]
93+
#else
7594
prfm pstl1strm, [x0]
7695
0: ldaxr w2, [x0]
7796
stlxr w8, w1, [x0]
7897
cbnz w8, 0b
98+
#endif
7999
dmb ish
80100
mov w0, w2
81101
ret
82102

83103
.globl aarch64_atomic_xchg_8_default_impl
84104
.align 5
85105
aarch64_atomic_xchg_8_default_impl:
106+
#ifdef __ARM_FEATURE_ATOMICS
107+
swpal x1, x2, [x0]
108+
#else
86109
prfm pstl1strm, [x0]
87110
0: ldaxr x2, [x0]
88111
stlxr w8, x1, [x0]
89112
cbnz w8, 0b
113+
#endif
90114
dmb ish
91115
mov x0, x2
92116
ret
93117

94118
.globl aarch64_atomic_cmpxchg_1_default_impl
95119
.align 5
96120
aarch64_atomic_cmpxchg_1_default_impl:
121+
#ifdef __ARM_FEATURE_ATOMICS
122+
mov x3, x1
123+
casalb w3, w2, [x0]
124+
#else
97125
dmb ish
98126
prfm pstl1strm, [x0]
99127
0: ldxrb w3, [x0]
@@ -102,119 +130,165 @@ aarch64_atomic_cmpxchg_1_default_impl:
102130
b.ne 1f
103131
stxrb w8, w2, [x0]
104132
cbnz w8, 0b
105-
1: mov w0, w3
106-
dmb ish
133+
#endif
134+
1: dmb ish
135+
mov w0, w3
107136
ret
108137

109138
.globl aarch64_atomic_cmpxchg_4_default_impl
110139
.align 5
111140
aarch64_atomic_cmpxchg_4_default_impl:
141+
#ifdef __ARM_FEATURE_ATOMICS
142+
mov x3, x1
143+
casal w3, w2, [x0]
144+
#else
112145
dmb ish
113146
prfm pstl1strm, [x0]
114147
0: ldxr w3, [x0]
115148
cmp w3, w1
116149
b.ne 1f
117150
stxr w8, w2, [x0]
118151
cbnz w8, 0b
119-
1: mov w0, w3
120-
dmb ish
152+
#endif
153+
1: dmb ish
154+
mov w0, w3
121155
ret
122156

123157
.globl aarch64_atomic_cmpxchg_8_default_impl
124158
.align 5
125159
aarch64_atomic_cmpxchg_8_default_impl:
160+
#ifdef __ARM_FEATURE_ATOMICS
161+
mov x3, x1
162+
casal x3, x2, [x0]
163+
#else
126164
dmb ish
127165
prfm pstl1strm, [x0]
128166
0: ldxr x3, [x0]
129167
cmp x3, x1
130168
b.ne 1f
131169
stxr w8, x2, [x0]
132170
cbnz w8, 0b
133-
1: mov x0, x3
134-
dmb ish
171+
#endif
172+
1: dmb ish
173+
mov x0, x3
135174
ret
136175

137176
.globl aarch64_atomic_cmpxchg_4_release_default_impl
138177
.align 5
139178
aarch64_atomic_cmpxchg_4_release_default_impl:
179+
#ifdef __ARM_FEATURE_ATOMICS
180+
mov x3, x1
181+
casl w3, w2, [x0]
182+
#else
140183
prfm pstl1strm, [x0]
141184
0: ldxr w3, [x0]
142185
cmp w3, w1
143186
b.ne 1f
144187
stlxr w8, w2, [x0]
145188
cbnz w8, 0b
189+
#endif
146190
1: mov w0, w3
147191
ret
148192

149193
.globl aarch64_atomic_cmpxchg_8_release_default_impl
150194
.align 5
151195
aarch64_atomic_cmpxchg_8_release_default_impl:
196+
#ifdef __ARM_FEATURE_ATOMICS
197+
mov x3, x1
198+
casl x3, x2, [x0]
199+
#else
152200
prfm pstl1strm, [x0]
153201
0: ldxr x3, [x0]
154202
cmp x3, x1
155203
b.ne 1f
156204
stlxr w8, x2, [x0]
157205
cbnz w8, 0b
206+
#endif
158207
1: mov x0, x3
159208
ret
160209

161210
.globl aarch64_atomic_cmpxchg_4_seq_cst_default_impl
162211
.align 5
163212
aarch64_atomic_cmpxchg_4_seq_cst_default_impl:
213+
#ifdef __ARM_FEATURE_ATOMICS
214+
mov x3, x1
215+
casal w3, w2, [x0]
216+
#else
164217
prfm pstl1strm, [x0]
165218
0: ldaxr w3, [x0]
166219
cmp w3, w1
167220
b.ne 1f
168221
stlxr w8, w2, [x0]
169222
cbnz w8, 0b
223+
#endif
170224
1: mov w0, w3
171225
ret
172226

173227
.globl aarch64_atomic_cmpxchg_8_seq_cst_default_impl
174228
.align 5
175229
aarch64_atomic_cmpxchg_8_seq_cst_default_impl:
230+
#ifdef __ARM_FEATURE_ATOMICS
231+
mov x3, x1
232+
casal x3, x2, [x0]
233+
#else
176234
prfm pstl1strm, [x0]
177235
0: ldaxr x3, [x0]
178236
cmp x3, x1
179237
b.ne 1f
180238
stlxr w8, x2, [x0]
181239
cbnz w8, 0b
240+
#endif
182241
1: mov x0, x3
183242
ret
184243

185244
.globl aarch64_atomic_cmpxchg_1_relaxed_default_impl
186245
.align 5
187246
aarch64_atomic_cmpxchg_1_relaxed_default_impl:
247+
#ifdef __ARM_FEATURE_ATOMICS
248+
mov x3, x1
249+
casb w3, w2, [x0]
250+
#else
188251
prfm pstl1strm, [x0]
189252
0: ldxrb w3, [x0]
190253
eor w8, w3, w1
191254
tst x8, #0xff
192255
b.ne 1f
193256
stxrb w8, w2, [x0]
194257
cbnz w8, 0b
258+
#endif
195259
1: mov w0, w3
196260
ret
197261

198262
.globl aarch64_atomic_cmpxchg_4_relaxed_default_impl
199263
.align 5
200264
aarch64_atomic_cmpxchg_4_relaxed_default_impl:
265+
#ifdef __ARM_FEATURE_ATOMICS
266+
mov x3, x1
267+
cas w3, w2, [x0]
268+
#else
201269
prfm pstl1strm, [x0]
202270
0: ldxr w3, [x0]
203271
cmp w3, w1
204272
b.ne 1f
205273
stxr w8, w2, [x0]
206274
cbnz w8, 0b
275+
#endif
207276
1: mov w0, w3
208277
ret
209278

210279
.globl aarch64_atomic_cmpxchg_8_relaxed_default_impl
211280
.align 5
212281
aarch64_atomic_cmpxchg_8_relaxed_default_impl:
282+
#ifdef __ARM_FEATURE_ATOMICS
283+
mov x3, x1
284+
cas x3, x2, [x0]
285+
#else
213286
prfm pstl1strm, [x0]
214287
0: ldxr x3, [x0]
215288
cmp x3, x1
216289
b.ne 1f
217290
stxr w8, x2, [x0]
218291
cbnz w8, 0b
292+
#endif
219293
1: mov x0, x3
220294
ret

0 commit comments

Comments
 (0)