src/cpu/mips/vm/vm_version_mips.cpp

Tue, 28 May 2019 16:35:59 +0800

author
aoqi
date
Tue, 28 May 2019 16:35:59 +0800
changeset 9578
191e90d9878f
parent 9459
814e9e335067
child 9639
38d2ba487173
permissions
-rw-r--r--

#9224 Backport of #9173 Refactor read_cpu_info and supported 3A4000/3B4000
Reviewed-by: jiefu

aoqi@1 1 /*
aoqi@1 2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
aoqi@9459 3 * Copyright (c) 2015, 2019, Loongson Technology. All rights reserved.
aoqi@1 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@1 5 *
aoqi@1 6 * This code is free software; you can redistribute it and/or modify it
aoqi@1 7 * under the terms of the GNU General Public License version 2 only, as
aoqi@1 8 * published by the Free Software Foundation.
aoqi@1 9 *
aoqi@1 10 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@1 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@1 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@1 13 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@1 14 * accompanied this code).
aoqi@1 15 *
aoqi@1 16 * You should have received a copy of the GNU General Public License version
aoqi@1 17 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@1 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@1 19 *
aoqi@1 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@1 21 * or visit www.oracle.com if you need additional information or have any
aoqi@1 22 * questions.
aoqi@1 23 *
aoqi@1 24 */
aoqi@1 25
aoqi@1 26 #include "precompiled.hpp"
aoqi@1 27 #include "asm/macroAssembler.hpp"
aoqi@1 28 #include "asm/macroAssembler.inline.hpp"
aoqi@1 29 #include "memory/resourceArea.hpp"
aoqi@1 30 #include "runtime/java.hpp"
aoqi@1 31 #include "runtime/stubCodeGenerator.hpp"
aoqi@1 32 #include "vm_version_mips.hpp"
aoqi@1 33 #ifdef TARGET_OS_FAMILY_linux
aoqi@1 34 # include "os_linux.inline.hpp"
aoqi@1 35 #endif
aoqi@1 36 #ifdef TARGET_OS_FAMILY_solaris
aoqi@1 37 # include "os_solaris.inline.hpp"
aoqi@1 38 #endif
aoqi@1 39 #ifdef TARGET_OS_FAMILY_windows
aoqi@1 40 # include "os_windows.inline.hpp"
aoqi@1 41 #endif
aoqi@1 42 #ifdef TARGET_OS_FAMILY_bsd
aoqi@1 43 # include "os_bsd.inline.hpp"
aoqi@1 44 #endif
aoqi@1 45 int VM_Version::_features = VM_Version::unknown_m;
aoqi@1 46 const char* VM_Version::_features_str = "";
aoqi@1 47 void VM_Version::initialize() {
chenhaoxuan@358 48
fujie@254 49 _features = determine_features();
fujie@254 50 //no need, Abstract_VM_Version already define it as false
fujie@254 51 _supports_cx8 = true;
chenhaoxuan@358 52
chenhaoxuan@358 53 //////////////////////add some other feature here//////////////////
fujie@8014 54
fujie@8014 55 if (UseG1GC && FLAG_IS_DEFAULT(MaxGCPauseMillis)) {
fujie@8014 56 FLAG_SET_CMDLINE(uintx, MaxGCPauseMillis, 650);
fujie@8014 57 }
fujie@8014 58
aoqi@203 59 #ifdef COMPILER2
aoqi@209 60 if (MaxVectorSize > 0) {
aoqi@209 61 if (!is_power_of_2(MaxVectorSize)) {
aoqi@209 62 warning("MaxVectorSize must be a power of 2");
aoqi@209 63 MaxVectorSize = 8;
aoqi@209 64 }
aoqi@209 65 if (MaxVectorSize > 0 && supports_ps()) {
aoqi@209 66 MaxVectorSize = 8;
aoqi@209 67 }
aoqi@209 68 }
aoqi@9459 69 //
aoqi@9459 70 // Vector optimization of MIPS works in most cases, but cannot pass hotspot/test/compiler/6340864/TestFloatVect.java.
aoqi@9459 71 // Vector optimization was closed by default.
aoqi@9459 72 // The reasons:
aoqi@9459 73 // 1. The kernel does not have emulation of PS instructions yet, so the emulation of PS instructions must be done in JVM, see JVM_handle_linux_signal.
aoqi@9459 74 // 2. It seems the gcc4.4.7 had some bug related to ucontext_t, which is used in signal handler to emulate PS instructions.
aoqi@9459 75 //
aoqi@409 76 if (FLAG_IS_DEFAULT(MaxVectorSize)) {
aoqi@409 77 MaxVectorSize = 0;
aoqi@409 78 }
chenhaoxuan@358 79
chenhaoxuan@358 80 if (is_gs464e()) {
huangxuguang@9155 81 if (FLAG_IS_DEFAULT(UseCountTrailingZerosInstructionMIPS64)) {
huangxuguang@9155 82 FLAG_SET_DEFAULT(UseCountTrailingZerosInstructionMIPS64, 1);
chenhaoxuan@358 83 }
huangxuguang@9155 84 } else if (UseCountTrailingZerosInstructionMIPS64) {
huangxuguang@9155 85 if (!FLAG_IS_DEFAULT(UseCountTrailingZerosInstructionMIPS64))
huangxuguang@9155 86 warning("Only 3A2000/3000 CPUs support UseCountTrailingZerosInstructionMIPS64");
huangxuguang@9155 87 FLAG_SET_DEFAULT(UseCountTrailingZerosInstructionMIPS64, 0);
chenhaoxuan@358 88 }
aoqi@203 89 #endif
aoqi@209 90 UseSSE = 0; // Only on x86 and x64
fujie@254 91
chenhaoxuan@358 92 if (is_loongson()) {
chenhaoxuan@358 93 if (FLAG_IS_DEFAULT(UseLoongsonISA)) {
chenhaoxuan@358 94 FLAG_SET_DEFAULT(UseLoongsonISA, 1);
chenhaoxuan@358 95 }
chenhaoxuan@358 96 } else if (UseLoongsonISA) {
chenhaoxuan@358 97 if (!FLAG_IS_DEFAULT(UseLoongsonISA))
chenhaoxuan@358 98 warning("Only Loongson CPUs support LoongISA");
chenhaoxuan@358 99 FLAG_SET_DEFAULT(UseLoongsonISA, 0);
chenhaoxuan@358 100 }
chenhaoxuan@358 101
chenhaoxuan@358 102 if (is_gs464e()) {
chenhaoxuan@358 103 if (FLAG_IS_DEFAULT(Use3A2000)) {
chenhaoxuan@358 104 FLAG_SET_DEFAULT(Use3A2000, 1);
chenhaoxuan@358 105 }
chenhaoxuan@358 106 } else if (Use3A2000) {
chenhaoxuan@358 107 if (!FLAG_IS_DEFAULT(Use3A2000))
chenhaoxuan@358 108 warning("Only 3A2000/3000 CPUs support this option");
chenhaoxuan@358 109 FLAG_SET_DEFAULT(Use3A2000, 0);
chenhaoxuan@358 110 }
chenhaoxuan@358 111
aoqi@8019 112 if (is_gs464()) {
aoqi@8019 113 if (FLAG_IS_DEFAULT(UseSyncLevel)) {
aoqi@8019 114 FLAG_SET_DEFAULT(UseSyncLevel, 1000);
aoqi@8019 115 }
aoqi@8019 116 }
aoqi@8019 117
aoqi@9578 118 if (is_gs464e() || is_gs464v()) {
aoqi@8019 119 if (FLAG_IS_DEFAULT(UseSyncLevel)) {
aoqi@8019 120 FLAG_SET_DEFAULT(UseSyncLevel, 2000);
aoqi@8019 121 }
aoqi@8019 122 }
aoqi@8019 123
aoqi@392 124 if (TieredCompilation) {
aoqi@392 125 if (!FLAG_IS_DEFAULT(TieredCompilation))
aoqi@392 126 warning("TieredCompilation not supported");
aoqi@392 127 FLAG_SET_DEFAULT(TieredCompilation, false);
aoqi@392 128 }
aoqi@392 129
chenhaoxuan@358 130 char buf[256];
aoqi@9578 131 bool is_unknown_loongson_cpu = is_loongson() && !is_gs464() && !is_gs464e() && !is_gs464v() && !is_gs264();
aoqi@9578 132 jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s%s%s, UseSyncLevel:%d",
aoqi@9578 133 (has_l2_cache() ? ", has_l2_cache" : ""),
aoqi@9578 134 (has_16k_page() ? ", has_16k_page" : ""),
aoqi@9578 135 (is_loongson() ? ", MIPS-compatible Loongson CPU" : "MIPS"),
aoqi@9578 136 (is_gs464() ? ", GS464 (3A1000/3B1500)" : ""),
aoqi@9578 137 (is_gs464e() ? ", GS464E (3A2000/3A3000/3B2000/3B3000)" : ""),
aoqi@9578 138 (is_gs464v() ? ", GS464V (3A4000/3B4000)" : ""),
aoqi@9578 139 (is_gs264() ? ", GS264 (2K1000)" : ""),
aoqi@9578 140 (is_unknown_loongson_cpu ? ", Unknown Loongson CPU" : ""),
aoqi@9578 141 (UseLoongsonISA ? ", UseLoongsonISA" : ""),
huangxuguang@9155 142 (UseCountTrailingZerosInstructionMIPS64 ? ", UseCountTrailingZerosInstructionMIPS64" : ""),
aoqi@9578 143 (Use3A2000 ? ", Use3A2000" : ""),
aoqi@9578 144 UseSyncLevel);
chenhaoxuan@358 145
chenhaoxuan@358 146 // buf is started with ", " or is empty
chenhaoxuan@358 147 _features_str = strdup(strlen(buf) > 2 ? buf + 2 : buf);
chenhaoxuan@358 148
fujie@254 149 if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) {
fujie@254 150 FLAG_SET_DEFAULT(AllocatePrefetchStyle, 1);
fujie@254 151 }
fujie@254 152
fujie@254 153 if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) {
fujie@254 154 FLAG_SET_DEFAULT(AllocatePrefetchLines, 1);
fujie@254 155 }
fujie@254 156
fujie@254 157 if (FLAG_IS_DEFAULT(AllocatePrefetchStepSize)) {
fujie@254 158 FLAG_SET_DEFAULT(AllocatePrefetchStepSize, 64);
fujie@254 159 }
chenhaoxuan@358 160
fujie@254 161 if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
fujie@254 162 FLAG_SET_DEFAULT(AllocatePrefetchDistance, 64);
fujie@254 163 }
fujie@254 164
fujie@254 165 if (FLAG_IS_DEFAULT(AllocateInstancePrefetchLines)) {
fujie@254 166 FLAG_SET_DEFAULT(AllocateInstancePrefetchLines, 1);
fujie@254 167 }
fujie@254 168
huangxuguang@9150 169 if (UseSHA) {
huangxuguang@9150 170 warning("SHA instructions are not available on this CPU");
huangxuguang@9150 171 FLAG_SET_DEFAULT(UseSHA, false);
huangxuguang@9150 172 }
huangxuguang@9150 173
huangxuguang@9150 174 if (UseSHA1Intrinsics || UseSHA256Intrinsics || UseSHA512Intrinsics) {
huangxuguang@9150 175 warning("SHA intrinsics are not available on this CPU");
huangxuguang@9150 176 FLAG_SET_DEFAULT(UseSHA1Intrinsics, false);
huangxuguang@9150 177 FLAG_SET_DEFAULT(UseSHA256Intrinsics, false);
huangxuguang@9150 178 FLAG_SET_DEFAULT(UseSHA512Intrinsics, false);
huangxuguang@9150 179 }
huangxuguang@9150 180
fujie@254 181 NOT_PRODUCT( if (PrintMiscellaneous && Verbose) print_features(); );
aoqi@1 182 }
aoqi@1 183
aoqi@1 184 void VM_Version::print_features() {
aoqi@9578 185 tty->print_cr("Version: %s", cpu_features());
aoqi@1 186 }
aoqi@1 187
aoqi@1 188 int VM_Version::determine_features() {
chenhaoxuan@358 189 //////////////////////add some other feature here//////////////////
chenhaoxuan@358 190 int features = platform_features(unknown_m);
aoqi@6880 191 //spt_16k_page_m;
chenhaoxuan@358 192 return features;
aoqi@1 193 }
aoqi@1 194
aoqi@1 195 static int saved_features = 0;
aoqi@1 196
aoqi@1 197 void VM_Version::allow_all() {
chenhaoxuan@358 198 saved_features = _features;
chenhaoxuan@358 199 _features = all_features_m;
aoqi@1 200 }
aoqi@1 201
aoqi@1 202 void VM_Version::revert() {
chenhaoxuan@358 203 _features = saved_features;
aoqi@1 204 }

mercurial