V8 Project
constants-mips64.cc
Go to the documentation of this file.
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 #include "src/v8.h"
6 
7 #if V8_TARGET_ARCH_MIPS64
8 
10 
11 namespace v8 {
12 namespace internal {
13 
14 
15 // -----------------------------------------------------------------------------
16 // Registers.
17 
18 
19 // These register names are defined in a way to match the native disassembler
20 // formatting. See for example the command "objdump -d <binary file>".
21 const char* Registers::names_[kNumSimuRegisters] = {
22  "zero_reg",
23  "at",
24  "v0", "v1",
25  "a0", "a1", "a2", "a3", "a4", "a5", "a6", "a7",
26  "t0", "t1", "t2", "t3",
27  "s0", "s1", "s2", "s3", "s4", "s5", "s6", "s7",
28  "t8", "t9",
29  "k0", "k1",
30  "gp",
31  "sp",
32  "fp",
33  "ra",
34  "LO", "HI",
35  "pc"
36 };
37 
38 
39 // List of alias names which can be used when referring to MIPS registers.
40 const Registers::RegisterAlias Registers::aliases_[] = {
41  {0, "zero"},
42  {23, "cp"},
43  {30, "s8"},
44  {30, "s8_fp"},
46 };
47 
48 
49 const char* Registers::Name(int reg) {
50  const char* result;
51  if ((0 <= reg) && (reg < kNumSimuRegisters)) {
52  result = names_[reg];
53  } else {
54  result = "noreg";
55  }
56  return result;
57 }
58 
59 
60 int Registers::Number(const char* name) {
61  // Look through the canonical names.
62  for (int i = 0; i < kNumSimuRegisters; i++) {
63  if (strcmp(names_[i], name) == 0) {
64  return i;
65  }
66  }
67 
68  // Look through the alias names.
69  int i = 0;
70  while (aliases_[i].reg != kInvalidRegister) {
71  if (strcmp(aliases_[i].name, name) == 0) {
72  return aliases_[i].reg;
73  }
74  i++;
75  }
76 
77  // No register with the reguested name found.
78  return kInvalidRegister;
79 }
80 
81 
83  "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11",
84  "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21",
85  "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
86 };
87 
88 
89 // List of alias names which can be used when referring to MIPS registers.
90 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = {
92 };
93 
94 
95 const char* FPURegisters::Name(int creg) {
96  const char* result;
97  if ((0 <= creg) && (creg < kNumFPURegisters)) {
98  result = names_[creg];
99  } else {
100  result = "nocreg";
101  }
102  return result;
103 }
104 
105 
106 int FPURegisters::Number(const char* name) {
107  // Look through the canonical names.
108  for (int i = 0; i < kNumFPURegisters; i++) {
109  if (strcmp(names_[i], name) == 0) {
110  return i;
111  }
112  }
113 
114  // Look through the alias names.
115  int i = 0;
116  while (aliases_[i].creg != kInvalidRegister) {
117  if (strcmp(aliases_[i].name, name) == 0) {
118  return aliases_[i].creg;
119  }
120  i++;
121  }
122 
123  // No Cregister with the reguested name found.
124  return kInvalidFPURegister;
125 }
126 
127 
128 // -----------------------------------------------------------------------------
129 // Instructions.
130 
132  const int op = OpcodeFieldRaw();
133  switch (op) {
134  case J:
135  case JAL:
136  case BEQ:
137  case BNE:
138  case BLEZ:
139  case BGTZ:
140  case BEQL:
141  case BNEL:
142  case BLEZL:
143  case BGTZL:
144  return true;
145  case REGIMM:
146  switch (RtFieldRaw()) {
147  case BLTZ:
148  case BGEZ:
149  case BLTZAL:
150  case BGEZAL:
151  return true;
152  default:
153  return false;
154  }
155  break;
156  case SPECIAL:
157  switch (FunctionFieldRaw()) {
158  case JR:
159  case JALR:
160  return true;
161  default:
162  return false;
163  }
164  break;
165  default:
166  return false;
167  }
168 }
169 
170 
172  const int op = OpcodeFieldRaw();
173  switch (op) {
174  case JAL:
175  return true;
176  case REGIMM:
177  switch (RtFieldRaw()) {
178  case BGEZAL:
179  case BLTZAL:
180  return true;
181  default:
182  return false;
183  }
184  case SPECIAL:
185  switch (FunctionFieldRaw()) {
186  case JALR:
187  return true;
188  default:
189  return false;
190  }
191  default:
192  return false;
193  }
194 }
195 
196 
197 bool Instruction::IsTrap() const {
198  if (OpcodeFieldRaw() != SPECIAL) {
199  return false;
200  } else {
201  switch (FunctionFieldRaw()) {
202  case BREAK:
203  case TGE:
204  case TGEU:
205  case TLT:
206  case TLTU:
207  case TEQ:
208  case TNE:
209  return true;
210  default:
211  return false;
212  }
213  }
214 }
215 
216 
218  switch (OpcodeFieldRaw()) {
219  case SPECIAL:
220  switch (FunctionFieldRaw()) {
221  case JR:
222  case JALR:
223  case BREAK:
224  case SLL:
225  case DSLL:
226  case DSLL32:
227  case SRL:
228  case DSRL:
229  case DSRL32:
230  case SRA:
231  case DSRA:
232  case DSRA32:
233  case SLLV:
234  case DSLLV:
235  case SRLV:
236  case DSRLV:
237  case SRAV:
238  case DSRAV:
239  case MFHI:
240  case MFLO:
241  case MULT:
242  case DMULT:
243  case MULTU:
244  case DMULTU:
245  case DIV:
246  case DDIV:
247  case DIVU:
248  case DDIVU:
249  case ADD:
250  case DADD:
251  case ADDU:
252  case DADDU:
253  case SUB:
254  case DSUB:
255  case SUBU:
256  case DSUBU:
257  case AND:
258  case OR:
259  case XOR:
260  case NOR:
261  case SLT:
262  case SLTU:
263  case TGE:
264  case TGEU:
265  case TLT:
266  case TLTU:
267  case TEQ:
268  case TNE:
269  case MOVZ:
270  case MOVN:
271  case MOVCI:
272  return kRegisterType;
273  default:
274  return kUnsupported;
275  }
276  break;
277  case SPECIAL2:
278  switch (FunctionFieldRaw()) {
279  case MUL:
280  case CLZ:
281  return kRegisterType;
282  default:
283  return kUnsupported;
284  }
285  break;
286  case SPECIAL3:
287  switch (FunctionFieldRaw()) {
288  case INS:
289  case EXT:
290  return kRegisterType;
291  default:
292  return kUnsupported;
293  }
294  break;
295  case COP1: // Coprocessor instructions.
296  switch (RsFieldRawNoAssert()) {
297  case BC1: // Branch on coprocessor condition.
298  case BC1EQZ:
299  case BC1NEZ:
300  return kImmediateType;
301  default:
302  return kRegisterType;
303  }
304  break;
305  case COP1X:
306  return kRegisterType;
307  // 16 bits Immediate type instructions. e.g.: addi dest, src, imm16.
308  case REGIMM:
309  case BEQ:
310  case BNE:
311  case BLEZ:
312  case BGTZ:
313  case ADDI:
314  case DADDI:
315  case ADDIU:
316  case DADDIU:
317  case SLTI:
318  case SLTIU:
319  case ANDI:
320  case ORI:
321  case XORI:
322  case LUI:
323  case BEQL:
324  case BNEL:
325  case BLEZL:
326  case BGTZL:
327  case BEQZC:
328  case BNEZC:
329  case LB:
330  case LH:
331  case LWL:
332  case LW:
333  case LWU:
334  case LD:
335  case LBU:
336  case LHU:
337  case LWR:
338  case SB:
339  case SH:
340  case SWL:
341  case SW:
342  case SD:
343  case SWR:
344  case LWC1:
345  case LDC1:
346  case SWC1:
347  case SDC1:
348  return kImmediateType;
349  // 26 bits immediate type instructions. e.g.: j imm26.
350  case J:
351  case JAL:
352  return kJumpType;
353  default:
354  return kUnsupported;
355  }
356  return kUnsupported;
357 }
358 
359 
360 } } // namespace v8::internal
361 
362 #endif // V8_TARGET_ARCH_MIPS64
static int Number(const char *name)
static const char * Name(int reg)
static const RegisterAlias aliases_[]
static const char * names_[kNumFPURegisters]
bool IsLinkingInstruction() const
Opcode OpcodeFieldRaw() const
bool IsForbiddenInBranchDelay() const
Type InstructionType() const
static int Number(const char *name)
static const RegisterAlias aliases_[]
static const char * names_[kNumRegisters]
static const char * Name(int reg)
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be expose gc extension under the specified name show built in functions in stack traces use random jit cookie to mask large constants minimum length for automatic enable preparsing CPU profiler sampling interval in microseconds trace out of bounds accesses to external arrays default size of stack region v8 is allowed to maximum length of function source code printed in a stack trace min size of a semi the new space consists of two semi spaces print one trace line following each garbage collection do not print trace line after scavenger collection print cumulative GC statistics in name
enable harmony numeric enable harmony object literal extensions Optimize object Array DOM strings and string trace pretenuring decisions of HAllocate instructions Enables optimizations which favor memory size over execution speed maximum source size in bytes considered for a single inlining maximum cumulative number of AST nodes considered for inlining trace the tracking of allocation sites deoptimize every n garbage collections perform array bounds checks elimination analyze liveness of environment slots and zap dead values flushes the cache of optimized code for closures on every GC allow uint32 values on optimize frames if they are used only in safe operations track concurrent recompilation artificial compilation delay in ms do not emit check maps for constant values that have a leaf deoptimize the optimized code if the layout of the maps changes enable context specialization in TurboFan execution budget before interrupt is triggered max percentage of megamorphic generic ICs to allow optimization enable use of SAHF instruction if enable use of VFP3 instructions if available enable use of NEON instructions if enable use of SDIV and UDIV instructions if enable use of MLS instructions if enable loading bit constant by means of movw movt instruction enable unaligned accesses for enable use of d16 d31 registers on ARM this requires VFP3 force all emitted branches to be in long enable alignment of csp to bytes on platforms which prefer the register to always be NULL
const int kNumFPURegisters
const int kInvalidFPURegister
const int kNumSimuRegisters
const int kInvalidRegister
Debugger support for the V8 JavaScript engine.
Definition: accessors.cc:20