| 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 |