1 /*
 2  * Copyright (c) 1997, 2020, Oracle and/or its affiliates. All rights reserved.
 3  * Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
 4  * Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
 5  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 6  *
 7  * This code is free software; you can redistribute it and/or modify it
 8  * under the terms of the GNU General Public License version 2 only, as
 9  * published by the Free Software Foundation.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  *
25  */
26 
27 #ifndef CPU_RISCV_VM_VERSION_RISCV_HPP
28 #define CPU_RISCV_VM_VERSION_RISCV_HPP
29 
30 #include "runtime/abstract_vm_version.hpp"
31 #include "runtime/arguments.hpp"
32 #include "runtime/globals_extension.hpp"
33 #include "utilities/sizes.hpp"
34 
35 class VM_Version : public Abstract_VM_Version {
36 #ifdef COMPILER2
37 private:
38   static void c2_initialize();
39 #endif // COMPILER2
40 
41 protected:
42   static const char* _uarch;
43   static uint32_t _initial_vector_length;
44   static void get_os_cpu_info();
45   static uint32_t get_current_vector_length();
46 
47 public:
48   // Initialization
49   static void initialize();
50 
51   constexpr static bool supports_stack_watermark_barrier() { return true; }
52 
53   enum Feature_Flag {
54 #define CPU_FEATURE_FLAGS(decl)               \
55     decl(I,            "i",            8)     \
56     decl(M,            "m",           12)     \
57     decl(A,            "a",            0)     \
58     decl(F,            "f",            5)     \
59     decl(D,            "d",            3)     \
60     decl(C,            "c",            2)     \
61     decl(V,            "v",           21)     \
62     decl(B,            "b",            1)
63 
64 #define DECLARE_CPU_FEATURE_FLAG(id, name, bit) CPU_##id = (1 << bit),
65     CPU_FEATURE_FLAGS(DECLARE_CPU_FEATURE_FLAG)
66 #undef DECLARE_CPU_FEATURE_FLAG
67   };
68 
69   static void initialize_cpu_information(void);
70 };
71 
72 #endif // CPU_RISCV_VM_VERSION_RISCV_HPP