Chromium Code Reviews| Index: src/mips64/constants-mips64.h |
| diff --git a/src/mips64/constants-mips64.h b/src/mips64/constants-mips64.h |
| index 38e5aa3dd176d5d978844ec3326d2886ebfc82f6..1ae0a7cf211ab5e01c9bc26f4c3c3bc9034b1eb8 100644 |
| --- a/src/mips64/constants-mips64.h |
| +++ b/src/mips64/constants-mips64.h |
| @@ -17,15 +17,17 @@ |
| #define UNSUPPORTED_MIPS() v8::internal::PrintF("Unsupported instruction.\n") |
| enum ArchVariants { |
| - kMips32r2, |
| - kMips32r1, |
| + kMips64r1, |
|
paul.l...
2014/07/29 14:58:04
I do not think we need kMips64r1 -- there are only
dusmil.imgtec
2014/07/29 17:39:12
I agree. I removed kLoongson also, newer versions
dusmil.imgtec
2014/07/29 17:39:12
Done.
|
| + kMips64r2, |
| kLoongson, |
| - kMips64r2 |
| + kMips64r6 |
| }; |
| #ifdef _MIPS_ARCH_MIPS64R2 |
| static const ArchVariants kArchVariant = kMips64r2; |
| +#elif _MIPS_ARCH_MIPS64R6 |
| + static const ArchVariants kArchVariant = kMips64r6; |
| #elif _MIPS_ARCH_LOONGSON |
| // The loongson flag refers to the LOONGSON architectures based on MIPS-III, |
| // which predates (and is a subset of) the mips32r2 and r1 architectures. |
| @@ -228,6 +230,8 @@ const int kLuiShift = 16; |
| const int kImm16Shift = 0; |
| const int kImm16Bits = 16; |
| +const int kImm21Shift = 0; |
| +const int kImm21Bits = 21; |
| const int kImm26Shift = 0; |
| const int kImm26Bits = 26; |
| const int kImm28Shift = 0; |
| @@ -295,15 +299,17 @@ enum Opcode { |
| ANDI = ((1 << 3) + 4) << kOpcodeShift, |
| ORI = ((1 << 3) + 5) << kOpcodeShift, |
| XORI = ((1 << 3) + 6) << kOpcodeShift, |
| - LUI = ((1 << 3) + 7) << kOpcodeShift, |
| + LUI = ((1 << 3) + 7) << kOpcodeShift, // LUI/AUI family. |
| + DAUI = ((3 << 3) + 5) << kOpcodeShift, |
| + 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, |
| + DADDI = ((3 << 3) + 0) << kOpcodeShift, // This is also BNEC. |
| DADDIU = ((3 << 3) + 1) << kOpcodeShift, |
| LDL = ((3 << 3) + 2) << kOpcodeShift, |
| LDR = ((3 << 3) + 3) << kOpcodeShift, |
| @@ -330,6 +336,7 @@ enum Opcode { |
| LWC1 = ((6 << 3) + 1) << kOpcodeShift, |
| LLD = ((6 << 3) + 4) << kOpcodeShift, |
| LDC1 = ((6 << 3) + 5) << kOpcodeShift, |
| + BEQZC = ((6 << 3) + 6) << kOpcodeShift, |
| LD = ((6 << 3) + 7) << kOpcodeShift, |
| PREF = ((6 << 3) + 3) << kOpcodeShift, |
| @@ -337,6 +344,7 @@ enum Opcode { |
| SWC1 = ((7 << 3) + 1) << kOpcodeShift, |
| SCD = ((7 << 3) + 4) << kOpcodeShift, |
| SDC1 = ((7 << 3) + 5) << kOpcodeShift, |
| + BNEZC = ((7 << 3) + 6) << kOpcodeShift, |
| SD = ((7 << 3) + 7) << kOpcodeShift, |
| COP1X = ((1 << 4) + 3) << kOpcodeShift |
| @@ -359,6 +367,8 @@ enum SecondaryField { |
| BREAK = ((1 << 3) + 5), |
| MFHI = ((2 << 3) + 0), |
| + CLZ_R6 = ((2 << 3) + 0), |
| + CLO_R6 = ((2 << 3) + 1), |
| MFLO = ((2 << 3) + 2), |
| DSLLV = ((2 << 3) + 4), |
| DSRLV = ((2 << 3) + 6), |
| @@ -394,7 +404,9 @@ enum SecondaryField { |
| 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), |
| DSLL = ((7 << 3) + 0), |
| DSRL = ((7 << 3) + 2), |
| @@ -402,6 +414,23 @@ enum SecondaryField { |
| DSLL32 = ((7 << 3) + 4), |
| DSRL32 = ((7 << 3) + 6), |
| DSRA32 = ((7 << 3) + 7), |
| + |
| + // Multiply integers in r6. |
| + MUL_MUH = ((3 << 3) + 0), // MUL, MUH. |
|
paul.l...
2014/07/29 14:58:04
nit: one space after MUL,
dusmil.imgtec
2014/07/29 17:39:12
Done.
|
| + MUL_MUH_U = ((3 << 3) + 1), // MUL_U, MUH_U. |
| + D_MUL_MUH = ((7 << 2) + 0), // DMUL, DMUH. |
| + D_MUL_MUH_U = ((7 << 2) + 1), // DMUL_U, DMUH_U. |
| + |
| + MUL_OP = ((0 << 3) + 2), |
| + MUH_OP = ((0 << 3) + 3), |
| + DIV_OP = ((0 << 3) + 2), |
| + MOD_OP = ((0 << 3) + 3), |
| + |
| + DIV_MOD = ((3 << 3) + 2), |
| + DIV_MOD_U = ((3 << 3) + 3), |
| + D_DIV_MOD = ((3 << 3) + 6), |
| + D_DIV_MOD_U = ((3 << 3) + 7), |
| + |
| // drotr in special4? |
| // SPECIAL2 Encoding of Function Field. |
| @@ -426,6 +455,9 @@ enum SecondaryField { |
| BGEZ = ((0 << 3) + 1) << 16, |
| BLTZAL = ((2 << 3) + 0) << 16, |
| BGEZAL = ((2 << 3) + 1) << 16, |
| + BGEZALL = ((2 << 3) + 3) << 16, |
| + DAHI = ((0 << 3) + 6) << 16, |
| + DATI = ((3 << 3) + 6) << 16, |
| // COP1 Encoding of rs Field. |
| MFC1 = ((0 << 3) + 0) << 21, |
| @@ -472,6 +504,10 @@ enum SecondaryField { |
| TRUNC_W_D = ((1 << 3) + 5), |
| CEIL_W_D = ((1 << 3) + 6), |
| FLOOR_W_D = ((1 << 3) + 7), |
| + 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), |
| @@ -488,6 +524,47 @@ enum SecondaryField { |
| 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, |
| + // 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), |
| + // 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), |
| + SELEQZ_C = ((2 << 3) + 4), // COP1 on FPR registers. |
| + SELNEZ_C = ((2 << 3) + 7), // COP1 on FPR registers. |
| + |
| // COP1 Encoding of Function Field When rs=PS. |
| // COP1X Encoding of Function Field. |
| MADD_D = ((4 << 3) + 1), |
| @@ -497,9 +574,9 @@ enum SecondaryField { |
| // ----- Emulated conditions. |
| -// On MIPS we use this enum to abstract from conditionnal branch instructions. |
| +// On MIPS we use this enum to abstract from conditional branch instructions. |
| // The 'U' prefix is used to specify unsigned comparisons. |
| -// Oppposite conditions must be paired as odd/even numbers |
| +// Opposite conditions must be paired as odd/even numbers |
| // because 'NegateCondition' function flips LSB to negate condition. |
| enum Condition { |
| // Any value < 0 is considered no_condition. |
| @@ -833,6 +910,11 @@ class Instruction { |
| return Bits(kImm16Shift + kImm16Bits - 1, kImm16Shift); |
| } |
| + inline int32_t Imm21Value() const { |
| + ASSERT(InstructionType() == kImmediateType); |
| + return Bits(kImm21Shift + kImm21Bits - 1, kImm21Shift); |
| + } |
| + |
| inline int32_t Imm26Value() const { |
| ASSERT(InstructionType() == kJumpType); |
| return Bits(kImm26Shift + kImm26Bits - 1, kImm26Shift); |