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