Skip to content
This repository was archived by the owner on Aug 27, 2022. It is now read-only.
/ lanai Public archive

Commit 9875ddd

Browse files
author
Stuart Monteith
committedJul 24, 2020
8246373: AArch64: Refactor register spilling code in ZGC barriers
Tidy up code spilling registers, reduce in some cases. Reviewed-by: aph, eosterlund
1 parent 21d0b3f commit 9875ddd

File tree

3 files changed

+24
-42
lines changed

3 files changed

+24
-42
lines changed
 

‎src/hotspot/cpu/aarch64/gc/z/zBarrierSetAssembler_aarch64.cpp

+8-35
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2019, 2020, Oracle and/or its affiliates. All rights reserved.
33
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44
*
55
* This code is free software; you can redistribute it and/or modify it
@@ -67,8 +67,6 @@ void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
6767
assert_different_registers(rscratch1, rscratch2, src.base());
6868
assert_different_registers(rscratch1, rscratch2, dst);
6969

70-
RegSet savedRegs = RegSet::range(r0, r28) - RegSet::of(dst, rscratch1, rscratch2);
71-
7270
Label done;
7371

7472
// Load bad mask into scratch register.
@@ -82,37 +80,21 @@ void ZBarrierSetAssembler::load_at(MacroAssembler* masm,
8280

8381
__ enter();
8482

85-
__ push(savedRegs, sp);
83+
__ push_call_clobbered_registers_except(RegSet::of(dst));
8684

8785
if (c_rarg0 != dst) {
8886
__ mov(c_rarg0, dst);
8987
}
9088
__ mov(c_rarg1, rscratch2);
9189

92-
int step = 4 * wordSize;
93-
__ mov(rscratch2, -step);
94-
__ sub(sp, sp, step);
95-
96-
for (int i = 28; i >= 4; i -= 4) {
97-
__ st1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
98-
as_FloatRegister(i+3), __ T1D, Address(__ post(sp, rscratch2)));
99-
}
100-
__ st1(as_FloatRegister(0), as_FloatRegister(1), as_FloatRegister(2),
101-
as_FloatRegister(3), __ T1D, Address(sp));
102-
10390
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
10491

105-
for (int i = 0; i <= 28; i += 4) {
106-
__ ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
107-
as_FloatRegister(i+3), __ T1D, Address(__ post(sp, step)));
108-
}
109-
11092
// Make sure dst has the return value.
11193
if (dst != r0) {
11294
__ mov(dst, r0);
11395
}
11496

115-
__ pop(savedRegs, sp);
97+
__ pop_call_clobbered_registers_except(RegSet::of(dst));
11698
__ leave();
11799

118100
__ bind(done);
@@ -170,7 +152,7 @@ void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
170152

171153
assert_different_registers(src, count, rscratch1);
172154

173-
__ pusha();
155+
__ push(saved_regs, sp);
174156

175157
if (count == c_rarg0) {
176158
if (src == c_rarg1) {
@@ -189,7 +171,8 @@ void ZBarrierSetAssembler::arraycopy_prologue(MacroAssembler* masm,
189171

190172
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_array_addr(), 2);
191173

192-
__ popa();
174+
__ pop(saved_regs, sp);
175+
193176
BLOCK_COMMENT("} ZBarrierSetAssembler::arraycopy_prologue");
194177
}
195178

@@ -295,25 +278,15 @@ void ZBarrierSetAssembler::generate_c1_load_barrier_runtime_stub(StubAssembler*
295278
DecoratorSet decorators) const {
296279
__ prologue("zgc_load_barrier stub", false);
297280

298-
// We don't use push/pop_clobbered_registers() - we need to pull out the result from r0.
299-
for (int i = 0; i < 32; i += 2) {
300-
__ stpd(as_FloatRegister(i), as_FloatRegister(i + 1), Address(__ pre(sp,-16)));
301-
}
302-
303-
const RegSet save_regs = RegSet::range(r1, r28);
304-
__ push(save_regs, sp);
281+
__ push_call_clobbered_registers_except(RegSet::of(r0));
305282

306283
// Setup arguments
307284
__ load_parameter(0, c_rarg0);
308285
__ load_parameter(1, c_rarg1);
309286

310287
__ call_VM_leaf(ZBarrierSetRuntime::load_barrier_on_oop_field_preloaded_addr(decorators), 2);
311288

312-
__ pop(save_regs, sp);
313-
314-
for (int i = 30; i >= 0; i -= 2) {
315-
__ ldpd(as_FloatRegister(i), as_FloatRegister(i + 1), Address(__ post(sp, 16)));
316-
}
289+
__ pop_call_clobbered_registers_except(RegSet::of(r0));
317290

318291
__ epilogue();
319292
}

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

+4-4
Original file line numberDiff line numberDiff line change
@@ -2626,9 +2626,9 @@ void MacroAssembler::debug64(char* msg, int64_t pc, int64_t regs[])
26262626
fatal("DEBUG MESSAGE: %s", msg);
26272627
}
26282628

2629-
void MacroAssembler::push_call_clobbered_registers() {
2629+
void MacroAssembler::push_call_clobbered_registers_except(RegSet exclude) {
26302630
int step = 4 * wordSize;
2631-
push(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2631+
push(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2) - exclude, sp);
26322632
sub(sp, sp, step);
26332633
mov(rscratch1, -step);
26342634
// Push v0-v7, v16-v31.
@@ -2641,14 +2641,14 @@ void MacroAssembler::push_call_clobbered_registers() {
26412641
as_FloatRegister(3), T1D, Address(sp));
26422642
}
26432643

2644-
void MacroAssembler::pop_call_clobbered_registers() {
2644+
void MacroAssembler::pop_call_clobbered_registers_except(RegSet exclude) {
26452645
for (int i = 0; i < 32; i += 4) {
26462646
if (i <= v7->encoding() || i >= v16->encoding())
26472647
ld1(as_FloatRegister(i), as_FloatRegister(i+1), as_FloatRegister(i+2),
26482648
as_FloatRegister(i+3), T1D, Address(post(sp, 4 * wordSize)));
26492649
}
26502650

2651-
pop(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2), sp);
2651+
pop(RegSet::range(r0, r18) - RegSet::of(rscratch1, rscratch2) - exclude, sp);
26522652
}
26532653

26542654
void MacroAssembler::push_CPU_state(bool save_vectors) {

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

+12-3
Original file line numberDiff line numberDiff line change
@@ -477,9 +477,18 @@ class MacroAssembler: public Assembler {
477477
// Push and pop everything that might be clobbered by a native
478478
// runtime call except rscratch1 and rscratch2. (They are always
479479
// scratch, so we don't have to protect them.) Only save the lower
480-
// 64 bits of each vector register.
481-
void push_call_clobbered_registers();
482-
void pop_call_clobbered_registers();
480+
// 64 bits of each vector register. Additonal registers can be excluded
481+
// in a passed RegSet.
482+
void push_call_clobbered_registers_except(RegSet exclude);
483+
void pop_call_clobbered_registers_except(RegSet exclude);
484+
485+
void push_call_clobbered_registers() {
486+
push_call_clobbered_registers_except(RegSet());
487+
}
488+
void pop_call_clobbered_registers() {
489+
pop_call_clobbered_registers_except(RegSet());
490+
}
491+
483492

484493
// now mov instructions for loading absolute addresses and 32 or
485494
// 64 bit integers

0 commit comments

Comments
 (0)