Skip to content

Commit 35dc3e5

Browse files
committed
Add JVMCI support for APX EGPRs
1 parent effe40a commit 35dc3e5

17 files changed

+162
-450
lines changed

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/aarch64/AArch64.java

Lines changed: 5 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@
2424

2525
import java.nio.ByteOrder;
2626
import java.util.EnumSet;
27+
import java.util.List;
2728

2829
import jdk.vm.ci.code.Architecture;
2930
import jdk.vm.ci.code.CPUFeatureName;
3031
import jdk.vm.ci.code.Register;
3132
import jdk.vm.ci.code.Register.RegisterCategory;
32-
import jdk.vm.ci.code.RegisterArray;
3333
import jdk.vm.ci.meta.JavaKind;
3434
import jdk.vm.ci.meta.PlatformKind;
3535

@@ -92,7 +92,7 @@ public class AArch64 extends Architecture {
9292
public static final Register rscratch2 = r9;
9393

9494
// @formatter:off
95-
public static final RegisterArray cpuRegisters = new RegisterArray(
95+
public static final List<Register> cpuRegisters = List.of(
9696
r0, r1, r2, r3, r4, r5, r6, r7,
9797
r8, r9, r10, r11, r12, r13, r14, r15,
9898
r16, r17, r18, r19, r20, r21, r22, r23,
@@ -138,7 +138,7 @@ public class AArch64 extends Architecture {
138138
public static final Register v31 = new Register(65, 31, "v31", SIMD);
139139

140140
// @formatter:off
141-
public static final RegisterArray simdRegisters = new RegisterArray(
141+
public static final List<Register> simdRegisters = List.of(
142142
v0, v1, v2, v3, v4, v5, v6, v7,
143143
v8, v9, v10, v11, v12, v13, v14, v15,
144144
v16, v17, v18, v19, v20, v21, v22, v23,
@@ -147,7 +147,7 @@ public class AArch64 extends Architecture {
147147
// @formatter:on
148148

149149
// @formatter:off
150-
public static final RegisterArray allRegisters = new RegisterArray(
150+
public static final List<Register> allRegisters = List.of(
151151
r0, r1, r2, r3, r4, r5, r6, r7,
152152
r8, r9, r10, r11, r12, r13, r14, r15,
153153
r16, r17, r18, r19, r20, r21, r22, r23,
@@ -189,34 +189,16 @@ public enum CPUFeature implements CPUFeatureName {
189189

190190
private final EnumSet<CPUFeature> features;
191191

192-
/**
193-
* Set of flags to control code emission.
194-
*/
195-
public enum Flag {
196-
UseCRC32,
197-
UseSIMDForMemoryOps,
198-
AvoidUnalignedAccesses,
199-
UseLSE,
200-
UseBlockZeroing
201-
}
202-
203-
private final EnumSet<Flag> flags;
204-
205-
public AArch64(EnumSet<CPUFeature> features, EnumSet<Flag> flags) {
192+
public AArch64(EnumSet<CPUFeature> features) {
206193
super("aarch64", AArch64Kind.QWORD, ByteOrder.LITTLE_ENDIAN, true, allRegisters, 0, 0, 0);
207194
this.features = features;
208-
this.flags = flags;
209195
}
210196

211197
@Override
212198
public EnumSet<CPUFeature> getFeatures() {
213199
return features;
214200
}
215201

216-
public EnumSet<Flag> getFlags() {
217-
return flags;
218-
}
219-
220202
@Override
221203
public PlatformKind getPlatformKind(JavaKind javaKind) {
222204
switch (javaKind) {

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/amd64/AMD64.java

Lines changed: 41 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -29,12 +29,12 @@
2929

3030
import java.nio.ByteOrder;
3131
import java.util.EnumSet;
32+
import java.util.List;
3233

3334
import jdk.vm.ci.code.Architecture;
3435
import jdk.vm.ci.code.CPUFeatureName;
3536
import jdk.vm.ci.code.Register;
3637
import jdk.vm.ci.code.Register.RegisterCategory;
37-
import jdk.vm.ci.code.RegisterArray;
3838
import jdk.vm.ci.meta.JavaKind;
3939
import jdk.vm.ci.meta.PlatformKind;
4040

@@ -91,6 +91,13 @@ public class AMD64 extends Architecture {
9191
r8, r9, r10, r11, r12, r13, r14, r15
9292
};
9393

94+
public static final Register[] cpuRegistersAPX = {
95+
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
96+
r8, r9, r10, r11, r12, r13, r14, r15,
97+
r16, r17, r18, r19, r20, r21, r22, r23,
98+
r24, r25, r26, r27, r28, r29, r30, r31
99+
};
100+
94101
public static final RegisterCategory XMM = new RegisterCategory("XMM");
95102

96103
// XMM registers
@@ -153,16 +160,37 @@ public class AMD64 extends Architecture {
153160
public static final Register k6 = new Register(70, 6, "k6", MASK);
154161
public static final Register k7 = new Register(71, 7, "k7", MASK);
155162

156-
public static final RegisterArray valueRegistersSSE = new RegisterArray(
163+
public static final List<Register> valueRegistersSSE = List.of(
164+
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
165+
r8, r9, r10, r11, r12, r13, r14, r15,
166+
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
167+
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
168+
);
169+
170+
public static final List<Register> valueRegistersAVX512 = List.of(
171+
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
172+
r8, r9, r10, r11, r12, r13, r14, r15,
173+
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
174+
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
175+
xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
176+
xmm24, xmm25, xmm26, xmm27, xmm28, xmm29, xmm30, xmm31,
177+
k0, k1, k2, k3, k4, k5, k6, k7
178+
);
179+
180+
public static final List<Register> valueRegistersSSEAndAPX = List.of(
157181
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
158182
r8, r9, r10, r11, r12, r13, r14, r15,
183+
r16, r17, r18, r19, r20, r21, r22, r23,
184+
r24, r25, r26, r27, r28, r29, r30, r31,
159185
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
160186
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
161187
);
162188

163-
public static final RegisterArray valueRegistersAVX512 = new RegisterArray(
189+
public static final List<Register> valueRegistersAVX512AndAPX = List.of(
164190
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
165191
r8, r9, r10, r11, r12, r13, r14, r15,
192+
r16, r17, r18, r19, r20, r21, r22, r23,
193+
r24, r25, r26, r27, r28, r29, r30, r31,
166194
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
167195
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
168196
xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
@@ -175,7 +203,7 @@ public class AMD64 extends Architecture {
175203
*/
176204
public static final Register rip = new Register(72, -1, "rip", SPECIAL);
177205

178-
public static final RegisterArray allRegisters = new RegisterArray(
206+
public static final List<Register> allRegisters = List.of(
179207
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
180208
r8, r9, r10, r11, r12, r13, r14, r15,
181209
r16, r17, r18, r19, r20, r21, r22, r23,
@@ -264,24 +292,13 @@ public enum CPUFeature implements CPUFeatureName {
264292

265293
private final EnumSet<CPUFeature> features;
266294

267-
/**
268-
* Set of flags to control code emission.
269-
*/
270-
public enum Flag {
271-
UseCountLeadingZerosInstruction,
272-
UseCountTrailingZerosInstruction
273-
}
274-
275-
private final EnumSet<Flag> flags;
276-
277295
private final AMD64Kind largestKind;
278296

279297
private final AMD64Kind largestMaskKind;
280298

281-
public AMD64(EnumSet<CPUFeature> features, EnumSet<Flag> flags) {
299+
public AMD64(EnumSet<CPUFeature> features) {
282300
super("AMD64", AMD64Kind.QWORD, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_LOAD | LOAD_STORE | STORE_STORE, 1, 8);
283301
this.features = features;
284-
this.flags = flags;
285302
assert features.contains(CPUFeature.SSE2) : "minimum config for x64";
286303

287304
if (features.contains(CPUFeature.AVX512F)) {
@@ -305,13 +322,15 @@ public EnumSet<CPUFeature> getFeatures() {
305322
return features;
306323
}
307324

308-
public EnumSet<Flag> getFlags() {
309-
return flags;
310-
}
311-
312325
@Override
313-
public RegisterArray getAvailableValueRegisters() {
314-
if (features.contains(CPUFeature.AVX512F)) {
326+
public List<Register> getAvailableValueRegisters() {
327+
if (features.contains(CPUFeature.APX_F)) {
328+
if (features.contains(CPUFeature.AVX512F)) {
329+
return valueRegistersAVX512AndAPX;
330+
} else {
331+
return valueRegistersSSEAndAPX;
332+
}
333+
} else if (features.contains(CPUFeature.AVX512F)) {
315334
return valueRegistersAVX512;
316335
} else {
317336
return valueRegistersSSE;

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/Architecture.java

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2009, 2024, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2009, 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
@@ -23,6 +23,7 @@
2323
package jdk.vm.ci.code;
2424

2525
import java.nio.ByteOrder;
26+
import java.util.List;
2627
import java.util.Set;
2728

2829
import jdk.vm.ci.code.Register.RegisterCategory;
@@ -50,7 +51,7 @@ public abstract class Architecture {
5051
* List of all available registers on this architecture. The index of each register in this list
5152
* is equal to its {@linkplain Register#number number}.
5253
*/
53-
private final RegisterArray registers;
54+
private final List<Register> registers;
5455

5556
/**
5657
* The byte ordering can be either little or big endian.
@@ -79,7 +80,7 @@ public abstract class Architecture {
7980
*/
8081
private final int returnAddressSize;
8182

82-
protected Architecture(String name, PlatformKind wordKind, ByteOrder byteOrder, boolean unalignedMemoryAccess, RegisterArray registers, int implicitMemoryBarriers,
83+
protected Architecture(String name, PlatformKind wordKind, ByteOrder byteOrder, boolean unalignedMemoryAccess, List<Register> registers, int implicitMemoryBarriers,
8384
int nativeCallDisplacementOffset,
8485
int returnAddressSize) {
8586
// registers is expected to mention all registers in order of their encoding.
@@ -144,15 +145,15 @@ public String getName() {
144145
* this particular architecture instance. The index of each register in this list is equal to
145146
* its {@linkplain Register#number number}.
146147
*/
147-
public RegisterArray getRegisters() {
148+
public List<Register> getRegisters() {
148149
return registers;
149150
}
150151

151152
/**
152153
* Gets a list of all registers available for storing values on this architecture. This may be a
153154
* subset of {@link #getRegisters()}, depending on the capabilities of this particular CPU.
154155
*/
155-
public RegisterArray getAvailableValueRegisters() {
156+
public List<Register> getAvailableValueRegisters() {
156157
return getRegisters();
157158
}
158159

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/RegisterArray.java

Lines changed: 0 additions & 106 deletions
This file was deleted.

src/jdk.internal.vm.ci/share/classes/jdk/vm/ci/code/RegisterAttributes.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* Copyright (c) 2010, 2011, Oracle and/or its affiliates. All rights reserved.
2+
* Copyright (c) 2010, 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
@@ -55,11 +55,11 @@ public RegisterAttributes(boolean isCallerSave, boolean isCalleeSave, boolean is
5555
* @return an array whose length is the max register number in {@code registers} plus 1. An
5656
* element at index i holds the attributes of the register whose number is i.
5757
*/
58-
public static RegisterAttributes[] createMap(RegisterConfig registerConfig, RegisterArray registers) {
58+
public static RegisterAttributes[] createMap(RegisterConfig registerConfig, List<Register> registers) {
5959
RegisterAttributes[] map = new RegisterAttributes[registers.size()];
60-
List<Register> callerSaveRegisters = registerConfig.getCallerSaveRegisters().asList();
61-
List<Register> calleeSaveRegisters = registerConfig.getCalleeSaveRegisters() == null ? Collections.emptyList() : registerConfig.getCalleeSaveRegisters().asList();
62-
List<Register> allocatableRegisters = registerConfig.getAllocatableRegisters().asList();
60+
List<Register> callerSaveRegisters = registerConfig.getCallerSaveRegisters();
61+
List<Register> calleeSaveRegisters = registerConfig.getCalleeSaveRegisters() == null ? Collections.emptyList() : registerConfig.getCalleeSaveRegisters();
62+
List<Register> allocatableRegisters = registerConfig.getAllocatableRegisters();
6363
for (Register reg : registers) {
6464
if (reg != null) {
6565
RegisterAttributes attr = new RegisterAttributes(callerSaveRegisters.contains(reg), calleeSaveRegisters.contains(reg), allocatableRegisters.contains(reg));

0 commit comments

Comments
 (0)