< prev index next >
src/jdk.vm.ci/share/classes/jdk.vm.ci.amd64/src/jdk/vm/ci/amd64/AMD64.java
Print this page
*** 20,38 ****
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.amd64;
! import static jdk.vm.ci.code.MemoryBarriers.*;
! import static jdk.vm.ci.code.Register.*;
! import java.nio.*;
! import java.util.*;
! import jdk.vm.ci.code.*;
import jdk.vm.ci.code.Register.RegisterCategory;
! import jdk.vm.ci.meta.*;
/**
* Represents the AMD64 architecture.
*/
public class AMD64 extends Architecture {
--- 20,41 ----
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
package jdk.vm.ci.amd64;
! import static jdk.vm.ci.code.MemoryBarriers.LOAD_STORE;
! import static jdk.vm.ci.code.MemoryBarriers.STORE_STORE;
! import static jdk.vm.ci.code.Register.SPECIAL;
! import java.nio.ByteOrder;
! import java.util.EnumSet;
! import jdk.vm.ci.code.Architecture;
! import jdk.vm.ci.code.Register;
import jdk.vm.ci.code.Register.RegisterCategory;
! import jdk.vm.ci.meta.JavaKind;
! import jdk.vm.ci.meta.PlatformKind;
/**
* Represents the AMD64 architecture.
*/
public class AMD64 extends Architecture {
*** 63,75 ****
public static final Register[] cpuRegisters = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15
};
! private static final int XMM_REFERENCE_MAP_SHIFT = 2;
!
! public static final RegisterCategory XMM = new RegisterCategory("XMM", cpuRegisters.length, XMM_REFERENCE_MAP_SHIFT);
// XMM registers
public static final Register xmm0 = new Register(16, 0, "xmm0", XMM);
public static final Register xmm1 = new Register(17, 1, "xmm1", XMM);
public static final Register xmm2 = new Register(18, 2, "xmm2", XMM);
--- 66,76 ----
public static final Register[] cpuRegisters = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15
};
! public static final RegisterCategory XMM = new RegisterCategory("XMM");
// XMM registers
public static final Register xmm0 = new Register(16, 0, "xmm0", XMM);
public static final Register xmm1 = new Register(17, 1, "xmm1", XMM);
public static final Register xmm2 = new Register(18, 2, "xmm2", XMM);
*** 86,117 ****
public static final Register xmm12 = new Register(28, 12, "xmm12", XMM);
public static final Register xmm13 = new Register(29, 13, "xmm13", XMM);
public static final Register xmm14 = new Register(30, 14, "xmm14", XMM);
public static final Register xmm15 = new Register(31, 15, "xmm15", XMM);
! public static final Register[] xmmRegisters = {
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
};
! public static final Register[] cpuxmmRegisters = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15,
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
};
/**
* Register used to construct an instruction-relative address.
*/
! public static final Register rip = new Register(32, -1, "rip", SPECIAL);
public static final Register[] allRegisters = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15,
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
rip
};
// @formatter:on
--- 87,167 ----
public static final Register xmm12 = new Register(28, 12, "xmm12", XMM);
public static final Register xmm13 = new Register(29, 13, "xmm13", XMM);
public static final Register xmm14 = new Register(30, 14, "xmm14", XMM);
public static final Register xmm15 = new Register(31, 15, "xmm15", XMM);
! public static final Register xmm16 = new Register(32, 16, "xmm16", XMM);
! public static final Register xmm17 = new Register(33, 17, "xmm17", XMM);
! public static final Register xmm18 = new Register(34, 18, "xmm18", XMM);
! public static final Register xmm19 = new Register(35, 19, "xmm19", XMM);
! public static final Register xmm20 = new Register(36, 20, "xmm20", XMM);
! public static final Register xmm21 = new Register(37, 21, "xmm21", XMM);
! public static final Register xmm22 = new Register(38, 22, "xmm22", XMM);
! public static final Register xmm23 = new Register(39, 23, "xmm23", XMM);
!
! public static final Register xmm24 = new Register(40, 24, "xmm24", XMM);
! public static final Register xmm25 = new Register(41, 25, "xmm25", XMM);
! public static final Register xmm26 = new Register(42, 26, "xmm26", XMM);
! public static final Register xmm27 = new Register(43, 27, "xmm27", XMM);
! public static final Register xmm28 = new Register(44, 28, "xmm28", XMM);
! public static final Register xmm29 = new Register(45, 29, "xmm29", XMM);
! public static final Register xmm30 = new Register(46, 30, "xmm30", XMM);
! public static final Register xmm31 = new Register(47, 31, "xmm31", XMM);
!
! public static final Register[] xmmRegistersSSE = {
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
};
! public static final Register[] xmmRegistersAVX512 = {
! xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
! xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
! xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
! xmm24, xmm25, xmm26, xmm27, xmm28, xmm29, xmm30, xmm31
! };
!
! public static final RegisterCategory MASK = new RegisterCategory("MASK", false);
!
! public static final Register k0 = new Register(48, 0, "k0", MASK);
! public static final Register k1 = new Register(49, 1, "k1", MASK);
! public static final Register k2 = new Register(50, 2, "k2", MASK);
! public static final Register k3 = new Register(51, 3, "k3", MASK);
! public static final Register k4 = new Register(52, 4, "k4", MASK);
! public static final Register k5 = new Register(53, 5, "k5", MASK);
! public static final Register k6 = new Register(54, 6, "k6", MASK);
! public static final Register k7 = new Register(55, 7, "k7", MASK);
!
! public static final Register[] valueRegistersSSE = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15,
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15
};
+ public static final Register[] valueRegistersAVX512 = {
+ rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
+ r8, r9, r10, r11, r12, r13, r14, r15,
+ xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
+ xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
+ xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
+ xmm24, xmm25, xmm26, xmm27, xmm28, xmm29, xmm30, xmm31,
+ k0, k1, k2, k3, k4, k5, k6, k7
+ };
+
/**
* Register used to construct an instruction-relative address.
*/
! public static final Register rip = new Register(56, -1, "rip", SPECIAL);
public static final Register[] allRegisters = {
rax, rcx, rdx, rbx, rsp, rbp, rsi, rdi,
r8, r9, r10, r11, r12, r13, r14, r15,
xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,
xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,
+ xmm16, xmm17, xmm18, xmm19, xmm20, xmm21, xmm22, xmm23,
+ xmm24, xmm25, xmm26, xmm27, xmm28, xmm29, xmm30, xmm31,
+ k0, k1, k2, k3, k4, k5, k6, k7,
rip
};
// @formatter:on
*** 149,159 ****
AVX512F,
AVX512DQ,
AVX512PF,
AVX512ER,
AVX512CD,
! AVX512BW
}
private final EnumSet<CPUFeature> features;
/**
--- 199,210 ----
AVX512F,
AVX512DQ,
AVX512PF,
AVX512ER,
AVX512CD,
! AVX512BW,
! AVX512VL
}
private final EnumSet<CPUFeature> features;
/**
*** 164,178 ****
UseCountTrailingZerosInstruction
}
private final EnumSet<Flag> flags;
public AMD64(EnumSet<CPUFeature> features, EnumSet<Flag> flags) {
! super("AMD64", JavaKind.Long, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, cpuRegisters.length + (xmmRegisters.length << XMM_REFERENCE_MAP_SHIFT), 8);
this.features = features;
this.flags = flags;
assert features.contains(CPUFeature.SSE2) : "minimum config for x64";
}
public EnumSet<CPUFeature> getFeatures() {
return features;
}
--- 215,239 ----
UseCountTrailingZerosInstruction
}
private final EnumSet<Flag> flags;
+ private final AMD64Kind largestKind;
+
public AMD64(EnumSet<CPUFeature> features, EnumSet<Flag> flags) {
! super("AMD64", AMD64Kind.QWORD, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, 8);
this.features = features;
this.flags = flags;
assert features.contains(CPUFeature.SSE2) : "minimum config for x64";
+
+ if (features.contains(CPUFeature.AVX512F)) {
+ largestKind = AMD64Kind.V512_QWORD;
+ } else if (features.contains(CPUFeature.AVX)) {
+ largestKind = AMD64Kind.V256_QWORD;
+ } else {
+ largestKind = AMD64Kind.V128_QWORD;
+ }
}
public EnumSet<CPUFeature> getFeatures() {
return features;
}
*** 180,231 ****
public EnumSet<Flag> getFlags() {
return flags;
}
@Override
! public PlatformKind getPlatformKind(JavaKind javaKind) {
! if (javaKind.isObject()) {
! return getWordKind();
} else {
! return javaKind;
}
}
@Override
! public boolean canStoreValue(RegisterCategory category, PlatformKind platformKind) {
! if (!(platformKind instanceof JavaKind)) {
! return false;
! }
!
! JavaKind kind = (JavaKind) platformKind;
! if (category.equals(CPU)) {
! switch (kind) {
case Boolean:
case Byte:
! case Char:
case Short:
case Int:
case Long:
! return true;
! }
! } else if (category.equals(XMM)) {
! switch (kind) {
case Float:
case Double:
! return true;
}
}
! return false;
}
@Override
! public PlatformKind getLargestStorableKind(RegisterCategory category) {
if (category.equals(CPU)) {
! return JavaKind.Long;
} else if (category.equals(XMM)) {
! return JavaKind.Double;
} else {
! return JavaKind.Illegal;
}
}
}
--- 241,302 ----
public EnumSet<Flag> getFlags() {
return flags;
}
@Override
! public Register[] getAvailableValueRegisters() {
! if (features.contains(CPUFeature.AVX512F)) {
! return valueRegistersAVX512;
} else {
! return valueRegistersSSE;
}
}
@Override
! public PlatformKind getPlatformKind(JavaKind javaKind) {
! switch (javaKind) {
case Boolean:
case Byte:
! return AMD64Kind.BYTE;
case Short:
+ case Char:
+ return AMD64Kind.WORD;
case Int:
+ return AMD64Kind.DWORD;
case Long:
! case Object:
! return AMD64Kind.QWORD;
case Float:
+ return AMD64Kind.SINGLE;
case Double:
! return AMD64Kind.DOUBLE;
! default:
! return null;
}
}
! @Override
! public boolean canStoreValue(RegisterCategory category, PlatformKind platformKind) {
! AMD64Kind kind = (AMD64Kind) platformKind;
! if (kind.isInteger()) {
! return category.equals(CPU);
! } else if (kind.isXMM()) {
! return category.equals(XMM);
! } else {
! assert kind.isMask();
! return category.equals(MASK);
! }
}
@Override
! public AMD64Kind getLargestStorableKind(RegisterCategory category) {
if (category.equals(CPU)) {
! return AMD64Kind.QWORD;
} else if (category.equals(XMM)) {
! return largestKind;
! } else if (category.equals(MASK)) {
! return AMD64Kind.MASK64;
} else {
! return null;
}
}
}
< prev index next >