Wed, 17 May 2017 03:46:25 -0400
#5481 Vector optimization was not used by default.
Vector optimization of MIPS works in most cases, but cannot pass hotspot/test/compiler/6340864/TestFloatVect.java.
The reasons:
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.
2. It seems the gcc4.4.7 had some bug related to ucontext_t, which is used in signal handler to emulate PS instructions.
use java -XX:MaxVectorSize=8 to enable Vector optimization.
1 /*
2 * Copyright (c) 1997, 2014, Oracle and/or its affiliates. All rights reserved.
3 * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved.
4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
5 *
6 * This code is free software; you can redistribute it and/or modify it
7 * under the terms of the GNU General Public License version 2 only, as
8 * published by the Free Software Foundation.
9 *
10 * This code is distributed in the hope that it will be useful, but WITHOUT
11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 * version 2 for more details (a copy is included in the LICENSE file that
14 * accompanied this code).
15 *
16 * You should have received a copy of the GNU General Public License version
17 * 2 along with this work; if not, write to the Free Software Foundation,
18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
19 *
20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
21 * or visit www.oracle.com if you need additional information or have any
22 * questions.
23 *
24 */
26 #include "precompiled.hpp"
27 #include "asm/macroAssembler.hpp"
28 #include "asm/macroAssembler.inline.hpp"
29 #include "memory/resourceArea.hpp"
30 #include "runtime/java.hpp"
31 #include "runtime/stubCodeGenerator.hpp"
32 #include "vm_version_mips.hpp"
33 #ifdef TARGET_OS_FAMILY_linux
34 # include "os_linux.inline.hpp"
35 #endif
36 #ifdef TARGET_OS_FAMILY_solaris
37 # include "os_solaris.inline.hpp"
38 #endif
39 #ifdef TARGET_OS_FAMILY_windows
40 # include "os_windows.inline.hpp"
41 #endif
42 #ifdef TARGET_OS_FAMILY_bsd
43 # include "os_bsd.inline.hpp"
44 #endif
45 /*
46 int VM_Version::_cpu;
47 int VM_Version::_model;
48 int VM_Version::_stepping;
49 int VM_Version::_cpuFeatures;
50 const char* VM_Version::_features_str = "";
51 VM_Version::CpuidInfo VM_Version::_cpuid_info = { 0, };
53 static BufferBlob* stub_blob;
54 static const int stub_size = 300;
56 extern "C" {
57 typedef void (*getPsrInfo_stub_t)(void*);
58 }
59 static getPsrInfo_stub_t getPsrInfo_stub = NULL;
60 */
61 int VM_Version::_features = VM_Version::unknown_m;
62 const char* VM_Version::_features_str = "";
63 /*
64 class VM_Version_StubGenerator: public StubCodeGenerator {
65 public:
67 VM_Version_StubGenerator(CodeBuffer *c) : StubCodeGenerator(c) {}
69 address generate_getPsrInfo() {
70 };
71 };
74 void VM_Version::get_processor_features() {
75 }
76 */
77 void VM_Version::initialize() {
79 _features = determine_features();
80 //no need, Abstract_VM_Version already define it as false
81 _supports_cx8 = true;
83 //////////////////////add some other feature here//////////////////
84 #ifdef COMPILER2
85 if (MaxVectorSize > 0) {
86 if (!is_power_of_2(MaxVectorSize)) {
87 warning("MaxVectorSize must be a power of 2");
88 MaxVectorSize = 8;
89 }
90 if (MaxVectorSize > 0 && supports_ps()) {
91 MaxVectorSize = 8;
92 }
93 }
94 /*
95 *
96 * 2017/5/17:
97 * Vector optimization of MIPS works in most cases, but cannot pass hotspot/test/compiler/6340864/TestFloatVect.java.
98 * Vector optimization was closed by default.
99 * The reasons:
100 * 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.
101 * 2. It seems the gcc4.4.7 had some bug related to ucontext_t, which is used in signal handler to emulate PS instructions.
102 */
103 if (FLAG_IS_DEFAULT(MaxVectorSize)) {
104 MaxVectorSize = 0;
105 }
107 if (is_gs464e()) {
108 if (FLAG_IS_DEFAULT(UseCountTrailingZerosInstruction)) {
109 FLAG_SET_DEFAULT(UseCountTrailingZerosInstruction, 1);
110 }
111 } else if (UseCountTrailingZerosInstruction) {
112 if (!FLAG_IS_DEFAULT(UseCountTrailingZerosInstruction))
113 warning("Only 3A2000/3000 CPUs support UseCountTrailingZerosInstruction");
114 FLAG_SET_DEFAULT(UseCountTrailingZerosInstruction, 0);
115 }
116 #endif
117 UseSSE = 0; // Only on x86 and x64
119 if (is_loongson()) {
120 if (FLAG_IS_DEFAULT(UseLoongsonISA)) {
121 FLAG_SET_DEFAULT(UseLoongsonISA, 1);
122 }
123 } else if (UseLoongsonISA) {
124 if (!FLAG_IS_DEFAULT(UseLoongsonISA))
125 warning("Only Loongson CPUs support LoongISA");
126 FLAG_SET_DEFAULT(UseLoongsonISA, 0);
127 }
129 if (is_gs464e()) {
130 if (FLAG_IS_DEFAULT(Use3A2000)) {
131 FLAG_SET_DEFAULT(Use3A2000, 1);
132 }
133 } else if (Use3A2000) {
134 if (!FLAG_IS_DEFAULT(Use3A2000))
135 warning("Only 3A2000/3000 CPUs support this option");
136 FLAG_SET_DEFAULT(Use3A2000, 0);
137 }
139 if (TieredCompilation) {
140 if (!FLAG_IS_DEFAULT(TieredCompilation))
141 warning("TieredCompilation not supported");
142 FLAG_SET_DEFAULT(TieredCompilation, false);
143 }
145 if (UseG1GC) {
146 if (!FLAG_IS_DEFAULT(UseG1GC))
147 warning("UseG1GC not supported");
148 FLAG_SET_DEFAULT(UseG1GC, false);
149 }
151 char buf[256];
152 jio_snprintf(buf, sizeof(buf), "%s%s%s%s%s%s%s%s%s",
153 (has_l2_cache() ? ", has_l2_cache" : ""),
154 (has_16k_page() ? ", has_16k_page" : ""),
155 (is_loongson() ? ", on_loongson" : ""),
156 (is_gs464() ? ", 3A1000" : ""),
157 (is_gs464v() ? ", 3B1500" : "" ),
158 (is_gs464e() ? ", 3A2000/3A3000" : ""),
159 (UseLoongsonISA ? ", UseLoongsonISA" : ""),
160 (UseCountTrailingZerosInstruction ? ", UseCountTrailingZerosInstruction" : ""),
161 (Use3A2000 ? ", Use3A2000" : ""));
163 // buf is started with ", " or is empty
164 _features_str = strdup(strlen(buf) > 2 ? buf + 2 : buf);
166 if (FLAG_IS_DEFAULT(AllocatePrefetchStyle)) {
167 FLAG_SET_DEFAULT(AllocatePrefetchStyle, 1);
168 }
170 if (FLAG_IS_DEFAULT(AllocatePrefetchLines)) {
171 FLAG_SET_DEFAULT(AllocatePrefetchLines, 1);
172 }
174 if (FLAG_IS_DEFAULT(AllocatePrefetchStepSize)) {
175 FLAG_SET_DEFAULT(AllocatePrefetchStepSize, 64);
176 }
178 if (FLAG_IS_DEFAULT(AllocatePrefetchDistance)) {
179 FLAG_SET_DEFAULT(AllocatePrefetchDistance, 64);
180 }
182 if (FLAG_IS_DEFAULT(AllocateInstancePrefetchLines)) {
183 FLAG_SET_DEFAULT(AllocateInstancePrefetchLines, 1);
184 }
186 NOT_PRODUCT( if (PrintMiscellaneous && Verbose) print_features(); );
187 }
189 void VM_Version::print_features() {
190 tty->print_cr("Version:%s", cpu_features());
191 }
193 int VM_Version::determine_features() {
194 //////////////////////add some other feature here//////////////////
195 int features = platform_features(unknown_m);
196 //spt_16k_page_m;
197 return features;
198 }
200 static int saved_features = 0;
202 void VM_Version::allow_all() {
203 saved_features = _features;
204 _features = all_features_m;
205 }
207 void VM_Version::revert() {
208 _features = saved_features;
209 }