Home | History | Annotate | Download | only in mips
      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 
     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 
     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 
     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 
    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