1 // Copyright 2011 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_MIPS
6 
7 #include "src/codegen/mips/constants-mips.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", "at", "v0", "v1", "a0", "a1", "a2", "a3", "t0",
19     "t1",       "t2", "t3", "t4", "t5", "t6", "t7", "s0", "s1",
20     "s2",       "s3", "s4", "s5", "s6", "s7", "t8", "t9", "k0",
21     "k1",       "gp", "sp", "fp", "ra", "LO", "HI", "pc"};
22 
23 // List of alias names which can be used when referring to MIPS registers.
24 const Registers::RegisterAlias Registers::aliases_[] = {
25     {0, "zero"},
26     {23, "cp"},
27     {30, "s8"},
28     {30, "s8_fp"},
29     {kInvalidRegister, nullptr}};
30 
Name(int reg)31 const char* Registers::Name(int reg) {
32   const char* result;
33   if ((0 <= reg) && (reg < kNumSimuRegisters)) {
34     result = names_[reg];
35   } else {
36     result = "noreg";
37   }
38   return result;
39 }
40 
Number(const char * name)41 int Registers::Number(const char* name) {
42   // Look through the canonical names.
43   for (int i = 0; i < kNumSimuRegisters; i++) {
44     if (strcmp(names_[i], name) == 0) {
45       return i;
46     }
47   }
48 
49   // Look through the alias names.
50   int i = 0;
51   while (aliases_[i].reg != kInvalidRegister) {
52     if (strcmp(aliases_[i].name, name) == 0) {
53       return aliases_[i].reg;
54     }
55     i++;
56   }
57 
58   // No register with the reguested name found.
59   return kInvalidRegister;
60 }
61 
62 const char* FPURegisters::names_[kNumFPURegisters] = {
63     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",  "f8",  "f9",  "f10",
64     "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
65     "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"};
66 
67 // List of alias names which can be used when referring to MIPS registers.
68 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
69     {kInvalidRegister, nullptr}};
70 
Name(int creg)71 const char* FPURegisters::Name(int creg) {
72   const char* result;
73   if ((0 <= creg) && (creg < kNumFPURegisters)) {
74     result = names_[creg];
75   } else {
76     result = "nocreg";
77   }
78   return result;
79 }
80 
Number(const char * name)81 int FPURegisters::Number(const char* name) {
82   // Look through the canonical names.
83   for (int i = 0; i < kNumFPURegisters; i++) {
84     if (strcmp(names_[i], name) == 0) {
85       return i;
86     }
87   }
88 
89   // Look through the alias names.
90   int i = 0;
91   while (aliases_[i].creg != kInvalidRegister) {
92     if (strcmp(aliases_[i].name, name) == 0) {
93       return aliases_[i].creg;
94     }
95     i++;
96   }
97 
98   // No Cregister with the reguested name found.
99   return kInvalidFPURegister;
100 }
101 
102 const char* MSARegisters::names_[kNumMSARegisters] = {
103     "w0",  "w1",  "w2",  "w3",  "w4",  "w5",  "w6",  "w7",  "w8",  "w9",  "w10",
104     "w11", "w12", "w13", "w14", "w15", "w16", "w17", "w18", "w19", "w20", "w21",
105     "w22", "w23", "w24", "w25", "w26", "w27", "w28", "w29", "w30", "w31"};
106 
107 const MSARegisters::RegisterAlias MSARegisters::aliases_[] = {
108     {kInvalidRegister, nullptr}};
109 
Name(int creg)110 const char* MSARegisters::Name(int creg) {
111   const char* result;
112   if ((0 <= creg) && (creg < kNumMSARegisters)) {
113     result = names_[creg];
114   } else {
115     result = "nocreg";
116   }
117   return result;
118 }
119 
Number(const char * name)120 int MSARegisters::Number(const char* name) {
121   // Look through the canonical names.
122   for (int i = 0; i < kNumMSARegisters; i++) {
123     if (strcmp(names_[i], name) == 0) {
124       return i;
125     }
126   }
127 
128   // Look through the alias names.
129   int i = 0;
130   while (aliases_[i].creg != kInvalidRegister) {
131     if (strcmp(aliases_[i].name, name) == 0) {
132       return aliases_[i].creg;
133     }
134     i++;
135   }
136 
137   // No Cregister with the reguested name found.
138   return kInvalidMSARegister;
139 }
140 
141 }  // namespace internal
142 }  // namespace v8
143 
144 #endif  // V8_TARGET_ARCH_MIPS
145