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// A Disassembler object is used to disassemble a block of code instruction by 612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// instruction. The default implementation of the NameConverter object can be 712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// overriden to modify register names or to do symbol lookup on addresses. 812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// 912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// The example below will disassemble a block of code and print it to stdout. 1012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// 1112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// NameConverter converter; 1212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Disassembler d(converter); 1312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// for (byte* pc = begin; pc < end;) { 1412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// v8::internal::EmbeddedVector<char, 256> buffer; 1512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// byte* prev_pc = pc; 1612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// pc += d.InstructionDecode(buffer, pc); 1712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// printf("%p %08x %s\n", 1812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer); 1912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// } 2012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// 2112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// The Disassembler class also has a convenience method to disassemble a block 2212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// of code into a FILE*, meaning that the above functionality could also be 2312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// achieved by just calling Disassembler::Disassemble(stdout, begin, end); 2412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 2612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include <assert.h> 2712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include <stdarg.h> 2812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include <stdio.h> 2912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include <string.h> 3012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 3112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/v8.h" 3212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 3312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#if V8_TARGET_ARCH_MIPS64 3412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 3512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/base/platform/platform.h" 3612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/disasm.h" 3712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/macro-assembler.h" 3812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#include "src/mips64/constants-mips64.h" 3912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace v8 { 4112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace internal { 4212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//------------------------------------------------------------------------------ 4412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 4512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Decoder decodes and disassembles instructions into an output buffer. 4612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// It uses the converter to convert register names and call destinations into 4712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// more informative description. 4812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgclass Decoder { 4912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org public: 5012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Decoder(const disasm::NameConverter& converter, 5112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::Vector<char> out_buffer) 5212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : converter_(converter), 5312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_(out_buffer), 5412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_(0) { 5512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_[out_buffer_pos_] = '\0'; 5612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 5712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 5812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org ~Decoder() {} 5912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 6012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Writes one disassembled instruction into 'buffer' (0-terminated). 6112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Returns the length of the disassembled machine instruction in bytes. 6212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int InstructionDecode(byte* instruction); 6312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 6412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org private: 6512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Bottleneck functions to print into the out_buffer. 6612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintChar(const char ch); 6712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void Print(const char* str); 6812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 6912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Printing of common values. 7012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintRegister(int reg); 7112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintFPURegister(int freg); 7212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintRs(Instruction* instr); 7312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintRt(Instruction* instr); 7412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintRd(Instruction* instr); 7512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintFs(Instruction* instr); 7612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintFt(Instruction* instr); 7712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintFd(Instruction* instr); 7812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSa(Instruction* instr); 7912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSd(Instruction* instr); 8012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSs1(Instruction* instr); 8112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSs2(Instruction* instr); 8212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintBc(Instruction* instr); 8312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintCc(Instruction* instr); 8412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintFunction(Instruction* instr); 8512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSecondaryField(Instruction* instr); 8612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintUImm16(Instruction* instr); 8712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintSImm16(Instruction* instr); 8812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintXImm16(Instruction* instr); 89dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org void PrintXImm21(Instruction* instr); 9012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintXImm26(Instruction* instr); 9112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintCode(Instruction* instr); // For break and trap instructions. 9212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Printing of instruction name. 9312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void PrintInstructionName(Instruction* instr); 9412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 9512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Handle formatting of instructions and their options. 9612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int FormatRegister(Instruction* instr, const char* option); 9712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int FormatFPURegister(Instruction* instr, const char* option); 9812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int FormatOption(Instruction* instr, const char* option); 9912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void Format(Instruction* instr, const char* format); 10012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void Unknown(Instruction* instr); 10112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int DecodeBreakInstr(Instruction* instr); 10212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 10312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Each of these functions decodes one particular instruction type. 10412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int DecodeTypeRegister(Instruction* instr); 10512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void DecodeTypeImmediate(Instruction* instr); 10612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org void DecodeTypeJump(Instruction* instr); 10712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 10812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org const disasm::NameConverter& converter_; 10912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::Vector<char> out_buffer_; 11012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int out_buffer_pos_; 11112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DISALLOW_COPY_AND_ASSIGN(Decoder); 11312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org}; 11412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 11612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Support for assertions in the Decoder formatting functions. 11712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#define STRING_STARTS_WITH(string, compare_string) \ 11812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (strncmp(string, compare_string, strlen(compare_string)) == 0) 11912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Append the ch to the output buffer. 12212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintChar(const char ch) { 12312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_[out_buffer_pos_++] = ch; 12412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 12512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 12712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Append the str to the output buffer. 12812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::Print(const char* str) { 12912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char cur = *str++; 13012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org while (cur != '\0' && (out_buffer_pos_ < (out_buffer_.length() - 1))) { 13112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintChar(cur); 13212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org cur = *str++; 13312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 13412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_[out_buffer_pos_] = 0; 13512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 13612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 13712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 13812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the register name according to the active name converter. 13912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintRegister(int reg) { 14012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Print(converter_.NameOfCPURegister(reg)); 14112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 14212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintRs(Instruction* instr) { 14512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RsValue(); 14612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 14712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 14812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 14912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintRt(Instruction* instr) { 15112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RtValue(); 15212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 15312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 15412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 15612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintRd(Instruction* instr) { 15712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RdValue(); 15812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 15912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 16012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the FPUregister name according to the active name converter. 16312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintFPURegister(int freg) { 16412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Print(converter_.NameOfXMMRegister(freg)); 16512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 16612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 16812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintFs(Instruction* instr) { 16912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int freg = instr->RsValue(); 17012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(freg); 17112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 17212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 17312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 17412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintFt(Instruction* instr) { 17512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int freg = instr->RtValue(); 17612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(freg); 17712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 17812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 17912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintFd(Instruction* instr) { 18112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int freg = instr->RdValue(); 18212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(freg); 18312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 18412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 18612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the sa field. 18712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintSa(Instruction* instr) { 18812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int sa = instr->SaValue(); 18912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", sa); 19012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 19112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the rd field, when it is not used as reg. 19412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintSd(Instruction* instr) { 19512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int sd = instr->RdValue(); 19612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", sd); 19712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 19812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 19912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 20012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the rd field, when used as 'ext' size. 20112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintSs1(Instruction* instr) { 20212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int ss = instr->RdValue(); 20312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", ss + 1); 20412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 20512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 20612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 20712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the rd field, when used as 'ins' size. 20812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintSs2(Instruction* instr) { 20912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int ss = instr->RdValue(); 21012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int pos = instr->SaValue(); 21112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += 21212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org SNPrintF(out_buffer_ + out_buffer_pos_, "%d", ss - pos + 1); 21312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 21412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 21512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 21612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the cc field for the bc1t/f instructions. 21712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintBc(Instruction* instr) { 21812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int cc = instr->FBccValue(); 21912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", cc); 22012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 22112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print the integer value of the cc field for the FP compare instructions. 22412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintCc(Instruction* instr) { 22512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int cc = instr->FCccValue(); 22612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "cc(%d)", cc); 22712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 22812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 22912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 23012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print 16-bit unsigned immediate value. 23112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintUImm16(Instruction* instr) { 23212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t imm = instr->Imm16Value(); 23312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%u", imm); 23412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 23512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 23612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 23712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print 16-bit signed immediate value. 23812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintSImm16(Instruction* instr) { 23912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t imm = ((instr->Imm16Value()) << 16) >> 16; 24012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", imm); 24112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 24212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 24312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 24412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print 16-bit hexa immediate value. 24512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintXImm16(Instruction* instr) { 24612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t imm = instr->Imm16Value(); 24712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", imm); 24812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 24912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 25012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 251dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org// Print 21-bit immediate value. 252dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.orgvoid Decoder::PrintXImm21(Instruction* instr) { 253dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org uint32_t imm = instr->Imm21Value(); 254dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", imm); 255dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org} 256dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 257dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 25812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print 26-bit immediate value. 25912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintXImm26(Instruction* instr) { 26012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org uint32_t imm = instr->Imm26Value() << kImmFieldShift; 26112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", imm); 26212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 26312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 26412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 26512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Print 26-bit immediate value. 26612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintCode(Instruction* instr) { 26712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->OpcodeFieldRaw() != SPECIAL) 26812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return; // Not a break or trap instruction. 26912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 27012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BREAK: { 27112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t code = instr->Bits(25, 6); 27212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 27312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "0x%05x (%d)", code, code); 27412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 27512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 27612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TGE: 27712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TGEU: 27812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TLT: 27912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TLTU: 28012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TEQ: 28112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TNE: { 28212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int32_t code = instr->Bits(15, 6); 28312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += 28412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org SNPrintF(out_buffer_ + out_buffer_pos_, "0x%03x", code); 28512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 28612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 28712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: // Not a break or trap instruction. 28812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 28912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 29012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 29112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Printing of instruction name. 29412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::PrintInstructionName(Instruction* instr) { 29512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 29612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 29812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Handle all register based formatting in this function to reduce the 29912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// complexity of FormatOption. 30012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::FormatRegister(Instruction* instr, const char* format) { 301e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(format[0] == 'r'); 30212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (format[1] == 's') { // 'rs: Rs register. 30312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RsValue(); 30412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 30512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 30612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[1] == 't') { // 'rt: rt register. 30712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RtValue(); 30812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 30912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 31012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[1] == 'd') { // 'rd: rd register. 31112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->RdValue(); 31212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintRegister(reg); 31312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 31412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 31512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 31612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 31712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 31812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 31912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 32012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Handle all FPUregister based formatting in this function to reduce the 32112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// complexity of FormatOption. 32212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::FormatFPURegister(Instruction* instr, const char* format) { 323e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(format[0] == 'f'); 32412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (format[1] == 's') { // 'fs: fs register. 32512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->FsValue(); 32612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(reg); 32712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 32812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[1] == 't') { // 'ft: ft register. 32912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->FtValue(); 33012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(reg); 33112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 33212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[1] == 'd') { // 'fd: fd register. 33312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->FdValue(); 33412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(reg); 33512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 33612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[1] == 'r') { // 'fr: fr register. 33712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org int reg = instr->FrValue(); 33812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintFPURegister(reg); 33912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 34012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 34112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 34212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 34312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 34412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 34512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 34612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// FormatOption takes a formatting string and interprets it based on 34712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// the current instructions. The format string points to the first 34812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// character of the option string (the option escape has already been 34912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// consumed by the caller.) FormatOption returns the number of 35012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// characters that were consumed from the formatting string. 35112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::FormatOption(Instruction* instr, const char* format) { 35212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (format[0]) { 35312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'c': { // 'code for break or trap instructions. 354e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "code")); 35512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintCode(instr); 35612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 4; 35712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 35812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'i': { // 'imm16u or 'imm26. 35912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (format[3] == '1') { 360e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm16")); 36112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (format[5] == 's') { 362e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm16s")); 36312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSImm16(instr); 36412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (format[5] == 'u') { 365e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm16u")); 36612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSImm16(instr); 36712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 368e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm16x")); 36912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintXImm16(instr); 37012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 37112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 6; 372dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if (format[3] == '2' && format[4] == '1') { 373e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm21x")); 374dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org PrintXImm21(instr); 375dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org return 6; 376dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if (format[3] == '2' && format[4] == '6') { 377e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "imm26x")); 37812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintXImm26(instr); 37912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 6; 38012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 38112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 38212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'r': { // 'r: registers. 38312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return FormatRegister(instr, format); 38412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 38512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'f': { // 'f: FPUregisters. 38612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return FormatFPURegister(instr, format); 38712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 38812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 's': { // 'sa. 38912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (format[1]) { 39012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'a': { 391e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "sa")); 39212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSa(instr); 39312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 39412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 39512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'd': { 396e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "sd")); 39712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSd(instr); 39812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 39912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 40012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 's': { 40112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (format[2] == '1') { 402e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "ss1")); /* ext size */ 40312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSs1(instr); 40412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 3; 40512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 406e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "ss2")); /* ins size */ 40712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintSs2(instr); 40812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 3; 40912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'b': { // 'bc - Special for bc1 cc field. 414e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "bc")); 41512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintBc(instr); 41612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 41712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 41812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case 'C': { // 'Cc - Special for c.xx.d cc field. 419e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "Cc")); 42012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org PrintCc(instr); 42112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 2; 42212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 42412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 42512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 42612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 42712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 42812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 42912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Format takes a formatting string for a whole instruction and prints it into 43012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// the output buffer. All escaped options are handed to FormatOption to be 43112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// parsed further. 43212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::Format(Instruction* instr, const char* format) { 43312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org char cur = *format++; 43412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org while ((cur != 0) && (out_buffer_pos_ < (out_buffer_.length() - 1))) { 43512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (cur == '\'') { // Single quote is used as the formatting escape. 43612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org format += FormatOption(instr, format); 43712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 43812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_[out_buffer_pos_++] = cur; 43912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 44012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org cur = *format++; 44112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 44212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_[out_buffer_pos_] = '\0'; 44312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 44412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 44512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 44612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// For currently unimplemented decodings the disassembler calls Unknown(instr) 44712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// which will just print "unknown" of the instruction bits. 44812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::Unknown(Instruction* instr) { 44912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "unknown"); 45012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 45112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 45312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::DecodeBreakInstr(Instruction* instr) { 45412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // This is already known to be BREAK instr, just extract the code. 45512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->Bits(25, 6) == static_cast<int>(kMaxStopCode)) { 45612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // This is stop(msg). 45712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "break, code: 'code"); 45812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 45912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "\n%p %08lx stop msg: %s", 46012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org static_cast<void*> 46112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (reinterpret_cast<int32_t*>(instr 46212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org + Instruction::kInstrSize)), 46312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org reinterpret_cast<uint64_t> 46412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org (*reinterpret_cast<char**>(instr 46512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org + Instruction::kInstrSize)), 46612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org *reinterpret_cast<char**>(instr 46712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org + Instruction::kInstrSize)); 46812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Size 3: the break_ instr, plus embedded 64-bit char pointer. 46912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return 3 * Instruction::kInstrSize; 47012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 47112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "break, code: 'code"); 47212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Instruction::kInstrSize; 47312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 47412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 47512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 47712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::DecodeTypeRegister(Instruction* instr) { 47812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->OpcodeFieldRaw()) { 47912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case COP1: // Coprocessor instructions. 48012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->RsFieldRaw()) { 48112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MFC1: 48212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mfc1 'rt, 'fs"); 48312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 48412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DMFC1: 48512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dmfc1 'rt, 'fs"); 48612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 48712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MFHC1: 48812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mfhc1 'rt, 'fs"); 48912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 49012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MTC1: 49112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mtc1 'rt, 'fs"); 49212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 49312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DMTC1: 49412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dmtc1 'rt, 'fs"); 49512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 49612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // These are called "fs" too, although they are not FPU registers. 49712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CTC1: 49812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ctc1 'rt, 'fs"); 49912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 50012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CFC1: 50112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cfc1 'rt, 'fs"); 50212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 50312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MTHC1: 50412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mthc1 'rt, 'fs"); 50512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 50612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case D: 50712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 50812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ADD_D: 50912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "add.d 'fd, 'fs, 'ft"); 51012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 51112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SUB_D: 51212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sub.d 'fd, 'fs, 'ft"); 51312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 51412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MUL_D: 51512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mul.d 'fd, 'fs, 'ft"); 51612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 51712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DIV_D: 51812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "div.d 'fd, 'fs, 'ft"); 51912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 52012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ABS_D: 52112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "abs.d 'fd, 'fs"); 52212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 52312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MOV_D: 52412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mov.d 'fd, 'fs"); 52512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 52612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case NEG_D: 52712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "neg.d 'fd, 'fs"); 52812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 52912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SQRT_D: 53012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sqrt.d 'fd, 'fs"); 53112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 53212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_W_D: 53312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.w.d 'fd, 'fs"); 53412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 53512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_L_D: 53612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.l.d 'fd, 'fs"); 53712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 53812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TRUNC_W_D: 53912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "trunc.w.d 'fd, 'fs"); 54012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 54112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TRUNC_L_D: 54212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "trunc.l.d 'fd, 'fs"); 54312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 54412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ROUND_W_D: 54512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "round.w.d 'fd, 'fs"); 54612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 54712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ROUND_L_D: 54812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "round.l.d 'fd, 'fs"); 54912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 55012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case FLOOR_W_D: 55112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "floor.w.d 'fd, 'fs"); 55212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 55312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case FLOOR_L_D: 55412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "floor.l.d 'fd, 'fs"); 55512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 55612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CEIL_W_D: 55712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ceil.w.d 'fd, 'fs"); 55812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 55912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CEIL_L_D: 56012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ceil.l.d 'fd, 'fs"); 56112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 56212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_S_D: 56312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.s.d 'fd, 'fs"); 56412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 56512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_F_D: 56612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.f.d 'fs, 'ft, 'Cc"); 56712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 56812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_UN_D: 56912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.un.d 'fs, 'ft, 'Cc"); 57012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 57112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_EQ_D: 57212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.eq.d 'fs, 'ft, 'Cc"); 57312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 57412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_UEQ_D: 57512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.ueq.d 'fs, 'ft, 'Cc"); 57612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 57712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_OLT_D: 57812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.olt.d 'fs, 'ft, 'Cc"); 57912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 58012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_ULT_D: 58112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.ult.d 'fs, 'ft, 'Cc"); 58212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 58312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_OLE_D: 58412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.ole.d 'fs, 'ft, 'Cc"); 58512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 58612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case C_ULE_D: 58712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "c.ule.d 'fs, 'ft, 'Cc"); 58812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 58912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 59012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "unknown.cop1.d"); 59112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 59212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 59312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 59412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case W: 59512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 59612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_D_W: // Convert word to double. 59712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.d.w 'fd, 'fs"); 59812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 59912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 60012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 60112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 60212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 60312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case L: 60412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 60512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_D_L: 60612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.d.l 'fd, 'fs"); 60712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 60812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CVT_S_L: 60912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "cvt.s.l 'fd, 'fs"); 61012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 611dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UN: 612dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.un.d 'fd, 'fs, 'ft"); 613dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 614dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_EQ: 615dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.eq.d 'fd, 'fs, 'ft"); 616dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 617dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UEQ: 618dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ueq.d 'fd, 'fs, 'ft"); 619dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 620dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LT: 621dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.lt.d 'fd, 'fs, 'ft"); 622dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 623dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULT: 624dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ult.d 'fd, 'fs, 'ft"); 625dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 626dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LE: 627dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.le.d 'fd, 'fs, 'ft"); 628dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 629dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULE: 630dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ule.d 'fd, 'fs, 'ft"); 631dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 632dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_OR: 633dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.or.d 'fd, 'fs, 'ft"); 634dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 635dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UNE: 636dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.une.d 'fd, 'fs, 'ft"); 637dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 638dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_NE: 639dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ne.d 'fd, 'fs, 'ft"); 640dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 64112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 64212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 64312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 64412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 64512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 64612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 64712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 64812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 64912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case COP1X: 65012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 65112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MADD_D: 65212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "madd.d 'fd, 'fr, 'fs, 'ft"); 65312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 65412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 65512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 65612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 65712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 65812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SPECIAL: 65912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 66012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case JR: 66112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "jr 'rs"); 66212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 66312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case JALR: 66412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "jalr 'rs"); 66512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 66612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLL: 667dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (0x0 == static_cast<int>(instr->InstructionBits())) 66812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "nop"); 66912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org else 67012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sll 'rd, 'rt, 'sa"); 67112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 67212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSLL: 673dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dsll 'rd, 'rt, 'sa"); 674dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 675dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case D_MUL_MUH: // Equals to DMUL. 676dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 677dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmult 'rs, 'rt"); 678dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 679dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == MUL_OP) { 680dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmul 'rd, 'rs, 'rt"); 681dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 682dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmuh 'rd, 'rs, 'rt"); 683dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 684dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 68512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 68612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSLL32: 68712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsll32 'rd, 'rt, 'sa"); 68812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 68912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SRL: 69012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RsValue() == 0) { 69112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "srl 'rd, 'rt, 'sa"); 69212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 69312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 69412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "rotr 'rd, 'rt, 'sa"); 69512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 69612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Unknown(instr); 69712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 69812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 69912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 70012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRL: 70112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->RsValue() == 0) { 70212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsrl 'rd, 'rt, 'sa"); 70312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 70412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 70512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "drotr 'rd, 'rt, 'sa"); 70612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 70712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Unknown(instr); 70812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 70912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 71012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 71112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRL32: 71212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsrl32 'rd, 'rt, 'sa"); 71312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 71412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SRA: 71512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sra 'rd, 'rt, 'sa"); 71612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 71712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRA: 71812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsra 'rd, 'rt, 'sa"); 71912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 72012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRA32: 72112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsra32 'rd, 'rt, 'sa"); 72212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 72312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLLV: 72412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sllv 'rd, 'rt, 'rs"); 72512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 72612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSLLV: 72712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsllv 'rd, 'rt, 'rs"); 72812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 72912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SRLV: 73012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->SaValue() == 0) { 73112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "srlv 'rd, 'rt, 'rs"); 73212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 73312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 73412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "rotrv 'rd, 'rt, 'rs"); 73512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 73612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Unknown(instr); 73712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 73812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 73912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 74012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRLV: 74112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->SaValue() == 0) { 74212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsrlv 'rd, 'rt, 'rs"); 74312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 74412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (kArchVariant == kMips64r2) { 74512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "drotrv 'rd, 'rt, 'rs"); 74612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 74712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Unknown(instr); 74812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 74912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 75012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 75112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SRAV: 75212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "srav 'rd, 'rt, 'rs"); 75312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 75412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSRAV: 75512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsrav 'rd, 'rt, 'rs"); 75612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 75712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MFHI: 758dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->Bits(25, 16) == 0) { 759dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mfhi 'rd"); 760dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 761dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if ((instr->FunctionFieldRaw() == CLZ_R6) 762dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->FdValue() == 1)) { 763dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "clz 'rd, 'rs"); 764dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->FunctionFieldRaw() == CLO_R6) 765dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->FdValue() == 1)) { 766dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "clo 'rd, 'rs"); 767dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 768dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 76912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 77012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MFLO: 77112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mflo 'rd"); 77212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 773dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case D_MUL_MUH_U: // Equals to DMULTU. 774dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 775dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmultu 'rs, 'rt"); 776dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 777dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == MUL_OP) { 778dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmulu 'rd, 'rs, 'rt"); 779dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 780dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmuhu 'rd, 'rs, 'rt"); 781dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 782dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 78312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 784dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MULT: // @Mips64r6 == MUL_MUH. 785dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 786dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mult 'rs, 'rt"); 787dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 788dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == MUL_OP) { 789dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mul 'rd, 'rs, 'rt"); 790dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 791dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "muh 'rd, 'rs, 'rt"); 792dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 793dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 79412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 795dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MULTU: // @Mips64r6 == MUL_MUH_U. 796dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 797dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "multu 'rs, 'rt"); 798dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 799dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == MUL_OP) { 800dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mulu 'rd, 'rs, 'rt"); 801dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 802dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "muhu 'rd, 'rs, 'rt"); 803dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 804dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 805dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 80612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 807dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DIV: // @Mips64r6 == DIV_MOD. 808dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 809dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "div 'rs, 'rt"); 810dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 811dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == DIV_OP) { 812dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "div 'rd, 'rs, 'rt"); 813dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 814dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mod 'rd, 'rs, 'rt"); 815dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 816dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 81712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 818dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DDIV: // @Mips64r6 == D_DIV_MOD. 819dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 820dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ddiv 'rs, 'rt"); 821dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 822dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == DIV_OP) { 823dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ddiv 'rd, 'rs, 'rt"); 824dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 825dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmod 'rd, 'rs, 'rt"); 826dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 827dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 82812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 829dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DIVU: // @Mips64r6 == DIV_MOD_U. 830dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 831dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "divu 'rs, 'rt"); 832dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 833dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == DIV_OP) { 834dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "divu 'rd, 'rs, 'rt"); 835dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 836dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "modu 'rd, 'rs, 'rt"); 837dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 838dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 83912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 840dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DDIVU: // @Mips64r6 == D_DIV_MOD_U. 841dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 842dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ddivu 'rs, 'rt"); 843dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 844dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->SaValue() == DIV_OP) { 845dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ddivu 'rd, 'rs, 'rt"); 846dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 847dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dmodu 'rd, 'rs, 'rt"); 848dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 849dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 85012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 85112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ADD: 85212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "add 'rd, 'rs, 'rt"); 85312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 85412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DADD: 85512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dadd 'rd, 'rs, 'rt"); 85612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 85712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ADDU: 85812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "addu 'rd, 'rs, 'rt"); 85912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 86012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DADDU: 86112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "daddu 'rd, 'rs, 'rt"); 86212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 86312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SUB: 86412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sub 'rd, 'rs, 'rt"); 86512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 86612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSUB: 86712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsub 'rd, 'rs, 'rt"); 86812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 86912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SUBU: 87012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "subu 'rd, 'rs, 'rt"); 87112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 87212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DSUBU: 87312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "dsubu 'rd, 'rs, 'rt"); 87412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 87512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case AND: 87612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "and 'rd, 'rs, 'rt"); 87712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 87812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case OR: 87912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (0 == instr->RsValue()) { 88012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mov 'rd, 'rt"); 88112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else if (0 == instr->RtValue()) { 88212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mov 'rd, 'rs"); 88312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 88412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "or 'rd, 'rs, 'rt"); 88512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 88612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 88712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case XOR: 88812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "xor 'rd, 'rs, 'rt"); 88912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 89012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case NOR: 89112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "nor 'rd, 'rs, 'rt"); 89212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 89312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLT: 89412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "slt 'rd, 'rs, 'rt"); 89512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 89612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLTU: 89712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sltu 'rd, 'rs, 'rt"); 89812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 89912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BREAK: 90012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DecodeBreakInstr(instr); 90112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TGE: 90212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "tge 'rs, 'rt, code: 'code"); 90312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 90412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TGEU: 90512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "tgeu 'rs, 'rt, code: 'code"); 90612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 90712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TLT: 90812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "tlt 'rs, 'rt, code: 'code"); 90912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 91012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TLTU: 91112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "tltu 'rs, 'rt, code: 'code"); 91212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 91312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TEQ: 91412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "teq 'rs, 'rt, code: 'code"); 91512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 91612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case TNE: 91712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "tne 'rs, 'rt, code: 'code"); 91812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 91912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MOVZ: 92012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "movz 'rd, 'rs, 'rt"); 92112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 92212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MOVN: 92312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "movn 'rd, 'rs, 'rt"); 92412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 92512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MOVCI: 92612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->Bit(16)) { 92712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "movt 'rd, 'rs, 'bc"); 92812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 92912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "movf 'rd, 'rs, 'bc"); 93012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 93112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 932dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELEQZ_S: 933dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "seleqz 'rd, 'rs, 'rt"); 934dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 935dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELNEZ_S: 936dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "selnez 'rd, 'rs, 'rt"); 937dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 93812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 93912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 94012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 94112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 94212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SPECIAL2: 94312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 94412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case MUL: 94512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "mul 'rd, 'rs, 'rt"); 94612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 94712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case CLZ: 948dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 949dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "clz 'rd, 'rs"); 950dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 95112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 95212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 95312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 95412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 95512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 95612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SPECIAL3: 95712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->FunctionFieldRaw()) { 95812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case INS: { 959dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ins 'rt, 'rs, 'sa, 'ss2"); 96012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 96112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 96212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case EXT: { 963dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "ext 'rt, 'rs, 'sa, 'ss1"); 96412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 96512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 96612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 96712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 96812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 96912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 97012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 97112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 97212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 97312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Instruction::kInstrSize; 97412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 97512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 97612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 97712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::DecodeTypeImmediate(Instruction* instr) { 97812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->OpcodeFieldRaw()) { 97912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case COP1: 98012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->RsFieldRaw()) { 98112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BC1: 98212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org if (instr->FBtrueValue()) { 98312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bc1t 'bc, 'imm16u"); 98412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } else { 98512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bc1f 'bc, 'imm16u"); 98612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 98712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 988dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BC1EQZ: 989dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bc1eqz 'ft, 'imm16u"); 990dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 991dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BC1NEZ: 992dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bc1nez 'ft, 'imm16u"); 993dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 994dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case W: // CMP.S instruction. 995dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org switch (instr->FunctionValue()) { 996dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_AF: 997dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.af.S 'ft, 'fs, 'fd"); 998dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 999dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UN: 1000dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.un.S 'ft, 'fs, 'fd"); 1001dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1002dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_EQ: 1003dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.eq.S 'ft, 'fs, 'fd"); 1004dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1005dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UEQ: 1006dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ueq.S 'ft, 'fs, 'fd"); 1007dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1008dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LT: 1009dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.lt.S 'ft, 'fs, 'fd"); 1010dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1011dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULT: 1012dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ult.S 'ft, 'fs, 'fd"); 1013dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1014dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LE: 1015dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.le.S 'ft, 'fs, 'fd"); 1016dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1017dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULE: 1018dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ule.S 'ft, 'fs, 'fd"); 1019dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1020dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_OR: 1021dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.or.S 'ft, 'fs, 'fd"); 1022dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1023dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UNE: 1024dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.une.S 'ft, 'fs, 'fd"); 1025dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1026dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_NE: 1027dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ne.S 'ft, 'fs, 'fd"); 1028dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1029dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org default: 1030dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1031dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1032dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1033dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case L: // CMP.D instruction. 1034dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org switch (instr->FunctionValue()) { 1035dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_AF: 1036dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.af.D 'ft, 'fs, 'fd"); 1037dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1038dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UN: 1039dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.un.D 'ft, 'fs, 'fd"); 1040dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1041dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_EQ: 1042dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.eq.D 'ft, 'fs, 'fd"); 1043dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1044dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UEQ: 1045dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ueq.D 'ft, 'fs, 'fd"); 1046dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1047dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LT: 1048dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.lt.D 'ft, 'fs, 'fd"); 1049dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1050dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULT: 1051dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ult.D 'ft, 'fs, 'fd"); 1052dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1053dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_LE: 1054dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.le.D 'ft, 'fs, 'fd"); 1055dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1056dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_ULE: 1057dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ule.D 'ft, 'fs, 'fd"); 1058dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1059dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_OR: 1060dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.or.D 'ft, 'fs, 'fd"); 1061dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1062dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_UNE: 1063dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.une.D 'ft, 'fs, 'fd"); 1064dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1065dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case CMP_NE: 1066dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "cmp.ne.D 'ft, 'fs, 'fd"); 1067dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1068dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org default: 1069dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1070dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1071dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1072dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case S: 1073dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org switch (instr->FunctionValue()) { 1074dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SEL: 1075dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "sel.S 'ft, 'fs, 'fd"); 1076dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1077dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELEQZ_C: 1078dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "seleqz.S 'ft, 'fs, 'fd"); 1079dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1080dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELNEZ_C: 1081dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "selnez.S 'ft, 'fs, 'fd"); 1082dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1083dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MIN: 1084dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "min.S 'ft, 'fs, 'fd"); 1085dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1086dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MINA: 1087dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mina.S 'ft, 'fs, 'fd"); 1088dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1089dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MAX: 1090dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "max.S 'ft, 'fs, 'fd"); 1091dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1092dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MAXA: 1093dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "maxa.S 'ft, 'fs, 'fd"); 1094dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1095dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org default: 1096dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1097dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1098dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1099dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case D: 1100dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org switch (instr->FunctionValue()) { 1101dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SEL: 1102dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "sel.D 'ft, 'fs, 'fd"); 1103dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1104dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELEQZ_C: 1105dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "seleqz.D 'ft, 'fs, 'fd"); 1106dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1107dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case SELNEZ_C: 1108dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "selnez.D 'ft, 'fs, 'fd"); 1109dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1110dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MIN: 1111dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "min.D 'ft, 'fs, 'fd"); 1112dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1113dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MINA: 1114dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "mina.D 'ft, 'fs, 'fd"); 1115dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1116dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MAX: 1117dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "max.D 'ft, 'fs, 'fd"); 1118dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1119dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case MAXA: 1120dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "maxa.D 'ft, 'fs, 'fd"); 1121dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1122dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org default: 1123dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1124dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1125dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 112612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 112712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 112812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 1129dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org 113012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; // Case COP1. 1131dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org // ------------- REGIMM class. 113212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case REGIMM: 113312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->RtFieldRaw()) { 113412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BLTZ: 113512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bltz 'rs, 'imm16u"); 113612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 113712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BLTZAL: 113812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bltzal 'rs, 'imm16u"); 113912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 114012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BGEZ: 114112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bgez 'rs, 'imm16u"); 114212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 114312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BGEZAL: 114412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bgezal 'rs, 'imm16u"); 114512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 1146dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BGEZALL: 1147dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgezall 'rs, 'imm16u"); 1148dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1149dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DAHI: 1150dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dahi 'rs, 'imm16u"); 1151dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1152dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DATI: 1153dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "dati 'rs, 'imm16u"); 1154dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 115512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 115612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 115712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 115812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; // Case REGIMM. 115912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // ------------- Branch instructions. 116012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BEQ: 116112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "beq 'rs, 'rt, 'imm16u"); 116212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 116312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BNE: 116412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "bne 'rs, 'rt, 'imm16u"); 116512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 116612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BLEZ: 1167dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if ((instr->RtFieldRaw() == 0) 1168dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0)) { 1169dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "blez 'rs, 'imm16u"); 1170dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() != instr->RsFieldRaw()) 1171dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0) && (instr->RtFieldRaw() != 0)) { 1172dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgeuc 'rs, 'rt, 'imm16u"); 1173dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() == instr->RsFieldRaw()) 1174dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1175dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgezalc 'rs, 'imm16u"); 1176dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RsFieldRaw() == 0) 1177dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1178dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "blezalc 'rs, 'imm16u"); 1179dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1180dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1181dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 118212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 118312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case BGTZ: 1184dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if ((instr->RtFieldRaw() == 0) 1185dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0)) { 1186dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgtz 'rs, 'imm16u"); 1187dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() != instr->RsFieldRaw()) 1188dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0) && (instr->RtFieldRaw() != 0)) { 1189dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bltuc 'rs, 'rt, 'imm16u"); 1190dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() == instr->RsFieldRaw()) 1191dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1192dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bltzalc 'rt, 'imm16u"); 1193dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RsFieldRaw() == 0) 1194dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1195dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgtzalc 'rt, 'imm16u"); 1196dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1197dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1198dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1199dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1200dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BLEZL: 1201dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if ((instr->RtFieldRaw() == instr->RsFieldRaw()) 1202dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1203dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgezc 'rt, 'imm16u"); 1204dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() != instr->RsFieldRaw()) 1205dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0) && (instr->RtFieldRaw() != 0)) { 1206dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgec 'rs, 'rt, 'imm16u"); 1207dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RsFieldRaw() == 0) 1208dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1209dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "blezc 'rt, 'imm16u"); 1210dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1211dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1212dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1213dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1214dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BGTZL: 1215dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if ((instr->RtFieldRaw() == instr->RsFieldRaw()) 1216dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1217dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bltzc 'rt, 'imm16u"); 1218dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RtFieldRaw() != instr->RsFieldRaw()) 1219dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RsFieldRaw() != 0) && (instr->RtFieldRaw() != 0)) { 1220dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bltc 'rs, 'rt, 'imm16u"); 1221dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if ((instr->RsFieldRaw() == 0) 1222dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org && (instr->RtFieldRaw() != 0)) { 1223dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bgtzc 'rt, 'imm16u"); 1224dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1225dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1226dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1227dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1228dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BEQZC: 1229dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->RsFieldRaw() != 0) { 1230dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "beqzc 'rs, 'imm21x"); 1231dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1232dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1233dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case BNEZC: 1234dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->RsFieldRaw() != 0) { 1235dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bnezc 'rs, 'imm21x"); 1236dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 123712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 123812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // ------------- Arithmetic instructions. 123912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ADDI: 1240dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 1241dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "addi 'rt, 'rs, 'imm16s"); 1242dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1243dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org // Check if BOVC or BEQC instruction. 1244dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->RsFieldRaw() >= instr->RtFieldRaw()) { 1245dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bovc 'rs, 'rt, 'imm16s"); 1246dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if (instr->RsFieldRaw() < instr->RtFieldRaw()) { 1247dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "beqc 'rs, 'rt, 'imm16s"); 1248dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1249dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1250dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1251dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 125212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 125312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DADDI: 1254dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 1255dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "daddi 'rt, 'rs, 'imm16s"); 1256dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1257dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org // Check if BNVC or BNEC instruction. 1258dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->RsFieldRaw() >= instr->RtFieldRaw()) { 1259dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bnvc 'rs, 'rt, 'imm16s"); 1260dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else if (instr->RsFieldRaw() < instr->RtFieldRaw()) { 1261dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "bnec 'rs, 'rt, 'imm16s"); 1262dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1263dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org UNREACHABLE(); 1264dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1265dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 126612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 126712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ADDIU: 126812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "addiu 'rt, 'rs, 'imm16s"); 126912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 127012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case DADDIU: 127112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "daddiu 'rt, 'rs, 'imm16s"); 127212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 127312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLTI: 127412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "slti 'rt, 'rs, 'imm16s"); 127512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 127612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SLTIU: 127712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sltiu 'rt, 'rs, 'imm16u"); 127812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 127912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ANDI: 128012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "andi 'rt, 'rs, 'imm16x"); 128112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 128212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case ORI: 128312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ori 'rt, 'rs, 'imm16x"); 128412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 128512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case XORI: 128612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "xori 'rt, 'rs, 'imm16x"); 128712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 128812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LUI: 1289dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (kArchVariant != kMips64r6) { 1290dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "lui 'rt, 'imm16x"); 1291dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1292dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org if (instr->RsValue() != 0) { 1293dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "aui 'rt, 'imm16x"); 1294dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } else { 1295dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "lui 'rt, 'imm16x"); 1296dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1297dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org } 1298dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org break; 1299dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org case DAUI: 1300dc207d99f9dbff76065405b65f3d88e1fb49fc1cmachenbach@chromium.org Format(instr, "daui 'rt, 'imm16x"); 130112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 130212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // ------------- Memory instructions. 130312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LB: 130412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lb 'rt, 'imm16s('rs)"); 130512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 130612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LH: 130712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lh 'rt, 'imm16s('rs)"); 130812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 130912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LWL: 131012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lwl 'rt, 'imm16s('rs)"); 131112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 131212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LDL: 131312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ldl 'rt, 'imm16s('rs)"); 131412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 131512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LW: 131612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lw 'rt, 'imm16s('rs)"); 131712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 131812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LWU: 131912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lwu 'rt, 'imm16s('rs)"); 132012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 132112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LD: 132212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ld 'rt, 'imm16s('rs)"); 132312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 132412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LBU: 132512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lbu 'rt, 'imm16s('rs)"); 132612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 132712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LHU: 132812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lhu 'rt, 'imm16s('rs)"); 132912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 133012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LWR: 133112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lwr 'rt, 'imm16s('rs)"); 133212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 133312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LDR: 133412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ldr 'rt, 'imm16s('rs)"); 133512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 133612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case PREF: 133712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "pref 'rt, 'imm16s('rs)"); 133812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 133912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SB: 134012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sb 'rt, 'imm16s('rs)"); 134112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 134212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SH: 134312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sh 'rt, 'imm16s('rs)"); 134412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 134512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SWL: 134612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "swl 'rt, 'imm16s('rs)"); 134712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 134812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SW: 134912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sw 'rt, 'imm16s('rs)"); 135012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 135112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SD: 135212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sd 'rt, 'imm16s('rs)"); 135312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 135412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SWR: 135512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "swr 'rt, 'imm16s('rs)"); 135612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 135712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LWC1: 135812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "lwc1 'ft, 'imm16s('rs)"); 135912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 136012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case LDC1: 136112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "ldc1 'ft, 'imm16s('rs)"); 136212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 136312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SWC1: 136412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "swc1 'ft, 'imm16s('rs)"); 136512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 136612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case SDC1: 136712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "sdc1 'ft, 'imm16s('rs)"); 136812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 136912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 137012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org printf("a 0x%x \n", instr->OpcodeFieldRaw()); 137112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 137212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 137312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 137412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 137512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 137612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 137712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Decoder::DecodeTypeJump(Instruction* instr) { 137812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->OpcodeFieldRaw()) { 137912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case J: 138012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "j 'imm26x"); 138112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 138212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case JAL: 138312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "jal 'imm26x"); 138412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 138512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: 138612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); 138712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 138812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 138912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 139012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 139112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// Disassemble the instruction at *instr_ptr into the output buffer. 139212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// All instructions are one word long, except for the simulator 139312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// psuedo-instruction stop(msg). For that one special case, we return 139412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// size larger than one kInstrSize. 139512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Decoder::InstructionDecode(byte* instr_ptr) { 139612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Instruction* instr = Instruction::At(instr_ptr); 139712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // Print raw instruction bytes. 139812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 139912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org "%08x ", 140012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org instr->InstructionBits()); 140112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org switch (instr->InstructionType()) { 140212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Instruction::kRegisterType: { 140312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return DecodeTypeRegister(instr); 140412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 140512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Instruction::kImmediateType: { 140612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DecodeTypeImmediate(instr); 140712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 140812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 140912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org case Instruction::kJumpType: { 141012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org DecodeTypeJump(instr); 141112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org break; 141212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 141312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org default: { 141412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Format(instr, "UNSUPPORTED"); 141512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNSUPPORTED_MIPS(); 141612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 141712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 141812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return Instruction::kInstrSize; 141912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 142012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} } // namespace v8::internal 142312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//------------------------------------------------------------------------------ 142712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 142812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgnamespace disasm { 142912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 143012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameOfAddress(byte* addr) const { 143112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::SNPrintF(tmp_buffer_, "%p", addr); 143212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return tmp_buffer_.start(); 143312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 143412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 143512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 143612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameOfConstant(byte* addr) const { 143712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return NameOfAddress(addr); 143812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 143912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 144012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 144112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameOfCPURegister(int reg) const { 144212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return v8::internal::Registers::Name(reg); 144312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 144412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 144512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 144612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameOfXMMRegister(int reg) const { 144712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return v8::internal::FPURegisters::Name(reg); 144812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 144912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameOfByteCPURegister(int reg) const { 145212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org UNREACHABLE(); // MIPS does not have the concept of a byte register. 145312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return "nobytereg"; 145412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 145512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 145712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgconst char* NameConverter::NameInCode(byte* addr) const { 145812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // The default name converter is called for unknown code. So we will not try 145912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org // to access any memory. 146012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return ""; 146112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 146212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 146312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 146412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org//------------------------------------------------------------------------------ 146512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 146612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgDisassembler::Disassembler(const NameConverter& converter) 146712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org : converter_(converter) {} 146812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 146912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 147012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgDisassembler::~Disassembler() {} 147112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 147212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 147312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Disassembler::InstructionDecode(v8::internal::Vector<char> buffer, 147412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org byte* instruction) { 147512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::Decoder d(converter_, buffer); 147612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return d.InstructionDecode(instruction); 147712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 147812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 147912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 148012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org// The MIPS assembler does not currently use constant pools. 148112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgint Disassembler::ConstantPoolSizeAt(byte* instruction) { 148212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org return -1; 148312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 148412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 148512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 148612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.orgvoid Disassembler::Disassemble(FILE* f, byte* begin, byte* end) { 148712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org NameConverter converter; 148812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org Disassembler d(converter); 148912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org for (byte* pc = begin; pc < end;) { 149012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::EmbeddedVector<char, 128> buffer; 149112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org buffer[0] = '\0'; 149212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org byte* prev_pc = pc; 149312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org pc += d.InstructionDecode(buffer, pc); 149412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org v8::internal::PrintF(f, "%p %08x %s\n", 149512e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer.start()); 149612e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org } 149712e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} 149812e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 149912e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 150012e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#undef UNSUPPORTED 150112e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 150212e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org} // namespace disasm 150312e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org 150412e05e8fde625d746b998a15049e8487c43a3b17machenbach@chromium.org#endif // V8_TARGET_ARCH_MIPS64 1505