Chromium Code Reviews| Index: runtime/vm/constants_mips.h | 
| =================================================================== | 
| --- runtime/vm/constants_mips.h (revision 19556) | 
| +++ runtime/vm/constants_mips.h (working copy) | 
| @@ -8,42 +8,75 @@ | 
| namespace dart { | 
| enum Register { | 
| - ZR = 0, | 
| - AT = 1, | 
| + R0 = 0, | 
| + R1 = 1, | 
| kFirstFreeCpuRegister = 2, | 
| - V0 = 2, | 
| - V1 = 3, | 
| - A0 = 4, | 
| - A1 = 5, | 
| - A2 = 6, | 
| - A3 = 7, | 
| - T0 = 8, | 
| - T1 = 9, | 
| - T2 = 10, | 
| - T3 = 11, | 
| - T4 = 12, | 
| - T5 = 13, | 
| - T6 = 14, | 
| - T7 = 15, | 
| - S0 = 16, | 
| - S1 = 17, | 
| - S2 = 18, | 
| - S3 = 19, | 
| - S4 = 20, | 
| - S5 = 21, | 
| - S6 = 22, | 
| - S7 = 23, | 
| - T8 = 24, | 
| - T9 = 25, | 
| + R2 = 2, | 
| + R3 = 3, | 
| + R4 = 4, | 
| + R5 = 5, | 
| + R6 = 6, | 
| + R7 = 7, | 
| + R8 = 8, | 
| + R9 = 9, | 
| + R10 = 10, | 
| + R11 = 11, | 
| + R12 = 12, | 
| + R13 = 13, | 
| + R14 = 14, | 
| + R15 = 15, | 
| + R16 = 16, | 
| + R17 = 17, | 
| + R18 = 18, | 
| + R19 = 19, | 
| + R20 = 20, | 
| + R21 = 21, | 
| + R22 = 22, | 
| + R23 = 23, | 
| + R24 = 24, | 
| + R25 = 25, | 
| kLastFreeCpuRegister = 25, | 
| - K0 = 26, | 
| - K1 = 27, | 
| - GP = 28, | 
| - SP = 29, | 
| - FP = 30, | 
| - RA = 31, | 
| + R26 = 26, | 
| + R27 = 27, | 
| + R28 = 28, | 
| + R29 = 29, | 
| + R30 = 30, | 
| + R31 = 31, | 
| kNumberOfCpuRegisters = 32, | 
| kNoRegister = -1, | 
| + | 
| + // Register aliases. | 
| + ZR = R0, | 
| + AT = R1, | 
| + V0 = R2, | 
| + V1 = R3, | 
| + A0 = R4, | 
| + A1 = R5, | 
| + A2 = R6, | 
| + A3 = R7, | 
| + T0 = R8, | 
| + T1 = R9, | 
| + T2 = R10, | 
| + T3 = R11, | 
| + T4 = R12, | 
| + T5 = R13, | 
| + T6 = R14, | 
| + T7 = R15, | 
| + S0 = R16, | 
| + S1 = R17, | 
| + S3 = R18, | 
| + S4 = R19, | 
| + S5 = R20, | 
| + S6 = R21, | 
| + S7 = R22, | 
| + T8 = R24, | 
| + T9 = R25, | 
| + K0 = R26, | 
| + K1 = R27, | 
| + GP = R28, | 
| + SP = R29, | 
| + FP = R30, | 
| + RA = R31, | 
| }; | 
| @@ -106,6 +139,211 @@ | 
| kMaxCondition = 16, | 
| }; | 
| + | 
| +// Constants used for the decoding or encoding of the individual fields of | 
| +// instructions. Based on the "Table 4.25 CPU Instruction Format Fields". | 
| +enum InstructionFields { | 
| + kOpcodeShift = 26, | 
| + kOpcodeBits = 6, | 
| + kRsShift = 21, | 
| + kRsBits = 5, | 
| + kRtShift = 16, | 
| + kRtBits = 5, | 
| + kRdShift = 11, | 
| + kRdBits = 5, | 
| + kSaShift = 6, | 
| + kSaBits = 5, | 
| + kFunctionShift = 0, | 
| + kFunctionBits = 6, | 
| + kImmShift = 0, | 
| + kImmBits = 16, | 
| + kInstrShift = 0, | 
| + kInstrBits = 26, | 
| +}; | 
| + | 
| + | 
| +enum Opcode { | 
| + SPECIAL = 0, | 
| + REGIMM = 1, | 
| + J = 2, | 
| + JAL = 3, | 
| + BEQ = 4, | 
| + BNE = 5, | 
| + BLEZ = 6, | 
| + BGTZ = 7, | 
| + ADDI = 8, | 
| + ADDIU = 9, | 
| + SLTI = 10, | 
| + SLTIU = 11, | 
| + ANDI = 12, | 
| + ORI = 13, | 
| + XORI = 14, | 
| + LUI = 15, | 
| + CPO0 = 16, | 
| + COP1 = 17, | 
| + COP2 = 18, | 
| + COP1X = 19, | 
| + BEQL = 20, | 
| + BNEL = 21, | 
| + BLEZL = 22, | 
| + BGTZL = 23, | 
| + SPECIAL2 = 28, | 
| + JALX = 29, | 
| + SPECIAL3 = 31, | 
| + LB = 32, | 
| + LH = 33, | 
| + LWL = 34, | 
| + LW = 35, | 
| + LBU = 36, | 
| + LHU = 37, | 
| + LWR = 38, | 
| + SB = 40, | 
| + SH = 41, | 
| + SWL = 42, | 
| + SW = 43, | 
| + SWR = 46, | 
| + CACHE = 47, | 
| + LL = 48, | 
| + LWC1 = 49, | 
| + LWC2 = 50, | 
| + PREF = 51, | 
| + LDC1 = 53, | 
| + LDC2 = 54, | 
| + SC = 56, | 
| + SWC1 = 57, | 
| + SWC2 = 58, | 
| + SDC1 = 61, | 
| + SDC2 = 62, | 
| +}; | 
| + | 
| + | 
| +enum SpecialFunction { | 
| + SLL = 0, | 
| + MOVCI = 1, | 
| + SRL = 2, | 
| + SRA = 3, | 
| + SLLV = 4, | 
| + SRLV = 6, | 
| + SRAV = 7, | 
| + JR = 8, | 
| + JALR = 9, | 
| + MOVZ = 10, | 
| + MOVN = 11, | 
| + SYSCALL = 12, | 
| + BREAK = 13, | 
| + SYNC = 15, | 
| + MFHI, | 
| 
 
regis
2013/03/06 21:18:42
= 16
etc...
 
Ivan Posva
2013/03/07 11:03:22
Done. I wasn't sure which one is more readable. I
 
regis
2013/03/07 17:56:57
It looks like you forgot to upload before committi
 
 | 
| + MTHI, | 
| + MFLO, | 
| + MTLO, | 
| + MULT = 24, | 
| + MUTLU, | 
| + DIV, | 
| + DIVU, | 
| + ADD = 32, | 
| + ADDU, | 
| + SUB, | 
| + SUBU, | 
| + AND, | 
| + OR, | 
| + XOR, | 
| + NOR, | 
| + SLT = 42, | 
| + SLTU, | 
| + TGE = 48, | 
| + TGEU, | 
| + TLT, | 
| + TLTU, | 
| + TEQ, | 
| + TNE = 54, | 
| +}; | 
| + | 
| + | 
| +enum RtRegImm { | 
| + BLTZ = 0, | 
| + BGEZ, | 
| 
 
regis
2013/03/06 21:18:42
fill in enum values
 
Ivan Posva
2013/03/07 11:03:22
Done.
 
 | 
| + BLTZL, | 
| + BGEZL, | 
| + TGEI = 8, | 
| + TGEIU, | 
| + TLTI, | 
| + TLTIU, | 
| + TEQI, | 
| + TNEI = 14, | 
| + BLTZAL = 16, | 
| + BGEZAL, | 
| + BLTZALL, | 
| + BGEZALL, | 
| + SYNCI = 31, | 
| +}; | 
| + | 
| + | 
| +class Instr { | 
| + public: | 
| + enum { | 
| + kInstrSize = 4, | 
| + }; | 
| + | 
| + static const int32_t kBreakPointInstruction = | 
| + (SPECIAL << kOpcodeShift) | (BREAK << kFunctionShift); | 
| + | 
| + // Get the raw instruction bits. | 
| + inline int32_t InstructionBits() const { | 
| + return reinterpret_cast<int32_t>(this); | 
| + } | 
| + | 
| + // Read one particular bit out of the instruction bits. | 
| + inline int Bit(int nr) const { | 
| + return (InstructionBits() >> nr) & 1; | 
| + } | 
| + | 
| + // Read a bit field out of the instruction bits. | 
| + inline int Bits(int shift, int count) const { | 
| + return (InstructionBits() >> shift) & ((1 << count) - 1); | 
| + } | 
| + | 
| + // Accessors to the different named fields used in the MIPS encoding. | 
| + inline Opcode OpcodeField() const { | 
| + return static_cast<Opcode>(Bits(kOpcodeShift, kOpcodeBits)); | 
| + } | 
| + | 
| + inline Register RsField() const { | 
| + return static_cast<Register>(Bits(kRsShift, kRsBits)); | 
| + } | 
| + | 
| + inline Register RtField() const { | 
| + return static_cast<Register>(Bits(kRtShift, kRtBits)); | 
| + } | 
| + | 
| + inline Register RdField() const { | 
| + return static_cast<Register>(Bits(kRdShift, kRdBits)); | 
| + } | 
| + | 
| + inline int SaField() const { | 
| + return Bits(kSaShift, kSaBits); | 
| + } | 
| + | 
| + inline int32_t ImmField() const { | 
| + return static_cast<int32_t>(Bits(kImmShift, kImmBits)); | 
| + } | 
| + | 
| + inline SpecialFunction FunctionField() const { | 
| + return static_cast<SpecialFunction>(Bits(kFunctionShift, kFunctionBits)); | 
| + } | 
| + | 
| + // Instructions are read out of a code stream. The only way to get a | 
| + // reference to an instruction is to convert a pc. There is no way | 
| + // to allocate or create instances of class Instr. | 
| + // Use the At(pc) function to create references to Instr. | 
| + static Instr* At(uword pc) { | 
| + return reinterpret_cast<Instr*>(*reinterpret_cast<int32_t*>(pc)); | 
| + } | 
| + | 
| + private: | 
| + DISALLOW_ALLOCATION(); | 
| + DISALLOW_IMPLICIT_CONSTRUCTORS(Instr); | 
| +}; | 
| + | 
| } // namespace dart | 
| #endif // VM_CONSTANTS_MIPS_H_ |