• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2021 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_LOONG64
6 
7 #include "src/codegen/loong64/constants-loong64.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", "ra", "tp", "sp", "a0", "a1", "a2", "a3", "a4", "a5", "a6",
19     "a7",       "t0", "t1", "t2", "t3", "t4", "t5", "t6", "t7", "t8", "x_reg",
20     "fp",       "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7", "s8", "pc"};
21 
22 // List of alias names which can be used when referring to registers.
23 const Registers::RegisterAlias Registers::aliases_[] = {
24     {0, "zero"}, {30, "cp"}, {kInvalidRegister, nullptr}};
25 
Name(int reg)26 const char* Registers::Name(int reg) {
27   const char* result;
28   if ((0 <= reg) && (reg < kNumSimuRegisters)) {
29     result = names_[reg];
30   } else {
31     result = "noreg";
32   }
33   return result;
34 }
35 
Number(const char * name)36 int Registers::Number(const char* name) {
37   // Look through the canonical names.
38   for (int i = 0; i < kNumSimuRegisters; i++) {
39     if (strcmp(names_[i], name) == 0) {
40       return i;
41     }
42   }
43 
44   // Look through the alias names.
45   int i = 0;
46   while (aliases_[i].reg != kInvalidRegister) {
47     if (strcmp(aliases_[i].name, name) == 0) {
48       return aliases_[i].reg;
49     }
50     i++;
51   }
52 
53   // No register with the reguested name found.
54   return kInvalidRegister;
55 }
56 
57 const char* FPURegisters::names_[kNumFPURegisters] = {
58     "f0",  "f1",  "f2",  "f3",  "f4",  "f5",  "f6",  "f7",  "f8",  "f9",  "f10",
59     "f11", "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
60     "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"};
61 
62 // List of alias names which can be used when referring to LoongArch registers.
63 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
64     {kInvalidRegister, nullptr}};
65 
Name(int creg)66 const char* FPURegisters::Name(int creg) {
67   const char* result;
68   if ((0 <= creg) && (creg < kNumFPURegisters)) {
69     result = names_[creg];
70   } else {
71     result = "nocreg";
72   }
73   return result;
74 }
75 
Number(const char * name)76 int FPURegisters::Number(const char* name) {
77   // Look through the canonical names.
78   for (int i = 0; i < kNumFPURegisters; i++) {
79     if (strcmp(names_[i], name) == 0) {
80       return i;
81     }
82   }
83 
84   // Look through the alias names.
85   int i = 0;
86   while (aliases_[i].creg != kInvalidRegister) {
87     if (strcmp(aliases_[i].name, name) == 0) {
88       return aliases_[i].creg;
89     }
90     i++;
91   }
92 
93   // No Cregister with the reguested name found.
94   return kInvalidFPURegister;
95 }
96 
97 }  // namespace internal
98 }  // namespace v8
99 
100 #endif  // V8_TARGET_ARCH_LOONG64
101