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