23 package com.oracle.graal.hotspot.amd64;
24
25 import static com.oracle.graal.hotspot.InitTimer.*;
26
27 import java.util.*;
28
29 import com.oracle.graal.amd64.*;
30 import com.oracle.graal.api.code.*;
31 import com.oracle.graal.api.meta.*;
32 import com.oracle.graal.api.replacements.*;
33 import com.oracle.graal.api.runtime.*;
34 import com.oracle.graal.hotspot.*;
35 import com.oracle.graal.hotspot.meta.*;
36 import com.oracle.graal.nodes.spi.*;
37 import com.oracle.graal.phases.util.*;
38
39 @ServiceProvider(HotSpotBackendFactory.class)
40 public class AMD64HotSpotBackendFactory implements HotSpotBackendFactory {
41
42 protected Architecture createArchitecture(HotSpotVMConfig config) {
43 return new AMD64(computeFeatures(config));
44 }
45
46 protected EnumSet<AMD64.CPUFeature> computeFeatures(HotSpotVMConfig config) {
47 // Configure the feature set using the HotSpot flag settings.
48 EnumSet<AMD64.CPUFeature> features = EnumSet.noneOf(AMD64.CPUFeature.class);
49 assert config.useSSE >= 2 : "minimum config for x64";
50 features.add(AMD64.CPUFeature.SSE);
51 features.add(AMD64.CPUFeature.SSE2);
52 if ((config.x86CPUFeatures & config.cpuSSE3) != 0) {
53 features.add(AMD64.CPUFeature.SSE3);
54 }
55 if ((config.x86CPUFeatures & config.cpuSSSE3) != 0) {
56 features.add(AMD64.CPUFeature.SSSE3);
57 }
58 if ((config.x86CPUFeatures & config.cpuSSE4A) != 0) {
59 features.add(AMD64.CPUFeature.SSE4a);
60 }
61 if ((config.x86CPUFeatures & config.cpuSSE41) != 0) {
62 features.add(AMD64.CPUFeature.SSE4_1);
63 }
74 features.add(AMD64.CPUFeature.ERMS);
75 }
76 if ((config.x86CPUFeatures & config.cpuLZCNT) != 0) {
77 features.add(AMD64.CPUFeature.LZCNT);
78 }
79 if ((config.x86CPUFeatures & config.cpuPOPCNT) != 0) {
80 features.add(AMD64.CPUFeature.POPCNT);
81 }
82 if ((config.x86CPUFeatures & config.cpuAES) != 0) {
83 features.add(AMD64.CPUFeature.AES);
84 }
85 if ((config.x86CPUFeatures & config.cpu3DNOWPREFETCH) != 0) {
86 features.add(AMD64.CPUFeature.AMD_3DNOW_PREFETCH);
87 }
88 if ((config.x86CPUFeatures & config.cpuBMI1) != 0) {
89 features.add(AMD64.CPUFeature.BMI1);
90 }
91 return features;
92 }
93
94 protected TargetDescription createTarget(HotSpotVMConfig config) {
95 final int stackFrameAlignment = 16;
96 final int implicitNullCheckLimit = 4096;
97 final boolean inlineObjects = true;
98 return new HotSpotTargetDescription(createArchitecture(config), true, stackFrameAlignment, implicitNullCheckLimit, inlineObjects);
99 }
100
101 @Override
102 public HotSpotBackend createBackend(HotSpotGraalRuntime runtime, HotSpotBackend host) {
103 assert host == null;
104 TargetDescription target = createTarget(runtime.getConfig());
105
106 HotSpotProviders providers;
107 HotSpotRegistersProvider registers;
108 RegisterConfig regConfig;
109 HotSpotCodeCacheProvider codeCache;
110 HotSpotConstantReflectionProvider constantReflection;
111 HotSpotHostForeignCallsProvider foreignCalls;
112 Value[] nativeABICallerSaveRegisters;
113 HotSpotMetaAccessProvider metaAccess;
|
23 package com.oracle.graal.hotspot.amd64;
24
25 import static com.oracle.graal.hotspot.InitTimer.*;
26
27 import java.util.*;
28
29 import com.oracle.graal.amd64.*;
30 import com.oracle.graal.api.code.*;
31 import com.oracle.graal.api.meta.*;
32 import com.oracle.graal.api.replacements.*;
33 import com.oracle.graal.api.runtime.*;
34 import com.oracle.graal.hotspot.*;
35 import com.oracle.graal.hotspot.meta.*;
36 import com.oracle.graal.nodes.spi.*;
37 import com.oracle.graal.phases.util.*;
38
39 @ServiceProvider(HotSpotBackendFactory.class)
40 public class AMD64HotSpotBackendFactory implements HotSpotBackendFactory {
41
42 protected Architecture createArchitecture(HotSpotVMConfig config) {
43 return new AMD64(computeFeatures(config), computeFlags(config));
44 }
45
46 protected EnumSet<AMD64.CPUFeature> computeFeatures(HotSpotVMConfig config) {
47 // Configure the feature set using the HotSpot flag settings.
48 EnumSet<AMD64.CPUFeature> features = EnumSet.noneOf(AMD64.CPUFeature.class);
49 assert config.useSSE >= 2 : "minimum config for x64";
50 features.add(AMD64.CPUFeature.SSE);
51 features.add(AMD64.CPUFeature.SSE2);
52 if ((config.x86CPUFeatures & config.cpuSSE3) != 0) {
53 features.add(AMD64.CPUFeature.SSE3);
54 }
55 if ((config.x86CPUFeatures & config.cpuSSSE3) != 0) {
56 features.add(AMD64.CPUFeature.SSSE3);
57 }
58 if ((config.x86CPUFeatures & config.cpuSSE4A) != 0) {
59 features.add(AMD64.CPUFeature.SSE4a);
60 }
61 if ((config.x86CPUFeatures & config.cpuSSE41) != 0) {
62 features.add(AMD64.CPUFeature.SSE4_1);
63 }
74 features.add(AMD64.CPUFeature.ERMS);
75 }
76 if ((config.x86CPUFeatures & config.cpuLZCNT) != 0) {
77 features.add(AMD64.CPUFeature.LZCNT);
78 }
79 if ((config.x86CPUFeatures & config.cpuPOPCNT) != 0) {
80 features.add(AMD64.CPUFeature.POPCNT);
81 }
82 if ((config.x86CPUFeatures & config.cpuAES) != 0) {
83 features.add(AMD64.CPUFeature.AES);
84 }
85 if ((config.x86CPUFeatures & config.cpu3DNOWPREFETCH) != 0) {
86 features.add(AMD64.CPUFeature.AMD_3DNOW_PREFETCH);
87 }
88 if ((config.x86CPUFeatures & config.cpuBMI1) != 0) {
89 features.add(AMD64.CPUFeature.BMI1);
90 }
91 return features;
92 }
93
94 protected EnumSet<AMD64.Flag> computeFlags(HotSpotVMConfig config) {
95 EnumSet<AMD64.Flag> flags = EnumSet.noneOf(AMD64.Flag.class);
96 if (config.useCountLeadingZerosInstruction) {
97 flags.add(AMD64.Flag.UseCountLeadingZerosInstruction);
98 }
99 if (config.useCountTrailingZerosInstruction) {
100 flags.add(AMD64.Flag.UseCountTrailingZerosInstruction);
101 }
102 return flags;
103 }
104
105 protected TargetDescription createTarget(HotSpotVMConfig config) {
106 final int stackFrameAlignment = 16;
107 final int implicitNullCheckLimit = 4096;
108 final boolean inlineObjects = true;
109 return new HotSpotTargetDescription(createArchitecture(config), true, stackFrameAlignment, implicitNullCheckLimit, inlineObjects);
110 }
111
112 @Override
113 public HotSpotBackend createBackend(HotSpotGraalRuntime runtime, HotSpotBackend host) {
114 assert host == null;
115 TargetDescription target = createTarget(runtime.getConfig());
116
117 HotSpotProviders providers;
118 HotSpotRegistersProvider registers;
119 RegisterConfig regConfig;
120 HotSpotCodeCacheProvider codeCache;
121 HotSpotConstantReflectionProvider constantReflection;
122 HotSpotHostForeignCallsProvider foreignCalls;
123 Value[] nativeABICallerSaveRegisters;
124 HotSpotMetaAccessProvider metaAccess;
|