OLD | NEW |
1 // Copyright 2010 the V8 project authors. All rights reserved. | 1 // Copyright 2010 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 13 matching lines...) Expand all Loading... |
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | 25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
27 | 27 |
28 #include "v8.h" | 28 #include "v8.h" |
29 | 29 |
30 #if defined(V8_TARGET_ARCH_MIPS) | 30 #if defined(V8_TARGET_ARCH_MIPS) |
31 | 31 |
32 #include "constants-mips.h" | 32 #include "constants-mips.h" |
33 | 33 |
34 namespace assembler { | 34 namespace v8 { |
35 namespace mips { | 35 namespace internal { |
36 | |
37 namespace v8i = v8::internal; | |
38 | 36 |
39 | 37 |
40 // ----------------------------------------------------------------------------- | 38 // ----------------------------------------------------------------------------- |
41 // Registers | 39 // Registers |
42 | 40 |
43 | 41 |
44 // These register names are defined in a way to match the native disassembler | 42 // These register names are defined in a way to match the native disassembler |
45 // formatting. See for example the command "objdump -d <binary file>". | 43 // formatting. See for example the command "objdump -d <binary file>". |
46 const char* Registers::names_[kNumSimuRegisters] = { | 44 const char* Registers::names_[kNumSimuRegisters] = { |
47 "zero_reg", | 45 "zero_reg", |
(...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
95 return aliases_[i].reg; | 93 return aliases_[i].reg; |
96 } | 94 } |
97 i++; | 95 i++; |
98 } | 96 } |
99 | 97 |
100 // No register with the reguested name found. | 98 // No register with the reguested name found. |
101 return kInvalidRegister; | 99 return kInvalidRegister; |
102 } | 100 } |
103 | 101 |
104 | 102 |
105 const char* FPURegister::names_[kNumFPURegister] = { | 103 const char* FPURegisters::names_[kNumFPURegisters] = { |
106 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", | 104 "f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7", "f8", "f9", "f10", "f11", |
107 "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", | 105 "f12", "f13", "f14", "f15", "f16", "f17", "f18", "f19", "f20", "f21", |
108 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" | 106 "f22", "f23", "f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31" |
109 }; | 107 }; |
110 | 108 |
111 // List of alias names which can be used when referring to MIPS registers. | 109 // List of alias names which can be used when referring to MIPS registers. |
112 const FPURegister::RegisterAlias FPURegister::aliases_[] = { | 110 const FPURegisters::RegisterAlias FPURegisters::aliases_[] = { |
113 {kInvalidRegister, NULL} | 111 {kInvalidRegister, NULL} |
114 }; | 112 }; |
115 | 113 |
116 const char* FPURegister::Name(int creg) { | 114 const char* FPURegisters::Name(int creg) { |
117 const char* result; | 115 const char* result; |
118 if ((0 <= creg) && (creg < kNumFPURegister)) { | 116 if ((0 <= creg) && (creg < kNumFPURegisters)) { |
119 result = names_[creg]; | 117 result = names_[creg]; |
120 } else { | 118 } else { |
121 result = "nocreg"; | 119 result = "nocreg"; |
122 } | 120 } |
123 return result; | 121 return result; |
124 } | 122 } |
125 | 123 |
126 | 124 |
127 int FPURegister::Number(const char* name) { | 125 int FPURegisters::Number(const char* name) { |
128 // Look through the canonical names. | 126 // Look through the canonical names. |
129 for (int i = 0; i < kNumSimuRegisters; i++) { | 127 for (int i = 0; i < kNumFPURegisters; i++) { |
130 if (strcmp(names_[i], name) == 0) { | 128 if (strcmp(names_[i], name) == 0) { |
131 return i; | 129 return i; |
132 } | 130 } |
133 } | 131 } |
134 | 132 |
135 // Look through the alias names. | 133 // Look through the alias names. |
136 int i = 0; | 134 int i = 0; |
137 while (aliases_[i].creg != kInvalidRegister) { | 135 while (aliases_[i].creg != kInvalidRegister) { |
138 if (strcmp(aliases_[i].name, name) == 0) { | 136 if (strcmp(aliases_[i].name, name) == 0) { |
139 return aliases_[i].creg; | 137 return aliases_[i].creg; |
140 } | 138 } |
141 i++; | 139 i++; |
142 } | 140 } |
143 | 141 |
144 // No Cregister with the reguested name found. | 142 // No Cregister with the reguested name found. |
145 return kInvalidFPURegister; | 143 return kInvalidFPURegister; |
146 } | 144 } |
147 | 145 |
148 | 146 |
149 // ----------------------------------------------------------------------------- | 147 // ----------------------------------------------------------------------------- |
150 // Instruction | 148 // Instruction |
151 | 149 |
152 bool Instruction::IsForbiddenInBranchDelay() { | 150 bool Instruction::IsForbiddenInBranchDelay() const { |
153 int op = OpcodeFieldRaw(); | 151 const int op = OpcodeFieldRaw(); |
154 switch (op) { | 152 switch (op) { |
155 case J: | 153 case J: |
156 case JAL: | 154 case JAL: |
157 case BEQ: | 155 case BEQ: |
158 case BNE: | 156 case BNE: |
159 case BLEZ: | 157 case BLEZ: |
160 case BGTZ: | 158 case BGTZ: |
161 case BEQL: | 159 case BEQL: |
162 case BNEL: | 160 case BNEL: |
163 case BLEZL: | 161 case BLEZL: |
(...skipping 18 matching lines...) Expand all Loading... |
182 default: | 180 default: |
183 return false; | 181 return false; |
184 }; | 182 }; |
185 break; | 183 break; |
186 default: | 184 default: |
187 return false; | 185 return false; |
188 }; | 186 }; |
189 } | 187 } |
190 | 188 |
191 | 189 |
192 bool Instruction::IsLinkingInstruction() { | 190 bool Instruction::IsLinkingInstruction() const { |
193 int op = OpcodeFieldRaw(); | 191 const int op = OpcodeFieldRaw(); |
194 switch (op) { | 192 switch (op) { |
195 case JAL: | 193 case JAL: |
196 case BGEZAL: | 194 case REGIMM: |
197 case BLTZAL: | 195 switch (RtFieldRaw()) { |
198 return true; | 196 case BGEZAL: |
| 197 case BLTZAL: |
| 198 return true; |
| 199 default: |
| 200 return false; |
| 201 }; |
199 case SPECIAL: | 202 case SPECIAL: |
200 switch (FunctionFieldRaw()) { | 203 switch (FunctionFieldRaw()) { |
201 case JALR: | 204 case JALR: |
202 return true; | 205 return true; |
203 default: | 206 default: |
204 return false; | 207 return false; |
205 }; | 208 }; |
206 default: | 209 default: |
207 return false; | 210 return false; |
208 }; | 211 }; |
209 } | 212 } |
210 | 213 |
211 | 214 |
212 bool Instruction::IsTrap() { | 215 bool Instruction::IsTrap() const { |
213 if (OpcodeFieldRaw() != SPECIAL) { | 216 if (OpcodeFieldRaw() != SPECIAL) { |
214 return false; | 217 return false; |
215 } else { | 218 } else { |
216 switch (FunctionFieldRaw()) { | 219 switch (FunctionFieldRaw()) { |
217 case BREAK: | 220 case BREAK: |
218 case TGE: | 221 case TGE: |
219 case TGEU: | 222 case TGEU: |
220 case TLT: | 223 case TLT: |
221 case TLTU: | 224 case TLTU: |
222 case TEQ: | 225 case TEQ: |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 case XOR: | 260 case XOR: |
258 case NOR: | 261 case NOR: |
259 case SLT: | 262 case SLT: |
260 case SLTU: | 263 case SLTU: |
261 case TGE: | 264 case TGE: |
262 case TGEU: | 265 case TGEU: |
263 case TLT: | 266 case TLT: |
264 case TLTU: | 267 case TLTU: |
265 case TEQ: | 268 case TEQ: |
266 case TNE: | 269 case TNE: |
| 270 case MOVZ: |
| 271 case MOVN: |
| 272 case MOVCI: |
267 return kRegisterType; | 273 return kRegisterType; |
268 default: | 274 default: |
269 UNREACHABLE(); | 275 UNREACHABLE(); |
270 }; | 276 }; |
271 break; | 277 break; |
272 case SPECIAL2: | 278 case SPECIAL2: |
273 switch (FunctionFieldRaw()) { | 279 switch (FunctionFieldRaw()) { |
274 case MUL: | 280 case MUL: |
| 281 case CLZ: |
| 282 return kRegisterType; |
| 283 default: |
| 284 UNREACHABLE(); |
| 285 }; |
| 286 break; |
| 287 case SPECIAL3: |
| 288 switch (FunctionFieldRaw()) { |
| 289 case INS: |
| 290 case EXT: |
275 return kRegisterType; | 291 return kRegisterType; |
276 default: | 292 default: |
277 UNREACHABLE(); | 293 UNREACHABLE(); |
278 }; | 294 }; |
279 break; | 295 break; |
280 case COP1: // Coprocessor instructions | 296 case COP1: // Coprocessor instructions |
281 switch (FunctionFieldRaw()) { | 297 switch (RsFieldRawNoAssert()) { |
282 case BC1: // branch on coprocessor condition | 298 case BC1: // branch on coprocessor condition |
283 return kImmediateType; | 299 return kImmediateType; |
284 default: | 300 default: |
285 return kRegisterType; | 301 return kRegisterType; |
286 }; | 302 }; |
287 break; | 303 break; |
288 // 16 bits Immediate type instructions. eg: addi dest, src, imm16 | 304 // 16 bits Immediate type instructions. eg: addi dest, src, imm16 |
289 case REGIMM: | 305 case REGIMM: |
290 case BEQ: | 306 case BEQ: |
291 case BNE: | 307 case BNE: |
292 case BLEZ: | 308 case BLEZ: |
293 case BGTZ: | 309 case BGTZ: |
294 case ADDI: | 310 case ADDI: |
295 case ADDIU: | 311 case ADDIU: |
296 case SLTI: | 312 case SLTI: |
297 case SLTIU: | 313 case SLTIU: |
298 case ANDI: | 314 case ANDI: |
299 case ORI: | 315 case ORI: |
300 case XORI: | 316 case XORI: |
301 case LUI: | 317 case LUI: |
302 case BEQL: | 318 case BEQL: |
303 case BNEL: | 319 case BNEL: |
304 case BLEZL: | 320 case BLEZL: |
305 case BGTZL: | 321 case BGTZL: |
306 case LB: | 322 case LB: |
| 323 case LH: |
| 324 case LWL: |
307 case LW: | 325 case LW: |
308 case LBU: | 326 case LBU: |
| 327 case LHU: |
| 328 case LWR: |
309 case SB: | 329 case SB: |
| 330 case SH: |
| 331 case SWL: |
310 case SW: | 332 case SW: |
| 333 case SWR: |
311 case LWC1: | 334 case LWC1: |
312 case LDC1: | 335 case LDC1: |
313 case SWC1: | 336 case SWC1: |
314 case SDC1: | 337 case SDC1: |
315 return kImmediateType; | 338 return kImmediateType; |
316 // 26 bits immediate type instructions. eg: j imm26 | 339 // 26 bits immediate type instructions. eg: j imm26 |
317 case J: | 340 case J: |
318 case JAL: | 341 case JAL: |
319 return kJumpType; | 342 return kJumpType; |
320 default: | 343 default: |
321 UNREACHABLE(); | 344 UNREACHABLE(); |
322 }; | 345 }; |
323 return kUnsupported; | 346 return kUnsupported; |
324 } | 347 } |
325 | 348 |
326 } } // namespace assembler::mips | 349 |
| 350 } } // namespace v8::internal |
327 | 351 |
328 #endif // V8_TARGET_ARCH_MIPS | 352 #endif // V8_TARGET_ARCH_MIPS |
OLD | NEW |