1 /* 2 * Copyright (c) 2012, 2015, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 */ 23 package jdk.vm.ci.hotspot.amd64; 24 25 import static jdk.vm.ci.inittimer.InitTimer.*; 26 27 import java.util.*; 28 29 import jdk.vm.ci.amd64.*; 30 import jdk.vm.ci.code.*; 31 import jdk.vm.ci.compiler.*; 32 import jdk.vm.ci.hotspot.*; 33 import jdk.vm.ci.inittimer.*; 34 import jdk.vm.ci.meta.*; 35 import jdk.vm.ci.runtime.*; 36 import jdk.vm.ci.service.*; 37 38 @ServiceProvider(HotSpotJVMCIBackendFactory.class) 39 public class AMD64HotSpotJVMCIBackendFactory implements HotSpotJVMCIBackendFactory { 40 41 protected EnumSet<AMD64.CPUFeature> computeFeatures(HotSpotVMConfig config) { 42 // Configure the feature set using the HotSpot flag settings. 43 EnumSet<AMD64.CPUFeature> features = EnumSet.noneOf(AMD64.CPUFeature.class); 44 if ((config.x86CPUFeatures & config.cpu3DNOWPREFETCH) != 0) { 45 features.add(AMD64.CPUFeature.AMD_3DNOW_PREFETCH); 46 } 47 assert config.useSSE >= 2 : "minimum config for x64"; 48 features.add(AMD64.CPUFeature.SSE); 49 features.add(AMD64.CPUFeature.SSE2); 50 if ((config.x86CPUFeatures & config.cpuSSE3) != 0) { 51 features.add(AMD64.CPUFeature.SSE3); 52 } 53 if ((config.x86CPUFeatures & config.cpuSSSE3) != 0) { 54 features.add(AMD64.CPUFeature.SSSE3); 55 } 56 if ((config.x86CPUFeatures & config.cpuSSE4A) != 0) { 57 features.add(AMD64.CPUFeature.SSE4A); 58 } 59 if ((config.x86CPUFeatures & config.cpuSSE41) != 0) { 60 features.add(AMD64.CPUFeature.SSE4_1); 61 } 62 if ((config.x86CPUFeatures & config.cpuSSE42) != 0) { 63 features.add(AMD64.CPUFeature.SSE4_2); 64 } 65 if ((config.x86CPUFeatures & config.cpuPOPCNT) != 0) { 66 features.add(AMD64.CPUFeature.POPCNT); 67 } 68 if ((config.x86CPUFeatures & config.cpuLZCNT) != 0) { 69 features.add(AMD64.CPUFeature.LZCNT); 70 } 71 if ((config.x86CPUFeatures & config.cpuAVX) != 0) { 72 features.add(AMD64.CPUFeature.AVX); 73 } 74 if ((config.x86CPUFeatures & config.cpuAVX2) != 0) { 75 features.add(AMD64.CPUFeature.AVX2); 76 } 77 if ((config.x86CPUFeatures & config.cpuAES) != 0) { 78 features.add(AMD64.CPUFeature.AES); 79 } 80 if ((config.x86CPUFeatures & config.cpuERMS) != 0) { 81 features.add(AMD64.CPUFeature.ERMS); 82 } 83 if ((config.x86CPUFeatures & config.cpuBMI1) != 0) { 84 features.add(AMD64.CPUFeature.BMI1); 85 } 86 return features; 87 } 88 89 protected EnumSet<AMD64.Flag> computeFlags(HotSpotVMConfig config) { 90 EnumSet<AMD64.Flag> flags = EnumSet.noneOf(AMD64.Flag.class); 91 if (config.useCountLeadingZerosInstruction) { 92 flags.add(AMD64.Flag.UseCountLeadingZerosInstruction); 93 } 94 if (config.useCountTrailingZerosInstruction) { 95 flags.add(AMD64.Flag.UseCountTrailingZerosInstruction); 96 } 97 return flags; 98 } 99 100 protected TargetDescription createTarget(HotSpotVMConfig config, CompilerFactory compilerFactory) { 101 final int stackFrameAlignment = 16; 102 final int implicitNullCheckLimit = 4096; 103 final boolean inlineObjects = true; 104 Architecture arch = new AMD64(computeFeatures(config), computeFlags(config)); 105 return new TargetDescription(compilerFactory.initializeArchitecture(arch), true, stackFrameAlignment, implicitNullCheckLimit, inlineObjects); 106 } 107 108 protected HotSpotConstantReflectionProvider createConstantReflection(HotSpotJVMCIRuntimeProvider runtime) { 109 return new HotSpotConstantReflectionProvider(runtime); 110 } 111 112 protected RegisterConfig createRegisterConfig(HotSpotJVMCIRuntimeProvider runtime, TargetDescription target) { 113 return new AMD64HotSpotRegisterConfig(target.arch, runtime.getConfig()); 114 } 115 116 protected HotSpotCodeCacheProvider createCodeCache(HotSpotJVMCIRuntimeProvider runtime, TargetDescription target, RegisterConfig regConfig) { 117 return new HotSpotCodeCacheProvider(runtime, runtime.getConfig(), target, regConfig); 118 } 119 120 protected HotSpotMetaAccessProvider createMetaAccess(HotSpotJVMCIRuntimeProvider runtime) { 121 return new HotSpotMetaAccessProvider(runtime); 122 } 123 124 @Override 125 public String getArchitecture() { 126 return "AMD64"; 127 } 128 129 @Override 130 public String toString() { 131 return "JVMCIBackend:" + getArchitecture(); 132 } 133 134 @SuppressWarnings("try") 135 public JVMCIBackend createJVMCIBackend(HotSpotJVMCIRuntimeProvider runtime, CompilerFactory compilerFactory, JVMCIBackend host) { 136 137 assert host == null; 138 TargetDescription target = createTarget(runtime.getConfig(), compilerFactory); 139 140 RegisterConfig regConfig; 141 HotSpotCodeCacheProvider codeCache; 142 ConstantReflectionProvider constantReflection; 143 HotSpotMetaAccessProvider metaAccess; 144 try (InitTimer t = timer("create providers")) { 145 try (InitTimer rt = timer("create MetaAccess provider")) { 146 metaAccess = createMetaAccess(runtime); 147 } 148 try (InitTimer rt = timer("create RegisterConfig")) { 149 regConfig = createRegisterConfig(runtime, target); 150 } 151 try (InitTimer rt = timer("create CodeCache provider")) { 152 codeCache = createCodeCache(runtime, target, regConfig); 153 } 154 try (InitTimer rt = timer("create ConstantReflection provider")) { 155 constantReflection = createConstantReflection(runtime); 156 } 157 } 158 try (InitTimer rt = timer("instantiate backend")) { 159 return createBackend(metaAccess, codeCache, constantReflection); 160 } 161 } 162 163 protected JVMCIBackend createBackend(HotSpotMetaAccessProvider metaAccess, HotSpotCodeCacheProvider codeCache, ConstantReflectionProvider constantReflection) { 164 return new JVMCIBackend(metaAccess, codeCache, constantReflection); 165 } 166 }