1 // Copyright 2021 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #if V8_TARGET_ARCH_LOONG64
6
7 #include "src/codegen/loong64/constants-loong64.h"
8
9 namespace v8 {
10 namespace internal {
11
12 // -----------------------------------------------------------------------------
13 // Registers.
14
15 // These register names are defined in a way to match the native disassembler
16 // formatting. See for example the command "objdump -d <binary file>".
17 const char* Registers::names_[kNumSimuRegisters] = {
18 "zero_reg", "ra", "tp", "sp", "a0", "a1", "a2", "a3", "a4", "a5", "a6",
19 "a7", "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "x_reg",
20 "fp", "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "pc"};
21
22 // List of alias names which can be used when referring to registers.
23 const Registers::RegisterAlias Registers::aliases_[] = {
24 {0, "zero"}, {30, "cp"}, {kInvalidRegister, nullptr}};
25
Name(int reg)26 const char* Registers::Name(int reg) {
27 const char* result;
28 if ((0 <= reg) && (reg < kNumSimuRegisters)) {
29 result = names_[reg];
30 } else {
31 result = "noreg";
32 }
33 return result;
34 }
35
Number(const char * name)36 int Registers::Number(const char* name) {
37 // Look through the canonical names.
38 for (int i = 0; i < kNumSimuRegisters; i++) {
39 if (strcmp(names_[i], name) == 0) {
40 return i;
41 }
42 }
43
44 // Look through the alias names.
45 int i = 0;
46 while (aliases_[i].reg != kInvalidRegister) {
47 if (strcmp(aliases_[i].name, name) == 0) {
48 return aliases_[i].reg;
49 }
50 i++;
51 }
52
53 // No register with the reguested name found.
54 return kInvalidRegister;
55 }
56
57 const char* FPURegisters::names_[kNumFPURegisters] = {
58 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10",
59 "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
60 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"};
61
62 // List of alias names which can be used when referring to LoongArch registers.
63 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
64 {kInvalidRegister, nullptr}};
65
Name(int creg)66 const char* FPURegisters::Name(int creg) {
67 const char* result;
68 if ((0 <= creg) && (creg < kNumFPURegisters)) {
69 result = names_[creg];
70 } else {
71 result = "nocreg";
72 }
73 return result;
74 }
75
Number(const char * name)76 int FPURegisters::Number(const char* name) {
77 // Look through the canonical names.
78 for (int i = 0; i < kNumFPURegisters; i++) {
79 if (strcmp(names_[i], name) == 0) {
80 return i;
81 }
82 }
83
84 // Look through the alias names.
85 int i = 0;
86 while (aliases_[i].creg != kInvalidRegister) {
87 if (strcmp(aliases_[i].name, name) == 0) {
88 return aliases_[i].creg;
89 }
90 i++;
91 }
92
93 // No Cregister with the reguested name found.
94 return kInvalidFPURegister;
95 }
96
97 } // namespace internal
98 } // namespace v8
99
100 #endif // V8_TARGET_ARCH_LOONG64
101