Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(146)

Side by Side Diff: src/mips/constants-mips.h

Issue 1310883005: MIPS: Optimize simulator. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix nits. Created 5 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/mips/constants-mips.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #include "src/globals.h" 7 #include "src/globals.h"
8 // UNIMPLEMENTED_ macro for MIPS. 8 // UNIMPLEMENTED_ macro for MIPS.
9 #ifdef DEBUG 9 #ifdef DEBUG
10 #define UNIMPLEMENTED_MIPS() \ 10 #define UNIMPLEMENTED_MIPS() \
(...skipping 802 matching lines...) Expand 10 before | Expand all | Expand 10 after
813 extern const Instr kRtMask; 813 extern const Instr kRtMask;
814 extern const Instr kLwSwInstrTypeMask; 814 extern const Instr kLwSwInstrTypeMask;
815 extern const Instr kLwSwInstrArgumentMask; 815 extern const Instr kLwSwInstrArgumentMask;
816 extern const Instr kLwSwOffsetMask; 816 extern const Instr kLwSwOffsetMask;
817 817
818 // Break 0xfffff, reserved for redirected real time call. 818 // Break 0xfffff, reserved for redirected real time call.
819 const Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6; 819 const Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6;
820 // A nop instruction. (Encoding of sll 0 0 0). 820 // A nop instruction. (Encoding of sll 0 0 0).
821 const Instr nopInstr = 0; 821 const Instr nopInstr = 0;
822 822
823
823 class Instruction { 824 class Instruction {
824 public: 825 public:
825 enum { 826 enum {
826 kInstrSize = 4, 827 kInstrSize = 4,
827 kInstrSizeLog2 = 2, 828 kInstrSizeLog2 = 2,
828 // On MIPS PC cannot actually be directly accessed. We behave as if PC was 829 // On MIPS PC cannot actually be directly accessed. We behave as if PC was
829 // always the value of the current instruction being executed. 830 // always the value of the current instruction being executed.
830 kPCReadOffset = 0 831 kPCReadOffset = 0
831 }; 832 };
832 833
(...skipping 18 matching lines...) Expand all
851 } 852 }
852 853
853 // Instruction type. 854 // Instruction type.
854 enum Type { 855 enum Type {
855 kRegisterType, 856 kRegisterType,
856 kImmediateType, 857 kImmediateType,
857 kJumpType, 858 kJumpType,
858 kUnsupported = -1 859 kUnsupported = -1
859 }; 860 };
860 861
862 enum TypeChecks { NORMAL, EXTRA };
863
864
865 #define OpcodeToBitNumber(opcode) \
866 (1ULL << (static_cast<uint32_t>(opcode) >> kOpcodeShift))
867
868 static const uint64_t kOpcodeImmediateTypeMask =
869 OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) |
870 OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) |
871 OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) |
872 OpcodeToBitNumber(DADDI) | OpcodeToBitNumber(ADDIU) |
873 OpcodeToBitNumber(SLTI) | OpcodeToBitNumber(SLTIU) |
874 OpcodeToBitNumber(ANDI) | OpcodeToBitNumber(ORI) |
875 OpcodeToBitNumber(XORI) | OpcodeToBitNumber(LUI) |
876 OpcodeToBitNumber(BEQL) | OpcodeToBitNumber(BNEL) |
877 OpcodeToBitNumber(BLEZL) | OpcodeToBitNumber(BGTZL) |
878 OpcodeToBitNumber(POP66) | OpcodeToBitNumber(POP76) |
879 OpcodeToBitNumber(LB) | OpcodeToBitNumber(LH) | OpcodeToBitNumber(LWL) |
880 OpcodeToBitNumber(LW) | OpcodeToBitNumber(LBU) | OpcodeToBitNumber(LHU) |
881 OpcodeToBitNumber(LWR) | OpcodeToBitNumber(SB) | OpcodeToBitNumber(SH) |
882 OpcodeToBitNumber(SWL) | OpcodeToBitNumber(SW) | OpcodeToBitNumber(SWR) |
883 OpcodeToBitNumber(LWC1) | OpcodeToBitNumber(LDC1) |
884 OpcodeToBitNumber(SWC1) | OpcodeToBitNumber(SDC1) |
885 OpcodeToBitNumber(PCREL) | OpcodeToBitNumber(BC) |
886 OpcodeToBitNumber(BALC);
887
888 #define FunctionFieldToBitNumber(function) (1ULL << function)
889
890 static const uint64_t kFunctionFieldRegisterTypeMask =
891 FunctionFieldToBitNumber(JR) | FunctionFieldToBitNumber(JALR) |
892 FunctionFieldToBitNumber(BREAK) | FunctionFieldToBitNumber(SLL) |
893 FunctionFieldToBitNumber(SRL) | FunctionFieldToBitNumber(SRA) |
894 FunctionFieldToBitNumber(SLLV) | FunctionFieldToBitNumber(SRLV) |
895 FunctionFieldToBitNumber(SRAV) | FunctionFieldToBitNumber(MFHI) |
896 FunctionFieldToBitNumber(MFLO) | FunctionFieldToBitNumber(MULT) |
897 FunctionFieldToBitNumber(MULTU) | FunctionFieldToBitNumber(DIV) |
898 FunctionFieldToBitNumber(DIVU) | FunctionFieldToBitNumber(ADD) |
899 FunctionFieldToBitNumber(ADDU) | FunctionFieldToBitNumber(SUB) |
900 FunctionFieldToBitNumber(SUBU) | FunctionFieldToBitNumber(AND) |
901 FunctionFieldToBitNumber(OR) | FunctionFieldToBitNumber(XOR) |
902 FunctionFieldToBitNumber(NOR) | FunctionFieldToBitNumber(SLT) |
903 FunctionFieldToBitNumber(SLTU) | FunctionFieldToBitNumber(TGE) |
904 FunctionFieldToBitNumber(TGEU) | FunctionFieldToBitNumber(TLT) |
905 FunctionFieldToBitNumber(TLTU) | FunctionFieldToBitNumber(TEQ) |
906 FunctionFieldToBitNumber(TNE) | FunctionFieldToBitNumber(MOVZ) |
907 FunctionFieldToBitNumber(MOVN) | FunctionFieldToBitNumber(MOVCI) |
908 FunctionFieldToBitNumber(SELEQZ_S) | FunctionFieldToBitNumber(SELNEZ_S);
909
910
861 // Get the encoding type of the instruction. 911 // Get the encoding type of the instruction.
862 Type InstructionType() const; 912 inline Type InstructionType(TypeChecks checks = NORMAL) const;
863
864 913
865 // Accessors for the different named fields used in the MIPS encoding. 914 // Accessors for the different named fields used in the MIPS encoding.
866 inline Opcode OpcodeValue() const { 915 inline Opcode OpcodeValue() const {
867 return static_cast<Opcode>( 916 return static_cast<Opcode>(
868 Bits(kOpcodeShift + kOpcodeBits - 1, kOpcodeShift)); 917 Bits(kOpcodeShift + kOpcodeBits - 1, kOpcodeShift));
869 } 918 }
870 919
871 inline int RsValue() const { 920 inline int RsValue() const {
872 DCHECK(InstructionType() == kRegisterType || 921 DCHECK(InstructionType() == kRegisterType ||
873 InstructionType() == kImmediateType); 922 InstructionType() == kImmediateType);
(...skipping 163 matching lines...) Expand 10 before | Expand all | Expand 10 after
1037 const int kCArgSlotCount = 4; 1086 const int kCArgSlotCount = 4;
1038 const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize; 1087 const int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize;
1039 const int kInvalidStackOffset = -1; 1088 const int kInvalidStackOffset = -1;
1040 // JS argument slots size. 1089 // JS argument slots size.
1041 const int kJSArgsSlotsSize = 0 * Instruction::kInstrSize; 1090 const int kJSArgsSlotsSize = 0 * Instruction::kInstrSize;
1042 // Assembly builtins argument slots size. 1091 // Assembly builtins argument slots size.
1043 const int kBArgsSlotsSize = 0 * Instruction::kInstrSize; 1092 const int kBArgsSlotsSize = 0 * Instruction::kInstrSize;
1044 1093
1045 const int kBranchReturnOffset = 2 * Instruction::kInstrSize; 1094 const int kBranchReturnOffset = 2 * Instruction::kInstrSize;
1046 1095
1096
1097 Instruction::Type Instruction::InstructionType(TypeChecks checks) const {
1098 if (checks == EXTRA) {
1099 if (OpcodeToBitNumber(OpcodeFieldRaw()) & kOpcodeImmediateTypeMask) {
1100 return kImmediateType;
1101 }
1102 }
1103 switch (OpcodeFieldRaw()) {
1104 case SPECIAL:
1105 if (checks == EXTRA) {
1106 if (FunctionFieldToBitNumber(FunctionFieldRaw()) &
1107 kFunctionFieldRegisterTypeMask) {
1108 return kRegisterType;
1109 } else {
1110 return kUnsupported;
1111 }
1112 } else {
1113 return kRegisterType;
1114 }
1115 break;
1116 case SPECIAL2:
1117 switch (FunctionFieldRaw()) {
1118 case MUL:
1119 case CLZ:
1120 return kRegisterType;
1121 default:
1122 return kUnsupported;
1123 }
1124 break;
1125 case SPECIAL3:
1126 switch (FunctionFieldRaw()) {
1127 case INS:
1128 case EXT:
1129 return kRegisterType;
1130 case BSHFL: {
1131 int sa = SaFieldRaw() >> kSaShift;
1132 switch (sa) {
1133 case BITSWAP:
1134 return kRegisterType;
1135 case WSBH:
1136 case SEB:
1137 case SEH:
1138 return kUnsupported;
1139 }
1140 sa >>= kBp2Bits;
1141 switch (sa) {
1142 case ALIGN:
1143 return kRegisterType;
1144 default:
1145 return kUnsupported;
1146 }
1147 }
1148 default:
1149 return kUnsupported;
1150 }
1151 break;
1152 case COP1: // Coprocessor instructions.
1153 switch (RsFieldRawNoAssert()) {
1154 case BC1: // Branch on coprocessor condition.
1155 case BC1EQZ:
1156 case BC1NEZ:
1157 return kImmediateType;
1158 default:
1159 return kRegisterType;
1160 }
1161 break;
1162 case COP1X:
1163 return kRegisterType;
1164
1165 // 26 bits immediate type instructions. e.g.: j imm26.
1166 case J:
1167 case JAL:
1168 return kJumpType;
1169
1170 default:
1171 if (checks == NORMAL) {
1172 return kImmediateType;
1173 } else {
1174 return kUnsupported;
1175 }
1176 }
1177 }
1178
1179 #undef OpcodeToBitNumber
1180 #undef FunctionFieldToBitNumber
1047 } } // namespace v8::internal 1181 } } // namespace v8::internal
1048 1182
1049 #endif // #ifndef V8_MIPS_CONSTANTS_H_ 1183 #endif // #ifndef V8_MIPS_CONSTANTS_H_
OLDNEW
« no previous file with comments | « no previous file | src/mips/constants-mips.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698