1958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Copyright 2014 the V8 project authors. All rights reserved.
2958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Use of this source code is governed by a BSD-style license that can be
3958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// found in the LICENSE file.
4958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
5958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// A Disassembler object is used to disassemble a block of code instruction by
6958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// instruction. The default implementation of the NameConverter object can be
7958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// overriden to modify register names or to do symbol lookup on addresses.
8958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
9958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The example below will disassemble a block of code and print it to stdout.
10958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
11958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//   NameConverter converter;
12958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//   Disassembler d(converter);
13958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//   for (byte* pc = begin; pc < end;) {
14958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     v8::internal::EmbeddedVector<char, 256> buffer;
15958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     byte* prev_pc = pc;
16958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     pc += d.InstructionDecode(buffer, pc);
17958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//     printf("%p    %08x      %s\n",
18958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//            prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer);
19958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//   }
20958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//
21958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The Disassembler class also has a convenience method to disassemble a block
22958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// of code into a FILE*, meaning that the above functionality could also be
23958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// achieved by just calling Disassembler::Disassemble(stdout, begin, end);
24958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
25958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
26958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <assert.h>
27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <stdarg.h>
28958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <stdio.h>
29958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include <string.h>
30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC
32958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
33958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/base/platform/platform.h"
34958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/disasm.h"
35958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/macro-assembler.h"
36958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#include "src/ppc/constants-ppc.h"
37958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
38958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
39958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace v8 {
40958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace internal {
41958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
4213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochconst auto GetRegConfig = RegisterConfiguration::Crankshaft;
43958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
44958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//------------------------------------------------------------------------------
45958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
46958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Decoder decodes and disassembles instructions into an output buffer.
47958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// It uses the converter to convert register names and call destinations into
48958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// more informative description.
49958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass Decoder {
50958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier public:
51958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Decoder(const disasm::NameConverter& converter, Vector<char> out_buffer)
52958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      : converter_(converter), out_buffer_(out_buffer), out_buffer_pos_(0) {
53958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    out_buffer_[out_buffer_pos_] = '\0';
54958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
56958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  ~Decoder() {}
57958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
58958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Writes one disassembled instruction into 'buffer' (0-terminated).
59958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Returns the length of the disassembled machine instruction in bytes.
60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int InstructionDecode(byte* instruction);
61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
62958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier private:
63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Bottleneck functions to print into the out_buffer.
64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void PrintChar(const char ch);
65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Print(const char* str);
66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
67958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Printing of common values.
68958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void PrintRegister(int reg);
69958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void PrintDRegister(int reg);
70958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int FormatFPRegister(Instruction* instr, const char* format);
71958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void PrintSoftwareInterrupt(SoftwareInterruptCodes svc);
72958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
73958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Handle formatting of instructions and their options.
74958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int FormatRegister(Instruction* instr, const char* option);
75958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int FormatOption(Instruction* instr, const char* option);
76958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Format(Instruction* instr, const char* format);
77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void Unknown(Instruction* instr);
78958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void UnknownFormat(Instruction* instr, const char* opcname);
79958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
80958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DecodeExt1(Instruction* instr);
81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DecodeExt2(Instruction* instr);
82014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  void DecodeExt3(Instruction* instr);
83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DecodeExt4(Instruction* instr);
84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  void DecodeExt5(Instruction* instr);
8562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  void DecodeExt6(Instruction* instr);
86958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
87958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  const disasm::NameConverter& converter_;
88958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Vector<char> out_buffer_;
89958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int out_buffer_pos_;
90958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
91958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DISALLOW_COPY_AND_ASSIGN(Decoder);
92958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier};
93958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
94958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
95958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Support for assertions in the Decoder formatting functions.
96958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define STRING_STARTS_WITH(string, compare_string) \
97958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  (strncmp(string, compare_string, strlen(compare_string)) == 0)
98958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
99958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
100958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Append the ch to the output buffer.
101958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::PrintChar(const char ch) { out_buffer_[out_buffer_pos_++] = ch; }
102958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
103958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
104958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Append the str to the output buffer.
105958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::Print(const char* str) {
106958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  char cur = *str++;
107958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  while (cur != '\0' && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
108958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PrintChar(cur);
109958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    cur = *str++;
110958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  out_buffer_[out_buffer_pos_] = 0;
112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
114958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
115958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Print the register name according to the active name converter.
116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::PrintRegister(int reg) {
117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Print(converter_.NameOfCPURegister(reg));
118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Print the double FP register name according to the active name converter.
122014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Decoder::PrintDRegister(int reg) {
12313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Print(GetRegConfig()->GetDoubleRegisterName(reg));
124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Print SoftwareInterrupt codes. Factoring this out reduces the complexity of
128958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the FormatOption method.
129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) {
130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (svc) {
131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kCallRtRedirected:
132958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print("call rt redirected");
133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case kBreakpoint:
135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Print("breakpoint");
136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default:
138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (svc >= kStopCode) {
139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d - 0x%x",
140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                    svc & kStopCodeMask, svc & kStopCodeMask);
141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", svc);
143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Handle all register based formatting in this function to reduce the
150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// complexity of FormatOption.
151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Decoder::FormatRegister(Instruction* instr, const char* format) {
152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(format[0] == 'r');
153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if ((format[1] == 't') || (format[1] == 's')) {  // 'rt & 'rs register
155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int reg = instr->RTValue();
156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PrintRegister(reg);
157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return 2;
158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else if (format[1] == 'a') {  // 'ra: RA register
159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int reg = instr->RAValue();
160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PrintRegister(reg);
161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return 2;
162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else if (format[1] == 'b') {  // 'rb: RB register
163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    int reg = instr->RBValue();
164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    PrintRegister(reg);
165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return 2;
166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return -1;
170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Handle all FP register based formatting in this function to reduce the
174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// complexity of FormatOption.
175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Decoder::FormatFPRegister(Instruction* instr, const char* format) {
176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  DCHECK(format[0] == 'D');
177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int retval = 2;
179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  int reg = -1;
180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (format[1] == 't') {
181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    reg = instr->RTValue();
182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else if (format[1] == 'a') {
183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    reg = instr->RAValue();
184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else if (format[1] == 'b') {
185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    reg = instr->RBValue();
186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else if (format[1] == 'c') {
187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    reg = instr->RCValue();
188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  } else {
189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    UNREACHABLE();
190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  PrintDRegister(reg);
193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return retval;
195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// FormatOption takes a formatting string and interprets it based on
199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the current instructions. The format string points to the first
200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// character of the option string (the option escape has already been
201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// consumed by the caller.)  FormatOption returns the number of
202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// characters that were consumed from the formatting string.
203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Decoder::FormatOption(Instruction* instr, const char* format) {
204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  switch (format[0]) {
205958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'o': {
206958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(10) == 1) {
207958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Print("o");
208958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
209958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 1;
210958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
211958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case '.': {
212958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(0) == 1) {
213958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Print(".");
214958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Print(" ");  // ensure consistent spacing
216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
217958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 1;
218958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
219958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'r': {
220958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return FormatRegister(instr, format);
221958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
222958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'D': {
223958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return FormatFPRegister(instr, format);
224958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
225958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'i': {  // int16
226958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int32_t value = (instr->Bits(15, 0) << 16) >> 16;
227958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 5;
229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'u': {  // uint16
231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int32_t value = instr->Bits(15, 0);
232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 6;
234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'l': {
236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // Link (LK) Bit 0
237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(0) == 1) {
238958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Print("l");
239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
240958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 1;
241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'a': {
243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // Absolute Address Bit 1
244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(1) == 1) {
245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Print("a");
246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 1;
248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case 'c': {  // 'cr: condition register of branch instruction
250014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int code = instr->Bits(20, 18);
251014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      if (code != 7) {
252014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        out_buffer_pos_ +=
253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            SNPrintF(out_buffer_ + out_buffer_pos_, " cr%d", code);
254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      }
255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return 2;
256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 't': {  // 'target: target of branch instructions
258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      // target26 or target16
259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DCHECK(STRING_STARTS_WITH(format, "target"));
260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if ((format[6] == '2') && (format[7] == '6')) {
261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int off = ((instr->Bits(25, 2)) << 8) >> 6;
262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(
263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return 8;
266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else if ((format[6] == '1') && (format[7] == '6')) {
267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int off = ((instr->Bits(15, 2)) << 18) >> 16;
268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(
269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return 8;
272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 's': {
274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        DCHECK(format[1] == 'h');
275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t value = 0;
276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t opcode = instr->OpcodeValue() << 26;
277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t sh = instr->Bits(15, 11);
278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (opcode == EXT5 ||
279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            (opcode == EXT2 && instr->Bits(10, 2) << 2 == SRADIX)) {
280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // SH Bits 1 and 15-11 (split field)
281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          value = (sh | (instr->Bit(1) << 5));
282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        } else {
283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          // SH Bits 15-11
284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          value = (sh << 26) >> 26;
285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return 2;
288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      case 'm': {
290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        int32_t value = 0;
291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        if (format[1] == 'e') {
292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          if (instr->OpcodeValue() << 26 != EXT5) {
293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            // ME Bits 10-6
294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            value = (instr->Bits(10, 6) << 26) >> 26;
295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          } else {
296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            // ME Bits 5 and 10-6 (split field)
297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            value = (instr->Bits(10, 6) | (instr->Bit(5) << 5));
298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          }
299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        } else if (format[1] == 'b') {
300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          if (instr->OpcodeValue() << 26 != EXT5) {
301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            // MB Bits 5-1
302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            value = (instr->Bits(5, 1) << 26) >> 26;
303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          } else {
304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            // MB Bits 5 and 10-6 (split field)
305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            value = (instr->Bits(10, 6) | (instr->Bit(5) << 5));
306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          }
307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        } else {
308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UNREACHABLE();  // bad format
309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        return 2;
312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case 'd': {  // ds value for offset
316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int32_t value = SIGN_EXT_IMM16(instr->Bits(15, 0) & ~3);
317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return 1;
319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default: {
322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UNREACHABLE();
323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();
328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return -1;
329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Format takes a formatting string for a whole instruction and prints it into
333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// the output buffer. All escaped options are handed to FormatOption to be
334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// parsed further.
335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::Format(Instruction* instr, const char* format) {
336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  char cur = *format++;
337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  while ((cur != 0) && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    if (cur == '\'') {  // Single quote is used as the formatting escape.
339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      format += FormatOption(instr, format);
340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    } else {
341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      out_buffer_[out_buffer_pos_++] = cur;
342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    cur = *format++;
344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  out_buffer_[out_buffer_pos_] = '\0';
346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The disassembler may end up decoding data inlined in the code. We do not want
350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// it to crash if the data does not ressemble any known instruction.
351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define VERIFY(condition) \
352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  if (!(condition)) {     \
353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    Unknown(instr);       \
354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    return;               \
355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// For currently unimplemented decodings the disassembler calls Unknown(instr)
359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// which will just print "unknown" of the instruction bits.
360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::Unknown(Instruction* instr) { Format(instr, "unknown"); }
361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// For currently unimplemented decodings the disassembler calls
364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// UnknownFormat(instr) which will just print opcode name of the
365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// instruction bits.
366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::UnknownFormat(Instruction* instr, const char* name) {
367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  char buffer[100];
368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  snprintf(buffer, sizeof(buffer), "%s (unknown-format)", name);
369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Format(instr, buffer);
370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::DecodeExt1(Instruction* instr) {
37462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT1 | (instr->BitField(10, 1))) {
375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MCRF: {
376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "mcrf");  // not used by V8
377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BCLRX: {
38062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      int bo = instr->BitField(25, 21);
381014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      int bi = instr->Bits(20, 16);
382014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CRBit cond = static_cast<CRBit>(bi & (CRWIDTH - 1));
383014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      switch (bo) {
384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZF: {
385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbnzf");
386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZF: {
389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbezf");
390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BF: {
393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          switch (cond) {
394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_EQ:
395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bnelr'l'cr");
396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_GT:
398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "blelr'l'cr");
399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_LT:
401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bgelr'l'cr");
402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_SO:
404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bnsolr'l'cr");
405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
406014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          }
407958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
408958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZT: {
410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbbzt");
411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZT: {
414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbnezt");
415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BT: {
418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          switch (cond) {
419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_EQ:
420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "beqlr'l'cr");
421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_GT:
423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bgtlr'l'cr");
424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_LT:
426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bltlr'l'cr");
427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_SO:
429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bsolr'l'cr");
430014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
431014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          }
432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZ: {
435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbnz");
436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZ: {
439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bclrx-dcbez");  // not used by V8
440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
441958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
442958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BA: {
443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Format(instr, "blr'l");
444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BCCTRX: {
45062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      switch (instr->BitField(25, 21)) {
451958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZF: {
452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbnzf");
453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZF: {
456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbezf");
457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BF: {
460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-bf");
461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
462958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZT: {
464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbnzt");
465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZT: {
468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbezf");
469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BT: {
472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-bt");
473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBNZ: {
476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbnz");
477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case DCBEZ: {
480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          UnknownFormat(instr, "bcctrx-dcbez");
481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case BA: {
484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          if (instr->Bit(0) == 1) {
485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            Format(instr, "bctrl");
486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          } else {
487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier            Format(instr, "bctr");
488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          }
489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        }
491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        default: { UNREACHABLE(); }
492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRNOR: {
496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "crnor (stuff)");
497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RFI: {
500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rfi (stuff)");
501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRANDC: {
504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "crandc (stuff)");
505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ISYNC: {
508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "isync (stuff)");
509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
511958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRXOR: {
512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "crxor (stuff)");
513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRNAND: {
516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "crnand");
517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRAND: {
520958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "crand");
521958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
522958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
523958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CREQV: {
524958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "creqv");
525958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
526958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
527958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CRORC: {
528958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "crorc");
529958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
530958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
531958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CROR: {
532958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "cror");
533958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
534958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
535958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default: {
536958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Unknown(instr);  // not used by V8
537958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
538958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
539958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
540958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
541958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
542958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::DecodeExt2(Instruction* instr) {
543958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Some encodings are 10-1 bits, handle those first
54462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT2 | (instr->BitField(10, 1))) {
545958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRWX: {
546958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "srw'.    'ra, 'rs, 'rb");
547958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
548958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
549958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
550958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRDX: {
551958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "srd'.    'ra, 'rs, 'rb");
552958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
553958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
554958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
555958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRAW: {
556958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sraw'.   'ra, 'rs, 'rb");
557958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
558958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
559958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
560958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRAD: {
561958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "srad'.   'ra, 'rs, 'rb");
562958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
563958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
564958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
56562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MODSW: {
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "modsw  'rt, 'ra, 'rb");
56762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return;
56862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
56962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MODUW: {
57062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "moduw  'rt, 'ra, 'rb");
57162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return;
57262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
57362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#if V8_TARGET_ARCH_PPC64
57462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MODSD: {
57562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "modsd  'rt, 'ra, 'rb");
57662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return;
57762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
57862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MODUD: {
57962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "modud  'rt, 'ra, 'rb");
58062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      return;
58162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
58262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#endif
583958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRAWIX: {
584958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "srawi'.  'ra,'rs,'sh");
585958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
586958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
587958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXTSH: {
588958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "extsh'.  'ra, 'rs");
589958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
590958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
591958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
592958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXTSW: {
593958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "extsw'.  'ra, 'rs");
594958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
595958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
596958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
597958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXTSB: {
598958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "extsb'.  'ra, 'rs");
599958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFSX: {
602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfsx    'rt, 'ra, 'rb");
603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
604958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
605958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFSUX: {
606958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfsux   'rt, 'ra, 'rb");
607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
608958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
609958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFDX: {
610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfdx    'rt, 'ra, 'rb");
611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFDUX: {
614958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfdux   'rt, 'ra, 'rb");
615958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
617958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFSX: {
618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfsx    'rs, 'ra, 'rb");
619958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
620958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
621958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFSUX: {
622958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfsux   'rs, 'ra, 'rb");
623958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
624958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
625958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFDX: {
626958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfdx    'rs, 'ra, 'rb");
627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFDUX: {
630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfdux   'rs, 'ra, 'rb");
631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
633014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case POPCNTW: {
634014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "popcntw  'ra, 'rs");
635014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
637014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#if V8_TARGET_ARCH_PPC64
638014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case POPCNTD: {
639014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "popcntd  'ra, 'rs");
640014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
641014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
642014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#endif
643958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
644958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT2 | (instr->BitField(10, 2))) {
646958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SRADIX: {
647958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sradi'.  'ra,'rs,'sh");
648958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
649958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
650958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
651958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
652958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // ?? are all of these xo_form?
65362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT2 | (instr->BitField(9, 1))) {
654958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CMP: {
655958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
656958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(21)) {
657958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmp     'ra, 'rb");
659958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
660958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
661958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmpw    'ra, 'rb");
662958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
663958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
664014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
665958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
666958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SLWX: {
667958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "slw'.   'ra, 'rs, 'rb");
668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
669958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
670958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
671958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SLDX: {
672958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sld'.   'ra, 'rs, 'rb");
673014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
674958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
675958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
676958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SUBFCX: {
677958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "subfc'. 'rt, 'ra, 'rb");
678014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
679958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
6803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SUBFEX: {
6813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "subfe'. 'rt, 'ra, 'rb");
6823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return;
6833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
684958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDCX: {
685958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "addc'.   'rt, 'ra, 'rb");
686014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
687958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
6883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ADDEX: {
6893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "adde'.   'rt, 'ra, 'rb");
6903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return;
6913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
692958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CNTLZWX: {
693958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "cntlzw'. 'ra, 'rs");
694014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
695958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
696958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
697958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CNTLZDX: {
698958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "cntlzd'. 'ra, 'rs");
699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
700958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
701958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
702958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ANDX: {
703958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "and'.    'ra, 'rs, 'rb");
704014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
705958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
706958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ANDCX: {
707958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "andc'.   'ra, 'rs, 'rb");
708014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
709958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
710958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CMPL: {
711958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
712958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(21)) {
713958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
714958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmpl    'ra, 'rb");
715958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
716958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
717958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmplw   'ra, 'rb");
718958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
719958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
720014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
721958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
722958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case NEGX: {
723958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "neg'.    'rt, 'ra");
724014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
725958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
726958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case NORX: {
727958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "nor'.    'rt, 'ra, 'rb");
728014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
729958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
730958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SUBFX: {
731958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "subf'.   'rt, 'ra, 'rb");
732014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
733958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
734958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MULHWX: {
735958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mulhw'o'.  'rt, 'ra, 'rb");
736014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
737958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
738958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDZEX: {
739958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "addze'.   'rt, 'ra");
740014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
741958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
742958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MULLW: {
743958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mullw'o'.  'rt, 'ra, 'rb");
744014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
745958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
746958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
747958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MULLD: {
748958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mulld'o'.  'rt, 'ra, 'rb");
749014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
750958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
751958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
752958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case DIVW: {
753958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "divw'o'.   'rt, 'ra, 'rb");
754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
755014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
756014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case DIVWU: {
757014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "divwu'o'.  'rt, 'ra, 'rb");
758014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
759958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
760958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
761958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case DIVD: {
762958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "divd'o'.   'rt, 'ra, 'rb");
763014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
764958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
765958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
766958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDX: {
767958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "add'o     'rt, 'ra, 'rb");
768014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
769958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
770958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case XORX: {
771958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "xor'.    'ra, 'rs, 'rb");
772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
773958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
774958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ORX: {
775958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->RTValue() == instr->RBValue()) {
776958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mr      'ra, 'rb");
777958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
778958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "or      'ra, 'rs, 'rb");
779958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
780014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
781958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
782958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MFSPR: {
783958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int spr = instr->Bits(20, 11);
784958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (256 == spr) {
785958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mflr    'rt");
786958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
787958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mfspr   'rt ??");
788958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
790958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
791958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTSPR: {
792958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int spr = instr->Bits(20, 11);
793958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (256 == spr) {
794958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mtlr    'rt");
795958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else if (288 == spr) {
796958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mtctr   'rt");
797958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
798958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "mtspr   'rt ??");
799958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
800014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
801958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
802958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MFCR: {
803958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mfcr    'rt");
804014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
805958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
806958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STWX: {
807958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stwx    'rs, 'ra, 'rb");
808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
809958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
810958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STWUX: {
811958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stwux   'rs, 'ra, 'rb");
812014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
813958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
814958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STBX: {
815958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stbx    'rs, 'ra, 'rb");
816014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
817958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
818958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STBUX: {
819958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stbux   'rs, 'ra, 'rb");
820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
821958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
822958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STHX: {
823958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sthx    'rs, 'ra, 'rb");
824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
825958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
826958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STHUX: {
827958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sthux   'rs, 'ra, 'rb");
828014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
829958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
830958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LWZX: {
831958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lwzx    'rt, 'ra, 'rb");
832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
833958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
834958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LWZUX: {
835958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lwzux   'rt, 'ra, 'rb");
836014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
837014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case LWAX: {
839014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "lwax    'rt, 'ra, 'rb");
840014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
841958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
842958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LBZX: {
843958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lbzx    'rt, 'ra, 'rb");
844014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
845958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
846958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LBZUX: {
847958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lbzux   'rt, 'ra, 'rb");
848014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
849958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
850958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHZX: {
851958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lhzx    'rt, 'ra, 'rb");
852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
853958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
854958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHZUX: {
855958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lhzux   'rt, 'ra, 'rb");
856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
858014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case LHAX: {
859014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "lhax    'rt, 'ra, 'rb");
860014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
861958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
862958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
863958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LDX: {
864958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "ldx     'rt, 'ra, 'rb");
865014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
866958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
867958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LDUX: {
868958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "ldux    'rt, 'ra, 'rb");
869014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
870958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
871958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STDX: {
872958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stdx    'rt, 'ra, 'rb");
873014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
874958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
875958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STDUX: {
876958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stdux   'rt, 'ra, 'rb");
877014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
878958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
879958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MFVSRD: {
880958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mffprd  'ra, 'Dt");
881014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
882958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
883958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MFVSRWZ: {
884958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mffprwz 'ra, 'Dt");
885014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
886958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
887958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTVSRD: {
888958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mtfprd  'Dt, 'ra");
889014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
890958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
891958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTVSRWA: {
892958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mtfprwa 'Dt, 'ra");
893014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
894958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
895958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTVSRWZ: {
896958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mtfprwz 'Dt, 'ra");
897014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
898958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
899958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
900014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
901014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
90262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT2 | (instr->BitField(5, 1))) {
903014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case ISEL: {
904014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "isel    'rt, 'ra, 'rb");
905014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      return;
906014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
907014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    default: {
908014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Unknown(instr);  // not used by V8
909014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}
912014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochvoid Decoder::DecodeExt3(Instruction* instr) {
91562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT3 | (instr->BitField(10, 1))) {
916014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FCFID: {
917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "fcfids'. 'Dt, 'Db");
918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
919014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
920014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FCFIDU: {
921014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "fcfidus'.'Dt, 'Db");
922014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
923014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default: {
925958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Unknown(instr);  // not used by V8
926958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
927958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
928958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
930958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
931958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::DecodeExt4(Instruction* instr) {
93262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT4 | (instr->BitField(5, 1))) {
933958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FDIV: {
934958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fdiv'.   'Dt, 'Da, 'Db");
935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
936958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
937958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FSUB: {
938958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fsub'.   'Dt, 'Da, 'Db");
939958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FADD: {
942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fadd'.   'Dt, 'Da, 'Db");
943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FSQRT: {
946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fsqrt'.  'Dt, 'Db");
947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
949958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FSEL: {
950958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fsel'.   'Dt, 'Da, 'Dc, 'Db");
951958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
952958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
953958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FMUL: {
954958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fmul'.   'Dt, 'Da, 'Dc");
955958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
956958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
957958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FMSUB: {
958958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fmsub'.  'Dt, 'Da, 'Dc, 'Db");
959958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
960958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
961958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FMADD: {
962958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fmadd'.  'Dt, 'Da, 'Dc, 'Db");
963958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
964958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
965958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
966958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
96762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT4 | (instr->BitField(10, 1))) {
968958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCMPU: {
969958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fcmpu   'Da, 'Db");
970958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
971958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
972958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FRSP: {
973958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "frsp'.   'Dt, 'Db");
974958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
975958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
976958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCFID: {
977958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fcfid'.  'Dt, 'Db");
978958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
979958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
980014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FCFIDU: {
981014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "fcfidu'. 'Dt, 'Db");
982014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
983014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
984958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCTID: {
985958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fctid   'Dt, 'Db");
986958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
987958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
988958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCTIDZ: {
989958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fctidz  'Dt, 'Db");
990958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
991958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FCTIDU: {
993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "fctidu  'Dt, 'Db");
994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FCTIDUZ: {
997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "fctiduz 'Dt, 'Db");
998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1000958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCTIW: {
1001958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fctiw'. 'Dt, 'Db");
1002958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1003958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FCTIWZ: {
1005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fctiwz'. 'Dt, 'Db");
1006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FMR: {
1009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fmr'.    'Dt, 'Db");
1010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTFSFI: {
1013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mtfsfi'.  ?,?");
1014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MFFS: {
1017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mffs'.   'Dt");
1018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MTFSF: {
1021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "mtfsf'.  'Db ?,?,?");
1022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FABS: {
1025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fabs'.   'Dt, 'Db");
1026958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1028014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FRIN: {
1029014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "frin.   'Dt, 'Db");
1030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1031014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1032014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FRIZ: {
1033014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "friz.   'Dt, 'Db");
1034014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1035014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1036014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case FRIP: {
1037014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "frip.   'Dt, 'Db");
1038014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1039014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FRIM: {
1041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "frim.   'Dt, 'Db");
1042958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1043958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1044958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case FNEG: {
1045958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "fneg'.   'Dt, 'Db");
1046958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1047958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MCRFS: {
1049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "mcrfs   ?,?");
1050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MTFSB0: {
1053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "mtfsb0'. ?");
1054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case MTFSB1: {
1057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      Format(instr, "mtfsb1'. ?");
1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1060958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default: {
1061958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Unknown(instr);  // not used by V8
1062958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1063958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1064958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1065958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1066958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1067958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Decoder::DecodeExt5(Instruction* instr) {
106862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT5 | (instr->BitField(4, 2))) {
1069958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLDICL: {
1070958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rldicl'. 'ra, 'rs, 'sh, 'mb");
1071958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
1072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLDICR: {
1074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rldicr'. 'ra, 'rs, 'sh, 'me");
1075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
1076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLDIC: {
1078958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rldic'.  'ra, 'rs, 'sh, 'mb");
1079958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
1080958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1081958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLDIMI: {
1082958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rldimi'. 'ra, 'rs, 'sh, 'mb");
1083958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
1084958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1085958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
108662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT5 | (instr->BitField(4, 1))) {
1087958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLDCL: {
1088958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rldcl'.  'ra, 'rs, 'sb, 'mb");
1089958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      return;
1090958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1091958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1092958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Unknown(instr);  // not used by V8
1093958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1094958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
109562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Decoder::DecodeExt6(Instruction* instr) {
109662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT6 | (instr->BitField(10, 3))) {
109762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DECODE_XX3_INSTRUCTIONS(name, opcode_name, opcode_value) \
109862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case opcode_name: {                                            \
109962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Format(instr, #name" 'Dt, 'Da, 'Db");                        \
110062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return;                                                      \
110162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
110262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PPC_XX3_OPCODE_LIST(DECODE_XX3_INSTRUCTIONS)
110362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef DECODE_XX3_INSTRUCTIONS
110462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
110562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (EXT6 | (instr->BitField(10, 2))) {
110662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DECODE_XX2_INSTRUCTIONS(name, opcode_name, opcode_value) \
110762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case opcode_name: {                                            \
110862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Format(instr, #name" 'Dt, 'Db");                             \
110962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    return;                                                      \
111062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
111162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    PPC_XX2_OPCODE_LIST(DECODE_XX2_INSTRUCTIONS)
111262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  }
111362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef DECODE_XX3_INSTRUCTIONS
111462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  Unknown(instr);  // not used by V8
111562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch}
111662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch
1117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef VERIFIY
1118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1119958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// Disassemble the instruction at *instr_ptr into the output buffer.
1120958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Decoder::InstructionDecode(byte* instr_ptr) {
1121958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Instruction* instr = Instruction::At(instr_ptr);
1122958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // Print raw instruction bytes.
1123958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%08x       ",
1124958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                              instr->InstructionBits());
1125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1126109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch  if (ABI_USES_FUNCTION_DESCRIPTORS && instr->InstructionBits() == 0) {
1127109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // The first field will be identified as a jump table entry.  We
1128109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch    // emit the rest of the structure as zero, so just skip past them.
1129014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    Format(instr, "constant");
1130014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    return Instruction::kInstrSize;
1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch  }
1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch
113362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  uint32_t opcode = instr->OpcodeValue() << 26;
113462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  switch (opcode) {
1135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case TWI: {
1136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      PrintSoftwareInterrupt(instr->SvcValue());
1137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case MULLI: {
1140958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "mulli");
1141958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1142958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1143958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SUBFIC: {
1144958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "subfic  'rt, 'ra, 'int16");
1145958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1146958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1147958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CMPLI: {
1148958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
1149958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(21)) {
1150958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1151958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmpli   'ra, 'uint16");
1152958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
1153958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
1154958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmplwi  'ra, 'uint16");
1155958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1156958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1157958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1158958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1159958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case CMPI: {
1160958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
1161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(21)) {
1162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1163958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmpi    'ra, 'int16");
1164958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
1165958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
1166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "cmpwi   'ra, 'int16");
1167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDIC: {
1172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "addic   'rt, 'ra, 'int16");
1173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1175958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDICx: {
1176958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "addicx");
1177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1178958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDI: {
1180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->RAValue() == 0) {
1181958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        // this is load immediate
1182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "li      'rt, 'int16");
1183958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
1184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "addi    'rt, 'ra, 'int16");
1185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ADDIS: {
1189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->RAValue() == 0) {
1190958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "lis     'rt, 'int16");
1191958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
1192958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "addis   'rt, 'ra, 'int16");
1193958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1194958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1195958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BCX: {
1197958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int bo = instr->Bits(25, 21) << 21;
1198958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      int bi = instr->Bits(20, 16);
1199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      CRBit cond = static_cast<CRBit>(bi & (CRWIDTH - 1));
1200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      switch (bo) {
1201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case BT: {  // Branch if condition true
1202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          switch (cond) {
1203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_EQ:
1204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "beq'l'a'cr 'target16");
1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_GT:
1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bgt'l'a'cr 'target16");
1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_LT:
1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "blt'l'a'cr 'target16");
1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_SO:
1213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bso'l'a'cr 'target16");
1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1215958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          }
1216958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
1218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case BF: {  // Branch if condition false
1219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          switch (cond) {
1220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_EQ:
1221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bne'l'a'cr 'target16");
1222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_GT:
1224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "ble'l'a'cr 'target16");
1225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_LT:
1227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bge'l'a'cr 'target16");
1228014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1229014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch            case CR_SO:
1230014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              Format(instr, "bnso'l'a'cr 'target16");
1231014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch              break;
1232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          }
1233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1234014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
1235014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        case DCBNZ: {  // Decrement CTR; branch if CTR != 0
1236014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Format(instr, "bdnz'l'a 'target16");
1237958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch        }
1239958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        default:
1240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch          Format(instr, "bc'l'a'cr 'target16");
1241958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1243958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1244958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1245958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case SC: {
1246958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "sc");
1247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1248958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1249958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case BX: {
1250958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "b'l'a 'target26");
1251958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1252958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1253958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXT1: {
1254958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DecodeExt1(instr);
1255958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1256958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1257958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLWIMIX: {
1258958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rlwimi'. 'ra, 'rs, 'sh, 'me, 'mb");
1259958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1260958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1261958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLWINMX: {
1262958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rlwinm'. 'ra, 'rs, 'sh, 'me, 'mb");
1263958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1264958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1265958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case RLWNMX: {
1266958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "rlwnm'.  'ra, 'rs, 'rb, 'me, 'mb");
1267958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1268958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1269958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ORI: {
1270958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "ori     'ra, 'rs, 'uint16");
1271958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1272958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1273958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ORIS: {
1274958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "oris    'ra, 'rs, 'uint16");
1275958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1276958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1277958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case XORI: {
1278958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "xori    'ra, 'rs, 'uint16");
1279958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1280958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1281958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case XORIS: {
1282958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "xoris   'ra, 'rs, 'uint16");
1283958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1284958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1285958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ANDIx: {
1286958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "andi.   'ra, 'rs, 'uint16");
1287958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1288958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1289958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case ANDISx: {
1290958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "andis.  'ra, 'rs, 'uint16");
1291958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1292958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1293958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXT2: {
1294958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DecodeExt2(instr);
1295958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1296958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1297958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LWZ: {
1298958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lwz     'rt, 'int16('ra)");
1299958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1300958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1301958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LWZU: {
1302958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lwzu    'rt, 'int16('ra)");
1303958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1304958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1305958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LBZ: {
1306958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lbz     'rt, 'int16('ra)");
1307958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1308958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1309958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LBZU: {
1310958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lbzu    'rt, 'int16('ra)");
1311958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1312958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1313958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STW: {
1314958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stw     'rs, 'int16('ra)");
1315958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1316958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1317958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STWU: {
1318958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stwu    'rs, 'int16('ra)");
1319958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1320958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1321958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STB: {
1322958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stb     'rs, 'int16('ra)");
1323958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1324958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1325958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STBU: {
1326958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stbu    'rs, 'int16('ra)");
1327958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1328958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1329958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHZ: {
1330958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lhz     'rt, 'int16('ra)");
1331958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1332958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1333958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHZU: {
1334958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lhzu    'rt, 'int16('ra)");
1335958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1336958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1337958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHA: {
1338958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lha     'rt, 'int16('ra)");
1339958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1340958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1341958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LHAU: {
1342958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lhau    'rt, 'int16('ra)");
1343958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1344958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1345958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STH: {
1346958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sth 'rs, 'int16('ra)");
1347958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1348958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1349958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STHU: {
1350958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "sthu 'rs, 'int16('ra)");
1351958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1352958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1353958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LMW: {
1354958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "lmw");
1355958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1356958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1357958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STMW: {
1358958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      UnknownFormat(instr, "stmw");
1359958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1360958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1361958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFS: {
1362958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfs     'Dt, 'int16('ra)");
1363958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1364958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1365958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFSU: {
1366958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfsu    'Dt, 'int16('ra)");
1367958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1368958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1369958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFD: {
1370958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfd     'Dt, 'int16('ra)");
1371958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1372958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1373958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LFDU: {
1374958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "lfdu    'Dt, 'int16('ra)");
1375958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1376958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1377958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFS: {
1378958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfs    'Dt, 'int16('ra)");
1379958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1380958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1381958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFSU: {
1382958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfsu   'Dt, 'int16('ra)");
1383958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1384958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1385958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFD: {
1386958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfd    'Dt, 'int16('ra)");
1387958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1388958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1389958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STFDU: {
1390958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Format(instr, "stfdu   'Dt, 'int16('ra)");
1391958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1392958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    case EXT3: {
1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      DecodeExt3(instr);
1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch      break;
1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch    }
1397958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXT4: {
1398958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DecodeExt4(instr);
1399958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1400958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1401958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case EXT5: {
1402958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      DecodeExt5(instr);
1403958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1404958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
140562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case EXT6: {
140662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      DecodeExt6(instr);
140762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
140862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    }
1409958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if V8_TARGET_ARCH_PPC64
1410958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case LD: {
1411958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      switch (instr->Bits(1, 0)) {
1412958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case 0:
1413958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          Format(instr, "ld      'rt, 'd('ra)");
1414958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1415958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case 1:
1416958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          Format(instr, "ldu     'rt, 'd('ra)");
1417958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1418958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        case 2:
1419958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          Format(instr, "lwa     'rt, 'd('ra)");
1420958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier          break;
1421958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1422958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1423958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1424958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    case STD: {  // could be STD or STDU
1425958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      if (instr->Bit(0) == 0) {
1426958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "std     'rs, 'd('ra)");
1427958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      } else {
1428958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier        Format(instr, "stdu    'rs, 'd('ra)");
1429958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      }
1430958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1431958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1432958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif
1433958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    default: {
1434958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      Unknown(instr);
1435958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier      break;
1436958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    }
1437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return Instruction::kInstrSize;
1440958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace internal
1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch}  // namespace v8
1443958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1444958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1445958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//------------------------------------------------------------------------------
1446958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1447958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace disasm {
1448958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1449958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1450958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameOfAddress(byte* addr) const {
145113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  v8::internal::SNPrintF(tmp_buffer_, "%p", static_cast<void*>(addr));
1452958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return tmp_buffer_.start();
1453958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1454958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1455958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1456958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameOfConstant(byte* addr) const {
1457958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return NameOfAddress(addr);
1458958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1459958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1460958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1461958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameOfCPURegister(int reg) const {
146213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return v8::internal::GetRegConfig()->GetGeneralRegisterName(reg);
1463958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1464958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1465958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameOfByteCPURegister(int reg) const {
1466958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();  // PPC does not have the concept of a byte register
1467958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return "nobytereg";
1468958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1469958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1470958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1471958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameOfXMMRegister(int reg) const {
1472958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  UNREACHABLE();  // PPC does not have any XMM registers
1473958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return "noxmmreg";
1474958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1475958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1476958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierconst char* NameConverter::NameInCode(byte* addr) const {
1477958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // The default name converter is called for unknown code. So we will not try
1478958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  // to access any memory.
1479958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return "";
1480958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1481958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1482958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier//------------------------------------------------------------------------------
1484958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierDisassembler::Disassembler(const NameConverter& converter)
1486958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    : converter_(converter) {}
1487958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1488958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1489958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierDisassembler::~Disassembler() {}
1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Disassembler::InstructionDecode(v8::internal::Vector<char> buffer,
1493958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                                    byte* instruction) {
1494958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  v8::internal::Decoder d(converter_, buffer);
1495958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  return d.InstructionDecode(instruction);
1496958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1497958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier// The PPC assembler does not currently use constant pools.
1500958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierint Disassembler::ConstantPoolSizeAt(byte* instruction) { return -1; }
1501958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1502958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1503958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid Disassembler::Disassemble(FILE* f, byte* begin, byte* end) {
1504958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  NameConverter converter;
1505958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  Disassembler d(converter);
1506958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  for (byte* pc = begin; pc < end;) {
1507958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    v8::internal::EmbeddedVector<char, 128> buffer;
1508958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    buffer[0] = '\0';
1509958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    byte* prev_pc = pc;
1510958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier    pc += d.InstructionDecode(buffer, pc);
151113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    v8::internal::PrintF(f, "%p    %08x      %s\n", static_cast<void*>(prev_pc),
1512958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier                         *reinterpret_cast<int32_t*>(prev_pc), buffer.start());
1513958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier  }
1514958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}
1515958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1516958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1517958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier}  // namespace disasm
1518958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier
1519958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif  // V8_TARGET_ARCH_PPC
1520