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