Skip to content

Commit 57f4c30

Browse files
author
Dmitry Chuyko
committed
8347917: AArch64: Enable upper GPR registers in C1
Reviewed-by: aph
1 parent ff52859 commit 57f4c30

File tree

7 files changed

+80
-26
lines changed

7 files changed

+80
-26
lines changed

src/hotspot/cpu/aarch64/c1_Defs_aarch64.hpp

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2000, 2025, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -41,16 +41,17 @@ enum {
4141

4242
// registers
4343
enum {
44+
pd_nof_available_regs = 32,
4445
pd_nof_cpu_regs_frame_map = Register::number_of_registers, // number of GP registers used during code emission
4546
pd_nof_fpu_regs_frame_map = FloatRegister::number_of_registers, // number of FP registers used during code emission
4647

47-
pd_nof_caller_save_cpu_regs_frame_map = 19 - 2 /* rscratch1 and rscratch2 */ R18_RESERVED_ONLY(- 1), // number of registers killed by calls
48+
pd_nof_caller_save_cpu_regs_frame_map = pd_nof_available_regs, // number of registers killed by calls
4849
pd_nof_caller_save_fpu_regs_frame_map = 32, // number of registers killed by calls
4950

50-
pd_first_callee_saved_reg = 19 - 2 /* rscratch1 and rscratch2 */ R18_RESERVED_ONLY(- 1),
51-
pd_last_callee_saved_reg = 26 - 2 /* rscratch1 and rscratch2 */ R18_RESERVED_ONLY(- 1),
51+
pd_first_callee_saved_reg = pd_nof_available_regs - 1,
52+
pd_last_callee_saved_reg = pd_first_callee_saved_reg - 1, // in fact, no callee saved regs
5253

53-
pd_last_allocatable_cpu_reg = 16 R18_RESERVED_ONLY(- 1),
54+
pd_last_allocatable_cpu_reg = pd_nof_available_regs - 1,
5455

5556
pd_nof_cpu_regs_reg_alloc
5657
= pd_last_allocatable_cpu_reg + 1, // number of registers that are visible to register allocator
@@ -60,9 +61,9 @@ enum {
6061
pd_nof_fpu_regs_linearscan = pd_nof_fpu_regs_frame_map, // number of registers visible to linear scan
6162
pd_nof_xmm_regs_linearscan = 0, // don't have vector registers
6263
pd_first_cpu_reg = 0,
63-
pd_last_cpu_reg = 16 R18_RESERVED_ONLY(- 1),
64+
pd_last_cpu_reg = pd_nof_available_regs - 1,
6465
pd_first_byte_reg = 0,
65-
pd_last_byte_reg = 16 R18_RESERVED_ONLY(- 1),
66+
pd_last_byte_reg = pd_last_cpu_reg,
6667
pd_first_fpu_reg = pd_nof_cpu_regs_frame_map,
6768
pd_last_fpu_reg = pd_first_fpu_reg + 31,
6869

src/hotspot/cpu/aarch64/c1_FrameMap_aarch64.cpp

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,9 +193,26 @@ void FrameMap::initialize() {
193193
map_register(i, r25); r25_opr = LIR_OprFact::single_cpu(i); i++;
194194
map_register(i, r26); r26_opr = LIR_OprFact::single_cpu(i); i++;
195195

196-
map_register(i, r27); r27_opr = LIR_OprFact::single_cpu(i); i++; // rheapbase
196+
// r27 is allocated conditionally. With compressed oops it holds
197+
// the heapbase value and is not visible to the allocator.
198+
bool preserve_rheapbase = i >= nof_caller_save_cpu_regs();
199+
if (!preserve_rheapbase) {
200+
map_register(i, r27); r27_opr = LIR_OprFact::single_cpu(i); i++; // rheapbase
201+
}
202+
203+
if(!PreserveFramePointer) {
204+
map_register(i, r29); r29_opr = LIR_OprFact::single_cpu(i); i++;
205+
}
206+
207+
// The unallocatable registers are at the end
208+
209+
if (preserve_rheapbase) {
210+
map_register(i, r27); r27_opr = LIR_OprFact::single_cpu(i); i++; // rheapbase
211+
}
197212
map_register(i, r28); r28_opr = LIR_OprFact::single_cpu(i); i++; // rthread
198-
map_register(i, r29); r29_opr = LIR_OprFact::single_cpu(i); i++; // rfp
213+
if(PreserveFramePointer) {
214+
map_register(i, r29); r29_opr = LIR_OprFact::single_cpu(i); i++; // rfp
215+
}
199216
map_register(i, r30); r30_opr = LIR_OprFact::single_cpu(i); i++; // lr
200217
map_register(i, r31_sp); sp_opr = LIR_OprFact::single_cpu(i); i++; // sp
201218
map_register(i, r8); r8_opr = LIR_OprFact::single_cpu(i); i++; // rscratch1
@@ -239,6 +256,19 @@ void FrameMap::initialize() {
239256
_caller_save_cpu_regs[16] = r18_opr;
240257
#endif
241258

259+
_caller_save_cpu_regs[17 R18_RESERVED_ONLY(-1)] = r19_opr;
260+
_caller_save_cpu_regs[18 R18_RESERVED_ONLY(-1)] = r20_opr;
261+
_caller_save_cpu_regs[19 R18_RESERVED_ONLY(-1)] = r21_opr;
262+
_caller_save_cpu_regs[20 R18_RESERVED_ONLY(-1)] = r22_opr;
263+
_caller_save_cpu_regs[21 R18_RESERVED_ONLY(-1)] = r23_opr;
264+
_caller_save_cpu_regs[22 R18_RESERVED_ONLY(-1)] = r24_opr;
265+
_caller_save_cpu_regs[23 R18_RESERVED_ONLY(-1)] = r25_opr;
266+
_caller_save_cpu_regs[24 R18_RESERVED_ONLY(-1)] = r26_opr;
267+
268+
if (nof_caller_save_cpu_regs() > 25 R18_RESERVED_ONLY(-1)) {
269+
_caller_save_cpu_regs[25 R18_RESERVED_ONLY(-1)] = r27_opr;
270+
}
271+
242272
for (int i = 0; i < 8; i++) {
243273
_caller_save_fpu_regs[i] = LIR_OprFact::single_fpu(i);
244274
}

src/hotspot/cpu/aarch64/c1_FrameMap_aarch64.hpp

Lines changed: 23 additions & 4 deletions
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, 2025, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -140,8 +140,27 @@
140140
static bool is_caller_save_register (LIR_Opr opr) { return true; }
141141
static bool is_caller_save_register (Register r) { return true; }
142142

143-
static int nof_caller_save_cpu_regs() { return pd_nof_caller_save_cpu_regs_frame_map; }
144-
static int last_cpu_reg() { return pd_last_cpu_reg; }
145-
static int last_byte_reg() { return pd_last_byte_reg; }
143+
static int adjust_reg_range(int range, bool exclude_fp = true) {
144+
// r27 is not allocatable when compressed oops is on and heapbase is not
145+
// zero, compressed klass pointers doesn't use r27 after JDK-8234794
146+
if (UseCompressedOops && (CompressedOops::base() != nullptr)) {
147+
range -= 1;
148+
}
149+
150+
// r29 is not allocatable when PreserveFramePointer is on,
151+
// but fp saving is handled in MacroAssembler::build_frame()/remove_frame()
152+
if (exclude_fp) {
153+
range -= 1;
154+
}
155+
156+
// rscratch registers r8, r9
157+
// r28=rthread, r30=lr, r31=sp
158+
// r18 on masOS/Windows
159+
return range - 5 R18_RESERVED_ONLY(-1);
160+
}
161+
162+
static int nof_caller_save_cpu_regs() { return adjust_reg_range(pd_nof_caller_save_cpu_regs_frame_map); }
163+
static int last_cpu_reg() { return adjust_reg_range(pd_last_cpu_reg, PreserveFramePointer); }
164+
static int last_byte_reg() { return adjust_reg_range(pd_last_byte_reg, PreserveFramePointer); }
146165

147166
#endif // CPU_AARCH64_C1_FRAMEMAP_AARCH64_HPP

src/hotspot/cpu/aarch64/c1_LinearScan_aarch64.hpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2005, 2019, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2005, 2025, Oracle and/or its affiliates. All rights reserved.
33
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
44
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
55
*
@@ -41,9 +41,9 @@ inline bool LinearScan::requires_adjacent_regs(BasicType type) {
4141

4242
inline bool LinearScan::is_caller_save(int assigned_reg) {
4343
assert(assigned_reg >= 0 && assigned_reg < nof_regs, "should call this only for registers");
44-
if (assigned_reg < pd_first_callee_saved_reg)
44+
if (assigned_reg < FrameMap::nof_caller_save_cpu_regs())
4545
return true;
46-
if (assigned_reg > pd_last_callee_saved_reg && assigned_reg < pd_first_callee_saved_fpu_reg)
46+
if (assigned_reg >= pd_first_fpu_reg && assigned_reg < pd_first_callee_saved_fpu_reg)
4747
return true;
4848
if (assigned_reg > pd_last_callee_saved_fpu_reg && assigned_reg < pd_last_fpu_reg)
4949
return true;
@@ -66,7 +66,7 @@ inline bool LinearScanWalker::pd_init_regs_for_alloc(Interval* cur) {
6666
return true;
6767
} else if (cur->type() == T_INT || cur->type() == T_LONG || cur->type() == T_OBJECT || cur->type() == T_ADDRESS || cur->type() == T_METADATA) {
6868
_first_reg = pd_first_cpu_reg;
69-
_last_reg = pd_last_allocatable_cpu_reg;
69+
_last_reg = FrameMap::last_cpu_reg();
7070
return true;
7171
}
7272
return false;

src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -257,15 +257,18 @@ static OopMap* generate_oop_map(StubAssembler* sasm, bool save_fpu_registers) {
257257
int frame_size_in_slots = frame_size_in_bytes / sizeof(jint);
258258
OopMap* oop_map = new OopMap(frame_size_in_slots, 0);
259259

260-
for (int i = 0; i < FrameMap::nof_cpu_regs; i++) {
261-
Register r = as_Register(i);
262-
if (r == rthread || (i <= 18 && i != rscratch1->encoding() && i != rscratch2->encoding())) {
263-
int sp_offset = cpu_reg_save_offsets[i];
264-
oop_map->set_callee_saved(VMRegImpl::stack2reg(sp_offset),
265-
r->as_VMReg());
266-
}
260+
for (int i = 0; i < FrameMap::nof_caller_save_cpu_regs(); i++) {
261+
LIR_Opr opr = FrameMap::caller_save_cpu_reg_at(i);
262+
Register r = opr->as_register();
263+
int reg_num = r->encoding();
264+
int sp_offset = cpu_reg_save_offsets[reg_num];
265+
oop_map->set_callee_saved(VMRegImpl::stack2reg(cpu_reg_save_offsets[reg_num]), r->as_VMReg());
267266
}
268267

268+
Register r = rthread;
269+
int reg_num = r->encoding();
270+
oop_map->set_callee_saved(VMRegImpl::stack2reg(cpu_reg_save_offsets[reg_num]), r->as_VMReg());
271+
269272
if (save_fpu_registers) {
270273
for (int i = 0; i < FrameMap::nof_fpu_regs; i++) {
271274
FloatRegister r = as_FloatRegister(i);

src/hotspot/share/c1/c1_Compiler.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,8 @@ Compiler::Compiler() : AbstractCompiler(compiler_c1) {
4949

5050
void Compiler::init_c1_runtime() {
5151
BufferBlob* buffer_blob = CompilerThread::current()->get_buffer_blob();
52-
Runtime1::initialize(buffer_blob);
5352
FrameMap::initialize();
53+
Runtime1::initialize(buffer_blob);
5454
// initialize data structures
5555
ValueType::initialize();
5656
GraphBuilder::initialize();

src/hotspot/share/c1/c1_FrameMap.hpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2000, 2023, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2000, 2025, 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
@@ -32,6 +32,7 @@
3232
#include "runtime/frame.hpp"
3333
#include "utilities/globalDefinitions.hpp"
3434
#include "utilities/macros.hpp"
35+
#include "oops/compressedOops.hpp"
3536

3637
class ciMethod;
3738
class CallingConvention;

0 commit comments

Comments
 (0)