174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org// Copyright 2011 the V8 project authors. All rights reserved. 23484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// Use of this source code is governed by a BSD-style license that can be 33484964a86451e86dcf04be9bd8c0d76ee04f081rossberg@chromium.org// found in the LICENSE file. 443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 53bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// A Disassembler object is used to disassemble a block of code instruction by 63bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// instruction. The default implementation of the NameConverter object can be 73bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// overriden to modify register names or to do symbol lookup on addresses. 83bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// 93bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// The example below will disassemble a block of code and print it to stdout. 103bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// 113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// NameConverter converter; 123bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// Disassembler d(converter); 133bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// for (byte* pc = begin; pc < end;) { 14013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org// v8::internal::EmbeddedVector<char, 256> buffer; 153bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// byte* prev_pc = pc; 16013f3e12d3af426bf5545b5f457aa08ee98bdca2fschneider@chromium.org// pc += d.InstructionDecode(buffer, pc); 173bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// printf("%p %08x %s\n", 183bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer); 193bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// } 203bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// 213bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// The Disassembler class also has a convenience method to disassemble a block 223bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// of code into a FILE*, meaning that the above functionality could also be 233bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// achieved by just calling Disassembler::Disassemble(stdout, begin, end); 243bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 253bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <assert.h> 2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <stdarg.h> 284b0feeef5d01dbc2948080b4f69daa37e1083461machenbach@chromium.org#include <stdio.h> 2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#include <string.h> 3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 31196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/v8.h" 3243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 3393a47f4837f2137c8d8349250fd8e91da3108126jkummerow@chromium.org#if V8_TARGET_ARCH_ARM 349dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 35196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/arm/constants-arm.h" 365de0074a922429f5e0ec2cf140c2d2989bf88140yangguo@chromium.org#include "src/base/platform/platform.h" 37196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/disasm.h" 38196eb601290dc49c3754da728dc58700dff2de1bmachenbach@chromium.org#include "src/macro-assembler.h" 3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 403bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 41378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgnamespace v8 { 42378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgnamespace internal { 4343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//------------------------------------------------------------------------------ 4643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 4743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Decoder decodes and disassembles instructions into an output buffer. 4843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// It uses the converter to convert register names and call destinations into 4943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// more informative description. 5043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Decoder { 5143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public: 5243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Decoder(const disasm::NameConverter& converter, 53378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Vector<char> out_buffer) 5443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen : converter_(converter), 5543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_(out_buffer), 5643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_pos_(0) { 5743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_[out_buffer_pos_] = '\0'; 5843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen ~Decoder() {} 6143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Writes one disassembled instruction into 'buffer' (0-terminated). 6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // Returns the length of the disassembled machine instruction in bytes. 6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int InstructionDecode(byte* instruction); 6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static bool IsConstantPoolAt(byte* instr_ptr); 67ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org static int ConstantPoolSizeAt(byte* instr_ptr); 68ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private: 703bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Bottleneck functions to print into the out_buffer. 7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintChar(const char ch); 7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void Print(const char* str); 7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 743bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Printing of common values. 7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen void PrintRegister(int reg); 76c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org void PrintSRegister(int reg); 77c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org void PrintDRegister(int reg); 78378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int FormatVFPRegister(Instruction* instr, const char* format); 79378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintMovwMovt(Instruction* instr); 80378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int FormatVFPinstruction(Instruction* instr, const char* format); 81378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintCondition(Instruction* instr); 82378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintShiftRm(Instruction* instr); 83378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintShiftImm(Instruction* instr); 84378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintShiftSat(Instruction* instr); 85378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void PrintPU(Instruction* instr); 86e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org void PrintSoftwareInterrupt(SoftwareInterruptCodes svc); 8743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 883bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Handle formatting of instructions and their options. 89378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int FormatRegister(Instruction* instr, const char* option); 90169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void FormatNeonList(int Vd, int type); 91169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void FormatNeonMemory(int Rn, int align, int Rm); 92378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int FormatOption(Instruction* instr, const char* option); 93378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void Format(Instruction* instr, const char* format); 94378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void Unknown(Instruction* instr); 9543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 963bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Each of these functions decodes one particular instruction type, a 3-bit 973bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // field in the instruction encoding. 983bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Types 0 and 1 are combined as they are largely the same except for the way 993bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // they interpret the shifter operand. 100378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType01(Instruction* instr); 101378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType2(Instruction* instr); 102378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType3(Instruction* instr); 103378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType4(Instruction* instr); 104378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType5(Instruction* instr); 105378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType6(Instruction* instr); 106e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // Type 7 includes special Debugger instructions. 107378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int DecodeType7(Instruction* instr); 108c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org // For VFP support. 109378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeTypeVFP(Instruction* instr); 110378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeType6CoprocessorIns(Instruction* instr); 111c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 112169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org void DecodeSpecialCondition(Instruction* instr); 113169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 114378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(Instruction* instr); 115378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeVCMP(Instruction* instr); 116378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeVCVTBetweenDoubleAndSingle(Instruction* instr); 117378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org void DecodeVCVTBetweenFloatingPointAndInteger(Instruction* instr); 1183bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 1193bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org const disasm::NameConverter& converter_; 120378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Vector<char> out_buffer_; 1213bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org int out_buffer_pos_; 1223bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 1233bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org DISALLOW_COPY_AND_ASSIGN(Decoder); 12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 12643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1273bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// Support for assertions in the Decoder formatting functions. 1283bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org#define STRING_STARTS_WITH(string, compare_string) \ 1293bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org (strncmp(string, compare_string, strlen(compare_string)) == 0) 1303bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 1313bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 13243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Append the ch to the output buffer. 13343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Decoder::PrintChar(const char ch) { 13443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_[out_buffer_pos_++] = ch; 13543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 13643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 13843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Append the str to the output buffer. 13943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Decoder::Print(const char* str) { 14043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char cur = *str++; 1413bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org while (cur != '\0' && (out_buffer_pos_ < (out_buffer_.length() - 1))) { 14243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintChar(cur); 14343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cur = *str++; 14443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 14543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_[out_buffer_pos_] = 0; 14643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 14743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 14843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1493bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// These condition names are defined in a way to match the native disassembler 1503bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// formatting. See for example the command "objdump -d <binary file>". 151378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgstatic const char* cond_names[kNumberOfConditions] = { 1523bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org "eq", "ne", "cs" , "cc" , "mi" , "pl" , "vs" , "vc" , 1533bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org "hi", "ls", "ge", "lt", "gt", "le", "", "invalid", 15443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 15543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 15743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print the condition guarding the instruction. 158378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintCondition(Instruction* instr) { 159378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Print(cond_names[instr->ConditionValue()]); 16043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 16143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 16343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print the register name according to the active name converter. 16443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Decoder::PrintRegister(int reg) { 16543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print(converter_.NameOfCPURegister(reg)); 16643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 16743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 168e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 169c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Print the VFP S register name according to the active name converter. 170c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Decoder::PrintSRegister(int reg) { 171378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Print(VFPRegisters::Name(reg, false)); 172c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 173c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 174e0e1b0d3e70c933d36ed381d511e9fda39f2a751mstarzinger@chromium.org 175003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org// Print the VFP D register name according to the active name converter. 176c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.orgvoid Decoder::PrintDRegister(int reg) { 177378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Print(VFPRegisters::Name(reg, true)); 178c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 179c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 18043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1813bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// These shift names are defined in a way to match the native disassembler 1823bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// formatting. See for example the command "objdump -d <binary file>". 1837c2628c3f0353f0558760c3ca442f934263ea766kmillikin@chromium.orgstatic const char* const shift_names[kNumberOfShifts] = { 18443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen "lsl", "lsr", "asr", "ror" 18543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen}; 18643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 18843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print the register shift operands for the instruction. Generally used for 18943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// data processing instructions. 190378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintShiftRm(Instruction* instr) { 191378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org ShiftOp shift = instr->ShiftField(); 192378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int shift_index = instr->ShiftValue(); 193378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int shift_amount = instr->ShiftAmountValue(); 194378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int rm = instr->RmValue(); 19543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 19643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintRegister(rm); 1977276f14ca716596e0a0d17539516370c1f453847kasper.lund 198378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if ((instr->RegShiftValue() == 0) && (shift == LSL) && (shift_amount == 0)) { 1997276f14ca716596e0a0d17539516370c1f453847kasper.lund // Special case for using rm only. 2007276f14ca716596e0a0d17539516370c1f453847kasper.lund return; 2017276f14ca716596e0a0d17539516370c1f453847kasper.lund } 202378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->RegShiftValue() == 0) { 2037276f14ca716596e0a0d17539516370c1f453847kasper.lund // by immediate 2047276f14ca716596e0a0d17539516370c1f453847kasper.lund if ((shift == ROR) && (shift_amount == 0)) { 2057276f14ca716596e0a0d17539516370c1f453847kasper.lund Print(", RRX"); 2067276f14ca716596e0a0d17539516370c1f453847kasper.lund return; 2077276f14ca716596e0a0d17539516370c1f453847kasper.lund } else if (((shift == LSR) || (shift == ASR)) && (shift_amount == 0)) { 2087276f14ca716596e0a0d17539516370c1f453847kasper.lund shift_amount = 32; 20943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 21070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 21170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ", %s #%d", 21270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org shift_names[shift_index], 21370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org shift_amount); 2147276f14ca716596e0a0d17539516370c1f453847kasper.lund } else { 2157276f14ca716596e0a0d17539516370c1f453847kasper.lund // by register 216378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int rs = instr->RsValue(); 21770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 21870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ", %s ", shift_names[shift_index]); 2197276f14ca716596e0a0d17539516370c1f453847kasper.lund PrintRegister(rs); 22043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 22143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 22243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 22443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Print the immediate operand for the instruction. Generally used for data 22543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// processing instructions. 226378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintShiftImm(Instruction* instr) { 227378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int rotate = instr->RotateValue() * 2; 228378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int immed8 = instr->Immed8Value(); 22943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen int imm = (immed8 >> rotate) | (immed8 << (32 - rotate)); 23070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "#%d", imm); 23143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 23243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 23343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 234ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org// Print the optional shift and immediate used by saturating instructions. 235378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintShiftSat(Instruction* instr) { 236ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org int shift = instr->Bits(11, 7); 237ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org if (shift > 0) { 23870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 23970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ", %s #%d", 24070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org shift_names[instr->Bit(6) * 2], 24170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org instr->Bits(11, 7)); 242ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 243ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org} 244ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 245ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 2463bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// Print PU formatting to reduce complexity of FormatOption. 247378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintPU(Instruction* instr) { 2483bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org switch (instr->PUField()) { 249378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case da_x: { 2503bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("da"); 2513bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2523bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 253378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ia_x: { 2543bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("ia"); 2553bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2563bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 257378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case db_x: { 2583bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("db"); 2593bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2603bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 261378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ib_x: { 2623bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("ib"); 2633bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2643bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2653bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org default: { 2663bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org UNREACHABLE(); 2673bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org break; 2683bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2693bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2703bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org} 2713bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 2723bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 2733bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// Print SoftwareInterrupt codes. Factoring this out reduces the complexity of 2743bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// the FormatOption method. 275e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.orgvoid Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) { 276e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org switch (svc) { 277378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case kCallRtRedirected: 278378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Print("call rt redirected"); 2793bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return; 280378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case kBreakpoint: 281378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Print("breakpoint"); 2823bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return; 2833bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org default: 284378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (svc >= kStopCode) { 28570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 28670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%d - 0x%x", 28770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org svc & kStopCodeMask, 28870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org svc & kStopCodeMask); 289e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } else { 29070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 29170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%d", 29270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org svc); 293e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } 2943bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return; 2953bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 2963bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org} 2973bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 2983bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 2993bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// Handle all register based formatting in this function to reduce the 3003bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org// complexity of FormatOption. 301378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgint Decoder::FormatRegister(Instruction* instr, const char* format) { 302e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(format[0] == 'r'); 3033bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (format[1] == 'n') { // 'rn: Rn register 304378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int reg = instr->RnValue(); 3053bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintRegister(reg); 3063bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 2; 3073bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else if (format[1] == 'd') { // 'rd: Rd register 308378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int reg = instr->RdValue(); 3093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintRegister(reg); 3103bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 2; 3113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else if (format[1] == 's') { // 'rs: Rs register 312378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int reg = instr->RsValue(); 3133bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintRegister(reg); 3143bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 2; 3153bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else if (format[1] == 'm') { // 'rm: Rm register 316378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int reg = instr->RmValue(); 3173bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintRegister(reg); 3183bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 2; 319c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else if (format[1] == 't') { // 'rt: Rt register 320378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int reg = instr->RtValue(); 321c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org PrintRegister(reg); 322c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return 2; 3233bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else if (format[1] == 'l') { 3243bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // 'rlist: register list for load and store multiple instructions 325e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "rlist")); 326378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int rlist = instr->RlistValue(); 3273bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org int reg = 0; 3283bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("{"); 3293bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // Print register list in ascending order, by scanning the bit mask. 3303bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org while (rlist != 0) { 3313bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if ((rlist & 1) != 0) { 3323bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintRegister(reg); 3333bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if ((rlist >> 1) != 0) { 3343bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print(", "); 3353bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 3363bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 3373bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org reg++; 3383bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org rlist >>= 1; 3393bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 3403bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("}"); 3413bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 5; 3423bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 3433bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org UNREACHABLE(); 3443bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return -1; 3453bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org} 3463bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 3473bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 348c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Handle all VFP register based formatting in this function to reduce the 349c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// complexity of FormatOption. 350378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgint Decoder::FormatVFPRegister(Instruction* instr, const char* format) { 351e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((format[0] == 'S') || (format[0] == 'D')); 352c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 35374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org VFPRegPrecision precision = 35474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org format[0] == 'D' ? kDoublePrecision : kSinglePrecision; 35574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 35674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org int retval = 2; 35774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org int reg = -1; 358c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org if (format[1] == 'n') { 35974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org reg = instr->VFPNRegValue(precision); 360c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else if (format[1] == 'm') { 36174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org reg = instr->VFPMRegValue(precision); 362c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else if (format[1] == 'd') { 363003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if ((instr->TypeValue() == 7) && 364003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org (instr->Bit(24) == 0x0) && 365003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org (instr->Bits(11, 9) == 0x5) && 366003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org (instr->Bit(4) == 0x1)) { 367003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org // vmov.32 has Vd in a different place. 368003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org reg = instr->Bits(19, 16) | (instr->Bit(7) << 4); 369003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } else { 370003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org reg = instr->VFPDRegValue(precision); 371003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 372003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org 37374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (format[2] == '+') { 37474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org int immed8 = instr->Immed8Value(); 37574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (format[0] == 'S') reg += immed8 - 1; 37674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (format[0] == 'D') reg += (immed8 / 2 - 1); 37774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 37874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (format[2] == '+') retval = 3; 37974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } else { 38074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org UNREACHABLE(); 381c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 382c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 38374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (precision == kSinglePrecision) { 38474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org PrintSRegister(reg); 38574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } else { 38674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org PrintDRegister(reg); 38774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 38874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org 38974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org return retval; 390c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 391c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 392c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 393378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgint Decoder::FormatVFPinstruction(Instruction* instr, const char* format) { 394c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org Print(format); 395c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return 0; 396c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 397c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 398c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 399169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgvoid Decoder::FormatNeonList(int Vd, int type) { 400169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (type == nlt_1) { 40170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 40270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "{d%d}", Vd); 403169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (type == nlt_2) { 40470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 40570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "{d%d, d%d}", Vd, Vd + 1); 406169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (type == nlt_3) { 40770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 40870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "{d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2); 409169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (type == nlt_4) { 41070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 41170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "{d%d, d%d, d%d, d%d}", Vd, Vd + 1, Vd + 2, Vd + 3); 412169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 413169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 414169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 415169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 416169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgvoid Decoder::FormatNeonMemory(int Rn, int align, int Rm) { 41770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 41870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "[r%d", Rn); 419169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (align != 0) { 42070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 42170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ":%d", (1 << align) << 6); 422169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 423169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (Rm == 15) { 424169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Print("]"); 425169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (Rm == 13) { 426169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Print("]!"); 427169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 42870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 42970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "], r%d", Rm); 430169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 431169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 432169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 433169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 4345ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org// Print the movw or movt instruction. 435378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::PrintMovwMovt(Instruction* instr) { 436378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int imm = instr->ImmedMovwMovtValue(); 437378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int rd = instr->RdValue(); 4385ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org PrintRegister(rd); 43970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, ", #%d", imm); 4405ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org} 4415ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 4425ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org 44343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// FormatOption takes a formatting string and interprets it based on 44443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the current instructions. The format string points to the first 44543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// character of the option string (the option escape has already been 44643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// consumed by the caller.) FormatOption returns the number of 44743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// characters that were consumed from the formatting string. 448378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgint Decoder::FormatOption(Instruction* instr, const char* format) { 44943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (format[0]) { 45043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'a': { // 'a: accumulate multiplies 45143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(21) == 0) { 45243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("ul"); 45343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 45443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("la"); 45543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 45643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 45743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 45843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'b': { // 'b: byte loads or stores 45943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasB()) { 46043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("b"); 46143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 46243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 46343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 46443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'c': { // 'cond: conditional execution 465e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "cond")); 46643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen PrintCondition(instr); 46743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 4; 46843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 4696a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org case 'd': { // 'd: vmov double immediate. 4706a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org double d = instr->DoubleImmedVmov(); 47170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "#%g", d); 4726a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org return 1; 4736a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 47430ce411529579186181838984710b0b0980857aaricow@chromium.org case 'f': { // 'f: bitfield instructions - v7 and above. 47530ce411529579186181838984710b0b0980857aaricow@chromium.org uint32_t lsbit = instr->Bits(11, 7); 47630ce411529579186181838984710b0b0980857aaricow@chromium.org uint32_t width = instr->Bits(20, 16) + 1; 47730ce411529579186181838984710b0b0980857aaricow@chromium.org if (instr->Bit(21) == 0) { 47830ce411529579186181838984710b0b0980857aaricow@chromium.org // BFC/BFI: 47930ce411529579186181838984710b0b0980857aaricow@chromium.org // Bits 20-16 represent most-significant bit. Covert to width. 48030ce411529579186181838984710b0b0980857aaricow@chromium.org width -= lsbit; 481e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(width > 0); 48230ce411529579186181838984710b0b0980857aaricow@chromium.org } 483e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((width + lsbit) <= 32); 48470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 48570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "#%d, #%d", lsbit, width); 48630ce411529579186181838984710b0b0980857aaricow@chromium.org return 1; 48730ce411529579186181838984710b0b0980857aaricow@chromium.org } 48843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'h': { // 'h: halfword operation for extra loads and stores 48943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasH()) { 49043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("h"); 49143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 49243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("b"); 49343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 49443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 49543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 496ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org case 'i': { // 'i: immediate value from adjacent bits. 4972efb900e7350b14be905abdeab077f3a64c583cfulan@chromium.org // Expects tokens in the form imm%02d@%02d, i.e. imm05@07, imm10@16 498ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org int width = (format[3] - '0') * 10 + (format[4] - '0'); 499ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org int lsb = (format[6] - '0') * 10 + (format[7] - '0'); 500ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 501e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((width >= 1) && (width <= 32)); 502e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((lsb >= 0) && (lsb <= 31)); 503e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK((width + lsb) <= 32); 504ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org 50570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 50670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%d", 50770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org instr->Bits(width + lsb - 1, lsb)); 508ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org return 8; 509ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 51043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'l': { // 'l: branch and link 51143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasLink()) { 51243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("l"); 51343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 51443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 51543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5163bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case 'm': { 5175ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (format[1] == 'w') { 5185ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org // 'mw: movt/movw instructions. 5195ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org PrintMovwMovt(instr); 5205ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org return 2; 5215ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org } 5225ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org if (format[1] == 'e') { // 'memop: load/store instructions. 523e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "memop")); 52443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasL()) { 52543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("ldr"); 52643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 5277304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if ((instr->Bits(27, 25) == 0) && (instr->Bit(20) == 0) && 5287304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org (instr->Bits(7, 6) == 3) && (instr->Bit(4) == 1)) { 5297304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org if (instr->Bit(5) == 1) { 5307304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Print("strd"); 5317304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } else { 5327304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org Print("ldrd"); 5337304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 5347304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org return 5; 5357304bcac06a6a63b9f3dcebac2eeceada87ca146vegorov@chromium.org } 53643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("str"); 53743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 53843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 5; 53943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5403bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // 'msg: for simulator break instructions 541e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "msg")); 5423bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org byte* str = 5433bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org reinterpret_cast<byte*>(instr->InstructionBits() & 0x0fffffff); 54470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 54570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%s", converter_.NameInCode(str)); 5463bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 3; 54743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 54843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'o': { 5495c838251403b0be9a882540f1922577abba4c872ager@chromium.org if ((format[3] == '1') && (format[4] == '2')) { 55043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // 'off12: 12-bit offset for load and store instructions 551e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "off12")); 55270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 55370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%d", instr->Offset12Value()); 55443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 5; 555357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } else if (format[3] == '0') { 556357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // 'off0to3and8to19 16-bit immediate encoded in bits 19-8 and 3-0. 557e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "off0to3and8to19")); 55870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 55970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%d", 56070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org (instr->Bits(19, 8) << 4) + 56170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org instr->Bits(3, 0)); 562357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org return 15; 56343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 5643bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // 'off8: 8-bit offset for extra load and store instructions 565e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "off8")); 566378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int offs8 = (instr->ImmedHValue() << 4) | instr->ImmedLValue(); 56770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", offs8); 5683bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 4; 56943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 570727e995b7bba3c57fb1e5c156d386ca11894f781v case 'p': { // 'pu: P and U bits for load and store instructions 571e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "pu")); 5723bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintPU(instr); 57343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 2; 57443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 57543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'r': { 5763bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return FormatRegister(instr, format); 57743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 57843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 's': { 579ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org if (format[1] == 'h') { // 'shift_op or 'shift_rm or 'shift_sat. 5803bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (format[6] == 'o') { // 'shift_op 581e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "shift_op")); 582378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->TypeValue() == 0) { 5833bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintShiftRm(instr); 5843bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else { 585e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(instr->TypeValue() == 1); 5863bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintShiftImm(instr); 5873bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 5883bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 8; 589ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } else if (format[6] == 's') { // 'shift_sat. 590e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "shift_sat")); 591ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org PrintShiftSat(instr); 592ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org return 9; 5933bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } else { // 'shift_rm 594e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "shift_rm")); 5953bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org PrintShiftRm(instr); 5963bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 8; 59743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 598e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } else if (format[1] == 'v') { // 'svc 599e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "svc")); 600378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org PrintSoftwareInterrupt(instr->SvcValue()); 60143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 3; 60243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else if (format[1] == 'i') { // 'sign: signed extra loads and stores 603e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "sign")); 60443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasSign()) { 60543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("s"); 60643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 60743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 4; 60843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 6093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org // 's: S field of data processing instructions 6103bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if (instr->HasS()) { 6113bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Print("s"); 6123bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org } 6133bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org return 1; 61443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 61543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 't': { // 'target: target of branch instructions 616e3c177a423baa3c30225c4e422b6f6c76d38b951machenbach@chromium.org DCHECK(STRING_STARTS_WITH(format, "target")); 617378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int off = (instr->SImmed24Value() << 2) + 8; 61870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 61970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%+d -> %s", 62070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org off, 62170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org converter_.NameOfAddress( 62270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org reinterpret_cast<byte*>(instr) + off)); 62343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 6; 62443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 62543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'u': { // 'u: signed or unsigned multiplies 62686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // The manual gets the meaning of bit 22 backwards in the multiply 62786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // instruction overview on page A3.16.2. The instructions that 62886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // exist in u and s variants are the following: 62986f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // smull A4.1.87 63086f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // umull A4.1.129 63186f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // umlal A4.1.128 63286f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // smlal A4.1.76 63386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // For these 0 means u and 1 means s. As can be seen on their individual 63486f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // pages. The other 18 mul instructions have the bit set or unset in 63586f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // arbitrary ways that are unrelated to the signedness of the instruction. 63686f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org // None of these 18 instructions exist in both a 'u' and an 's' variant. 63786f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org 63886f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org if (instr->Bit(22) == 0) { 63943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("u"); 64043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 64143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("s"); 64243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 64343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 64443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 645c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case 'v': { 646c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return FormatVFPinstruction(instr, format); 647c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 648c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case 'S': 649c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org case 'D': { 650c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org return FormatVFPRegister(instr, format); 651c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 65243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 'w': { // 'w: W field of load and store instructions 65343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasW()) { 65443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Print("!"); 65543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 65643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return 1; 65743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 65843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 65943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 66043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 66143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 66243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 66343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 66443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return -1; 66543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 66643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 66843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Format takes a formatting string for a whole instruction and prints it into 66943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// the output buffer. All escaped options are handed to FormatOption to be 67043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// parsed further. 671378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::Format(Instruction* instr, const char* format) { 67243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen char cur = *format++; 673b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org while ((cur != 0) && (out_buffer_pos_ < (out_buffer_.length() - 1))) { 67443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (cur == '\'') { // Single quote is used as the formatting escape. 67543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen format += FormatOption(instr, format); 67643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 67743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_[out_buffer_pos_++] = cur; 67843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 67943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen cur = *format++; 68043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 68143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen out_buffer_[out_buffer_pos_] = '\0'; 68243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 68343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 68443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 685659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// The disassembler may end up decoding data inlined in the code. We do not want 686659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// it to crash if the data does not ressemble any known instruction. 687659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#define VERIFY(condition) \ 688659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.orgif(!(condition)) { \ 689659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org Unknown(instr); \ 690659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org return; \ 691659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org} 692659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 693659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org 69443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// For currently unimplemented decodings the disassembler calls Unknown(instr) 69543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// which will just print "unknown" of the instruction bits. 696378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::Unknown(Instruction* instr) { 69743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "unknown"); 69843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 69943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 70043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 701378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType01(Instruction* instr) { 702378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org int type = instr->TypeValue(); 7033bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org if ((type == 0) && instr->IsSpecialType0()) { 70443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // multiply instruction or extra loads and stores 70543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bits(7, 4) == 9) { 70643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(24) == 0) { 70743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // multiply instructions 70843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(23) == 0) { 70943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(21) == 0) { 71068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // The MUL instruction description (A 4.1.33) refers to Rd as being 71168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // the destination for the operation, but it confusingly uses the 71268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // Rn field to encode it. 71386f77b7fe492ed2bdfbf4e1147dab2f09c7d7003kasperl@chromium.org Format(instr, "mul'cond's 'rn, 'rm, 'rs"); 71443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 71533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (instr->Bit(22) == 0) { 71633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // The MLA instruction description (A 4.1.28) refers to the order 71733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // of registers as "Rd, Rm, Rs, Rn". But confusingly it uses the 71833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Rn field to encode the Rd register and the Rd field to encode 71933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // the Rn register. 72033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Format(instr, "mla'cond's 'rn, 'rm, 'rs, 'rd"); 72133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } else { 72233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // The MLS instruction description (A 4.1.29) refers to the order 72333e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // of registers as "Rd, Rm, Rs, Rn". But confusingly it uses the 72433e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // Rn field to encode the Rd register and the Rd field to encode 72533e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // the Rn register. 72633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Format(instr, "mls'cond's 'rn, 'rm, 'rs, 'rd"); 72733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 72843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 72943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 73068ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // The signed/long multiply instructions use the terms RdHi and RdLo 73168ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // when referring to the target registers. They are mapped to the Rn 73268ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // and Rd fields as follows: 73368ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // RdLo == Rd field 73468ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // RdHi == Rn field 73568ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org // The order of registers is: <RdLo>, <RdHi>, <Rm>, <Rs> 73668ac009f55a85e6891742d58914eaf717f667b26kasperl@chromium.org Format(instr, "'um'al'cond's 'rd, 'rn, 'rm, 'rs"); 73743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 73843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 73943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Unknown(instr); // not used by V8 74043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 741720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } else if ((instr->Bit(20) == 0) && ((instr->Bits(7, 4) & 0xd) == 0xd)) { 742720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // ldrd, strd 743720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org switch (instr->PUField()) { 744378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case da_x: { 745720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org if (instr->Bit(22) == 0) { 746720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn], -'rm"); 747720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } else { 748720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn], #-'off8"); 749720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 750720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break; 751720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 752378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ia_x: { 753720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org if (instr->Bit(22) == 0) { 754720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn], +'rm"); 755720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } else { 756720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn], #+'off8"); 757720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 758720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break; 759720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 760378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case db_x: { 761720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org if (instr->Bit(22) == 0) { 762720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn, -'rm]'w"); 763720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } else { 764720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn, #-'off8]'w"); 765720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 766720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break; 767720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 768378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ib_x: { 769720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org if (instr->Bit(22) == 0) { 770720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn, +'rm]'w"); 771720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } else { 772720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org Format(instr, "'memop'cond's 'rd, ['rn, #+'off8]'w"); 773720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 774720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break; 775720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 776720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org default: { 777720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org // The PU field is a 2-bit field. 778720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org UNREACHABLE(); 779720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org break; 780720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 781720dc0bc17114e33b9b2177fcb6726bda9cabd62sgjesse@chromium.org } 78243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 78343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // extra load/store instructions 78443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (instr->PUField()) { 785378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case da_x: { 78643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(22) == 0) { 78743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn], -'rm"); 78843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 78943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn], #-'off8"); 79043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 79143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 79243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 793378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ia_x: { 79443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(22) == 0) { 79543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn], +'rm"); 79643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 79743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn], #+'off8"); 79843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 79943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 80043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 801378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case db_x: { 80243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(22) == 0) { 80343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn, -'rm]'w"); 80443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 80543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn, #-'off8]'w"); 80643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 80743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 80843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 809378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ib_x: { 81043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(22) == 0) { 81143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn, +'rm]'w"); 81243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 81343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'sign'h 'rd, ['rn, #+'off8]'w"); 81443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 81543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 81643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 81743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 81843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The PU field is a 2-bit field. 81943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 82043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 82143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 82243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 82343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return; 82443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 825357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } else if ((type == 0) && instr->IsMiscType0()) { 826357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org if (instr->Bits(22, 21) == 1) { 827378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org switch (instr->BitField(7, 4)) { 828357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org case BX: 829357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Format(instr, "bx'cond 'rm"); 830357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 831357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org case BLX: 832357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Format(instr, "blx'cond 'rm"); 833357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 834357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org case BKPT: 835357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Format(instr, "bkpt 'off0to3and8to19"); 836357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 837357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org default: 838357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Unknown(instr); // not used by V8 839357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 840357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 841357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } else if (instr->Bits(22, 21) == 3) { 842378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org switch (instr->BitField(7, 4)) { 843357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org case CLZ: 844357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Format(instr, "clz'cond 'rd, 'rm"); 845357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 846357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org default: 847357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Unknown(instr); // not used by V8 848357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org break; 849357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 850357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } else { 851357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org Unknown(instr); // not used by V8 852357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org } 85389e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org } else if ((type == 1) && instr->IsNopType1()) { 85489e18f5599cb4cd462cb1ed324addd7388fb4d60rossberg@chromium.org Format(instr, "nop'cond"); 85543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 85643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (instr->OpcodeField()) { 85743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case AND: { 8583bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "and'cond's 'rd, 'rn, 'shift_op"); 85943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 86043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 86143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case EOR: { 8623bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "eor'cond's 'rd, 'rn, 'shift_op"); 86343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 86443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 86543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case SUB: { 8663bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "sub'cond's 'rd, 'rn, 'shift_op"); 86743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 86843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 86943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case RSB: { 8703bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "rsb'cond's 'rd, 'rn, 'shift_op"); 87143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 87243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 87343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ADD: { 8743bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "add'cond's 'rd, 'rn, 'shift_op"); 87543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 87643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 87743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ADC: { 8783bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "adc'cond's 'rd, 'rn, 'shift_op"); 87943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 88043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 88143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case SBC: { 8823bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "sbc'cond's 'rd, 'rn, 'shift_op"); 88343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 88443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 88543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case RSC: { 8863bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "rsc'cond's 'rd, 'rn, 'shift_op"); 88743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 88843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 88943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TST: { 89043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasS()) { 8913bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "tst'cond 'rn, 'shift_op"); 89243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 8935ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org Format(instr, "movw'cond 'mw"); 89443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 89543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 89643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 89743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case TEQ: { 89843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasS()) { 8993bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "teq'cond 'rn, 'shift_op"); 90043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 901357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // Other instructions matching this pattern are handled in the 902357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // miscellaneous instructions part above. 903357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org UNREACHABLE(); 90443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 90543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 90643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 90743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case CMP: { 90843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasS()) { 9093bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "cmp'cond 'rn, 'shift_op"); 91043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 9115ad5acef6bd4ebc785f946d8bcc2a88b1e031827ricow@chromium.org Format(instr, "movt'cond 'mw"); 91243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 91343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 91443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 91543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case CMN: { 91643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasS()) { 9173bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "cmn'cond 'rn, 'shift_op"); 91843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 919357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // Other instructions matching this pattern are handled in the 920357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org // miscellaneous instructions part above. 921357bf65ed5309ac3a2c4bf20b6ce7770488787c2ager@chromium.org UNREACHABLE(); 92243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 92343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 92443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 92543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case ORR: { 9263bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "orr'cond's 'rd, 'rn, 'shift_op"); 92743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 92843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 92943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case MOV: { 9303bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "mov'cond's 'rd, 'shift_op"); 93143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 93243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 93343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case BIC: { 9343bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "bic'cond's 'rd, 'rn, 'shift_op"); 93543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 93643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 93743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case MVN: { 9383bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Format(instr, "mvn'cond's 'rd, 'shift_op"); 93943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 94043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 94143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 94243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The Opcode field is a 4-bit field. 94343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 94443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 94543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 94643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 94743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 94843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 94943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 95043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 951378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType2(Instruction* instr) { 95243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (instr->PUField()) { 953378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case da_x: { 95443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasW()) { 95543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Unknown(instr); // not used in V8 956ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return; 95743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 95843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn], #-'off12"); 95943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 96043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 961378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ia_x: { 96243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->HasW()) { 96343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Unknown(instr); // not used in V8 964ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return; 96543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 96643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn], #+'off12"); 96743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 96843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 969378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case db_x: { 97043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn, #-'off12]'w"); 97143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 97243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 973378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ib_x: { 97443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn, #+'off12]'w"); 97543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 97643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 97743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 97843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The PU field is a 2-bit field. 97943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 98043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 98143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 98243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 98343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 98443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 98543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 986378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType3(Instruction* instr) { 98743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen switch (instr->PUField()) { 988378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case da_x: { 989659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY(!instr->HasW()); 99043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn], -'shift_rm"); 99143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 99243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 993378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ia_x: { 994169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bit(4) == 0) { 995169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "'memop'cond'b 'rd, ['rn], +'shift_rm"); 996169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 997169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bit(5) == 0) { 998169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->Bits(22, 21)) { 999169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0: 1000169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bit(20) == 0) { 1001169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bit(6) == 0) { 1002169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "pkhbt'cond 'rd, 'rn, 'rm, lsl #'imm05@07"); 1003169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1004169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bits(11, 7) == 0) { 1005169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "pkhtb'cond 'rd, 'rn, 'rm, asr #32"); 1006169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1007169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "pkhtb'cond 'rd, 'rn, 'rm, asr #'imm05@07"); 1008169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1009169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1010169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1011169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1012169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1013169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1014169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 1: 1015169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1016169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1017169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 2: 1018169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1019169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1020169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 3: 1021169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "usat 'rd, #'imm05@16, 'rm'shift_sat"); 1022169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1023169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1024ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } else { 1025169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->Bits(22, 21)) { 1026169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0: 1027169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1028169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1029169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 1: 1030169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1031169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1032169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 2: 1033169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((instr->Bit(20) == 0) && (instr->Bits(9, 6) == 1)) { 1034169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bits(19, 16) == 0xF) { 1035169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->Bits(11, 10)) { 1036169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0: 1037a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Format(instr, "uxtb16'cond 'rd, 'rm"); 1038169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1039169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 1: 1040169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb16'cond 'rd, 'rm, ror #8"); 1041169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1042169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 2: 1043169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb16'cond 'rd, 'rm, ror #16"); 1044169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1045169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 3: 1046169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb16'cond 'rd, 'rm, ror #24"); 1047169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1048169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1049169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1050169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1051169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1052169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1053169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1054169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1055169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1056169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 3: 1057169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((instr->Bit(20) == 0) && (instr->Bits(9, 6) == 1)) { 1058169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bits(19, 16) == 0xF) { 1059169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->Bits(11, 10)) { 1060169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0: 1061a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Format(instr, "uxtb'cond 'rd, 'rm"); 1062169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1063169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 1: 1064169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb'cond 'rd, 'rm, ror #8"); 1065169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1066169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 2: 1067169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb'cond 'rd, 'rm, ror #16"); 1068169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1069169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 3: 1070169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtb'cond 'rd, 'rm, ror #24"); 1071169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1072169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1073169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1074169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->Bits(11, 10)) { 1075169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0: 1076a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org Format(instr, "uxtab'cond 'rd, 'rn, 'rm"); 1077169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1078169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 1: 1079169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtab'cond 'rd, 'rn, 'rm, ror #8"); 1080169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1081169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 2: 1082169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtab'cond 'rd, 'rn, 'rm, ror #16"); 1083169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1084169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 3: 1085169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Format(instr, "uxtab'cond 'rd, 'rn, 'rm, ror #24"); 1086169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1087169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1088169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1089169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1090169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org UNREACHABLE(); 1091169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1092169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1093169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1094ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 1095ed78ffdee6ea4f4f94420b464e7377b610fdac2ffschneider@chromium.org } 109643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 109743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1098378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case db_x: { 109933e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org if (FLAG_enable_sudiv) { 11007d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (instr->Bits(5, 4) == 0x1) { 11017d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if ((instr->Bit(22) == 0x0) && (instr->Bit(20) == 0x1)) { 11027d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org if (instr->Bit(21) == 0x1) { 11037d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org // UDIV (in V8 notation matching ARM ISA format) rn = rm/rs 11047d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org Format(instr, "udiv'cond'b 'rn, 'rm, 'rs"); 11057d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org } else { 110633e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org // SDIV (in V8 notation matching ARM ISA format) rn = rm/rs 110733e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org Format(instr, "sdiv'cond'b 'rn, 'rm, 'rs"); 110833e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 11097d299ad4dc0ca26e0017b190b48362ad71328ce4machenbach@chromium.org break; 111033e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 111133e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 111233e09c8efd078308de3c77a88301566f65c07befverwaest@chromium.org } 111343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "'memop'cond'b 'rd, ['rn, -'shift_rm]'w"); 111443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 111543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1116378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org case ib_x: { 11175c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (instr->HasW() && (instr->Bits(6, 4) == 0x5)) { 11185c838251403b0be9a882540f1922577abba4c872ager@chromium.org uint32_t widthminus1 = static_cast<uint32_t>(instr->Bits(20, 16)); 111930ce411529579186181838984710b0b0980857aaricow@chromium.org uint32_t lsbit = static_cast<uint32_t>(instr->Bits(11, 7)); 11205c838251403b0be9a882540f1922577abba4c872ager@chromium.org uint32_t msbit = widthminus1 + lsbit; 11215c838251403b0be9a882540f1922577abba4c872ager@chromium.org if (msbit <= 31) { 112230ce411529579186181838984710b0b0980857aaricow@chromium.org if (instr->Bit(22)) { 112330ce411529579186181838984710b0b0980857aaricow@chromium.org Format(instr, "ubfx'cond 'rd, 'rm, 'f"); 112430ce411529579186181838984710b0b0980857aaricow@chromium.org } else { 112530ce411529579186181838984710b0b0980857aaricow@chromium.org Format(instr, "sbfx'cond 'rd, 'rm, 'f"); 112630ce411529579186181838984710b0b0980857aaricow@chromium.org } 112730ce411529579186181838984710b0b0980857aaricow@chromium.org } else { 112830ce411529579186181838984710b0b0980857aaricow@chromium.org UNREACHABLE(); 112930ce411529579186181838984710b0b0980857aaricow@chromium.org } 113030ce411529579186181838984710b0b0980857aaricow@chromium.org } else if (!instr->HasW() && (instr->Bits(6, 4) == 0x1)) { 113130ce411529579186181838984710b0b0980857aaricow@chromium.org uint32_t lsbit = static_cast<uint32_t>(instr->Bits(11, 7)); 113230ce411529579186181838984710b0b0980857aaricow@chromium.org uint32_t msbit = static_cast<uint32_t>(instr->Bits(20, 16)); 113330ce411529579186181838984710b0b0980857aaricow@chromium.org if (msbit >= lsbit) { 1134378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->RmValue() == 15) { 113530ce411529579186181838984710b0b0980857aaricow@chromium.org Format(instr, "bfc'cond 'rd, 'f"); 113630ce411529579186181838984710b0b0980857aaricow@chromium.org } else { 113730ce411529579186181838984710b0b0980857aaricow@chromium.org Format(instr, "bfi'cond 'rd, 'rm, 'f"); 113830ce411529579186181838984710b0b0980857aaricow@chromium.org } 11395c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else { 11405c838251403b0be9a882540f1922577abba4c872ager@chromium.org UNREACHABLE(); 11415c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 11425c838251403b0be9a882540f1922577abba4c872ager@chromium.org } else { 11435c838251403b0be9a882540f1922577abba4c872ager@chromium.org Format(instr, "'memop'cond'b 'rd, ['rn, +'shift_rm]'w"); 11445c838251403b0be9a882540f1922577abba4c872ager@chromium.org } 114543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 114643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 114743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 114843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The PU field is a 2-bit field. 114943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 115043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 115143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 115243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 115343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 115443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 115543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1156378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType4(Instruction* instr) { 1157ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (instr->Bit(22) != 0) { 1158ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org // Privileged mode currently not supported. 1159ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Unknown(instr); 116043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 1161ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (instr->HasL()) { 1162ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Format(instr, "ldm'cond'pu 'rn'w, 'rlist"); 1163ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else { 1164ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Format(instr, "stm'cond'pu 'rn'w, 'rlist"); 1165ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 116643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 116743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 116843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 116943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1170378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType5(Instruction* instr) { 117143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen Format(instr, "b'l'cond 'target"); 117243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 117343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1175378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType6(Instruction* instr) { 1176c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DecodeType6CoprocessorIns(instr); 117743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 117843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 117943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1180378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgint Decoder::DecodeType7(Instruction* instr) { 118143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen if (instr->Bit(24) == 1) { 1182378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SvcValue() >= kStopCode) { 1183e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org Format(instr, "stop'cond 'svc"); 1184e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // Also print the stop message. Its address is encoded 1185e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org // in the following 4 bytes. 118670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 118770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "\n %p %08x stop message: %s", 118870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org reinterpret_cast<void*>(instr 118970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org + Instruction::kInstrSize), 119070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org *reinterpret_cast<uint32_t*>(instr 119170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org + Instruction::kInstrSize), 119270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org *reinterpret_cast<char**>(instr 119370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org + Instruction::kInstrSize)); 1194378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org // We have decoded 2 * Instruction::kInstrSize bytes. 1195378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return 2 * Instruction::kInstrSize; 1196e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } else { 1197e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org Format(instr, "svc'cond 'svc"); 1198e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org } 119943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } else { 1200c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org DecodeTypeVFP(instr); 120143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1202378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return Instruction::kInstrSize; 120318ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org} 120418ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 120518ad94b919217ffbcd2d3159eeb5f8c588761c47ager@chromium.org 1206378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org// void Decoder::DecodeTypeVFP(Instruction* instr) 120713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// vmov: Sn = Rt 120813bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// vmov: Rt = Sn 120913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// vcvt: Dd = Sm 121013bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// vcvt: Sd = Dm 1211bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org// vcvt.f64.s32 Dd, Dd, #<fbits> 1212ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Dd = vabs(Dm) 1213ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org// Dd = vneg(Dm) 121413bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Dd = vadd(Dn, Dm) 121513bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Dd = vsub(Dn, Dm) 121613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Dd = vmul(Dn, Dm) 1217fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org// Dd = vmla(Dn, Dm) 12188432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org// Dd = vmls(Dn, Dm) 121913bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Dd = vdiv(Dn, Dm) 1220c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// vcmp(Dd, Dm) 122132d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org// vmrs 12224a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com// vmsr 122332d961d4454609ab4251a760fc46b19f661da90clrn@chromium.org// Dd = vsqrt(Dm) 1224378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeTypeVFP(Instruction* instr) { 1225659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->TypeValue() == 7) && (instr->Bit(24) == 0x0) ); 1226659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY(instr->Bits(11, 9) == 0x5); 12275d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 12285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (instr->Bit(4) == 0) { 1229378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->Opc1Value() == 0x7) { 12305d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Other data processing instructions 1231378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if ((instr->Opc2Value() == 0x0) && (instr->Opc3Value() == 0x1)) { 123269ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org // vmov register to register. 1233378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SzValue() == 0x1) { 12348432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmov'cond.f64 'Dd, 'Dm"); 123569ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org } else { 12368432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmov'cond.f32 'Sd, 'Sm"); 123769ea3965ef6e0d3f020a402cf7e6b96b9cb651aekmillikin@chromium.org } 12387a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org } else if ((instr->Opc2Value() == 0x0) && (instr->Opc3Value() == 0x3)) { 12397a392b3bfb39dbbc1ff22f0b53109aa5763fde57whesse@chromium.org // vabs 12408432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vabs'cond.f64 'Dd, 'Dm"); 1241badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org } else if ((instr->Opc2Value() == 0x1) && (instr->Opc3Value() == 0x1)) { 1242badaffc570baec00166b0ad3bdc96995751a7e13ricow@chromium.org // vneg 12438432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vneg'cond.f64 'Dd, 'Dm"); 1244378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if ((instr->Opc2Value() == 0x7) && (instr->Opc3Value() == 0x3)) { 12455d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org DecodeVCVTBetweenDoubleAndSingle(instr); 1246378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if ((instr->Opc2Value() == 0x8) && (instr->Opc3Value() & 0x1)) { 12475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org DecodeVCVTBetweenFloatingPointAndInteger(instr); 1248bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org } else if ((instr->Opc2Value() == 0xA) && (instr->Opc3Value() == 0x3) && 1249bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org (instr->Bit(8) == 1)) { 1250bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org // vcvt.f64.s32 Dd, Dd, #<fbits> 12518f8fe81d7a9cced7a0d30e56124c0428d1a6d229machenbach@chromium.org int fraction_bits = 32 - ((instr->Bits(3, 0) << 1) | instr->Bit(5)); 1252bf9432e3965b385e2e8df3701b710c105f5b3eb7ulan@chromium.org Format(instr, "vcvt'cond.f64.s32 'Dd, 'Dd"); 125370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 125470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org ", #%d", fraction_bits); 1255378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (((instr->Opc2Value() >> 1) == 0x6) && 1256378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->Opc3Value() & 0x1)) { 12575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org DecodeVCVTBetweenFloatingPointAndInteger(instr); 1258378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (((instr->Opc2Value() == 0x4) || (instr->Opc2Value() == 0x5)) && 1259378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->Opc3Value() & 0x1)) { 12605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org DecodeVCMP(instr); 1261378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (((instr->Opc2Value() == 0x1)) && (instr->Opc3Value() == 0x3)) { 12628432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vsqrt'cond.f64 'Dd, 'Dm"); 1263378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (instr->Opc3Value() == 0x0) { 1264378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SzValue() == 0x1) { 12658432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmov'cond.f64 'Dd, 'd"); 12666a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } else { 12676a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org Unknown(instr); // Not used by V8. 12686a2b0aa331a1ae1829a9b9637ad18cfc7ec9d840ager@chromium.org } 12695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 12705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 12715d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1272378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (instr->Opc1Value() == 0x3) { 1273378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SzValue() == 0x1) { 1274378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->Opc3Value() & 0x1) { 12758432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vsub'cond.f64 'Dd, 'Dn, 'Dm"); 12765d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 12778432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vadd'cond.f64 'Dd, 'Dn, 'Dm"); 12785d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 12795d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 12805d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 12815d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1282378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if ((instr->Opc1Value() == 0x2) && !(instr->Opc3Value() & 0x1)) { 1283378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SzValue() == 0x1) { 12848432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmul'cond.f64 'Dd, 'Dn, 'Dm"); 12855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 12865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 12875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1288fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } else if ((instr->Opc1Value() == 0x0) && !(instr->Opc3Value() & 0x1)) { 1289fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org if (instr->SzValue() == 0x1) { 12908432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmla'cond.f64 'Dd, 'Dn, 'Dm"); 12918432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } else { 12928432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Unknown(instr); // Not used by V8. 12938432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } 12948432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org } else if ((instr->Opc1Value() == 0x0) && (instr->Opc3Value() & 0x1)) { 12958432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org if (instr->SzValue() == 0x1) { 12968432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmls'cond.f64 'Dd, 'Dn, 'Dm"); 1297fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } else { 1298fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org Unknown(instr); // Not used by V8. 1299fb37721ea34922d8758d5cb26ae465aaf241e6b6yangguo@chromium.org } 1300378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if ((instr->Opc1Value() == 0x4) && !(instr->Opc3Value() & 0x1)) { 1301378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->SzValue() == 0x1) { 13028432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vdiv'cond.f64 'Dd, 'Dn, 'Dm"); 13035d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 13045d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 13055d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1306c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else { 1307c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org Unknown(instr); // Not used by V8. 1308c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 13095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 1310378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if ((instr->VCValue() == 0x0) && 1311378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->VAValue() == 0x0)) { 13125d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org DecodeVMOVBetweenCoreAndSinglePrecisionRegisters(instr); 1313003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } else if ((instr->VLValue() == 0x0) && 1314003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org (instr->VCValue() == 0x1) && 1315003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org (instr->Bit(23) == 0x0)) { 1316003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (instr->Bit(21) == 0x0) { 13178432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmov'cond.32 'Dd[0], 'rt"); 1318003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } else { 13198432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vmov'cond.32 'Dd[1], 'rt"); 1320003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org } 1321fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org } else if ((instr->VLValue() == 0x1) && 1322fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org (instr->VCValue() == 0x1) && 1323fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org (instr->Bit(23) == 0x0)) { 1324fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org if (instr->Bit(21) == 0x0) { 1325fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org Format(instr, "vmov'cond.32 'rt, 'Dd[0]"); 1326fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org } else { 1327fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org Format(instr, "vmov'cond.32 'rt, 'Dd[1]"); 1328fb732b17922ea75830be4db6b80534c4827d8a55jkummerow@chromium.org } 1329378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if ((instr->VCValue() == 0x0) && 1330378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->VAValue() == 0x7) && 13315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org (instr->Bits(19, 16) == 0x1)) { 1332378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->VLValue() == 0) { 13334a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com if (instr->Bits(15, 12) == 0xF) { 13344a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Format(instr, "vmsr'cond FPSCR, APSR"); 13354a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } else { 13364a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Format(instr, "vmsr'cond FPSCR, 'rt"); 13374a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 13384a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } else { 13394a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com if (instr->Bits(15, 12) == 0xF) { 13404a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Format(instr, "vmrs'cond APSR, FPSCR"); 13414a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } else { 13424a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com Format(instr, "vmrs'cond 'rt, FPSCR"); 13434a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 13444a6c3279070e8f133607a74c08d8c08ac394ab98erik.corry@gmail.com } 1345c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 13465d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 13475d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 13485d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13495d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1350378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeVMOVBetweenCoreAndSinglePrecisionRegisters( 1351378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Instruction* instr) { 1352659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->Bit(4) == 1) && (instr->VCValue() == 0x0) && 1353378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->VAValue() == 0x0)); 13545d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1355378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org bool to_arm_register = (instr->VLValue() == 0x1); 13565d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (to_arm_register) { 13585d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Format(instr, "vmov'cond 'rt, 'Sn"); 13595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 13605d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Format(instr, "vmov'cond 'Sn, 'rt"); 13615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 13625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 13635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13645d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1365378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeVCMP(Instruction* instr) { 1366659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->Bit(4) == 0) && (instr->Opc1Value() == 0x7)); 1367659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY(((instr->Opc2Value() == 0x4) || (instr->Opc2Value() == 0x5)) && 1368378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (instr->Opc3Value() & 0x1)); 13695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org // Comparison. 1371378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org bool dp_operation = (instr->SzValue() == 1); 13725d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool raise_exception_for_qnan = (instr->Bit(7) == 0x1); 13735d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13745d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (dp_operation && !raise_exception_for_qnan) { 1375378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->Opc2Value() == 0x4) { 13768432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcmp'cond.f64 'Dd, 'Dm"); 1377378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (instr->Opc2Value() == 0x5) { 13788432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcmp'cond.f64 'Dd, #0.0"); 1379ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } else { 1380ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org Unknown(instr); // invalid 1381ea4f62e1df22417fc8dc2c2425485dca98b13d07ager@chromium.org } 13825d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 13835d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 13845d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 13855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 13865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1388378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeVCVTBetweenDoubleAndSingle(Instruction* instr) { 1389659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->Bit(4) == 0) && (instr->Opc1Value() == 0x7)); 1390659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->Opc2Value() == 0x7) && (instr->Opc3Value() == 0x3)); 13915d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1392378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org bool double_to_single = (instr->SzValue() == 1); 13935d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 13945d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (double_to_single) { 13958432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f32.f64 'Sd, 'Dm"); 13965d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 13978432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f64.f32 'Dd, 'Sm"); 13985d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 13995d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org} 14005d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 14015d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 1402378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeVCVTBetweenFloatingPointAndInteger(Instruction* instr) { 1403659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY((instr->Bit(4) == 0) && (instr->Opc1Value() == 0x7)); 1404659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY(((instr->Opc2Value() == 0x8) && (instr->Opc3Value() & 0x1)) || 1405378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org (((instr->Opc2Value() >> 1) == 0x6) && (instr->Opc3Value() & 0x1))); 14065d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 14075d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool to_integer = (instr->Bit(18) == 1); 1408378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org bool dp_operation = (instr->SzValue() == 1); 14095d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (to_integer) { 14105d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool unsigned_integer = (instr->Bit(16) == 0); 14115d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 14125d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (dp_operation) { 14135d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (unsigned_integer) { 14148432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.u32.f64 'Sd, 'Dm"); 14155d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 14168432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.s32.f64 'Sd, 'Dm"); 14175d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 14185d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 14195d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (unsigned_integer) { 14208432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.u32.f32 'Sd, 'Sm"); 14215d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 14228432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.s32.f32 'Sd, 'Sm"); 14235d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 14245d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1425c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else { 14265d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org bool unsigned_integer = (instr->Bit(7) == 0); 14275d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org 14285d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (dp_operation) { 14295d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (unsigned_integer) { 14308432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f64.u32 'Dd, 'Sm"); 14315d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 14328432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f64.s32 'Dd, 'Sm"); 14335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1434c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } else { 14355d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (unsigned_integer) { 14368432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f32.u32 'Sd, 'Sm"); 14375d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 14388432c9102e4b2125d8eec741d35237cf23167471hpayer@chromium.org Format(instr, "vcvt'cond.f32.s32 'Sd, 'Sm"); 14395d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1440c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 1441c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 1442c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 1443c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1444c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1445c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org// Decode Type 6 coprocessor instructions. 144613bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// Dm = vmov(Rt, Rt2) 144713bd294acf56c7f824d92d4941a2aeb3cec58e0ckmillikin@chromium.org// <Rt, Rt2> = vmov(Dm) 1448b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// Ddst = MEM(Rbase + 4*offset). 1449b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org// MEM(Rbase + 4*offset) = Dsrc. 1450378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.orgvoid Decoder::DecodeType6CoprocessorIns(Instruction* instr) { 1451659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org VERIFY(instr->TypeValue() == 6); 1452c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1453378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->CoprocessorValue() == 0xA) { 1454378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org switch (instr->OpcodeValue()) { 14555d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org case 0x8: 1456d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org case 0xA: 14575d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (instr->HasL()) { 1458d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vldr'cond 'Sd, ['rn - 4*'imm08@00]"); 14595d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 1460d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vstr'cond 'Sd, ['rn - 4*'imm08@00]"); 14615d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 14625d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org break; 14635d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org case 0xC: 1464d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org case 0xE: 14655d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org if (instr->HasL()) { 1466d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vldr'cond 'Sd, ['rn + 4*'imm08@00]"); 14675d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 1468d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vstr'cond 'Sd, ['rn + 4*'imm08@00]"); 14695d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 14705d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org break; 147174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x4: 147274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x5: 147374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x6: 147474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x7: 147574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x9: 147674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0xB: { 147774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org bool to_vfp_register = (instr->VLValue() == 0x1); 147874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (to_vfp_register) { 147974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org Format(instr, "vldm'cond'pu 'rn'w, {'Sd-'Sd+}"); 148074f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } else { 148174f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org Format(instr, "vstm'cond'pu 'rn'w, {'Sd-'Sd+}"); 148274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 148374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org break; 148474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 14855d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org default: 14865d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org Unknown(instr); // Not used by V8. 14875d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } 1488378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org } else if (instr->CoprocessorValue() == 0xB) { 1489378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org switch (instr->OpcodeValue()) { 1490b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case 0x2: 1491b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org // Load and store double to two GP registers 1492003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org if (instr->Bits(7, 6) != 0 || instr->Bit(4) != 1) { 1493b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Unknown(instr); // Not used by V8. 1494b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else if (instr->HasL()) { 1495b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Format(instr, "vmov'cond 'rt, 'rn, 'Dm"); 1496b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 1497b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Format(instr, "vmov'cond 'Dm, 'rt, 'rn"); 1498b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 1499b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org break; 1500b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case 0x8: 1501003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0xA: 1502b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (instr->HasL()) { 1503d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vldr'cond 'Dd, ['rn - 4*'imm08@00]"); 1504b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 1505d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vstr'cond 'Dd, ['rn - 4*'imm08@00]"); 1506b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 1507b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org break; 1508b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org case 0xC: 1509003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0xE: 1510b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org if (instr->HasL()) { 1511d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vldr'cond 'Dd, ['rn + 4*'imm08@00]"); 1512b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } else { 1513d236f4d96b5dd21acc5ec57f4e50fa97cdd97bb6ricow@chromium.org Format(instr, "vstr'cond 'Dd, ['rn + 4*'imm08@00]"); 1514b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 1515b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org break; 151674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x4: 151774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org case 0x5: 1518003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0x6: 1519003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0x7: 1520003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0x9: 1521003650ee766f5e92756d470a37973fd371757485yangguo@chromium.org case 0xB: { 152274f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org bool to_vfp_register = (instr->VLValue() == 0x1); 152374f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org if (to_vfp_register) { 152474f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org Format(instr, "vldm'cond'pu 'rn'w, {'Dd-'Dd+}"); 152574f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } else { 152674f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org Format(instr, "vstm'cond'pu 'rn'w, {'Dd-'Dd+}"); 152774f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 152874f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org break; 152974f333bce721daf6b1f9d7d3d3faa623f77658d7vegorov@chromium.org } 1530b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org default: 1531b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org Unknown(instr); // Not used by V8. 1532b302e56e5b70c4504faa2adf4ec3efb64a9d3e38sgjesse@chromium.org } 15335d8f0e6e7b477f422e3064bdf0dd5f2a23f75544kmillikin@chromium.org } else { 1534ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org Unknown(instr); // Not used by V8. 1535ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1536ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1537ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1538169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1539169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.orgvoid Decoder::DecodeSpecialCondition(Instruction* instr) { 1540169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org switch (instr->SpecialValue()) { 1541169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 5: 1542169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && 1543169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org (instr->Bit(4) == 1)) { 1544169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // vmovl signed 1545a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if ((instr->VdValue() & 1) != 0) Unknown(instr); 1546a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); 1547169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Vm = (instr->Bit(5) << 4) | instr->VmValue(); 1548169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int imm3 = instr->Bits(21, 19); 154970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 155070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "vmovl.s%d q%d, d%d", imm3*8, Vd, Vm); 1551169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1552169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Unknown(instr); 1553169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1554169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1555169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 7: 1556169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((instr->Bits(18, 16) == 0) && (instr->Bits(11, 6) == 0x28) && 1557169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org (instr->Bit(4) == 1)) { 1558169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // vmovl unsigned 1559a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org if ((instr->VdValue() & 1) != 0) Unknown(instr); 1560a221880197f38ff22d942851060daffa5d036bdfmachenbach@chromium.org int Vd = (instr->Bit(22) << 3) | (instr->VdValue() >> 1); 1561169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Vm = (instr->Bit(5) << 4) | instr->VmValue(); 1562169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int imm3 = instr->Bits(21, 19); 156370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 156470ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "vmovl.u%d q%d, d%d", imm3*8, Vd, Vm); 1565169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1566169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Unknown(instr); 1567169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1568169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1569169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 8: 1570169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (instr->Bits(21, 20) == 0) { 1571169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // vst1 1572169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Vd = (instr->Bit(22) << 4) | instr->VdValue(); 1573169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Rn = instr->VnValue(); 1574169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int type = instr->Bits(11, 8); 1575169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int size = instr->Bits(7, 6); 1576169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int align = instr->Bits(5, 4); 1577169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Rm = instr->VmValue(); 157870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 157970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "vst1.%d ", (1 << size) << 3); 1580169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org FormatNeonList(Vd, type); 1581169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Print(", "); 1582169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org FormatNeonMemory(Rn, align, Rm); 1583169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (instr->Bits(21, 20) == 2) { 1584169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org // vld1 1585169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Vd = (instr->Bit(22) << 4) | instr->VdValue(); 1586169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Rn = instr->VnValue(); 1587169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int type = instr->Bits(11, 8); 1588169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int size = instr->Bits(7, 6); 1589169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int align = instr->Bits(5, 4); 1590169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Rm = instr->VmValue(); 159170ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 159270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "vld1.%d ", (1 << size) << 3); 1593169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org FormatNeonList(Vd, type); 1594169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Print(", "); 1595169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org FormatNeonMemory(Rn, align, Rm); 1596169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1597169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Unknown(instr); 1598169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1599169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1600169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0xA: 1601169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org case 0xB: 1602169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if ((instr->Bits(22, 20) == 5) && (instr->Bits(15, 12) == 0xf)) { 1603169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int Rn = instr->Bits(19, 16); 1604169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org int offset = instr->Bits(11, 0); 1605169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org if (offset == 0) { 160670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 160770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "pld [r%d]", Rn); 1608169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else if (instr->Bit(23) == 0) { 160970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 161070ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "pld [r%d, #-%d]", Rn, offset); 1611169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 161270ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 161370ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "pld [r%d, #+%d]", Rn, offset); 1614169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1615169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } else { 1616169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Unknown(instr); 1617169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1618169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1619169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org default: 1620169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org Unknown(instr); 1621169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org break; 1622169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org } 1623169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org} 1624169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org 1625659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#undef VERIFIY 1626ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1627ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgbool Decoder::IsConstantPoolAt(byte* instr_ptr) { 1628ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int instruction_bits = *(reinterpret_cast<int*>(instr_ptr)); 1629ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return (instruction_bits & kConstantPoolMarkerMask) == kConstantPoolMarker; 1630ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org} 1631ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1632ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org 1633ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.orgint Decoder::ConstantPoolSizeAt(byte* instr_ptr) { 1634ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if (IsConstantPoolAt(instr_ptr)) { 1635ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int instruction_bits = *(reinterpret_cast<int*>(instr_ptr)); 163672204d59e7fb1b8a0e9012e1fac5ef160351e8e4danno@chromium.org return DecodeConstantPoolLength(instruction_bits); 1637ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } else { 1638ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return -1; 1639c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org } 1640c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org} 1641c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 1642c4c927273ae2b690c4a015b4640a2a469c9a1a69ager@chromium.org 164343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Disassemble the instruction at *instr_ptr into the output buffer. 164443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenint Decoder::InstructionDecode(byte* instr_ptr) { 1645378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org Instruction* instr = Instruction::At(instr_ptr); 16467276f14ca716596e0a0d17539516370c1f453847kasper.lund // Print raw instruction bytes. 164770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 164870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "%08x ", 164970ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org instr->InstructionBits()); 1650378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org if (instr->ConditionField() == kSpecialCondition) { 1651169691d93a961c8b511f8ac8fd8ee33d081ca10fdanno@chromium.org DecodeSpecialCondition(instr); 1652ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return Instruction::kInstrSize; 1653ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org } 1654ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org int instruction_bits = *(reinterpret_cast<int*>(instr_ptr)); 1655ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org if ((instruction_bits & kConstantPoolMarkerMask) == kConstantPoolMarker) { 165670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, 165770ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org "constant pool begin (length %d)", 165870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org DecodeConstantPoolLength(instruction_bits)); 1659378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return Instruction::kInstrSize; 1660c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org } else if (instruction_bits == kCodeAgeJumpInstruction) { 1661c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // The code age prologue has a constant immediatly following the jump 1662c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org // instruction. 1663c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org Instruction* target = Instruction::At(instr_ptr + Instruction::kInstrSize); 1664c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org DecodeType2(instr); 166570ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org SNPrintF(out_buffer_ + out_buffer_pos_, 166670ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org " (0x%08x)", target->InstructionBits()); 1667c86e8c29eea534916f0d6a2a285b65a86d1b3b67machenbach@chromium.org return 2 * Instruction::kInstrSize; 166843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1669378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org switch (instr->TypeValue()) { 16703bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org case 0: 167143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 1: { 16723bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org DecodeType01(instr); 167343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 167443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 167543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 2: { 167643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DecodeType2(instr); 167743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 167843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 167943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 3: { 168043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DecodeType3(instr); 168143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 168243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 168343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 4: { 168443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DecodeType4(instr); 168543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 168643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 168743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 5: { 168843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DecodeType5(instr); 168943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 169043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 169143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 6: { 169243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen DecodeType6(instr); 169343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 169443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 169543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen case 7: { 1696e03fb64ef23331755b7986d2560bc4c00ba3e67bfschneider@chromium.org return DecodeType7(instr); 169743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 169843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen default: { 169943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The type field is 3-bits in the ARM encoding. 170043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); 170143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen break; 170243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 170343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 1704378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return Instruction::kInstrSize; 170543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 170643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 170743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1708378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org} } // namespace v8::internal 170943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 171043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 171143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 171243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//------------------------------------------------------------------------------ 171343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 171443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansennamespace disasm { 171543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17163bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org 171743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* NameConverter::NameOfAddress(byte* addr) const { 171870ec1a2160dd946b9578d04d97d631a6d4ab4f8cbmeurer@chromium.org v8::internal::SNPrintF(tmp_buffer_, "%p", addr); 1719ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return tmp_buffer_.start(); 172043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 172143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* NameConverter::NameOfConstant(byte* addr) const { 172443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return NameOfAddress(addr); 172543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 172643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 172843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* NameConverter::NameOfCPURegister(int reg) const { 1729378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org return v8::internal::Registers::Name(reg); 173043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 173143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 173243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17337be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.orgconst char* NameConverter::NameOfByteCPURegister(int reg) const { 17347be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org UNREACHABLE(); // ARM does not have the concept of a byte register 17357be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org return "nobytereg"; 17367be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org} 17377be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 17387be3c996bea370e151c9fe4ecf7f779cdc5f87adkasperl@chromium.org 173943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* NameConverter::NameOfXMMRegister(int reg) const { 174043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen UNREACHABLE(); // ARM does not have any XMM registers 174143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return "noxmmreg"; 174243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 174343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 174443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 174543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenconst char* NameConverter::NameInCode(byte* addr) const { 174643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // The default name converter is called for unknown code. So we will not try 174743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen // to access any memory. 174843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return ""; 174943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 175043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//------------------------------------------------------------------------------ 175343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDisassembler::Disassembler(const NameConverter& converter) 175543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen : converter_(converter) {} 175643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 175843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenDisassembler::~Disassembler() {} 175943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 176043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 1761b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.orgint Disassembler::InstructionDecode(v8::internal::Vector<char> buffer, 176243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen byte* instruction) { 1763378b34e3f8852e94739bb77a528278fe0e2bb532ager@chromium.org v8::internal::Decoder d(converter_, buffer); 176443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen return d.InstructionDecode(instruction); 176543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 176643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 176743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 17687276f14ca716596e0a0d17539516370c1f453847kasper.lundint Disassembler::ConstantPoolSizeAt(byte* instruction) { 1769ea88ce93dcb41a9200ec8747ae7642a5db1f4ce7sgjesse@chromium.org return v8::internal::Decoder::ConstantPoolSizeAt(instruction); 17707276f14ca716596e0a0d17539516370c1f453847kasper.lund} 17717276f14ca716596e0a0d17539516370c1f453847kasper.lund 17727276f14ca716596e0a0d17539516370c1f453847kasper.lund 177343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenvoid Disassembler::Disassemble(FILE* f, byte* begin, byte* end) { 17743bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org NameConverter converter; 17753bf7b91c90e9bff46f53eec55055d2d1a1949215ager@chromium.org Disassembler d(converter); 177643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen for (byte* pc = begin; pc < end;) { 1777b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org v8::internal::EmbeddedVector<char, 128> buffer; 177843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen buffer[0] = '\0'; 177943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen byte* prev_pc = pc; 1780b912362e2b2e704d09faac4290e027fd744bf587kasperl@chromium.org pc += d.InstructionDecode(buffer, pc); 1781e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org v8::internal::PrintF( 1782e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org f, "%p %08x %s\n", 1783e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer.start()); 178443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen } 178543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} 178643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 178743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen 178843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} // namespace disasm 17899dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com 17909dfbea4c7d423c7bc1db94425cb78e7f7cf41f78erik.corry@gmail.com#endif // V8_TARGET_ARCH_ARM 1791