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
9namespace v8 {
10namespace 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>".
19const 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.
38const Registers::RegisterAlias Registers::aliases_[] = {
39  {0, "zero"},
40  {23, "cp"},
41  {30, "s8"},
42  {30, "s8_fp"},
43  {kInvalidRegister, NULL}
44};
45
46
47const 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
58int 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
80const 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.
88const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
89  {kInvalidRegister, NULL}
90};
91
92
93const 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
104int 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