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