# HG changeset patch # User Tom Rodriguez # Date 1387215079 28800 # Node ID 2c3b59f346199113c8b2a90c5c0d739090b71826 # Parent 3ce69f7364a7ea29b917887bfbdad8b88cea19cd add CPUFeature EnumSet to target description with appropriate asserts diff -r 3ce69f7364a7 -r 2c3b59f34619 graal/com.oracle.graal.amd64/src/com/oracle/graal/amd64/AMD64.java --- a/graal/com.oracle.graal.amd64/src/com/oracle/graal/amd64/AMD64.java Mon Dec 16 17:18:18 2013 +0100 +++ b/graal/com.oracle.graal.amd64/src/com/oracle/graal/amd64/AMD64.java Mon Dec 16 09:31:19 2013 -0800 @@ -26,6 +26,7 @@ import static com.oracle.graal.api.code.Register.*; import java.nio.*; +import java.util.*; import com.oracle.graal.api.code.*; import com.oracle.graal.api.code.Register.RegisterCategory; @@ -111,22 +112,23 @@ // @formatter:on - private final int supportedSSEVersion; - private final int supportedAVXVersion; - - public AMD64(int supportedSSEVersion, int supportedAVXVersion) { - super("AMD64", 8, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, r15.encoding + 1, 8); - assert supportedSSEVersion >= 2; - this.supportedSSEVersion = supportedSSEVersion; - this.supportedAVXVersion = supportedAVXVersion; + /** + * Basic set of CPU features mirroring what is returned from the cpuid instruction. + */ + public static enum CPUFeature { + SSE, SSE2, SSE3, SSE4, SSE4a, SSE4_1, SSE4_2, SSSE3, POPCNT, LZCNT, AVX, AVX2, ERMS, AMD_3DNOW_PREFETCH, AES, } - public int getSupportedSSEVersion() { - return supportedSSEVersion; + private final EnumSet features; + + public AMD64(EnumSet features) { + super("AMD64", 8, ByteOrder.LITTLE_ENDIAN, true, allRegisters, LOAD_STORE | STORE_STORE, 1, r15.encoding + 1, 8); + this.features = features; + assert features.contains(CPUFeature.SSE2) : "minimum config for x64"; } - public int getSupportedAVXVersion() { - return supportedAVXVersion; + public EnumSet getFeatures() { + return features; } @Override diff -r 3ce69f7364a7 -r 2c3b59f34619 graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java --- a/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Dec 16 17:18:18 2013 +0100 +++ b/graal/com.oracle.graal.asm.amd64/src/com/oracle/graal/asm/amd64/AMD64Assembler.java Mon Dec 16 09:31:19 2013 -0800 @@ -174,6 +174,10 @@ this.frameRegister = registerConfig == null ? null : registerConfig.getFrameRegister(); } + private boolean supports(CPUFeature feature) { + return ((AMD64) target.arch).getFeatures().contains(feature); + } + private static int encode(Register r) { assert r.encoding < 16 && r.encoding >= 0 : "encoding out of range: " + r.encoding; return r.encoding & 0x7; @@ -450,6 +454,7 @@ } public final void bsrq(Register dst, Register src) { + assert !supports(CPUFeature.LZCNT); int encode = prefixqAndEncode(dst.encoding, src.encoding); emitByte(0x0F); emitByte(0xBD); @@ -457,6 +462,7 @@ } public final void bsrq(Register dst, AMD64Address src) { + assert !supports(CPUFeature.LZCNT); prefixq(src, dst); emitByte(0x0F); emitByte(0xBD); @@ -464,6 +470,7 @@ } public final void bsrl(Register dst, Register src) { + assert !supports(CPUFeature.LZCNT); int encode = prefixAndEncode(dst.encoding, src.encoding); emitByte(0x0F); emitByte(0xBD); @@ -471,6 +478,7 @@ } public final void bsrl(Register dst, AMD64Address src) { + assert !supports(CPUFeature.LZCNT); prefix(src, dst); emitByte(0x0F); emitByte(0xBD); @@ -1405,6 +1413,7 @@ } public final void popcntl(Register dst, AMD64Address src) { + assert supports(CPUFeature.POPCNT); emitByte(0xF3); prefix(src, dst); emitByte(0x0F); @@ -1413,6 +1422,7 @@ } public final void popcntl(Register dst, Register src) { + assert supports(CPUFeature.POPCNT); emitByte(0xF3); int encode = prefixAndEncode(dst.encoding, src.encoding); emitByte(0x0F); @@ -1421,6 +1431,7 @@ } public final void popcntq(Register dst, AMD64Address src) { + assert supports(CPUFeature.POPCNT); emitByte(0xF3); prefixq(src, dst); emitByte(0x0F); @@ -1429,6 +1440,7 @@ } public final void popcntq(Register dst, Register src) { + assert supports(CPUFeature.POPCNT); emitByte(0xF3); int encode = prefixqAndEncode(dst.encoding, src.encoding); emitByte(0x0F); @@ -2549,28 +2561,28 @@ } void prefetchr(AMD64Address src) { - // assert(VM_Version::supports_3dnow_prefetch(), "must support"); + assert supports(CPUFeature.AMD_3DNOW_PREFETCH); prefetchPrefix(src); emitByte(0x0D); emitOperandHelper(0, src); } public void prefetcht0(AMD64Address src) { - // NOT_LP64(assert(VM_Version::supports_sse(), "must support")); + assert supports(CPUFeature.SSE); prefetchPrefix(src); emitByte(0x18); emitOperandHelper(1, src); } public void prefetcht1(AMD64Address src) { - // NOT_LP64(assert(VM_Version::supports_sse(), "must support")); + assert supports(CPUFeature.SSE); prefetchPrefix(src); emitByte(0x18); emitOperandHelper(2, src); } public void prefetcht2(AMD64Address src) { - // NOT_LP64(assert(VM_Version::supports_sse(), "must support")); + assert supports(CPUFeature.SSE); prefix(src); emitByte(0x0f); emitByte(0x18); @@ -2578,7 +2590,7 @@ } public void prefetchw(AMD64Address src) { - // assert(VM_Version::supports_3dnow_prefetch(), "must support"); + assert supports(CPUFeature.AMD_3DNOW_PREFETCH); prefix(src); emitByte(0x0f); emitByte(0x0D); diff -r 3ce69f7364a7 -r 2c3b59f34619 graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackendFactory.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackendFactory.java Mon Dec 16 17:18:18 2013 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotBackendFactory.java Mon Dec 16 09:31:19 2013 -0800 @@ -37,7 +37,37 @@ public class AMD64HotSpotBackendFactory implements HotSpotBackendFactory { protected Architecture createArchitecture(HotSpotVMConfig config) { - return new AMD64(config.useSSE, config.useAVX); + // Configure the feature set using the HotSpot flag settings. + EnumSet features = EnumSet.noneOf(AMD64.CPUFeature.class); + assert config.useSSE >= 2 : "minimum config for x64"; + features.add(AMD64.CPUFeature.SSE); + features.add(AMD64.CPUFeature.SSE2); + if (config.useSSE > 2) { + features.add(AMD64.CPUFeature.SSE3); + } + if (config.useSSE > 3) { + features.add(AMD64.CPUFeature.SSE4); + } + if (config.useAVX > 0) { + features.add(AMD64.CPUFeature.AVX); + } + if (config.useAVX > 1) { + features.add(AMD64.CPUFeature.AVX2); + } + if (config.useCountLeadingZerosInstruction) { + features.add(AMD64.CPUFeature.LZCNT); + } + if (config.usePopCountInstruction) { + features.add(AMD64.CPUFeature.POPCNT); + } + if (config.useAESIntrinsics) { + features.add(AMD64.CPUFeature.AES); + } + if (config.allocatePrefetchInstr == 3) { + features.add(AMD64.CPUFeature.AMD_3DNOW_PREFETCH); + } + + return new AMD64(features); } protected TargetDescription createTarget(HotSpotVMConfig config) { diff -r 3ce69f7364a7 -r 2c3b59f34619 graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java --- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Dec 16 17:18:18 2013 +0100 +++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/HotSpotVMConfig.java Mon Dec 16 09:31:19 2013 -0800 @@ -669,6 +669,7 @@ @HotSpotVMFlag(name = "UseTLAB") @Stable public boolean useTLAB; @HotSpotVMFlag(name = "UseBiasedLocking") @Stable public boolean useBiasedLocking; @HotSpotVMFlag(name = "UsePopCountInstruction") @Stable public boolean usePopCountInstruction; + @HotSpotVMFlag(name = "UseCountLeadingZerosInstruction") @Stable public boolean useCountLeadingZerosInstruction; @HotSpotVMFlag(name = "UseAESIntrinsics") @Stable public boolean useAESIntrinsics; @HotSpotVMFlag(name = "UseCRC32Intrinsics") @Stable public boolean useCRC32Intrinsics; @HotSpotVMFlag(name = "UseG1GC") @Stable public boolean useG1GC;