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/mips/constants-mips.h"
8
9 namespace v8 {
10 namespace internal {
11
12
13 // -----------------------------------------------------------------------------
14 // Registers.
15
16
17 // These register names are defined in a way to match the native disassembler
18 // formatting. See for example the command "objdump -d <binary file>".
19 const char* Registers::names_[kNumSimuRegisters] = {
20 "zero_reg",
21 "at",
22 "v0", "v1",
23 "a0", "a1", "a2", "a3",
24 "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7",
25 "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
26 "t8", "t9",
27 "k0", "k1",
28 "gp",
29 "sp",
30 "fp",
31 "ra",
32 "LO", "HI",
33 "pc"
34 };
35
36
37 // List of alias names which can be used when referring to MIPS registers.
38 const Registers::RegisterAlias Registers::aliases_[] = {
39 {0, "zero"},
40 {23, "cp"},
41 {30, "s8"},
42 {30, "s8_fp"},
43 {kInvalidRegister, NULL}
44 };
45
46
Name(int reg)47 const char* Registers::Name(int reg) {
48 const char* result;
49 if ((0 <= reg) && (reg < kNumSimuRegisters)) {
50 result = names_[reg];
51 } else {
52 result = "noreg";
53 }
54 return result;
55 }
56
57
Number(const char * name)58 int Registers::Number(const char* name) {
59 // Look through the canonical names.
60 for (int i = 0; i < kNumSimuRegisters; i++) {
61 if (strcmp(names_[i], name) == 0) {
62 return i;
63 }
64 }
65
66 // Look through the alias names.
67 int i = 0;
68 while (aliases_[i].reg != kInvalidRegister) {
69 if (strcmp(aliases_[i].name, name) == 0) {
70 return aliases_[i].reg;
71 }
72 i++;
73 }
74
75 // No register with the reguested name found.
76 return kInvalidRegister;
77 }
78
79
80 const char* FPURegisters::names_[kNumFPURegisters] = {
81 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11",
82 "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
83 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
84 };
85
86
87 // List of alias names which can be used when referring to MIPS registers.
88 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
89 {kInvalidRegister, NULL}
90 };
91
92
Name(int creg)93 const char* FPURegisters::Name(int creg) {
94 const char* result;
95 if ((0 <= creg) && (creg < kNumFPURegisters)) {
96 result = names_[creg];
97 } else {
98 result = "nocreg";
99 }
100 return result;
101 }
102
103
Number(const char * name)104 int FPURegisters::Number(const char* name) {
105 // Look through the canonical names.
106 for (int i = 0; i < kNumFPURegisters; i++) {
107 if (strcmp(names_[i], name) == 0) {
108 return i;
109 }
110 }
111
112 // Look through the alias names.
113 int i = 0;
114 while (aliases_[i].creg != kInvalidRegister) {
115 if (strcmp(aliases_[i].name, name) == 0) {
116 return aliases_[i].creg;
117 }
118 i++;
119 }
120
121 // No Cregister with the reguested name found.
122 return kInvalidFPURegister;
123 }
124
125
126 } // namespace internal
127 } // namespace v8
128
129 #endif // V8_TARGET_ARCH_MIPS
130