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
9namespace v8 {
10namespace 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>".
17const 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.
24const Registers::RegisterAlias Registers::aliases_[] = {
25    {0, "zero"},
26    {23, "cp"},
27    {30, "s8"},
28    {30, "s8_fp"},
29    {kInvalidRegister, nullptr}};
30
31const 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
41int 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
62const 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.
68const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
69    {kInvalidRegister, nullptr}};
70
71const 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
81int 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
102const 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
107const MSARegisters::RegisterAlias MSARegisters::aliases_[] = {
108    {kInvalidRegister, nullptr}};
109
110const 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
120int 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