Skip to content

Commit 2fe0ce0

Browse files
author
Vladimir Ivanov
committed
8292203: AArch64: Represent Registers as values
Reviewed-by: kvn, aph
1 parent 251bff6 commit 2fe0ce0

15 files changed

+474
-406
lines changed

src/hotspot/cpu/aarch64/aarch64.ad

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1909,19 +1909,19 @@ static enum RC rc_class(OptoReg::Name reg) {
19091909
}
19101910

19111911
// we have 32 int registers * 2 halves
1912-
int slots_of_int_registers = RegisterImpl::max_slots_per_register * RegisterImpl::number_of_registers;
1912+
int slots_of_int_registers = Register::number_of_registers * Register::max_slots_per_register;
19131913

19141914
if (reg < slots_of_int_registers) {
19151915
return rc_int;
19161916
}
19171917

19181918
// we have 32 float register * 8 halves
1919-
int slots_of_float_registers = FloatRegisterImpl::max_slots_per_register * FloatRegisterImpl::number_of_registers;
1919+
int slots_of_float_registers = FloatRegister::number_of_registers * FloatRegister::max_slots_per_register;
19201920
if (reg < slots_of_int_registers + slots_of_float_registers) {
19211921
return rc_float;
19221922
}
19231923

1924-
int slots_of_predicate_registers = PRegisterImpl::max_slots_per_register * PRegisterImpl::number_of_registers;
1924+
int slots_of_predicate_registers = PRegister::number_of_registers * PRegister::max_slots_per_register;
19251925
if (reg < slots_of_int_registers + slots_of_float_registers + slots_of_predicate_registers) {
19261926
return rc_predicate;
19271927
}

src/hotspot/cpu/aarch64/assembler_aarch64.hpp

Lines changed: 55 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -62,23 +62,23 @@ class Argument {
6262
};
6363
};
6464

65-
REGISTER_DECLARATION(Register, c_rarg0, r0);
66-
REGISTER_DECLARATION(Register, c_rarg1, r1);
67-
REGISTER_DECLARATION(Register, c_rarg2, r2);
68-
REGISTER_DECLARATION(Register, c_rarg3, r3);
69-
REGISTER_DECLARATION(Register, c_rarg4, r4);
70-
REGISTER_DECLARATION(Register, c_rarg5, r5);
71-
REGISTER_DECLARATION(Register, c_rarg6, r6);
72-
REGISTER_DECLARATION(Register, c_rarg7, r7);
73-
74-
REGISTER_DECLARATION(FloatRegister, c_farg0, v0);
75-
REGISTER_DECLARATION(FloatRegister, c_farg1, v1);
76-
REGISTER_DECLARATION(FloatRegister, c_farg2, v2);
77-
REGISTER_DECLARATION(FloatRegister, c_farg3, v3);
78-
REGISTER_DECLARATION(FloatRegister, c_farg4, v4);
79-
REGISTER_DECLARATION(FloatRegister, c_farg5, v5);
80-
REGISTER_DECLARATION(FloatRegister, c_farg6, v6);
81-
REGISTER_DECLARATION(FloatRegister, c_farg7, v7);
65+
constexpr Register c_rarg0 = r0;
66+
constexpr Register c_rarg1 = r1;
67+
constexpr Register c_rarg2 = r2;
68+
constexpr Register c_rarg3 = r3;
69+
constexpr Register c_rarg4 = r4;
70+
constexpr Register c_rarg5 = r5;
71+
constexpr Register c_rarg6 = r6;
72+
constexpr Register c_rarg7 = r7;
73+
74+
constexpr FloatRegister c_farg0 = v0;
75+
constexpr FloatRegister c_farg1 = v1;
76+
constexpr FloatRegister c_farg2 = v2;
77+
constexpr FloatRegister c_farg3 = v3;
78+
constexpr FloatRegister c_farg4 = v4;
79+
constexpr FloatRegister c_farg5 = v5;
80+
constexpr FloatRegister c_farg6 = v6;
81+
constexpr FloatRegister c_farg7 = v7;
8282

8383
// Symbolically name the register arguments used by the Java calling convention.
8484
// We have control over the convention for java so we can do what we please.
@@ -96,25 +96,25 @@ REGISTER_DECLARATION(FloatRegister, c_farg7, v7);
9696
// |--------------------------------------------------------------------|
9797

9898

99-
REGISTER_DECLARATION(Register, j_rarg0, c_rarg1);
100-
REGISTER_DECLARATION(Register, j_rarg1, c_rarg2);
101-
REGISTER_DECLARATION(Register, j_rarg2, c_rarg3);
102-
REGISTER_DECLARATION(Register, j_rarg3, c_rarg4);
103-
REGISTER_DECLARATION(Register, j_rarg4, c_rarg5);
104-
REGISTER_DECLARATION(Register, j_rarg5, c_rarg6);
105-
REGISTER_DECLARATION(Register, j_rarg6, c_rarg7);
106-
REGISTER_DECLARATION(Register, j_rarg7, c_rarg0);
99+
constexpr Register j_rarg0 = c_rarg1;
100+
constexpr Register j_rarg1 = c_rarg2;
101+
constexpr Register j_rarg2 = c_rarg3;
102+
constexpr Register j_rarg3 = c_rarg4;
103+
constexpr Register j_rarg4 = c_rarg5;
104+
constexpr Register j_rarg5 = c_rarg6;
105+
constexpr Register j_rarg6 = c_rarg7;
106+
constexpr Register j_rarg7 = c_rarg0;
107107

108108
// Java floating args are passed as per C
109109

110-
REGISTER_DECLARATION(FloatRegister, j_farg0, v0);
111-
REGISTER_DECLARATION(FloatRegister, j_farg1, v1);
112-
REGISTER_DECLARATION(FloatRegister, j_farg2, v2);
113-
REGISTER_DECLARATION(FloatRegister, j_farg3, v3);
114-
REGISTER_DECLARATION(FloatRegister, j_farg4, v4);
115-
REGISTER_DECLARATION(FloatRegister, j_farg5, v5);
116-
REGISTER_DECLARATION(FloatRegister, j_farg6, v6);
117-
REGISTER_DECLARATION(FloatRegister, j_farg7, v7);
110+
constexpr FloatRegister j_farg0 = v0;
111+
constexpr FloatRegister j_farg1 = v1;
112+
constexpr FloatRegister j_farg2 = v2;
113+
constexpr FloatRegister j_farg3 = v3;
114+
constexpr FloatRegister j_farg4 = v4;
115+
constexpr FloatRegister j_farg5 = v5;
116+
constexpr FloatRegister j_farg6 = v6;
117+
constexpr FloatRegister j_farg7 = v7;
118118

119119
// registers used to hold VM data either temporarily within a method
120120
// or across method calls
@@ -123,40 +123,28 @@ REGISTER_DECLARATION(FloatRegister, j_farg7, v7);
123123

124124
// r8 is used for indirect result location return
125125
// we use it and r9 as scratch registers
126-
REGISTER_DECLARATION(Register, rscratch1, r8);
127-
REGISTER_DECLARATION(Register, rscratch2, r9);
126+
constexpr Register rscratch1 = r8;
127+
constexpr Register rscratch2 = r9;
128128

129129
// current method -- must be in a call-clobbered register
130-
REGISTER_DECLARATION(Register, rmethod, r12);
130+
constexpr Register rmethod = r12;
131131

132132
// non-volatile (callee-save) registers are r16-29
133133
// of which the following are dedicated global state
134134

135-
// link register
136-
REGISTER_DECLARATION(Register, lr, r30);
137-
// frame pointer
138-
REGISTER_DECLARATION(Register, rfp, r29);
139-
// current thread
140-
REGISTER_DECLARATION(Register, rthread, r28);
141-
// base of heap
142-
REGISTER_DECLARATION(Register, rheapbase, r27);
143-
// constant pool cache
144-
REGISTER_DECLARATION(Register, rcpool, r26);
145-
// r25 is a callee-saved temp
146-
// REGISTER_DECLARATION(Register, unused, r25);
147-
// locals on stack
148-
REGISTER_DECLARATION(Register, rlocals, r24);
149-
// bytecode pointer
150-
REGISTER_DECLARATION(Register, rbcp, r22);
151-
// Dispatch table base
152-
REGISTER_DECLARATION(Register, rdispatch, r21);
153-
// Java expression stack pointer
154-
REGISTER_DECLARATION(Register, esp, r20);
155-
// Sender's SP while in interpreter
156-
REGISTER_DECLARATION(Register, r19_sender_sp, r19);
135+
constexpr Register lr = r30; // link register
136+
constexpr Register rfp = r29; // frame pointer
137+
constexpr Register rthread = r28; // current thread
138+
constexpr Register rheapbase = r27; // base of heap
139+
constexpr Register rcpool = r26; // constant pool cache
140+
constexpr Register rlocals = r24; // locals on stack
141+
constexpr Register rbcp = r22; // bytecode pointer
142+
constexpr Register rdispatch = r21; // dispatch table base
143+
constexpr Register esp = r20; // Java expression stack pointer
144+
constexpr Register r19_sender_sp = r19; // sender's SP while in interpreter
157145

158146
// Preserved predicate register with all elements set TRUE.
159-
REGISTER_DECLARATION(PRegister, ptrue, p7);
147+
constexpr PRegister ptrue = p7;
160148

161149
#define assert_cond(ARG1) assert(ARG1, #ARG1)
162150

@@ -277,29 +265,29 @@ class Instruction_aarch64 {
277265
}
278266

279267
void rf(Register r, int lsb) {
280-
f(r->encoding_nocheck(), lsb + 4, lsb);
268+
f(r->raw_encoding(), lsb + 4, lsb);
281269
}
282270

283271
// reg|ZR
284272
void zrf(Register r, int lsb) {
285-
f(r->encoding_nocheck() - (r == zr), lsb + 4, lsb);
273+
f(r->raw_encoding() - (r == zr), lsb + 4, lsb);
286274
}
287275

288276
// reg|SP
289277
void srf(Register r, int lsb) {
290-
f(r == sp ? 31 : r->encoding_nocheck(), lsb + 4, lsb);
278+
f(r == sp ? 31 : r->raw_encoding(), lsb + 4, lsb);
291279
}
292280

293281
void rf(FloatRegister r, int lsb) {
294-
f(r->encoding_nocheck(), lsb + 4, lsb);
282+
f(r->raw_encoding(), lsb + 4, lsb);
295283
}
296284

297285
void prf(PRegister r, int lsb) {
298-
f(r->encoding_nocheck(), lsb + 3, lsb);
286+
f(r->raw_encoding(), lsb + 3, lsb);
299287
}
300288

301289
void pgrf(PRegister r, int lsb) {
302-
f(r->encoding_nocheck(), lsb + 2, lsb);
290+
f(r->raw_encoding(), lsb + 2, lsb);
303291
}
304292

305293
unsigned get(int msb = 31, int lsb = 0) {
@@ -329,7 +317,7 @@ class Post : public PrePost {
329317
Register _idx;
330318
bool _is_postreg;
331319
public:
332-
Post(Register reg, int o) : PrePost(reg, o) { _idx = NULL; _is_postreg = false; }
320+
Post(Register reg, int o) : PrePost(reg, o) { _idx = noreg; _is_postreg = false; }
333321
Post(Register reg, Register idx) : PrePost(reg, 0) { _idx = idx; _is_postreg = true; }
334322
Register idx_reg() { return _idx; }
335323
bool is_postreg() {return _is_postreg; }
@@ -627,8 +615,7 @@ class InternalAddress: public Address {
627615
InternalAddress(address target) : Address(target, relocInfo::internal_word_type) {}
628616
};
629617

630-
const int FPUStateSizeInWords = FloatRegisterImpl::number_of_registers *
631-
FloatRegisterImpl::save_slots_per_register;
618+
const int FPUStateSizeInWords = FloatRegister::number_of_registers * FloatRegister::save_slots_per_register;
632619

633620
typedef enum {
634621
PLDL1KEEP = 0b00000, PLDL1STRM, PLDL2KEEP, PLDL2STRM, PLDL3KEEP, PLDL3STRM,

src/hotspot/cpu/aarch64/c1_Defs_aarch64.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,8 @@ enum {
4141

4242
// registers
4343
enum {
44-
pd_nof_cpu_regs_frame_map = RegisterImpl::number_of_registers, // number of registers used during code emission
45-
pd_nof_fpu_regs_frame_map = FloatRegisterImpl::number_of_registers, // number of registers used during code emission
44+
pd_nof_cpu_regs_frame_map = Register::number_of_registers, // number of GP registers used during code emission
45+
pd_nof_fpu_regs_frame_map = FloatRegister::number_of_registers, // number of FP registers used during code emission
4646

4747
pd_nof_caller_save_cpu_regs_frame_map = 19 - 2 /* rscratch1 and rscratch2 */ R18_RESERVED_ONLY(- 1), // number of registers killed by calls
4848
pd_nof_caller_save_fpu_regs_frame_map = 32, // number of registers killed by calls

src/hotspot/cpu/aarch64/jvmciCodeInstaller_aarch64.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -175,11 +175,11 @@ void CodeInstaller::pd_relocate_poll(address pc, jint mark, JVMCI_TRAPS) {
175175

176176
// convert JVMCI register indices (as used in oop maps) to HotSpot registers
177177
VMReg CodeInstaller::get_hotspot_reg(jint jvmci_reg, JVMCI_TRAPS) {
178-
if (jvmci_reg < RegisterImpl::number_of_registers) {
178+
if (jvmci_reg < Register::number_of_registers) {
179179
return as_Register(jvmci_reg)->as_VMReg();
180180
} else {
181-
jint floatRegisterNumber = jvmci_reg - RegisterImpl::number_of_declared_registers;
182-
if (floatRegisterNumber >= 0 && floatRegisterNumber < FloatRegisterImpl::number_of_registers) {
181+
jint floatRegisterNumber = jvmci_reg - Register::number_of_declared_registers;
182+
if (floatRegisterNumber >= 0 && floatRegisterNumber < FloatRegister::number_of_registers) {
183183
return as_FloatRegister(floatRegisterNumber)->as_VMReg();
184184
}
185185
JVMCI_ERROR_NULL("invalid register number: %d", jvmci_reg);

src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2198,7 +2198,7 @@ int MacroAssembler::push(unsigned int bitset, Register stack) {
21982198
regs[count++] = reg;
21992199
bitset >>= 1;
22002200
}
2201-
regs[count++] = zr->encoding_nocheck();
2201+
regs[count++] = zr->raw_encoding();
22022202
count &= ~1; // Only push an even number of regs
22032203

22042204
if (count) {
@@ -2228,7 +2228,7 @@ int MacroAssembler::pop(unsigned int bitset, Register stack) {
22282228
regs[count++] = reg;
22292229
bitset >>= 1;
22302230
}
2231-
regs[count++] = zr->encoding_nocheck();
2231+
regs[count++] = zr->raw_encoding();
22322232
count &= ~1;
22332233

22342234
for (int i = 2; i < count; i += 2) {
@@ -2383,9 +2383,9 @@ int MacroAssembler::push_p(unsigned int bitset, Register stack) {
23832383
return 0;
23842384
}
23852385

2386-
unsigned char regs[PRegisterImpl::number_of_saved_registers];
2386+
unsigned char regs[PRegister::number_of_saved_registers];
23872387
int count = 0;
2388-
for (int reg = 0; reg < PRegisterImpl::number_of_saved_registers; reg++) {
2388+
for (int reg = 0; reg < PRegister::number_of_saved_registers; reg++) {
23892389
if (1 & bitset)
23902390
regs[count++] = reg;
23912391
bitset >>= 1;
@@ -2420,9 +2420,9 @@ int MacroAssembler::pop_p(unsigned int bitset, Register stack) {
24202420
return 0;
24212421
}
24222422

2423-
unsigned char regs[PRegisterImpl::number_of_saved_registers];
2423+
unsigned char regs[PRegister::number_of_saved_registers];
24242424
int count = 0;
2425-
for (int reg = 0; reg < PRegisterImpl::number_of_saved_registers; reg++) {
2425+
for (int reg = 0; reg < PRegister::number_of_saved_registers; reg++) {
24262426
if (1 & bitset)
24272427
regs[count++] = reg;
24282428
bitset >>= 1;
@@ -2910,8 +2910,8 @@ void MacroAssembler::push_CPU_state(bool save_vectors, bool use_sve,
29102910
int sve_vector_size_in_bytes, int total_predicate_in_bytes) {
29112911
push(RegSet::range(r0, r29), sp); // integer registers except lr & sp
29122912
if (save_vectors && use_sve && sve_vector_size_in_bytes > 16) {
2913-
sub(sp, sp, sve_vector_size_in_bytes * FloatRegisterImpl::number_of_registers);
2914-
for (int i = 0; i < FloatRegisterImpl::number_of_registers; i++) {
2913+
sub(sp, sp, sve_vector_size_in_bytes * FloatRegister::number_of_registers);
2914+
for (int i = 0; i < FloatRegister::number_of_registers; i++) {
29152915
sve_str(as_FloatRegister(i), Address(sp, i));
29162916
}
29172917
} else {
@@ -2926,7 +2926,7 @@ void MacroAssembler::push_CPU_state(bool save_vectors, bool use_sve,
29262926
}
29272927
if (save_vectors && use_sve && total_predicate_in_bytes > 0) {
29282928
sub(sp, sp, total_predicate_in_bytes);
2929-
for (int i = 0; i < PRegisterImpl::number_of_saved_registers; i++) {
2929+
for (int i = 0; i < PRegister::number_of_saved_registers; i++) {
29302930
sve_str(as_PRegister(i), Address(sp, i));
29312931
}
29322932
}
@@ -2935,16 +2935,16 @@ void MacroAssembler::push_CPU_state(bool save_vectors, bool use_sve,
29352935
void MacroAssembler::pop_CPU_state(bool restore_vectors, bool use_sve,
29362936
int sve_vector_size_in_bytes, int total_predicate_in_bytes) {
29372937
if (restore_vectors && use_sve && total_predicate_in_bytes > 0) {
2938-
for (int i = PRegisterImpl::number_of_saved_registers - 1; i >= 0; i--) {
2938+
for (int i = PRegister::number_of_saved_registers - 1; i >= 0; i--) {
29392939
sve_ldr(as_PRegister(i), Address(sp, i));
29402940
}
29412941
add(sp, sp, total_predicate_in_bytes);
29422942
}
29432943
if (restore_vectors && use_sve && sve_vector_size_in_bytes > 16) {
2944-
for (int i = FloatRegisterImpl::number_of_registers - 1; i >= 0; i--) {
2944+
for (int i = FloatRegister::number_of_registers - 1; i >= 0; i--) {
29452945
sve_ldr(as_FloatRegister(i), Address(sp, i));
29462946
}
2947-
add(sp, sp, sve_vector_size_in_bytes * FloatRegisterImpl::number_of_registers);
2947+
add(sp, sp, sve_vector_size_in_bytes * FloatRegister::number_of_registers);
29482948
} else {
29492949
int step = (restore_vectors ? 8 : 4) * wordSize;
29502950
for (int i = 0; i <= 28; i += 4)

0 commit comments

Comments
 (0)