src/cpu/mips/vm/vm_version_mips.cpp

Wed, 17 May 2017 03:46:25 -0400

author
aoqi
date
Wed, 17 May 2017 03:46:25 -0400
changeset 409
674542ea38ff
parent 393
671cd2b861b4
child 6880
52ea28d233d2
permissions
-rw-r--r--

#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 }

mercurial