112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Use of this source code is governed by a BSD-style license that can be
312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// found in the LICENSE file.
412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifndef  V8_MIPS_CONSTANTS_H_
612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define  V8_MIPS_CONSTANTS_H_
712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// UNIMPLEMENTED_ macro for MIPS.
912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef DEBUG
1012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define UNIMPLEMENTED_MIPS()                                                  \
1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  v8::internal::PrintF("%s, \tline %d: \tfunction %s not implemented. \n",    \
1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org                       __FILE__, __LINE__, __func__)
1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#else
1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define UNIMPLEMENTED_MIPS()
1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define UNSUPPORTED_MIPS() v8::internal::PrintF("Unsupported instruction.\n")
1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum ArchVariants {
20dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  kMips64r2,
21dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  kMips64r6
2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef _MIPS_ARCH_MIPS64R2
2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const ArchVariants kArchVariant = kMips64r2;
27dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org#elif  _MIPS_ARCH_MIPS64R6
28dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  static const ArchVariants kArchVariant = kMips64r6;
2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#else
30dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  static const ArchVariants kArchVariant = kMips64r2;
3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// TODO(plind): consider deriving ABI from compiler flags or build system.
3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ABI-dependent definitions are made with #define in simulator-mips64.h,
3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// so the ABI choice must be available to the pre-processor. However, in all
3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// other cases, we should use the enum AbiVariants with normal if statements.
3912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define MIPS_ABI_N64 1
4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// #define MIPS_ABI_O32 1
4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// The only supported Abi's are O32, and n64.
4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum AbiVariants {
4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kO32,
4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kN64  // Use upper case N for 'n64' ABI to conform to style standard.
4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#ifdef MIPS_ABI_N64
5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic const AbiVariants kMipsAbi = kN64;
5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#else
5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgstatic const AbiVariants kMipsAbi = kO32;
5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// TODO(plind): consider renaming these ...
5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if(defined(__mips_hard_float) && __mips_hard_float != 0)
5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Use floating-point coprocessor instructions. This flag is raised when
5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -mhard-float is passed to the compiler.
6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst bool IsMipsSoftFloatABI = false;
6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#elif(defined(__mips_soft_float) && __mips_soft_float != 0)
6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// This flag is raised when -msoft-float is passed to the compiler.
6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Although FPU is a base requirement for v8, soft-float ABI is used
6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// on soft-float systems with FPU kernel emulation.
6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst bool IsMipsSoftFloatABI = true;
6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#else
6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst bool IsMipsSoftFloatABI = true;
6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif
6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
717c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org#ifndef __STDC_FORMAT_MACROS
7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define __STDC_FORMAT_MACROS
737c0666e15d1f68f0fef5db9e5c409fab010ed816machenbach@chromium.org#endif
7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include <inttypes.h>
7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Defines constants and accessor classes to assemble, disassemble and
7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// simulate MIPS32 instructions.
7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//
8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// See: MIPS32 Architecture For Programmers
8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//      Volume II: The MIPS32 Instruction Set
8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Try www.cs.cornell.edu/courses/cs3410/2008fa/MIPS_Vol2.pdf.
8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace v8 {
8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace internal {
8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -----------------------------------------------------------------------------
8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Registers and FPURegisters.
8912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Number of general purpose registers.
9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumRegisters = 32;
9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kInvalidRegister = -1;
9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Number of registers with HI, LO, and pc.
9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumSimuRegisters = 35;
9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// In the simulator, the PC register is simulated as the 34th register.
9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kPCRegister = 34;
9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Number coprocessor registers.
10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kNumFPURegisters = 32;
10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kInvalidFPURegister = -1;
10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// FPU (coprocessor 1) control registers. Currently only FCSR is implemented.
10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFCSRRegister = 31;
10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kInvalidFPUControlRegister = -1;
10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFPUInvalidResult = static_cast<uint32_t>(1 << 31) - 1;
10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint64_t kFPU64InvalidResult =
10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    static_cast<uint64_t>(static_cast<uint64_t>(1) << 63) - 1;
11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// FCSR constants.
11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRInexactFlagBit = 2;
11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRUnderflowFlagBit = 3;
11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSROverflowFlagBit = 4;
11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRDivideByZeroFlagBit = 5;
11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRInvalidOpFlagBit = 6;
11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRInexactFlagMask = 1 << kFCSRInexactFlagBit;
11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRUnderflowFlagMask = 1 << kFCSRUnderflowFlagBit;
12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSROverflowFlagMask = 1 << kFCSROverflowFlagBit;
12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRDivideByZeroFlagMask = 1 << kFCSRDivideByZeroFlagBit;
12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRInvalidOpFlagMask = 1 << kFCSRInvalidOpFlagBit;
12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRFlagMask =
12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kFCSRInexactFlagMask |
12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kFCSRUnderflowFlagMask |
12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kFCSROverflowFlagMask |
12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kFCSRDivideByZeroFlagMask |
12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kFCSRInvalidOpFlagMask;
13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFCSRExceptionFlagMask = kFCSRFlagMask ^ kFCSRInexactFlagMask;
13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// 'pref' instruction hints
13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintLoad = 0;
13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintStore = 1;
13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintLoadStreamed = 4;
13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintStoreStreamed = 5;
13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintLoadRetained = 6;
13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintStoreRetained = 7;
14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintWritebackInvalidate = 25;
14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int32_t kPrefHintPrepareForStore = 30;
14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Helper functions for converting between register numbers and names.
14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass Registers {
14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Return the name of the register.
14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const char* Name(int reg);
14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Lookup the register number for the name provided.
15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static int Number(const char* name);
15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  struct RegisterAlias {
15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int reg;
15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    const char* name;
15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  };
15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int64_t kMaxValue = 0x7fffffffffffffffl;
15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const int64_t kMinValue = 0x8000000000000000l;
15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org private:
16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const char* names_[kNumSimuRegisters];
16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const RegisterAlias aliases_[];
16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Helper functions for converting between register numbers and names.
16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass FPURegisters {
16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Return the name of the register.
16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const char* Name(int reg);
17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Lookup the register number for the name provided.
17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static int Number(const char* name);
17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  struct RegisterAlias {
17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    int creg;
17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    const char* name;
17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  };
17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org private:
18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const char* names_[kNumFPURegisters];
18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static const RegisterAlias aliases_[];
18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -----------------------------------------------------------------------------
18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Instructions encoding constants.
18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// On MIPS all instructions are 32 bits.
18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgtypedef int32_t Instr;
19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Special Software Interrupt codes when used in the presence of the MIPS
19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// simulator.
19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum SoftwareInterruptCodes {
19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Transition to C code.
19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  call_rt_redirected = 0xfffff
19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// On MIPS Simulator breakpoints can have different codes:
19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// - Breaks between 0 and kMaxWatchpointCode are treated as simple watchpoints,
20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//   the simulator will run through them and print the registers.
20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// - Breaks between kMaxWatchpointCode and kMaxStopCode are treated as stop()
20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//   instructions (see Assembler::stop()).
20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// - Breaks larger than kMaxStopCode are simple breaks, dropping you into the
20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//   debugger.
20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kMaxWatchpointCode = 31;
20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kMaxStopCode = 127;
20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgSTATIC_ASSERT(kMaxWatchpointCode < kMaxStopCode);
20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- Fields offset and length.
21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kOpcodeShift   = 26;
21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kOpcodeBits    = 6;
21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRsShift       = 21;
21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRsBits        = 5;
21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRtShift       = 16;
21612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRtBits        = 5;
21712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRdShift       = 11;
21812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kRdBits        = 5;
21912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kSaShift       = 6;
22012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kSaBits        = 5;
22112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFunctionShift = 0;
22212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFunctionBits  = 6;
22312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kLuiShift      = 16;
22412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
22512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm16Shift = 0;
22612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm16Bits  = 16;
227dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgconst int kImm21Shift = 0;
228dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgconst int kImm21Bits  = 21;
22912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm26Shift = 0;
23012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm26Bits  = 26;
23112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm28Shift = 0;
23212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm28Bits  = 28;
23312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm32Shift = 0;
23412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImm32Bits  = 32;
23512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
23612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// In branches and jumps immediate fields point to words, not bytes,
23712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// and are therefore shifted by 2.
23812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kImmFieldShift = 2;
23912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
24012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFrBits        = 5;
24112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFrShift       = 21;
24212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFsShift       = 11;
24312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFsBits        = 5;
24412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFtShift       = 16;
24512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFtBits        = 5;
24612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFdShift       = 6;
24712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFdBits        = 5;
24812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFCccShift     = 8;
24912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFCccBits      = 3;
25012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFBccShift     = 18;
25112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFBccBits      = 3;
25212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFBtrueShift   = 16;
25312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kFBtrueBits    = 1;
25412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
25512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- Miscellaneous useful masks.
25612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Instruction bit masks.
25712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kOpcodeMask   = ((1 << kOpcodeBits) - 1) << kOpcodeShift;
25812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kImm16Mask    = ((1 << kImm16Bits) - 1) << kImm16Shift;
25912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kImm26Mask    = ((1 << kImm26Bits) - 1) << kImm26Shift;
26012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kImm28Mask    = ((1 << kImm28Bits) - 1) << kImm28Shift;
26112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kRsFieldMask  = ((1 << kRsBits) - 1) << kRsShift;
26212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kRtFieldMask  = ((1 << kRtBits) - 1) << kRtShift;
26312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kRdFieldMask  = ((1 << kRdBits) - 1) << kRdShift;
26412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kSaFieldMask  = ((1 << kSaBits) - 1) << kSaShift;
26512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kFunctionFieldMask = ((1 << kFunctionBits) - 1) << kFunctionShift;
26612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Misc masks.
26712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kHiMask       =   0xffff << 16;
26812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kLoMask       =   0xffff;
26912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kSignMask     =   0x80000000;
27012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int  kJumpAddrMask = (1 << (kImm26Bits + kImmFieldShift)) - 1;
27112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int64_t  kHi16MaskOf64 =   (int64_t)0xffff << 48;
27212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int64_t  kSe16MaskOf64 =   (int64_t)0xffff << 32;
27312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int64_t  kTh16MaskOf64 =   (int64_t)0xffff << 16;
27412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
27512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- MIPS Opcodes and Function Fields.
27612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// We use this presentation to stay close to the table representation in
27712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// MIPS32 Architecture For Programmers, Volume II: The MIPS32 Instruction Set.
27812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum Opcode {
27912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SPECIAL   =   0 << kOpcodeShift,
28012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  REGIMM    =   1 << kOpcodeShift,
28112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  J         =   ((0 << 3) + 2) << kOpcodeShift,
28312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  JAL       =   ((0 << 3) + 3) << kOpcodeShift,
28412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BEQ       =   ((0 << 3) + 4) << kOpcodeShift,
28512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BNE       =   ((0 << 3) + 5) << kOpcodeShift,
28612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BLEZ      =   ((0 << 3) + 6) << kOpcodeShift,
28712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BGTZ      =   ((0 << 3) + 7) << kOpcodeShift,
28812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
28912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ADDI      =   ((1 << 3) + 0) << kOpcodeShift,
29012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ADDIU     =   ((1 << 3) + 1) << kOpcodeShift,
29112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLTI      =   ((1 << 3) + 2) << kOpcodeShift,
29212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLTIU     =   ((1 << 3) + 3) << kOpcodeShift,
29312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ANDI      =   ((1 << 3) + 4) << kOpcodeShift,
29412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ORI       =   ((1 << 3) + 5) << kOpcodeShift,
29512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  XORI      =   ((1 << 3) + 6) << kOpcodeShift,
296dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  LUI       =   ((1 << 3) + 7) << kOpcodeShift,  // LUI/AUI family.
297dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DAUI      =   ((3 << 3) + 5) << kOpcodeShift,
29812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
299dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BEQC      =   ((2 << 3) + 0) << kOpcodeShift,
30012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  COP1      =   ((2 << 3) + 1) << kOpcodeShift,  // Coprocessor 1 class.
30112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BEQL      =   ((2 << 3) + 4) << kOpcodeShift,
30212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BNEL      =   ((2 << 3) + 5) << kOpcodeShift,
30312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BLEZL     =   ((2 << 3) + 6) << kOpcodeShift,
30412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BGTZL     =   ((2 << 3) + 7) << kOpcodeShift,
30512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
306dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DADDI     =   ((3 << 3) + 0) << kOpcodeShift,  // This is also BNEC.
30712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DADDIU    =   ((3 << 3) + 1) << kOpcodeShift,
30812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LDL       =   ((3 << 3) + 2) << kOpcodeShift,
30912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LDR       =   ((3 << 3) + 3) << kOpcodeShift,
31012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SPECIAL2  =   ((3 << 3) + 4) << kOpcodeShift,
31112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SPECIAL3  =   ((3 << 3) + 7) << kOpcodeShift,
31212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
31312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LB        =   ((4 << 3) + 0) << kOpcodeShift,
31412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LH        =   ((4 << 3) + 1) << kOpcodeShift,
31512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LWL       =   ((4 << 3) + 2) << kOpcodeShift,
31612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LW        =   ((4 << 3) + 3) << kOpcodeShift,
31712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LBU       =   ((4 << 3) + 4) << kOpcodeShift,
31812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LHU       =   ((4 << 3) + 5) << kOpcodeShift,
31912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LWR       =   ((4 << 3) + 6) << kOpcodeShift,
32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LWU       =   ((4 << 3) + 7) << kOpcodeShift,
32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SB        =   ((5 << 3) + 0) << kOpcodeShift,
32312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SH        =   ((5 << 3) + 1) << kOpcodeShift,
32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SWL       =   ((5 << 3) + 2) << kOpcodeShift,
32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SW        =   ((5 << 3) + 3) << kOpcodeShift,
32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SDL       =   ((5 << 3) + 4) << kOpcodeShift,
32712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SDR       =   ((5 << 3) + 5) << kOpcodeShift,
32812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SWR       =   ((5 << 3) + 6) << kOpcodeShift,
32912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
33012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LWC1      =   ((6 << 3) + 1) << kOpcodeShift,
33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LLD       =   ((6 << 3) + 4) << kOpcodeShift,
33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LDC1      =   ((6 << 3) + 5) << kOpcodeShift,
333dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BEQZC     =   ((6 << 3) + 6) << kOpcodeShift,
33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  LD        =   ((6 << 3) + 7) << kOpcodeShift,
33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  PREF      =   ((6 << 3) + 3) << kOpcodeShift,
33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
33812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SWC1      =   ((7 << 3) + 1) << kOpcodeShift,
33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SCD       =   ((7 << 3) + 4) << kOpcodeShift,
34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SDC1      =   ((7 << 3) + 5) << kOpcodeShift,
341dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BNEZC     =   ((7 << 3) + 6) << kOpcodeShift,
34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SD        =   ((7 << 3) + 7) << kOpcodeShift,
34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  COP1X     =   ((1 << 4) + 3) << kOpcodeShift
34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum SecondaryField {
34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // SPECIAL Encoding of Function Field.
34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLL       =   ((0 << 3) + 0),
35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MOVCI     =   ((0 << 3) + 1),
35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SRL       =   ((0 << 3) + 2),
35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SRA       =   ((0 << 3) + 3),
35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLLV      =   ((0 << 3) + 4),
35412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SRLV      =   ((0 << 3) + 6),
35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SRAV      =   ((0 << 3) + 7),
35612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
35712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  JR        =   ((1 << 3) + 0),
35812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  JALR      =   ((1 << 3) + 1),
35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MOVZ      =   ((1 << 3) + 2),
36012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MOVN      =   ((1 << 3) + 3),
36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BREAK     =   ((1 << 3) + 5),
36212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MFHI      =   ((2 << 3) + 0),
364dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CLZ_R6    =   ((2 << 3) + 0),
365dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CLO_R6    =   ((2 << 3) + 1),
36612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MFLO      =   ((2 << 3) + 2),
36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSLLV     =   ((2 << 3) + 4),
36812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRLV     =   ((2 << 3) + 6),
36912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRAV     =   ((2 << 3) + 7),
37012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MULT      =   ((3 << 3) + 0),
37212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MULTU     =   ((3 << 3) + 1),
37312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DIV       =   ((3 << 3) + 2),
37412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DIVU      =   ((3 << 3) + 3),
37512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DMULT     =   ((3 << 3) + 4),
37612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DMULTU    =   ((3 << 3) + 5),
37712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DDIV      =   ((3 << 3) + 6),
37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DDIVU     =   ((3 << 3) + 7),
37912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ADD       =   ((4 << 3) + 0),
38112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ADDU      =   ((4 << 3) + 1),
38212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SUB       =   ((4 << 3) + 2),
38312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SUBU      =   ((4 << 3) + 3),
38412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  AND       =   ((4 << 3) + 4),
38512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  OR        =   ((4 << 3) + 5),
38612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  XOR       =   ((4 << 3) + 6),
38712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  NOR       =   ((4 << 3) + 7),
38812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
38912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLT       =   ((5 << 3) + 2),
39012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SLTU      =   ((5 << 3) + 3),
39112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DADD      =   ((5 << 3) + 4),
39212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DADDU     =   ((5 << 3) + 5),
39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSUB      =   ((5 << 3) + 6),
39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSUBU     =   ((5 << 3) + 7),
39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
39612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TGE       =   ((6 << 3) + 0),
39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TGEU      =   ((6 << 3) + 1),
39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TLT       =   ((6 << 3) + 2),
39912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TLTU      =   ((6 << 3) + 3),
40012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TEQ       =   ((6 << 3) + 4),
401dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  SELEQZ_S  =   ((6 << 3) + 5),
40212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TNE       =   ((6 << 3) + 6),
403dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  SELNEZ_S  =   ((6 << 3) + 7),
40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSLL      =   ((7 << 3) + 0),
40612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRL      =   ((7 << 3) + 2),
40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRA      =   ((7 << 3) + 3),
40812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSLL32    =   ((7 << 3) + 4),
40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRL32    =   ((7 << 3) + 6),
41012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSRA32    =   ((7 << 3) + 7),
411dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
412dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  // Multiply integers in r6.
413dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MUL_MUH   =   ((3 << 3) + 0),  // MUL, MUH.
414dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MUL_MUH_U =   ((3 << 3) + 1),  // MUL_U, MUH_U.
415dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  D_MUL_MUH =   ((7 << 2) + 0),  // DMUL, DMUH.
416dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  D_MUL_MUH_U = ((7 << 2) + 1),  // DMUL_U, DMUH_U.
417dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
418dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MUL_OP    =   ((0 << 3) + 2),
419dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MUH_OP    =   ((0 << 3) + 3),
420dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DIV_OP    =   ((0 << 3) + 2),
421dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MOD_OP    =   ((0 << 3) + 3),
422dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
423dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DIV_MOD   =   ((3 << 3) + 2),
424dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DIV_MOD_U =   ((3 << 3) + 3),
425dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  D_DIV_MOD =   ((3 << 3) + 6),
426dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  D_DIV_MOD_U = ((3 << 3) + 7),
427dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // drotr in special4?
42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // SPECIAL2 Encoding of Function Field.
43112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MUL       =   ((0 << 3) + 2),
43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CLZ       =   ((4 << 3) + 0),
43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CLO       =   ((4 << 3) + 1),
43412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // SPECIAL3 Encoding of Function Field.
43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  EXT       =   ((0 << 3) + 0),
43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DEXTM     =   ((0 << 3) + 1),
43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DEXTU     =   ((0 << 3) + 2),
43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DEXT      =   ((0 << 3) + 3),
44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  INS       =   ((0 << 3) + 4),
44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DINSM     =   ((0 << 3) + 5),
44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DINSU     =   ((0 << 3) + 6),
44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DINS      =   ((0 << 3) + 7),
44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DSBH      =   ((4 << 3) + 4),
44612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
44712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // REGIMM  encoding of rt Field.
44812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BLTZ      =   ((0 << 3) + 0) << 16,
44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BGEZ      =   ((0 << 3) + 1) << 16,
45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BLTZAL    =   ((2 << 3) + 0) << 16,
45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BGEZAL    =   ((2 << 3) + 1) << 16,
452dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BGEZALL   =   ((2 << 3) + 3) << 16,
453dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DAHI      =   ((0 << 3) + 6) << 16,
454dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  DATI      =   ((3 << 3) + 6) << 16,
45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1 Encoding of rs Field.
45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MFC1      =   ((0 << 3) + 0) << 21,
45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DMFC1     =   ((0 << 3) + 1) << 21,
45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CFC1      =   ((0 << 3) + 2) << 21,
46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MFHC1     =   ((0 << 3) + 3) << 21,
46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MTC1      =   ((0 << 3) + 4) << 21,
46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DMTC1     =   ((0 << 3) + 5) << 21,
46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CTC1      =   ((0 << 3) + 6) << 21,
46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MTHC1     =   ((0 << 3) + 7) << 21,
46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  BC1       =   ((1 << 3) + 0) << 21,
46612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  S         =   ((2 << 3) + 0) << 21,
46712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  D         =   ((2 << 3) + 1) << 21,
46812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  W         =   ((2 << 3) + 4) << 21,
46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  L         =   ((2 << 3) + 5) << 21,
47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  PS        =   ((2 << 3) + 6) << 21,
47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1 Encoding of Function Field When rs=S.
47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ROUND_L_S =   ((1 << 3) + 0),
47312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TRUNC_L_S =   ((1 << 3) + 1),
47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CEIL_L_S  =   ((1 << 3) + 2),
47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  FLOOR_L_S =   ((1 << 3) + 3),
47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ROUND_W_S =   ((1 << 3) + 4),
47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TRUNC_W_S =   ((1 << 3) + 5),
47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CEIL_W_S  =   ((1 << 3) + 6),
47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  FLOOR_W_S =   ((1 << 3) + 7),
48012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_D_S   =   ((4 << 3) + 1),
48112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_W_S   =   ((4 << 3) + 4),
48212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_L_S   =   ((4 << 3) + 5),
48312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_PS_S  =   ((4 << 3) + 6),
48412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1 Encoding of Function Field When rs=D.
48512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ADD_D     =   ((0 << 3) + 0),
48612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SUB_D     =   ((0 << 3) + 1),
48712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MUL_D     =   ((0 << 3) + 2),
48812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DIV_D     =   ((0 << 3) + 3),
48912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  SQRT_D    =   ((0 << 3) + 4),
49012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ABS_D     =   ((0 << 3) + 5),
49112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MOV_D     =   ((0 << 3) + 6),
49212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  NEG_D     =   ((0 << 3) + 7),
49312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ROUND_L_D =   ((1 << 3) + 0),
49412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TRUNC_L_D =   ((1 << 3) + 1),
49512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CEIL_L_D  =   ((1 << 3) + 2),
49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  FLOOR_L_D =   ((1 << 3) + 3),
49712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ROUND_W_D =   ((1 << 3) + 4),
49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  TRUNC_W_D =   ((1 << 3) + 5),
49912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CEIL_W_D  =   ((1 << 3) + 6),
50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  FLOOR_W_D =   ((1 << 3) + 7),
501dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MIN       =   ((3 << 3) + 4),
502dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MINA      =   ((3 << 3) + 5),
503dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MAX       =   ((3 << 3) + 6),
504dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  MAXA      =   ((3 << 3) + 7),
50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_S_D   =   ((4 << 3) + 0),
50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_W_D   =   ((4 << 3) + 4),
50712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_L_D   =   ((4 << 3) + 5),
50812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_F_D     =   ((6 << 3) + 0),
50912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_UN_D    =   ((6 << 3) + 1),
51012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_EQ_D    =   ((6 << 3) + 2),
51112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_UEQ_D   =   ((6 << 3) + 3),
51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_OLT_D   =   ((6 << 3) + 4),
51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_ULT_D   =   ((6 << 3) + 5),
51412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_OLE_D   =   ((6 << 3) + 6),
51512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  C_ULE_D   =   ((6 << 3) + 7),
51612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1 Encoding of Function Field When rs=W or L.
51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_S_W   =   ((4 << 3) + 0),
51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_D_W   =   ((4 << 3) + 1),
51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_S_L   =   ((4 << 3) + 0),
52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  CVT_D_L   =   ((4 << 3) + 1),
521dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BC1EQZ    =   ((2 << 2) + 1) << 21,
522dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  BC1NEZ    =   ((3 << 2) + 1) << 21,
523dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  // COP1 CMP positive predicates Bit 5..4 = 00.
524dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_AF    =   ((0 << 3) + 0),
525dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_UN    =   ((0 << 3) + 1),
526dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_EQ    =   ((0 << 3) + 2),
527dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_UEQ   =   ((0 << 3) + 3),
528dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_LT    =   ((0 << 3) + 4),
529dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_ULT   =   ((0 << 3) + 5),
530dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_LE    =   ((0 << 3) + 6),
531dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_ULE   =   ((0 << 3) + 7),
532dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SAF   =   ((1 << 3) + 0),
533dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SUN   =   ((1 << 3) + 1),
534dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SEQ   =   ((1 << 3) + 2),
535dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SUEQ  =   ((1 << 3) + 3),
536dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SSLT  =   ((1 << 3) + 4),
537dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SSULT =   ((1 << 3) + 5),
538dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SLE   =   ((1 << 3) + 6),
539dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SULE  =   ((1 << 3) + 7),
540dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  // COP1 CMP negative predicates Bit 5..4 = 01.
541dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_AT    =   ((2 << 3) + 0),  // Reserved, not implemented.
542dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_OR    =   ((2 << 3) + 1),
543dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_UNE   =   ((2 << 3) + 2),
544dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_NE    =   ((2 << 3) + 3),
545dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_UGE   =   ((2 << 3) + 4),  // Reserved, not implemented.
546dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_OGE   =   ((2 << 3) + 5),  // Reserved, not implemented.
547dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_UGT   =   ((2 << 3) + 6),  // Reserved, not implemented.
548dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_OGT   =   ((2 << 3) + 7),  // Reserved, not implemented.
549dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SAT   =   ((3 << 3) + 0),  // Reserved, not implemented.
550dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SOR   =   ((3 << 3) + 1),
551dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SUNE  =   ((3 << 3) + 2),
552dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SNE   =   ((3 << 3) + 3),
553dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SUGE  =   ((3 << 3) + 4),  // Reserved, not implemented.
554dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SOGE  =   ((3 << 3) + 5),  // Reserved, not implemented.
555dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SUGT  =   ((3 << 3) + 6),  // Reserved, not implemented.
556dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  CMP_SOGT  =   ((3 << 3) + 7),  // Reserved, not implemented.
557dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
558dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  SEL       =   ((2 << 3) + 0),
559dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  SELEQZ_C  =   ((2 << 3) + 4),  // COP1 on FPR registers.
560dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  SELNEZ_C  =   ((2 << 3) + 7),  // COP1 on FPR registers.
561dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
56212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1 Encoding of Function Field When rs=PS.
56312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // COP1X Encoding of Function Field.
56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  MADD_D    =   ((4 << 3) + 1),
56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  NULLSF    =   0
56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- Emulated conditions.
571dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org// On MIPS we use this enum to abstract from conditional branch instructions.
57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// The 'U' prefix is used to specify unsigned comparisons.
573dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org// Opposite conditions must be paired as odd/even numbers
57412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// because 'NegateCondition' function flips LSB to negate condition.
57512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum Condition {
57612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Any value < 0 is considered no_condition.
57712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kNoCondition  = -1,
57812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
57912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  overflow      =  0,
58012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  no_overflow   =  1,
58112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Uless         =  2,
58212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Ugreater_equal=  3,
58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  equal         =  4,
58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  not_equal     =  5,
58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Uless_equal   =  6,
58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Ugreater      =  7,
58712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  negative      =  8,
58812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  positive      =  9,
58912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  parity_even   = 10,
59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  parity_odd    = 11,
59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  less          = 12,
59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  greater_equal = 13,
59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  less_equal    = 14,
59412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  greater       = 15,
59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ueq           = 16,  // Unordered or Equal.
59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  nue           = 17,  // Not (Unordered or Equal).
59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  cc_always     = 18,
59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Aliases.
60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  carry         = Uless,
60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  not_carry     = Ugreater_equal,
60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  zero          = equal,
60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  eq            = equal,
60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  not_zero      = not_equal,
60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ne            = not_equal,
60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  nz            = not_equal,
60812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  sign          = negative,
60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  not_sign      = positive,
61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  mi            = negative,
61112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  pl            = positive,
61212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  hi            = Ugreater,
61312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ls            = Uless_equal,
61412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ge            = greater_equal,
61512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  lt            = less,
61612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  gt            = greater,
61712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  le            = less_equal,
61812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  hs            = Ugreater_equal,
61912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  lo            = Uless,
62012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  al            = cc_always,
62112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
62212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  cc_default    = kNoCondition
62312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
62412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
62512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
62612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Returns the equivalent of !cc.
62712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Negation of the default kNoCondition (-1) results in a non-default
62812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// no_condition value (-2). As long as tests for no_condition check
62912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// for condition < 0, this will work as expected.
63012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orginline Condition NegateCondition(Condition cc) {
631e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org  DCHECK(cc != cc_always);
63212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return static_cast<Condition>(cc ^ 1);
63312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
63412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
63612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Commute a condition such that {a cond b == b cond' a}.
63712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orginline Condition CommuteCondition(Condition cc) {
63812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  switch (cc) {
63912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Uless:
64012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return Ugreater;
64112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Ugreater:
64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return Uless;
64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Ugreater_equal:
64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return Uless_equal;
64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case Uless_equal:
64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return Ugreater_equal;
64712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case less:
64812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return greater;
64912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case greater:
65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return less;
65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case greater_equal:
65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return less_equal;
65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    case less_equal:
65412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return greater_equal;
65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    default:
65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      return cc;
65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
65912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// ----- Coprocessor conditions.
66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum FPUCondition {
66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kNoFPUCondition = -1,
66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
66512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  F     = 0,  // False.
66612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UN    = 1,  // Unordered.
66712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  EQ    = 2,  // Equal.
66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  UEQ   = 3,  // Unordered or Equal.
66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  OLT   = 4,  // Ordered or Less Than.
67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ULT   = 5,  // Unordered or Less Than.
67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  OLE   = 6,  // Ordered or Less Than or Equal.
67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  ULE   = 7   // Unordered or Less Than or Equal.
67312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
67412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
67612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// FPU rounding modes.
67712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum FPURoundingMode {
67812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RN = 0 << 0,  // Round to Nearest.
67912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RZ = 1 << 0,  // Round towards zero.
68012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RP = 2 << 0,  // Round towards Plus Infinity.
68112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  RM = 3 << 0,  // Round towards Minus Infinity.
68212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
68312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Aliases.
68412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kRoundToNearest = RN,
68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kRoundToZero = RZ,
68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kRoundToPlusInf = RP,
68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kRoundToMinusInf = RM
68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst uint32_t kFPURoundingModeMask = 3 << 0;
69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum CheckForInexactConversion {
69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kCheckForInexactConversion,
69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  kDontCheckForInexactConversion
69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
69612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
69712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
69812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -----------------------------------------------------------------------------
69912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Hints.
70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Branch hints are not used on the MIPS.  They are defined so that they can
70212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// appear in shared function signatures, but will be ignored in MIPS
70312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// implementations.
70412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgenum Hint {
70512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  no_hint = 0
70612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
70712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
70912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orginline Hint NegateHint(Hint hint) {
71012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  return no_hint;
71112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}
71212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
71312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
71412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -----------------------------------------------------------------------------
71512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Specific instructions, constants, and masks.
71612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// These constants are declared in assembler-mips.cc, as they use named
71712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// registers and other constants.
71812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
71912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// addiu(sp, sp, 4) aka Pop() operation or part of Pop(r)
72012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// operations as post-increment of sp.
72112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kPopInstruction;
72212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// addiu(sp, sp, -4) part of Push(r) operation as pre-decrement of sp.
72312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kPushInstruction;
72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// sw(r, MemOperand(sp, 0))
72512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kPushRegPattern;
72612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// lw(r, MemOperand(sp, 0))
72712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kPopRegPattern;
72812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kLwRegFpOffsetPattern;
72912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kSwRegFpOffsetPattern;
73012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kLwRegFpNegOffsetPattern;
73112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kSwRegFpNegOffsetPattern;
73212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// A mask for the Rt register for push, pop, lw, sw instructions.
73312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kRtMask;
73412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kLwSwInstrTypeMask;
73512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kLwSwInstrArgumentMask;
73612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgextern const Instr kLwSwOffsetMask;
73712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
73812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Break 0xfffff, reserved for redirected real time call.
73912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst Instr rtCallRedirInstr = SPECIAL | BREAK | call_rt_redirected << 6;
74012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// A nop instruction. (Encoding of sll 0 0 0).
74112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst Instr nopInstr = 0;
74212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
74312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass Instruction {
74412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public:
74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  enum {
74612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kInstrSize = 4,
74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kInstrSizeLog2 = 2,
74812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // On MIPS PC cannot actually be directly accessed. We behave as if PC was
74912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    // always the value of the current instruction being executed.
75012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kPCReadOffset = 0
75112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  };
75212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Get the raw instruction bits.
75412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline Instr InstructionBits() const {
75512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return *reinterpret_cast<const Instr*>(this);
75612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
75712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
75812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Set the raw instruction bits to value.
75912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline void SetInstructionBits(Instr value) {
76012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    *reinterpret_cast<Instr*>(this) = value;
76112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
76212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
76312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Read one particular bit out of the instruction bits.
76412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int Bit(int nr) const {
76512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return (InstructionBits() >> nr) & 1;
76612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
76712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
76812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Read a bit field out of the instruction bits.
76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int Bits(int hi, int lo) const {
77012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return (InstructionBits() >> lo) & ((2 << (hi - lo)) - 1);
77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
77312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Instruction type.
77412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  enum Type {
77512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kRegisterType,
77612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kImmediateType,
77712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kJumpType,
77812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    kUnsupported = -1
77912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  };
78012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
78112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Get the encoding type of the instruction.
78212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  Type InstructionType() const;
78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
78412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
78512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Accessors for the different named fields used in the MIPS encoding.
78612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline Opcode OpcodeValue() const {
78712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return static_cast<Opcode>(
78812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        Bits(kOpcodeShift + kOpcodeBits - 1, kOpcodeShift));
78912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
79012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
79112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RsValue() const {
792e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType ||
79312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           InstructionType() == kImmediateType);
79412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kRsShift + kRsBits - 1, kRsShift);
79512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
79612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
79712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RtValue() const {
798e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType ||
79912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           InstructionType() == kImmediateType);
80012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kRtShift + kRtBits - 1, kRtShift);
80112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
80212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
80312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RdValue() const {
804e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType);
80512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kRdShift + kRdBits - 1, kRdShift);
80612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
80712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
80812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int SaValue() const {
809e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType);
81012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kSaShift + kSaBits - 1, kSaShift);
81112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
81212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
81312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FunctionValue() const {
814e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType ||
81512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           InstructionType() == kImmediateType);
81612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFunctionShift + kFunctionBits - 1, kFunctionShift);
81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
81812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
81912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FdValue() const {
82012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFdShift + kFdBits - 1, kFdShift);
82112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
82212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FsValue() const {
82412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFsShift + kFsBits - 1, kFsShift);
82512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
82612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
82712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FtValue() const {
82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFtShift + kFtBits - 1, kFtShift);
82912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
83012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
83112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FrValue() const {
83212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFrShift + kFrBits -1, kFrShift);
83312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
83412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
83512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Float Compare condition code instruction bits.
83612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FCccValue() const {
83712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFCccShift + kFCccBits - 1, kFCccShift);
83812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
84012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Float Branch condition code instruction bits.
84112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FBccValue() const {
84212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFBccShift + kFBccBits - 1, kFBccShift);
84312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
84412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
84512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Float Branch true/false instruction bit.
84612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FBtrueValue() const {
84712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kFBtrueShift + kFBtrueBits - 1, kFBtrueShift);
84812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
84912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
85012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Return the fields at their original place in the instruction encoding.
85112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline Opcode OpcodeFieldRaw() const {
85212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return static_cast<Opcode>(InstructionBits() & kOpcodeMask);
85312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
85412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
85512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RsFieldRaw() const {
856e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType ||
85712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           InstructionType() == kImmediateType);
85812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kRsFieldMask;
85912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
86012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Same as above function, but safe to call within InstructionType().
86212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RsFieldRawNoAssert() const {
86312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kRsFieldMask;
86412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
86512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
86612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RtFieldRaw() const {
867e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType ||
86812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org           InstructionType() == kImmediateType);
86912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kRtFieldMask;
87012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
87112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
87212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int RdFieldRaw() const {
873e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType);
87412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kRdFieldMask;
87512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
87612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
87712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int SaFieldRaw() const {
878e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kRegisterType);
87912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kSaFieldMask;
88012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
88112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
88212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int FunctionFieldRaw() const {
88312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return InstructionBits() & kFunctionFieldMask;
88412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
88512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
88612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Get the secondary field according to the opcode.
88712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int SecondaryValue() const {
88812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    Opcode op = OpcodeFieldRaw();
88912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    switch (op) {
89012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      case SPECIAL:
89112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      case SPECIAL2:
89212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return FunctionValue();
89312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      case COP1:
89412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return RsValue();
89512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      case REGIMM:
89612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return RtValue();
89712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org      default:
89812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org        return NULLSF;
89912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    }
90012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
90112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
90212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int32_t Imm16Value() const {
903e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kImmediateType);
90412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kImm16Shift + kImm16Bits - 1, kImm16Shift);
90512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
90612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
907dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  inline int32_t Imm21Value() const {
908e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kImmediateType);
909dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org    return Bits(kImm21Shift + kImm21Bits - 1, kImm21Shift);
910dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org  }
911dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org
91212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  inline int32_t Imm26Value() const {
913e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org    DCHECK(InstructionType() == kJumpType);
91412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return Bits(kImm26Shift + kImm26Bits - 1, kImm26Shift);
91512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
91612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
91712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Say if the instruction should not be used in a branch delay slot.
91812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool IsForbiddenInBranchDelay() const;
91912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Say if the instruction 'links'. e.g. jal, bal.
92012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool IsLinkingInstruction() const;
92112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Say if the instruction is a break or a trap.
92212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  bool IsTrap() const;
92312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
92412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Instructions are read of out a code stream. The only way to get a
92512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // reference to an instruction is to convert a pointer. There is no way
92612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // to allocate or create instances of class Instruction.
92712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // Use the At(pc) function to create references to Instruction.
92812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  static Instruction* At(byte* pc) {
92912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org    return reinterpret_cast<Instruction*>(pc);
93012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  }
93112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org private:
93312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  // We need to prevent the creation of instances of class Instruction.
93412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org  DISALLOW_IMPLICIT_CONSTRUCTORS(Instruction);
93512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org};
93612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
93812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// -----------------------------------------------------------------------------
93912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// MIPS assembly various constants.
94012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
94112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// C/C++ argument slots size.
94212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kCArgSlotCount = (kMipsAbi == kN64) ? 0 : 4;
94312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
94412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// TODO(plind): below should be based on kPointerSize
94512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// TODO(plind): find all usages and remove the needless instructions for n64.
94612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kCArgsSlotsSize = kCArgSlotCount * Instruction::kInstrSize * 2;
94712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
94812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst int kBranchReturnOffset = 2 * Instruction::kInstrSize;
94912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
95012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} }   // namespace v8::internal
95112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org
95212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif    // #ifndef V8_MIPS_CONSTANTS_H_
953