| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef V8_MIPS_CONSTANTS_H_ | 5 #ifndef V8_MIPS_CONSTANTS_H_ |
| 6 #define V8_MIPS_CONSTANTS_H_ | 6 #define V8_MIPS_CONSTANTS_H_ |
| 7 | 7 |
| 8 #include "src/base/logging.h" | 8 #include "src/base/logging.h" |
| 9 #include "src/base/macros.h" | 9 #include "src/base/macros.h" |
| 10 #include "src/globals.h" | 10 #include "src/globals.h" |
| (...skipping 914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 925 // Read one particular bit out of the instruction bits. | 925 // Read one particular bit out of the instruction bits. |
| 926 inline int Bit(int nr) const { | 926 inline int Bit(int nr) const { |
| 927 return (InstructionBits() >> nr) & 1; | 927 return (InstructionBits() >> nr) & 1; |
| 928 } | 928 } |
| 929 | 929 |
| 930 // Read a bit field out of the instruction bits. | 930 // Read a bit field out of the instruction bits. |
| 931 inline int Bits(int hi, int lo) const { | 931 inline int Bits(int hi, int lo) const { |
| 932 return (InstructionBits() >> lo) & ((2U << (hi - lo)) - 1); | 932 return (InstructionBits() >> lo) & ((2U << (hi - lo)) - 1); |
| 933 } | 933 } |
| 934 | 934 |
| 935 enum TypeChecks { NORMAL, EXTRA }; | |
| 936 | |
| 937 static constexpr uint64_t kOpcodeImmediateTypeMask = | 935 static constexpr uint64_t kOpcodeImmediateTypeMask = |
| 938 OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) | | 936 OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) | |
| 939 OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) | | 937 OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) | |
| 940 OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) | | 938 OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) | |
| 941 OpcodeToBitNumber(DADDI) | OpcodeToBitNumber(ADDIU) | | 939 OpcodeToBitNumber(DADDI) | OpcodeToBitNumber(ADDIU) | |
| 942 OpcodeToBitNumber(DADDIU) | OpcodeToBitNumber(SLTI) | | 940 OpcodeToBitNumber(DADDIU) | OpcodeToBitNumber(SLTI) | |
| 943 OpcodeToBitNumber(SLTIU) | OpcodeToBitNumber(ANDI) | | 941 OpcodeToBitNumber(SLTIU) | OpcodeToBitNumber(ANDI) | |
| 944 OpcodeToBitNumber(ORI) | OpcodeToBitNumber(XORI) | | 942 OpcodeToBitNumber(ORI) | OpcodeToBitNumber(XORI) | |
| 945 OpcodeToBitNumber(LUI) | OpcodeToBitNumber(BEQL) | | 943 OpcodeToBitNumber(LUI) | OpcodeToBitNumber(BEQL) | |
| 946 OpcodeToBitNumber(BNEL) | OpcodeToBitNumber(BLEZL) | | 944 OpcodeToBitNumber(BNEL) | OpcodeToBitNumber(BLEZL) | |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1007 } | 1005 } |
| 1008 | 1006 |
| 1009 // Safe to call within InstructionType(). | 1007 // Safe to call within InstructionType(). |
| 1010 inline int RsFieldRawNoAssert() const { | 1008 inline int RsFieldRawNoAssert() const { |
| 1011 return InstructionBits() & kRsFieldMask; | 1009 return InstructionBits() & kRsFieldMask; |
| 1012 } | 1010 } |
| 1013 | 1011 |
| 1014 inline int SaFieldRaw() const { return InstructionBits() & kSaFieldMask; } | 1012 inline int SaFieldRaw() const { return InstructionBits() & kSaFieldMask; } |
| 1015 | 1013 |
| 1016 // Get the encoding type of the instruction. | 1014 // Get the encoding type of the instruction. |
| 1017 inline Type InstructionType(TypeChecks checks = NORMAL) const; | 1015 inline Type InstructionType() const; |
| 1018 | 1016 |
| 1019 protected: | 1017 protected: |
| 1020 InstructionBase() {} | 1018 InstructionBase() {} |
| 1021 }; | 1019 }; |
| 1022 | 1020 |
| 1023 template <class T> | 1021 template <class T> |
| 1024 class InstructionGetters : public T { | 1022 class InstructionGetters : public T { |
| 1025 public: | 1023 public: |
| 1026 inline int RsValue() const { | 1024 inline int RsValue() const { |
| 1027 DCHECK(this->InstructionType() == InstructionBase::kRegisterType || | 1025 DCHECK(this->InstructionType() == InstructionBase::kRegisterType || |
| (...skipping 191 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1219 // C/C++ argument slots size. | 1217 // C/C++ argument slots size. |
| 1220 const int kCArgSlotCount = 0; | 1218 const int kCArgSlotCount = 0; |
| 1221 | 1219 |
| 1222 // TODO(plind): below should be based on kPointerSize | 1220 // TODO(plind): below should be based on kPointerSize |
| 1223 // TODO(plind): find all usages and remove the needless instructions for n64. | 1221 // TODO(plind): find all usages and remove the needless instructions for n64. |
| 1224 const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize * 2; | 1222 const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize * 2; |
| 1225 | 1223 |
| 1226 const int kInvalidStackOffset = -1; | 1224 const int kInvalidStackOffset = -1; |
| 1227 const int kBranchReturnOffset = 2 * Instruction::kInstrSize; | 1225 const int kBranchReturnOffset = 2 * Instruction::kInstrSize; |
| 1228 | 1226 |
| 1229 InstructionBase::Type InstructionBase::InstructionType( | 1227 InstructionBase::Type InstructionBase::InstructionType() const { |
| 1230 TypeChecks checks) const { | |
| 1231 if (checks == EXTRA) { | |
| 1232 if (OpcodeToBitNumber(OpcodeFieldRaw()) & kOpcodeImmediateTypeMask) { | |
| 1233 return kImmediateType; | |
| 1234 } | |
| 1235 } | |
| 1236 switch (OpcodeFieldRaw()) { | 1228 switch (OpcodeFieldRaw()) { |
| 1237 case SPECIAL: | 1229 case SPECIAL: |
| 1238 if (checks == EXTRA) { | 1230 if (FunctionFieldToBitNumber(FunctionFieldRaw()) & |
| 1239 if (FunctionFieldToBitNumber(FunctionFieldRaw()) & | 1231 kFunctionFieldRegisterTypeMask) { |
| 1240 kFunctionFieldRegisterTypeMask) { | |
| 1241 return kRegisterType; | |
| 1242 } else { | |
| 1243 return kUnsupported; | |
| 1244 } | |
| 1245 } else { | |
| 1246 return kRegisterType; | 1232 return kRegisterType; |
| 1247 } | 1233 } |
| 1248 break; | 1234 return kUnsupported; |
| 1249 case SPECIAL2: | 1235 case SPECIAL2: |
| 1250 switch (FunctionFieldRaw()) { | 1236 switch (FunctionFieldRaw()) { |
| 1251 case MUL: | 1237 case MUL: |
| 1252 case CLZ: | 1238 case CLZ: |
| 1253 case DCLZ: | 1239 case DCLZ: |
| 1254 return kRegisterType; | 1240 return kRegisterType; |
| 1255 default: | 1241 default: |
| 1256 return kUnsupported; | 1242 return kUnsupported; |
| 1257 } | 1243 } |
| 1258 break; | 1244 break; |
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1315 break; | 1301 break; |
| 1316 case COP1X: | 1302 case COP1X: |
| 1317 return kRegisterType; | 1303 return kRegisterType; |
| 1318 | 1304 |
| 1319 // 26 bits immediate type instructions. e.g.: j imm26. | 1305 // 26 bits immediate type instructions. e.g.: j imm26. |
| 1320 case J: | 1306 case J: |
| 1321 case JAL: | 1307 case JAL: |
| 1322 return kJumpType; | 1308 return kJumpType; |
| 1323 | 1309 |
| 1324 default: | 1310 default: |
| 1325 if (checks == NORMAL) { | 1311 return kImmediateType; |
| 1326 return kImmediateType; | |
| 1327 } else { | |
| 1328 return kUnsupported; | |
| 1329 } | |
| 1330 } | 1312 } |
| 1331 return kUnsupported; | 1313 return kUnsupported; |
| 1332 } | 1314 } |
| 1333 #undef OpcodeToBitNumber | 1315 #undef OpcodeToBitNumber |
| 1334 #undef FunctionFieldToBitNumber | 1316 #undef FunctionFieldToBitNumber |
| 1335 | 1317 |
| 1336 // ----------------------------------------------------------------------------- | 1318 // ----------------------------------------------------------------------------- |
| 1337 // Instructions. | 1319 // Instructions. |
| 1338 | 1320 |
| 1339 template <class P> | 1321 template <class P> |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1440 } | 1422 } |
| 1441 break; | 1423 break; |
| 1442 default: | 1424 default: |
| 1443 return false; | 1425 return false; |
| 1444 } | 1426 } |
| 1445 } | 1427 } |
| 1446 } // namespace internal | 1428 } // namespace internal |
| 1447 } // namespace v8 | 1429 } // namespace v8 |
| 1448 | 1430 |
| 1449 #endif // #ifndef V8_MIPS_CONSTANTS_H_ | 1431 #endif // #ifndef V8_MIPS_CONSTANTS_H_ |
| OLD | NEW |