| Index: src/mips/constants-mips.h
|
| diff --git a/src/mips/constants-mips.h b/src/mips/constants-mips.h
|
| index 813e33a7f09ce002a22afc96be1ffcae237d1c49..b0c2ebbdf8ac20a88dccd196d0e44d488951eb58 100644
|
| --- a/src/mips/constants-mips.h
|
| +++ b/src/mips/constants-mips.h
|
| @@ -298,311 +298,319 @@ const int kFBtrueBits = 1;
|
|
|
| // ----- Miscellaneous useful masks.
|
| // Instruction bit masks.
|
| -const int kOpcodeMask = ((1 << kOpcodeBits) - 1) << kOpcodeShift;
|
| -const int kImm16Mask = ((1 << kImm16Bits) - 1) << kImm16Shift;
|
| +const int kOpcodeMask = ((1 << kOpcodeBits) - 1) << kOpcodeShift;
|
| +const int kImm16Mask = ((1 << kImm16Bits) - 1) << kImm16Shift;
|
| const int kImm18Mask = ((1 << kImm18Bits) - 1) << kImm18Shift;
|
| const int kImm19Mask = ((1 << kImm19Bits) - 1) << kImm19Shift;
|
| const int kImm21Mask = ((1 << kImm21Bits) - 1) << kImm21Shift;
|
| -const int kImm26Mask = ((1 << kImm26Bits) - 1) << kImm26Shift;
|
| -const int kImm28Mask = ((1 << kImm28Bits) - 1) << kImm28Shift;
|
| -const int kRsFieldMask = ((1 << kRsBits) - 1) << kRsShift;
|
| -const int kRtFieldMask = ((1 << kRtBits) - 1) << kRtShift;
|
| -const int kRdFieldMask = ((1 << kRdBits) - 1) << kRdShift;
|
| -const int kSaFieldMask = ((1 << kSaBits) - 1) << kSaShift;
|
| -const int kFunctionFieldMask = ((1 << kFunctionBits) - 1) << kFunctionShift;
|
| +const int kImm26Mask = ((1 << kImm26Bits) - 1) << kImm26Shift;
|
| +const int kImm28Mask = ((1 << kImm28Bits) - 1) << kImm28Shift;
|
| +const int kRsFieldMask = ((1 << kRsBits) - 1) << kRsShift;
|
| +const int kRtFieldMask = ((1 << kRtBits) - 1) << kRtShift;
|
| +const int kRdFieldMask = ((1 << kRdBits) - 1) << kRdShift;
|
| +const int kSaFieldMask = ((1 << kSaBits) - 1) << kSaShift;
|
| +const int kFunctionFieldMask = ((1 << kFunctionBits) - 1) << kFunctionShift;
|
| // Misc masks.
|
| -const int kHiMask = 0xffff << 16;
|
| -const int kLoMask = 0xffff;
|
| -const int kSignMask = 0x80000000;
|
| -const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1;
|
| +const int kHiMask = 0xffff << 16;
|
| +const int kLoMask = 0xffff;
|
| +const int kSignMask = 0x80000000;
|
| +const int kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1;
|
|
|
| // ----- MIPS Opcodes and Function Fields.
|
| // We use this presentation to stay close to the table representation in
|
| // MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set.
|
| -enum Opcode {
|
| - SPECIAL = 0 << kOpcodeShift,
|
| - REGIMM = 1 << kOpcodeShift,
|
| -
|
| - J = ((0 << 3) + 2) << kOpcodeShift,
|
| - JAL = ((0 << 3) + 3) << kOpcodeShift,
|
| - BEQ = ((0 << 3) + 4) << kOpcodeShift,
|
| - BNE = ((0 << 3) + 5) << kOpcodeShift,
|
| - BLEZ = ((0 << 3) + 6) << kOpcodeShift,
|
| - BGTZ = ((0 << 3) + 7) << kOpcodeShift,
|
| -
|
| - ADDI = ((1 << 3) + 0) << kOpcodeShift,
|
| - ADDIU = ((1 << 3) + 1) << kOpcodeShift,
|
| - SLTI = ((1 << 3) + 2) << kOpcodeShift,
|
| - SLTIU = ((1 << 3) + 3) << kOpcodeShift,
|
| - ANDI = ((1 << 3) + 4) << kOpcodeShift,
|
| - ORI = ((1 << 3) + 5) << kOpcodeShift,
|
| - XORI = ((1 << 3) + 6) << kOpcodeShift,
|
| - LUI = ((1 << 3) + 7) << kOpcodeShift, // LUI/AUI family.
|
| -
|
| - BEQC = ((2 << 3) + 0) << kOpcodeShift,
|
| - COP1 = ((2 << 3) + 1) << kOpcodeShift, // Coprocessor 1 class.
|
| - BEQL = ((2 << 3) + 4) << kOpcodeShift,
|
| - BNEL = ((2 << 3) + 5) << kOpcodeShift,
|
| - BLEZL = ((2 << 3) + 6) << kOpcodeShift,
|
| - BGTZL = ((2 << 3) + 7) << kOpcodeShift,
|
| -
|
| - DADDI = ((3 << 3) + 0) << kOpcodeShift, // This is also BNEC.
|
| - SPECIAL2 = ((3 << 3) + 4) << kOpcodeShift,
|
| - SPECIAL3 = ((3 << 3) + 7) << kOpcodeShift,
|
| -
|
| - LB = ((4 << 3) + 0) << kOpcodeShift,
|
| - LH = ((4 << 3) + 1) << kOpcodeShift,
|
| - LWL = ((4 << 3) + 2) << kOpcodeShift,
|
| - LW = ((4 << 3) + 3) << kOpcodeShift,
|
| - LBU = ((4 << 3) + 4) << kOpcodeShift,
|
| - LHU = ((4 << 3) + 5) << kOpcodeShift,
|
| - LWR = ((4 << 3) + 6) << kOpcodeShift,
|
| - SB = ((5 << 3) + 0) << kOpcodeShift,
|
| - SH = ((5 << 3) + 1) << kOpcodeShift,
|
| - SWL = ((5 << 3) + 2) << kOpcodeShift,
|
| - SW = ((5 << 3) + 3) << kOpcodeShift,
|
| - SWR = ((5 << 3) + 6) << kOpcodeShift,
|
| -
|
| - LWC1 = ((6 << 3) + 1) << kOpcodeShift,
|
| - BC = ((6 << 3) + 2) << kOpcodeShift,
|
| - LDC1 = ((6 << 3) + 5) << kOpcodeShift,
|
| - POP66 = ((6 << 3) + 6) << kOpcodeShift,
|
| -
|
| - PREF = ((6 << 3) + 3) << kOpcodeShift,
|
| -
|
| - SWC1 = ((7 << 3) + 1) << kOpcodeShift,
|
| - BALC = ((7 << 3) + 2) << kOpcodeShift,
|
| - PCREL = ((7 << 3) + 3) << kOpcodeShift,
|
| - SDC1 = ((7 << 3) + 5) << kOpcodeShift,
|
| - POP76 = ((7 << 3) + 6) << kOpcodeShift,
|
| -
|
| - COP1X = ((1 << 4) + 3) << kOpcodeShift
|
| +enum Opcode : uint32_t {
|
| + SPECIAL = 0U << kOpcodeShift,
|
| + REGIMM = 1U << kOpcodeShift,
|
| +
|
| + J = ((0U << 3) + 2) << kOpcodeShift,
|
| + JAL = ((0U << 3) + 3) << kOpcodeShift,
|
| + BEQ = ((0U << 3) + 4) << kOpcodeShift,
|
| + BNE = ((0U << 3) + 5) << kOpcodeShift,
|
| + BLEZ = ((0U << 3) + 6) << kOpcodeShift,
|
| + BGTZ = ((0U << 3) + 7) << kOpcodeShift,
|
| +
|
| + ADDI = ((1U << 3) + 0) << kOpcodeShift,
|
| + ADDIU = ((1U << 3) + 1) << kOpcodeShift,
|
| + SLTI = ((1U << 3) + 2) << kOpcodeShift,
|
| + SLTIU = ((1U << 3) + 3) << kOpcodeShift,
|
| + ANDI = ((1U << 3) + 4) << kOpcodeShift,
|
| + ORI = ((1U << 3) + 5) << kOpcodeShift,
|
| + XORI = ((1U << 3) + 6) << kOpcodeShift,
|
| + LUI = ((1U << 3) + 7) << kOpcodeShift, // LUI/AUI family.
|
| +
|
| + BEQC = ((2U << 3) + 0) << kOpcodeShift,
|
| + COP1 = ((2U << 3) + 1) << kOpcodeShift, // Coprocessor 1 class.
|
| + BEQL = ((2U << 3) + 4) << kOpcodeShift,
|
| + BNEL = ((2U << 3) + 5) << kOpcodeShift,
|
| + BLEZL = ((2U << 3) + 6) << kOpcodeShift,
|
| + BGTZL = ((2U << 3) + 7) << kOpcodeShift,
|
| +
|
| + DADDI = ((3U << 3) + 0) << kOpcodeShift, // This is also BNEC.
|
| + SPECIAL2 = ((3U << 3) + 4) << kOpcodeShift,
|
| + SPECIAL3 = ((3U << 3) + 7) << kOpcodeShift,
|
| +
|
| + LB = ((4U << 3) + 0) << kOpcodeShift,
|
| + LH = ((4U << 3) + 1) << kOpcodeShift,
|
| + LWL = ((4U << 3) + 2) << kOpcodeShift,
|
| + LW = ((4U << 3) + 3) << kOpcodeShift,
|
| + LBU = ((4U << 3) + 4) << kOpcodeShift,
|
| + LHU = ((4U << 3) + 5) << kOpcodeShift,
|
| + LWR = ((4U << 3) + 6) << kOpcodeShift,
|
| + SB = ((5U << 3) + 0) << kOpcodeShift,
|
| + SH = ((5U << 3) + 1) << kOpcodeShift,
|
| + SWL = ((5U << 3) + 2) << kOpcodeShift,
|
| + SW = ((5U << 3) + 3) << kOpcodeShift,
|
| + SWR = ((5U << 3) + 6) << kOpcodeShift,
|
| +
|
| + LWC1 = ((6U << 3) + 1) << kOpcodeShift,
|
| + BC = ((6U << 3) + 2) << kOpcodeShift,
|
| + LDC1 = ((6U << 3) + 5) << kOpcodeShift,
|
| + POP66 = ((6U << 3) + 6) << kOpcodeShift, // beqzc, jic
|
| +
|
| + PREF = ((6U << 3) + 3) << kOpcodeShift,
|
| +
|
| + SWC1 = ((7U << 3) + 1) << kOpcodeShift,
|
| + BALC = ((7U << 3) + 2) << kOpcodeShift,
|
| + PCREL = ((7U << 3) + 3) << kOpcodeShift,
|
| + SDC1 = ((7U << 3) + 5) << kOpcodeShift,
|
| + POP76 = ((7U << 3) + 6) << kOpcodeShift, // bnezc, jialc
|
| +
|
| + COP1X = ((1U << 4) + 3) << kOpcodeShift,
|
| +
|
| + // New r6 instruction.
|
| + POP06 = BLEZ, // bgeuc/bleuc, blezalc, bgezalc
|
| + POP07 = BGTZ, // bltuc/bgtuc, bgtzalc, bltzalc
|
| + POP10 = ADDI, // beqzalc, bovc, beqc
|
| + POP26 = BLEZL, // bgezc, blezc, bgec/blec
|
| + POP27 = BGTZL, // bgtzc, bltzc, bltc/bgtc
|
| + POP30 = DADDI, // bnezalc, bvnc, bnec
|
| };
|
|
|
| -enum SecondaryField {
|
| +enum SecondaryField : uint32_t {
|
| // SPECIAL Encoding of Function Field.
|
| - SLL = ((0 << 3) + 0),
|
| - MOVCI = ((0 << 3) + 1),
|
| - SRL = ((0 << 3) + 2),
|
| - SRA = ((0 << 3) + 3),
|
| - SLLV = ((0 << 3) + 4),
|
| - SRLV = ((0 << 3) + 6),
|
| - SRAV = ((0 << 3) + 7),
|
| -
|
| - JR = ((1 << 3) + 0),
|
| - JALR = ((1 << 3) + 1),
|
| - MOVZ = ((1 << 3) + 2),
|
| - MOVN = ((1 << 3) + 3),
|
| - BREAK = ((1 << 3) + 5),
|
| -
|
| - MFHI = ((2 << 3) + 0),
|
| - CLZ_R6 = ((2 << 3) + 0),
|
| - CLO_R6 = ((2 << 3) + 1),
|
| - MFLO = ((2 << 3) + 2),
|
| -
|
| - MULT = ((3 << 3) + 0),
|
| - MULTU = ((3 << 3) + 1),
|
| - DIV = ((3 << 3) + 2),
|
| - DIVU = ((3 << 3) + 3),
|
| -
|
| - ADD = ((4 << 3) + 0),
|
| - ADDU = ((4 << 3) + 1),
|
| - SUB = ((4 << 3) + 2),
|
| - SUBU = ((4 << 3) + 3),
|
| - AND = ((4 << 3) + 4),
|
| - OR = ((4 << 3) + 5),
|
| - XOR = ((4 << 3) + 6),
|
| - NOR = ((4 << 3) + 7),
|
| -
|
| - SLT = ((5 << 3) + 2),
|
| - SLTU = ((5 << 3) + 3),
|
| -
|
| - TGE = ((6 << 3) + 0),
|
| - TGEU = ((6 << 3) + 1),
|
| - TLT = ((6 << 3) + 2),
|
| - TLTU = ((6 << 3) + 3),
|
| - TEQ = ((6 << 3) + 4),
|
| - SELEQZ_S = ((6 << 3) + 5),
|
| - TNE = ((6 << 3) + 6),
|
| - SELNEZ_S = ((6 << 3) + 7),
|
| + SLL = ((0U << 3) + 0),
|
| + MOVCI = ((0U << 3) + 1),
|
| + SRL = ((0U << 3) + 2),
|
| + SRA = ((0U << 3) + 3),
|
| + SLLV = ((0U << 3) + 4),
|
| + SRLV = ((0U << 3) + 6),
|
| + SRAV = ((0U << 3) + 7),
|
| +
|
| + JR = ((1U << 3) + 0),
|
| + JALR = ((1U << 3) + 1),
|
| + MOVZ = ((1U << 3) + 2),
|
| + MOVN = ((1U << 3) + 3),
|
| + BREAK = ((1U << 3) + 5),
|
| +
|
| + MFHI = ((2U << 3) + 0),
|
| + CLZ_R6 = ((2U << 3) + 0),
|
| + CLO_R6 = ((2U << 3) + 1),
|
| + MFLO = ((2U << 3) + 2),
|
| +
|
| + MULT = ((3U << 3) + 0),
|
| + MULTU = ((3U << 3) + 1),
|
| + DIV = ((3U << 3) + 2),
|
| + DIVU = ((3U << 3) + 3),
|
| +
|
| + ADD = ((4U << 3) + 0),
|
| + ADDU = ((4U << 3) + 1),
|
| + SUB = ((4U << 3) + 2),
|
| + SUBU = ((4U << 3) + 3),
|
| + AND = ((4U << 3) + 4),
|
| + OR = ((4U << 3) + 5),
|
| + XOR = ((4U << 3) + 6),
|
| + NOR = ((4U << 3) + 7),
|
| +
|
| + SLT = ((5U << 3) + 2),
|
| + SLTU = ((5U << 3) + 3),
|
| +
|
| + TGE = ((6U << 3) + 0),
|
| + TGEU = ((6U << 3) + 1),
|
| + TLT = ((6U << 3) + 2),
|
| + TLTU = ((6U << 3) + 3),
|
| + TEQ = ((6U << 3) + 4),
|
| + SELEQZ_S = ((6U << 3) + 5),
|
| + TNE = ((6U << 3) + 6),
|
| + SELNEZ_S = ((6U << 3) + 7),
|
|
|
| // Multiply integers in r6.
|
| - MUL_MUH = ((3 << 3) + 0), // MUL, MUH.
|
| - MUL_MUH_U = ((3 << 3) + 1), // MUL_U, MUH_U.
|
| - RINT = ((3 << 3) + 2),
|
| + MUL_MUH = ((3U << 3) + 0), // MUL, MUH.
|
| + MUL_MUH_U = ((3U << 3) + 1), // MUL_U, MUH_U.
|
| + RINT = ((3U << 3) + 2),
|
|
|
| - MUL_OP = ((0 << 3) + 2),
|
| - MUH_OP = ((0 << 3) + 3),
|
| - DIV_OP = ((0 << 3) + 2),
|
| - MOD_OP = ((0 << 3) + 3),
|
| + MUL_OP = ((0U << 3) + 2),
|
| + MUH_OP = ((0U << 3) + 3),
|
| + DIV_OP = ((0U << 3) + 2),
|
| + MOD_OP = ((0U << 3) + 3),
|
|
|
| - DIV_MOD = ((3 << 3) + 2),
|
| - DIV_MOD_U = ((3 << 3) + 3),
|
| + DIV_MOD = ((3U << 3) + 2),
|
| + DIV_MOD_U = ((3U << 3) + 3),
|
|
|
| // SPECIAL2 Encoding of Function Field.
|
| - MUL = ((0 << 3) + 2),
|
| - CLZ = ((4 << 3) + 0),
|
| - CLO = ((4 << 3) + 1),
|
| + MUL = ((0U << 3) + 2),
|
| + CLZ = ((4U << 3) + 0),
|
| + CLO = ((4U << 3) + 1),
|
|
|
| // SPECIAL3 Encoding of Function Field.
|
| - EXT = ((0 << 3) + 0),
|
| - INS = ((0 << 3) + 4),
|
| - BSHFL = ((4 << 3) + 0),
|
| + EXT = ((0U << 3) + 0),
|
| + INS = ((0U << 3) + 4),
|
| + BSHFL = ((4U << 3) + 0),
|
|
|
| // SPECIAL3 Encoding of sa Field.
|
| - BITSWAP = ((0 << 3) + 0),
|
| - ALIGN = ((0 << 3) + 2),
|
| - WSBH = ((0 << 3) + 2),
|
| - SEB = ((2 << 3) + 0),
|
| - SEH = ((3 << 3) + 0),
|
| + BITSWAP = ((0U << 3) + 0),
|
| + ALIGN = ((0U << 3) + 2),
|
| + WSBH = ((0U << 3) + 2),
|
| + SEB = ((2U << 3) + 0),
|
| + SEH = ((3U << 3) + 0),
|
|
|
| // REGIMM encoding of rt Field.
|
| - BLTZ = ((0 << 3) + 0) << 16,
|
| - BGEZ = ((0 << 3) + 1) << 16,
|
| - BLTZAL = ((2 << 3) + 0) << 16,
|
| - BGEZAL = ((2 << 3) + 1) << 16,
|
| - BGEZALL = ((2 << 3) + 3) << 16,
|
| + BLTZ = ((0U << 3) + 0) << 16,
|
| + BGEZ = ((0U << 3) + 1) << 16,
|
| + BLTZAL = ((2U << 3) + 0) << 16,
|
| + BGEZAL = ((2U << 3) + 1) << 16,
|
| + BGEZALL = ((2U << 3) + 3) << 16,
|
|
|
| // COP1 Encoding of rs Field.
|
| - MFC1 = ((0 << 3) + 0) << 21,
|
| - CFC1 = ((0 << 3) + 2) << 21,
|
| - MFHC1 = ((0 << 3) + 3) << 21,
|
| - MTC1 = ((0 << 3) + 4) << 21,
|
| - CTC1 = ((0 << 3) + 6) << 21,
|
| - MTHC1 = ((0 << 3) + 7) << 21,
|
| - BC1 = ((1 << 3) + 0) << 21,
|
| - S = ((2 << 3) + 0) << 21,
|
| - D = ((2 << 3) + 1) << 21,
|
| - W = ((2 << 3) + 4) << 21,
|
| - L = ((2 << 3) + 5) << 21,
|
| - PS = ((2 << 3) + 6) << 21,
|
| + MFC1 = ((0U << 3) + 0) << 21,
|
| + CFC1 = ((0U << 3) + 2) << 21,
|
| + MFHC1 = ((0U << 3) + 3) << 21,
|
| + MTC1 = ((0U << 3) + 4) << 21,
|
| + CTC1 = ((0U << 3) + 6) << 21,
|
| + MTHC1 = ((0U << 3) + 7) << 21,
|
| + BC1 = ((1U << 3) + 0) << 21,
|
| + S = ((2U << 3) + 0) << 21,
|
| + D = ((2U << 3) + 1) << 21,
|
| + W = ((2U << 3) + 4) << 21,
|
| + L = ((2U << 3) + 5) << 21,
|
| + PS = ((2U << 3) + 6) << 21,
|
| // COP1 Encoding of Function Field When rs=S.
|
|
|
| - ADD_S = ((0 << 3) + 0),
|
| - SUB_S = ((0 << 3) + 1),
|
| - MUL_S = ((0 << 3) + 2),
|
| - DIV_S = ((0 << 3) + 3),
|
| - ABS_S = ((0 << 3) + 5),
|
| - SQRT_S = ((0 << 3) + 4),
|
| - MOV_S = ((0 << 3) + 6),
|
| - NEG_S = ((0 << 3) + 7),
|
| - ROUND_L_S = ((1 << 3) + 0),
|
| - TRUNC_L_S = ((1 << 3) + 1),
|
| - CEIL_L_S = ((1 << 3) + 2),
|
| - FLOOR_L_S = ((1 << 3) + 3),
|
| - ROUND_W_S = ((1 << 3) + 4),
|
| - TRUNC_W_S = ((1 << 3) + 5),
|
| - CEIL_W_S = ((1 << 3) + 6),
|
| - FLOOR_W_S = ((1 << 3) + 7),
|
| - RECIP_S = ((2 << 3) + 5),
|
| - RSQRT_S = ((2 << 3) + 6),
|
| - CLASS_S = ((3 << 3) + 3),
|
| - CVT_D_S = ((4 << 3) + 1),
|
| - CVT_W_S = ((4 << 3) + 4),
|
| - CVT_L_S = ((4 << 3) + 5),
|
| - CVT_PS_S = ((4 << 3) + 6),
|
| + ADD_S = ((0U << 3) + 0),
|
| + SUB_S = ((0U << 3) + 1),
|
| + MUL_S = ((0U << 3) + 2),
|
| + DIV_S = ((0U << 3) + 3),
|
| + ABS_S = ((0U << 3) + 5),
|
| + SQRT_S = ((0U << 3) + 4),
|
| + MOV_S = ((0U << 3) + 6),
|
| + NEG_S = ((0U << 3) + 7),
|
| + ROUND_L_S = ((1U << 3) + 0),
|
| + TRUNC_L_S = ((1U << 3) + 1),
|
| + CEIL_L_S = ((1U << 3) + 2),
|
| + FLOOR_L_S = ((1U << 3) + 3),
|
| + ROUND_W_S = ((1U << 3) + 4),
|
| + TRUNC_W_S = ((1U << 3) + 5),
|
| + CEIL_W_S = ((1U << 3) + 6),
|
| + FLOOR_W_S = ((1U << 3) + 7),
|
| + RECIP_S = ((2U << 3) + 5),
|
| + RSQRT_S = ((2U << 3) + 6),
|
| + CLASS_S = ((3U << 3) + 3),
|
| + CVT_D_S = ((4U << 3) + 1),
|
| + CVT_W_S = ((4U << 3) + 4),
|
| + CVT_L_S = ((4U << 3) + 5),
|
| + CVT_PS_S = ((4U << 3) + 6),
|
|
|
| // COP1 Encoding of Function Field When rs=D.
|
| - ADD_D = ((0 << 3) + 0),
|
| - SUB_D = ((0 << 3) + 1),
|
| - MUL_D = ((0 << 3) + 2),
|
| - DIV_D = ((0 << 3) + 3),
|
| - SQRT_D = ((0 << 3) + 4),
|
| - ABS_D = ((0 << 3) + 5),
|
| - MOV_D = ((0 << 3) + 6),
|
| - NEG_D = ((0 << 3) + 7),
|
| - ROUND_L_D = ((1 << 3) + 0),
|
| - TRUNC_L_D = ((1 << 3) + 1),
|
| - CEIL_L_D = ((1 << 3) + 2),
|
| - FLOOR_L_D = ((1 << 3) + 3),
|
| - ROUND_W_D = ((1 << 3) + 4),
|
| - TRUNC_W_D = ((1 << 3) + 5),
|
| - CEIL_W_D = ((1 << 3) + 6),
|
| - FLOOR_W_D = ((1 << 3) + 7),
|
| - RECIP_D = ((2 << 3) + 5),
|
| - RSQRT_D = ((2 << 3) + 6),
|
| - CLASS_D = ((3 << 3) + 3),
|
| - MIN = ((3 << 3) + 4),
|
| - MINA = ((3 << 3) + 5),
|
| - MAX = ((3 << 3) + 6),
|
| - MAXA = ((3 << 3) + 7),
|
| - CVT_S_D = ((4 << 3) + 0),
|
| - CVT_W_D = ((4 << 3) + 4),
|
| - CVT_L_D = ((4 << 3) + 5),
|
| - C_F_D = ((6 << 3) + 0),
|
| - C_UN_D = ((6 << 3) + 1),
|
| - C_EQ_D = ((6 << 3) + 2),
|
| - C_UEQ_D = ((6 << 3) + 3),
|
| - C_OLT_D = ((6 << 3) + 4),
|
| - C_ULT_D = ((6 << 3) + 5),
|
| - C_OLE_D = ((6 << 3) + 6),
|
| - C_ULE_D = ((6 << 3) + 7),
|
| + ADD_D = ((0U << 3) + 0),
|
| + SUB_D = ((0U << 3) + 1),
|
| + MUL_D = ((0U << 3) + 2),
|
| + DIV_D = ((0U << 3) + 3),
|
| + SQRT_D = ((0U << 3) + 4),
|
| + ABS_D = ((0U << 3) + 5),
|
| + MOV_D = ((0U << 3) + 6),
|
| + NEG_D = ((0U << 3) + 7),
|
| + ROUND_L_D = ((1U << 3) + 0),
|
| + TRUNC_L_D = ((1U << 3) + 1),
|
| + CEIL_L_D = ((1U << 3) + 2),
|
| + FLOOR_L_D = ((1U << 3) + 3),
|
| + ROUND_W_D = ((1U << 3) + 4),
|
| + TRUNC_W_D = ((1U << 3) + 5),
|
| + CEIL_W_D = ((1U << 3) + 6),
|
| + FLOOR_W_D = ((1U << 3) + 7),
|
| + RECIP_D = ((2U << 3) + 5),
|
| + RSQRT_D = ((2U << 3) + 6),
|
| + CLASS_D = ((3U << 3) + 3),
|
| + MIN = ((3U << 3) + 4),
|
| + MINA = ((3U << 3) + 5),
|
| + MAX = ((3U << 3) + 6),
|
| + MAXA = ((3U << 3) + 7),
|
| + CVT_S_D = ((4U << 3) + 0),
|
| + CVT_W_D = ((4U << 3) + 4),
|
| + CVT_L_D = ((4U << 3) + 5),
|
| + C_F_D = ((6U << 3) + 0),
|
| + C_UN_D = ((6U << 3) + 1),
|
| + C_EQ_D = ((6U << 3) + 2),
|
| + C_UEQ_D = ((6U << 3) + 3),
|
| + C_OLT_D = ((6U << 3) + 4),
|
| + C_ULT_D = ((6U << 3) + 5),
|
| + C_OLE_D = ((6U << 3) + 6),
|
| + C_ULE_D = ((6U << 3) + 7),
|
|
|
| // COP1 Encoding of Function Field When rs=W or L.
|
| - CVT_S_W = ((4 << 3) + 0),
|
| - CVT_D_W = ((4 << 3) + 1),
|
| - CVT_S_L = ((4 << 3) + 0),
|
| - CVT_D_L = ((4 << 3) + 1),
|
| - BC1EQZ = ((2 << 2) + 1) << 21,
|
| - BC1NEZ = ((3 << 2) + 1) << 21,
|
| + CVT_S_W = ((4U << 3) + 0),
|
| + CVT_D_W = ((4U << 3) + 1),
|
| + CVT_S_L = ((4U << 3) + 0),
|
| + CVT_D_L = ((4U << 3) + 1),
|
| + BC1EQZ = ((2U << 2) + 1) << 21,
|
| + BC1NEZ = ((3U << 2) + 1) << 21,
|
| // COP1 CMP positive predicates Bit 5..4 = 00.
|
| - CMP_AF = ((0 << 3) + 0),
|
| - CMP_UN = ((0 << 3) + 1),
|
| - CMP_EQ = ((0 << 3) + 2),
|
| - CMP_UEQ = ((0 << 3) + 3),
|
| - CMP_LT = ((0 << 3) + 4),
|
| - CMP_ULT = ((0 << 3) + 5),
|
| - CMP_LE = ((0 << 3) + 6),
|
| - CMP_ULE = ((0 << 3) + 7),
|
| - CMP_SAF = ((1 << 3) + 0),
|
| - CMP_SUN = ((1 << 3) + 1),
|
| - CMP_SEQ = ((1 << 3) + 2),
|
| - CMP_SUEQ = ((1 << 3) + 3),
|
| - CMP_SSLT = ((1 << 3) + 4),
|
| - CMP_SSULT = ((1 << 3) + 5),
|
| - CMP_SLE = ((1 << 3) + 6),
|
| - CMP_SULE = ((1 << 3) + 7),
|
| + CMP_AF = ((0U << 3) + 0),
|
| + CMP_UN = ((0U << 3) + 1),
|
| + CMP_EQ = ((0U << 3) + 2),
|
| + CMP_UEQ = ((0U << 3) + 3),
|
| + CMP_LT = ((0U << 3) + 4),
|
| + CMP_ULT = ((0U << 3) + 5),
|
| + CMP_LE = ((0U << 3) + 6),
|
| + CMP_ULE = ((0U << 3) + 7),
|
| + CMP_SAF = ((1U << 3) + 0),
|
| + CMP_SUN = ((1U << 3) + 1),
|
| + CMP_SEQ = ((1U << 3) + 2),
|
| + CMP_SUEQ = ((1U << 3) + 3),
|
| + CMP_SSLT = ((1U << 3) + 4),
|
| + CMP_SSULT = ((1U << 3) + 5),
|
| + CMP_SLE = ((1U << 3) + 6),
|
| + CMP_SULE = ((1U << 3) + 7),
|
| // COP1 CMP negative predicates Bit 5..4 = 01.
|
| - CMP_AT = ((2 << 3) + 0), // Reserved, not implemented.
|
| - CMP_OR = ((2 << 3) + 1),
|
| - CMP_UNE = ((2 << 3) + 2),
|
| - CMP_NE = ((2 << 3) + 3),
|
| - CMP_UGE = ((2 << 3) + 4), // Reserved, not implemented.
|
| - CMP_OGE = ((2 << 3) + 5), // Reserved, not implemented.
|
| - CMP_UGT = ((2 << 3) + 6), // Reserved, not implemented.
|
| - CMP_OGT = ((2 << 3) + 7), // Reserved, not implemented.
|
| - CMP_SAT = ((3 << 3) + 0), // Reserved, not implemented.
|
| - CMP_SOR = ((3 << 3) + 1),
|
| - CMP_SUNE = ((3 << 3) + 2),
|
| - CMP_SNE = ((3 << 3) + 3),
|
| - CMP_SUGE = ((3 << 3) + 4), // Reserved, not implemented.
|
| - CMP_SOGE = ((3 << 3) + 5), // Reserved, not implemented.
|
| - CMP_SUGT = ((3 << 3) + 6), // Reserved, not implemented.
|
| - CMP_SOGT = ((3 << 3) + 7), // Reserved, not implemented.
|
| -
|
| - SEL = ((2 << 3) + 0),
|
| - MOVZ_C = ((2 << 3) + 2),
|
| - MOVN_C = ((2 << 3) + 3),
|
| - SELEQZ_C = ((2 << 3) + 4), // COP1 on FPR registers.
|
| - MOVF = ((2 << 3) + 1), // Function field for MOVT.fmt and MOVF.fmt
|
| - SELNEZ_C = ((2 << 3) + 7), // COP1 on FPR registers.
|
| + CMP_AT = ((2U << 3) + 0), // Reserved, not implemented.
|
| + CMP_OR = ((2U << 3) + 1),
|
| + CMP_UNE = ((2U << 3) + 2),
|
| + CMP_NE = ((2U << 3) + 3),
|
| + CMP_UGE = ((2U << 3) + 4), // Reserved, not implemented.
|
| + CMP_OGE = ((2U << 3) + 5), // Reserved, not implemented.
|
| + CMP_UGT = ((2U << 3) + 6), // Reserved, not implemented.
|
| + CMP_OGT = ((2U << 3) + 7), // Reserved, not implemented.
|
| + CMP_SAT = ((3U << 3) + 0), // Reserved, not implemented.
|
| + CMP_SOR = ((3U << 3) + 1),
|
| + CMP_SUNE = ((3U << 3) + 2),
|
| + CMP_SNE = ((3U << 3) + 3),
|
| + CMP_SUGE = ((3U << 3) + 4), // Reserved, not implemented.
|
| + CMP_SOGE = ((3U << 3) + 5), // Reserved, not implemented.
|
| + CMP_SUGT = ((3U << 3) + 6), // Reserved, not implemented.
|
| + CMP_SOGT = ((3U << 3) + 7), // Reserved, not implemented.
|
| +
|
| + SEL = ((2U << 3) + 0),
|
| + MOVZ_C = ((2U << 3) + 2),
|
| + MOVN_C = ((2U << 3) + 3),
|
| + SELEQZ_C = ((2U << 3) + 4), // COP1 on FPR registers.
|
| + MOVF = ((2U << 3) + 1), // Function field for MOVT.fmt and MOVF.fmt
|
| + SELNEZ_C = ((2U << 3) + 7), // COP1 on FPR registers.
|
| // COP1 Encoding of Function Field When rs=PS.
|
| // COP1X Encoding of Function Field.
|
| - MADD_D = ((4 << 3) + 1),
|
| + MADD_D = ((4U << 3) + 1),
|
|
|
| // PCREL Encoding of rt Field.
|
| - ADDIUPC = ((0 << 2) + 0),
|
| - LWPC = ((0 << 2) + 1),
|
| - AUIPC = ((3 << 3) + 6),
|
| - ALUIPC = ((3 << 3) + 7),
|
| + ADDIUPC = ((0U << 2) + 0),
|
| + LWPC = ((0U << 2) + 1),
|
| + AUIPC = ((3U << 3) + 6),
|
| + ALUIPC = ((3U << 3) + 7),
|
|
|
| // POP66 Encoding of rs Field.
|
| - JIC = ((0 << 5) + 0),
|
| + JIC = ((0U << 5) + 0),
|
|
|
| // POP76 Encoding of rs Field.
|
| - JIALC = ((0 << 5) + 0),
|
| + JIALC = ((0U << 5) + 0),
|
|
|
| - NULLSF = 0
|
| + NULLSF = 0U
|
| };
|
|
|
|
|
| @@ -820,6 +828,10 @@ const Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6;
|
| // A nop instruction. (Encoding of sll 0 0 0).
|
| const Instr nopInstr = 0;
|
|
|
| +static constexpr uint64_t OpcodeToBitNumber(Opcode opcode) {
|
| + return 1ULL << (static_cast<uint32_t>(opcode) >> kOpcodeShift);
|
| +}
|
| +
|
|
|
| class Instruction {
|
| public:
|
| @@ -848,7 +860,7 @@ class Instruction {
|
|
|
| // Read a bit field out of the instruction bits.
|
| inline int Bits(int hi, int lo) const {
|
| - return (InstructionBits() >> lo) & ((2 << (hi - lo)) - 1);
|
| + return (InstructionBits() >> lo) & ((2U << (hi - lo)) - 1);
|
| }
|
|
|
| // Instruction type.
|
| @@ -862,10 +874,7 @@ class Instruction {
|
| enum TypeChecks { NORMAL, EXTRA };
|
|
|
|
|
| -#define OpcodeToBitNumber(opcode) \
|
| - (1ULL << (static_cast<uint32_t>(opcode) >> kOpcodeShift))
|
| -
|
| - static const uint64_t kOpcodeImmediateTypeMask =
|
| + static constexpr uint64_t kOpcodeImmediateTypeMask =
|
| OpcodeToBitNumber(REGIMM) | OpcodeToBitNumber(BEQ) |
|
| OpcodeToBitNumber(BNE) | OpcodeToBitNumber(BLEZ) |
|
| OpcodeToBitNumber(BGTZ) | OpcodeToBitNumber(ADDI) |
|
| @@ -1032,6 +1041,11 @@ class Instruction {
|
| }
|
| }
|
|
|
| + inline int32_t ImmValue(int bits) const {
|
| + DCHECK(InstructionType() == kImmediateType);
|
| + return Bits(bits - 1, 0);
|
| + }
|
| +
|
| inline int32_t Imm16Value() const {
|
| DCHECK(InstructionType() == kImmediateType);
|
| return Bits(kImm16Shift + kImm16Bits - 1, kImm16Shift);
|
| @@ -1058,8 +1072,18 @@ class Instruction {
|
| return Bits(kImm26Shift + kImm26Bits - 1, kImm26Shift);
|
| }
|
|
|
| - // Say if the instruction should not be used in a branch delay slot.
|
| - bool IsForbiddenInBranchDelay() const;
|
| + static bool IsForbiddenAfterBranchInstr(Instr instr);
|
| +
|
| + // Say if the instruction should not be used in a branch delay slot or
|
| + // immediately after a compact branch.
|
| + inline bool IsForbiddenAfterBranch() const {
|
| + return IsForbiddenAfterBranchInstr(InstructionBits());
|
| + }
|
| +
|
| + inline bool IsForbiddenInBranchDelay() const {
|
| + return IsForbiddenAfterBranch();
|
| + }
|
| +
|
| // Say if the instruction 'links'. e.g. jal, bal.
|
| bool IsLinkingInstruction() const;
|
| // Say if the instruction is a break or a trap.
|
|
|