13b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Copyright 2014 the V8 project authors. All rights reserved.
23b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Use of this source code is governed by a BSD-style license that can be
33b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// found in the LICENSE file.
43b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
53b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// A Disassembler object is used to disassemble a block of code instruction by
63b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// instruction. The default implementation of the NameConverter object can be
73b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// overriden to modify register names or to do symbol lookup on addresses.
83b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//
93b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// The example below will disassemble a block of code and print it to stdout.
103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//
113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//   NameConverter converter;
123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//   Disassembler d(converter);
133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//   for (byte* pc = begin; pc < end;) {
143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//     v8::internal::EmbeddedVector<char, 256> buffer;
153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//     byte* prev_pc = pc;
163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//     pc += d.InstructionDecode(buffer, pc);
173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//     printf("%p    %08x      %s\n",
183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//            prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer);
193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//   }
203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//
213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// The Disassembler class also has a convenience method to disassemble a block
223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// of code into a FILE*, meaning that the above functionality could also be
233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// achieved by just calling Disassembler::Disassemble(stdout, begin, end);
243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <assert.h>
263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <stdarg.h>
273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <stdio.h>
283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include <string.h>
293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#if V8_TARGET_ARCH_S390
313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/base/platform/platform.h"
333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/disasm.h"
343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/macro-assembler.h"
353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#include "src/s390/constants-s390.h"
363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace v8 {
383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace internal {
393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdochconst auto GetRegConfig = RegisterConfiguration::Crankshaft;
4113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch
423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//------------------------------------------------------------------------------
433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Decoder decodes and disassembles instructions into an output buffer.
453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// It uses the converter to convert register names and call destinations into
463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// more informative description.
473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochclass Decoder {
483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch public:
493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Decoder(const disasm::NameConverter& converter, Vector<char> out_buffer)
503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      : converter_(converter), out_buffer_(out_buffer), out_buffer_pos_(0) {
513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_[out_buffer_pos_] = '\0';
523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  ~Decoder() {}
553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Writes one disassembled instruction into 'buffer' (0-terminated).
573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Returns the length of the disassembled machine instruction in bytes.
583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int InstructionDecode(byte* instruction);
593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch private:
613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Bottleneck functions to print into the out_buffer.
623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void PrintChar(const char ch);
633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void Print(const char* str);
643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Printing of common values.
663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void PrintRegister(int reg);
673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void PrintDRegister(int reg);
683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void PrintSoftwareInterrupt(SoftwareInterruptCodes svc);
693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Handle formatting of instructions and their options.
713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatRegister(Instruction* instr, const char* option);
723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatFloatingRegister(Instruction* instr, const char* option);
733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatMask(Instruction* instr, const char* option);
743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatDisplacement(Instruction* instr, const char* option);
753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatImmediate(Instruction* instr, const char* option);
763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int FormatOption(Instruction* instr, const char* option);
773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void Format(Instruction* instr, const char* format);
783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void Unknown(Instruction* instr);
793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  void UnknownFormat(Instruction* instr, const char* opcname);
803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool DecodeTwoByte(Instruction* instr);
823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool DecodeFourByte(Instruction* instr);
833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  bool DecodeSixByte(Instruction* instr);
843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  const disasm::NameConverter& converter_;
863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Vector<char> out_buffer_;
873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int out_buffer_pos_;
883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DISALLOW_COPY_AND_ASSIGN(Decoder);
903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch};
913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Support for assertions in the Decoder formatting functions.
933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define STRING_STARTS_WITH(string, compare_string) \
943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  (strncmp(string, compare_string, strlen(compare_string)) == 0)
953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Append the ch to the output buffer.
973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::PrintChar(const char ch) { out_buffer_[out_buffer_pos_++] = ch; }
983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Append the str to the output buffer.
1003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::Print(const char* str) {
1013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  char cur = *str++;
1023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  while (cur != '\0' && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
1033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintChar(cur);
1043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    cur = *str++;
1053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_[out_buffer_pos_] = 0;
1073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Print the register name according to the active name converter.
1103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::PrintRegister(int reg) {
1113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Print(converter_.NameOfCPURegister(reg));
1123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Print the double FP register name according to the active name converter.
1153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::PrintDRegister(int reg) {
11613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  Print(GetRegConfig()->GetDoubleRegisterName(reg));
1173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Print SoftwareInterrupt codes. Factoring this out reduces the complexity of
1203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// the FormatOption method.
1213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) {
1223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (svc) {
1233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case kCallRtRedirected:
1243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Print("call rt redirected");
1253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return;
1263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case kBreakpoint:
1273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Print("breakpoint");
1283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return;
1293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    default:
1303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (svc >= kStopCode) {
1313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d - 0x%x",
1323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                    svc & kStopCodeMask, svc & kStopCodeMask);
1333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      } else {
1343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", svc);
1353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
1363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return;
1373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Handle all register based formatting in this function to reduce the
1413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// complexity of FormatOption.
1423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatRegister(Instruction* instr, const char* format) {
1433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(format[0] == 'r');
1443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (format[1] == '1') {  // 'r1: register resides in bit 8-11
1463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
1473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rrinstr->R1Value();
1483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '2') {  // 'r2: register resides in bit 12-15
1513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
1523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rrinstr->R2Value();
1533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // indicating it is a r0 for displacement, in which case the offset
1543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // should be 0.
1553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (format[2] == 'd') {
1563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (reg == 0) return 4;
1573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      PrintRegister(reg);
1583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 3;
1593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    } else {
1603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      PrintRegister(reg);
1613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 2;
1623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
1633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '3') {  // 'r3: register resides in bit 16-19
1643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RSInstruction* rsinstr = reinterpret_cast<RSInstruction*>(instr);
1653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rsinstr->B2Value();
1663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '4') {  // 'r4: register resides in bit 20-23
1693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RSInstruction* rsinstr = reinterpret_cast<RSInstruction*>(instr);
1703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rsinstr->B2Value();
1713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '5') {  // 'r5: register resides in bit 24-28
1743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
1753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rreinstr->R1Value();
1763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '6') {  // 'r6: register resides in bit 29-32
1793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
1803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rreinstr->R2Value();
1813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '7') {  // 'r6: register resides in bit 32-35
1843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SSInstruction* ssinstr = reinterpret_cast<SSInstruction*>(instr);
1853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = ssinstr->B2Value();
1863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintRegister(reg);
1873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
1883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
1893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
1913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return -1;
1923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
1933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatFloatingRegister(Instruction* instr, const char* format) {
1953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(format[0] == 'f');
1963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
1973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // reuse 1, 5 and 6 because it is coresponding
1983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (format[1] == '1') {  // 'r1: register resides in bit 8-11
1993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
2003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rrinstr->R1Value();
2013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintDRegister(reg);
2023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
2033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '2') {  // 'f2: register resides in bit 12-15
2043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
2053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rrinstr->R2Value();
2063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintDRegister(reg);
2073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
2083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '3') {  // 'f3: register resides in bit 16-19
2093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RRDInstruction* rrdinstr = reinterpret_cast<RRDInstruction*>(instr);
2103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rrdinstr->R1Value();
2113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintDRegister(reg);
2123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
2133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '5') {  // 'f5: register resides in bit 24-28
2143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
2153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rreinstr->R1Value();
2163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintDRegister(reg);
2173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
2183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '6') {  // 'f6: register resides in bit 29-32
2193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
2203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int reg = rreinstr->R2Value();
2213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    PrintDRegister(reg);
2223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
2233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
2243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
2253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return -1;
2263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
2273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
2283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// FormatOption takes a formatting string and interprets it based on
2293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// the current instructions. The format string points to the first
2303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// character of the option string (the option escape has already been
2313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// consumed by the caller.)  FormatOption returns the number of
2323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// characters that were consumed from the formatting string.
2333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatOption(Instruction* instr, const char* format) {
2343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (format[0]) {
2353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'o': {
2363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (instr->Bit(10) == 1) {
2373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        Print("o");
2383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 1;
2403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case '.': {
2423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (instr->Bit(0) == 1) {
2433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        Print(".");
2443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      } else {
2453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        Print(" ");  // ensure consistent spacing
2463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 1;
2483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'r': {
2503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return FormatRegister(instr, format);
2513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'f': {
2533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return FormatFloatingRegister(instr, format);
2543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'i': {  // int16
2563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return FormatImmediate(instr, format);
2573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'u': {  // uint16
2593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      int32_t value = instr->Bits(15, 0);
2603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
2613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 6;
2623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'l': {
2643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      // Link (LK) Bit 0
2653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (instr->Bit(0) == 1) {
2663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        Print("l");
2673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 1;
2693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'a': {
2713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      // Absolute Address Bit 1
2723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if (instr->Bit(1) == 1) {
2733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        Print("a");
2743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return 1;
2763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 't': {  // 'target: target of branch instructions
2783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      // target26 or target16
2793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      DCHECK(STRING_STARTS_WITH(format, "target"));
2803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      if ((format[6] == '2') && (format[7] == '6')) {
2813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        int off = ((instr->Bits(25, 2)) << 8) >> 6;
2823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_pos_ += SNPrintF(
2833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
2843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
2853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        return 8;
2863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      } else if ((format[6] == '1') && (format[7] == '6')) {
2873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        int off = ((instr->Bits(15, 2)) << 18) >> 16;
2883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_pos_ += SNPrintF(
2893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
2903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch            converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
2913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        return 8;
2923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      case 'm': {
2943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        return FormatMask(instr, format);
2953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      }
2963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
2973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case 'd': {  // ds value for offset
2983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return FormatDisplacement(instr, format);
2993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
3003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    default: {
3013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      UNREACHABLE();
3023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
3033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
3043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
3053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
3073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return -1;
3083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
3093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatMask(Instruction* instr, const char* format) {
3113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(format[0] == 'm');
3123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int32_t value = 0;
3133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if ((format[1] == '1')) {  // prints the mask format in bits 8-12
3143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    value = reinterpret_cast<RRInstruction*>(instr)->R1Value();
3153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
3163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '2') {  // mask format in bits 16-19
3183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    value = reinterpret_cast<RXInstruction*>(instr)->B2Value();
3193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
3203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '3') {  // mask format in bits 20-23
3223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    value = reinterpret_cast<RRFInstruction*>(instr)->M4Value();
3233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
3243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
3263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return 2;
3293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
3303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatDisplacement(Instruction* instr, const char* format) {
3323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(format[0] == 'd');
3333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (format[1] == '1') {  // displacement in 20-31
3353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RSInstruction* rsinstr = reinterpret_cast<RSInstruction*>(instr);
3363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint16_t value = rsinstr->D2Value();
3373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '2') {  // displacement in 20-39
3413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RXYInstruction* rxyinstr = reinterpret_cast<RXYInstruction*>(instr);
3423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int32_t value = rxyinstr->D2Value();
3433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '4') {  // SS displacement 2 36-47
3463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr);
3473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint16_t value = ssInstr->D2Value();
3483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '3') {  // SS displacement 1 20 - 32
3513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr);
3523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint16_t value = ssInstr->D1Value();
3533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else {  // s390 specific
3563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int32_t value = SIGN_EXT_IMM16(instr->Bits(15, 0) & ~3);
3573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 1;
3593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
3603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
3613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::FormatImmediate(Instruction* instr, const char* format) {
3633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  DCHECK(format[0] == 'i');
3643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (format[1] == '1') {  // immediate in 16-31
3663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
3673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int16_t value = riinstr->I2Value();
3683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '2') {  // immediate in 16-48
3713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
3723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int32_t value = rilinstr->I2Value();
3733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '3') {  // immediate in I format
3763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    IInstruction* iinstr = reinterpret_cast<IInstruction*>(instr);
3773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int8_t value = iinstr->IValue();
3783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
3793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '4') {  // immediate in 16-31, but outputs as offset
3813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
3823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int16_t value = riinstr->I2Value() * 2;
3833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (value >= 0)
3843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
3853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    else
3863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
3873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
3883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(
3893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_ + out_buffer_pos_, "%d -> %s", value,
3903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
3913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
3923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '5') {  // immediate in 16-31, but outputs as offset
3933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
3943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int32_t value = rilinstr->I2Value() * 2;
3953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (value >= 0)
3963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
3973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    else
3983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
3993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(
4013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_ + out_buffer_pos_, "%d -> %s", value,
4023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
4033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '6') {  // unsigned immediate in 16-31
4053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
4063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint16_t value = riinstr->I2UnsignedValue();
4073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '7') {  // unsigned immediate in 16-47
4103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
4113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint32_t value = rilinstr->I2UnsignedValue();
4123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '8') {  // unsigned immediate in 8-15
4153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SSInstruction* ssinstr = reinterpret_cast<SSInstruction*>(instr);
4163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint8_t value = ssinstr->Length();
4173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == '9') {  // unsigned immediate in 16-23
4203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
4213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint8_t value = rie_instr->I3Value();
4223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == 'a') {  // unsigned immediate in 24-31
4253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
4263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint8_t value = rie_instr->I4Value();
4273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == 'b') {  // unsigned immediate in 32-39
4303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
4313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    uint8_t value = rie_instr->I5Value();
4323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == 'c') {  // signed immediate in 8-15
4353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SSInstruction* ssinstr = reinterpret_cast<SSInstruction*>(instr);
4363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int8_t value = ssinstr->Length();
4373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == 'd') {  // signed immediate in 32-47
4403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    SILInstruction* silinstr = reinterpret_cast<SILInstruction*>(instr);
4413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int16_t value = silinstr->I2Value();
4423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
4433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  } else if (format[1] == 'e') {  // immediate in 16-47, but outputs as offset
4453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
4463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    int32_t value = rilinstr->I2Value() * 2;
4473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (value >= 0)
4483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
4493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    else
4503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
4513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    out_buffer_pos_ += SNPrintF(
4533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        out_buffer_ + out_buffer_pos_, "%d -> %s", value,
4543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch        converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
4553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return 2;
4563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
4573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
4593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return -1;
4603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
4613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Format takes a formatting string for a whole instruction and prints it into
4633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// the output buffer. All escaped options are handed to FormatOption to be
4643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// parsed further.
4653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::Format(Instruction* instr, const char* format) {
4663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  char cur = *format++;
4673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  while ((cur != 0) && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
4683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    if (cur == '\'') {  // Single quote is used as the formatting escape.
4693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      format += FormatOption(instr, format);
4703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    } else {
4713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      out_buffer_[out_buffer_pos_++] = cur;
4723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
4733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    cur = *format++;
4743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
4753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_[out_buffer_pos_] = '\0';
4763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
4773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// The disassembler may end up decoding data inlined in the code. We do not want
4793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// it to crash if the data does not ressemble any known instruction.
4803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#define VERIFY(condition) \
4813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (!(condition)) {     \
4823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    Unknown(instr);       \
4833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    return;               \
4843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
4853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// For currently unimplemented decodings the disassembler calls Unknown(instr)
4873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// which will just print "unknown" of the instruction bits.
4883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::Unknown(Instruction* instr) { Format(instr, "unknown"); }
4893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// For currently unimplemented decodings the disassembler calls
4913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// UnknownFormat(instr) which will just print opcode name of the
4923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// instruction bits.
4933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Decoder::UnknownFormat(Instruction* instr, const char* name) {
4943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  char buffer[100];
4953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  snprintf(buffer, sizeof(buffer), "%s (unknown-format)", name);
4963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Format(instr, buffer);
4973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
4983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
4993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Disassembles Two Byte S390 Instructions
5003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// @return true if successfully decoded
5013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Decoder::DecodeTwoByte(Instruction* instr) {
5023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Print the Instruction bits.
5033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%04x           ",
5043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              instr->InstructionBits<TwoByteInstr>());
5053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
5063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Opcode opcode = instr->S390OpcodeValue();
5073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (opcode) {
5083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AR:
5093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ar\t'r1,'r2");
5103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SR:
5123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sr\t'r1,'r2");
5133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MR:
5153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mr\t'r1,'r2");
5163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DR:
5183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "dr\t'r1,'r2");
5193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OR:
5213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "or\t'r1,'r2");
5223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NR:
5243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nr\t'r1,'r2");
5253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XR:
5273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xr\t'r1,'r2");
5283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LR:
5303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lr\t'r1,'r2");
5313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CR:
5333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cr\t'r1,'r2");
5343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLR:
5363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clr\t'r1,'r2");
5373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BCR:
5393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bcr\t'm1,'r2");
5403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTR:
5423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltr\t'r1,'r2");
5433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALR:
5453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "alr\t'r1,'r2");
5463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLR:
5483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slr\t'r1,'r2");
5493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LNR:
5513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lnr\t'r1,'r2");
5523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LCR:
5543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lcr\t'r1,'r2");
5553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BASR:
5573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "basr\t'r1,'r2");
5583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LDR:
5603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ldr\t'f1,'f2");
5613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BKPT:
5633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bkpt");
5643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
56562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case LPR:
56662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "lpr\t'r1, 'r2");
56762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
5683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    default:
5693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return false;
5703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
5713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return true;
5723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
5733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
5743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Disassembles Four Byte S390 Instructions
5753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// @return true if successfully decoded
5763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Decoder::DecodeFourByte(Instruction* instr) {
5773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Print the Instruction bits.
5783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%08x       ",
5793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                              instr->InstructionBits<FourByteInstr>());
5803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
5813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Opcode opcode = instr->S390OpcodeValue();
5823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (opcode) {
5833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AHI:
5843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ahi\t'r1,'i1");
5853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGHI:
5873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "aghi\t'r1,'i1");
5883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LHI:
5903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lhi\t'r1,'i1");
5913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGHI:
5933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lghi\t'r1,'i1");
5943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MHI:
5963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mhi\t'r1,'i1");
5973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
5983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MGHI:
5993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mghi\t'r1,'i1");
6003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CHI:
6023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "chi\t'r1,'i1");
6033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CGHI:
6053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cghi\t'r1,'i1");
6063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRAS:
6083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bras\t'r1,'i1");
6093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRC:
6113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "brc\t'm1,'i4");
6123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRCT:
6143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "brct\t'r1,'i4");
6153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRCTG:
6173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "brctg\t'r1,'i4");
6183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IIHH:
6203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iihh\t'r1,'i1");
6213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IIHL:
6233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iihl\t'r1,'i1");
6243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IILH:
6263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iilh\t'r1,'i1");
6273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IILL:
6293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iill\t'r1,'i1");
6303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OILL:
6323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "oill\t'r1,'i1");
6333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case TMLL:
6353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "tmll\t'r1,'i1");
6363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STM:
6383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stm\t'r1,'r2,'d1('r3)");
6393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LM:
6413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lm\t'r1,'r2,'d1('r3)");
6423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLL:
6443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sll\t'r1,'d1('r3)");
6453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRL:
6473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srl\t'r1,'d1('r3)");
6483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLA:
6503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sla\t'r1,'d1('r3)");
6513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRA:
6533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sra\t'r1,'d1('r3)");
6543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLDL:
6563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sldl\t'r1,'d1('r3)");
6573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGR:
6593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "agr\t'r5,'r6");
6603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGFR:
6623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "agfr\t'r5,'r6");
6633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ARK:
6653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ark\t'r5,'r6,'r3");
6663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGRK:
6683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "agrk\t'r5,'r6,'r3");
6693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SGR:
6713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sgr\t'r5,'r6");
6723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SGFR:
6743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sgfr\t'r5,'r6");
6753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRK:
6773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srk\t'r5,'r6,'r3");
6783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SGRK:
6803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sgrk\t'r5,'r6,'r3");
6813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NGR:
6833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ngr\t'r5,'r6");
6843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NRK:
6863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nrk\t'r5,'r6,'r3");
6873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NGRK:
6893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ngrk\t'r5,'r6,'r3");
6903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NILL:
6923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nill\t'r1,'i1");
6933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NILH:
6953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nilh\t'r1,'i1");
6963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
6973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OGR:
6983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ogr\t'r5,'r6");
6993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ORK:
7013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ork\t'r5,'r6,'r3");
7023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OGRK:
7043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ogrk\t'r5,'r6,'r3");
7053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XGR:
7073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xgr\t'r5,'r6");
7083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XRK:
7103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xrk\t'r5,'r6,'r3");
7113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XGRK:
7133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xgrk\t'r5,'r6,'r3");
7143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
71562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case CGFR:
71662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "cgfr\t'r5,'r6");
71762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
7183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CGR:
7193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cgr\t'r5,'r6");
7203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLGR:
7223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clgr\t'r5,'r6");
7233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLGFR:
7253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llgfr\t'r5,'r6");
7263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
72762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case POPCNT_Z:
72862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "popcnt\t'r5,'r6");
72962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
73062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case LLGCR:
73162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "llgcr\t'r5,'r6");
73262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
73362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case LLCR:
73462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "llcr\t'r5,'r6");
73562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
7363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LBR:
7373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lbr\t'r5,'r6");
7383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LEDBR:
7403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ledbr\t'f5,'f6");
7413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LDEBR:
7433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ldebr\t'f5,'f6");
7443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTGR:
7463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltgr\t'r5,'r6");
7473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTDBR:
7493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltdbr\t'f5,'f6");
7503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTEBR:
7523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltebr\t'f5,'f6");
7533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
754f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LRVR:
755f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lrvr\t'r5,'r6");
756f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
757f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LRVGR:
758f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lrvgr\t'r5,'r6");
759f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
7603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGR:
7613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgr\t'r5,'r6");
7623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGDR:
7643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgdr\t'r5,'f6");
7653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGFR:
7673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgfr\t'r5,'r6");
7683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTGFR:
7703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltgfr\t'r5,'r6");
7713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LCGR:
7733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lcgr\t'r5,'r6");
7743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MSR:
7763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "msr\t'r5,'r6");
7773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
77862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MSRKC:
77962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "msrkc\t'r5,'r6,'r3");
78062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
7813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGBR:
7823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgbr\t'r5,'r6");
7833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGHR:
7853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lghr\t'r5,'r6");
7863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
7873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MSGR:
7883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "msgr\t'r5,'r6");
7893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
79062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MSGRKC:
79162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "msgrkc\t'r5,'r6,'r3");
79262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
7933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DSGR:
7943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "dsgr\t'r5,'r6");
7953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
79662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case DSGFR:
79762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "dsgfr\t'r5,'r6");
79862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
79962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MSGFR:
80062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "msgfr\t'r5,'r6");
80162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
8023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LZDR:
8033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lzdr\t'f5");
8043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MLR:
8063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mlr\t'r5,'r6");
8073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MLGR:
8093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mlgr\t'r5,'r6");
8103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALCR:
8123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "alcr\t'r5,'r6");
8133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALGR:
8153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "algr\t'r5,'r6");
8163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALRK:
8183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "alrk\t'r5,'r6,'r3");
8193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALGRK:
8213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "algrk\t'r5,'r6,'r3");
8223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLGR:
8243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slgr\t'r5,'r6");
8253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLBR:
8273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slbr\t'r5,'r6");
8283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DLR:
8303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "dlr\t'r5,'r6");
8313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DLGR:
8333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "dlgr\t'r5,'r6");
8343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLRK:
8363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slrk\t'r5,'r6,'r3");
8373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLGRK:
8393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slgrk\t'r5,'r6,'r3");
8403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LHR:
8423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lhr\t'r5,'r6");
8433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLHR:
8453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llhr\t'r5,'r6");
8463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLGHR:
8483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llghr\t'r5,'r6");
8493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
850f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LOCR:
851f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "locr\t'm1,'r5,'r6");
852f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
853f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LOCGR:
854f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "locgr\t'm1,'r5,'r6");
855f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
8563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LNGR:
8573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lngr\t'r5,'r6");
8583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case A:
8603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "a\t'r1,'d1('r2d,'r3)");
8613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case S:
8633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "s\t'r1,'d1('r2d,'r3)");
8643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case M:
8663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "m\t'r1,'d1('r2d,'r3)");
8673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case D:
8693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "d\t'r1,'d1('r2d,'r3)");
8703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case O:
8723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "o\t'r1,'d1('r2d,'r3)");
8733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case N:
8753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "n\t'r1,'d1('r2d,'r3)");
8763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case L:
8783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "l\t'r1,'d1('r2d,'r3)");
8793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case C:
8813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "c\t'r1,'d1('r2d,'r3)");
8823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AH:
8843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ah\t'r1,'d1('r2d,'r3)");
8853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SH:
8873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sh\t'r1,'d1('r2d,'r3)");
8883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MH:
8903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mh\t'r1,'d1('r2d,'r3)");
8913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AL:
8933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "al\t'r1,'d1('r2d,'r3)");
8943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SL:
8963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sl\t'r1,'d1('r2d,'r3)");
8973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
8983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LA:
8993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "la\t'r1,'d1('r2d,'r3)");
9003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CH:
9023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ch\t'r1,'d1('r2d,'r3)");
9033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CL:
9053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cl\t'r1,'d1('r2d,'r3)");
9063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLI:
9083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cli\t'd1('r3),'i8");
9093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case TM:
9113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "tm\t'd1('r3),'i8");
9123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BC:
9143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bc\t'm1,'d1('r2d,'r3)");
9153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BCT:
9173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bct\t'r1,'d1('r2d,'r3)");
9183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ST:
9203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "st\t'r1,'d1('r2d,'r3)");
9213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STC:
9233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stc\t'r1,'d1('r2d,'r3)");
9243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IC_z:
9263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ic\t'r1,'d1('r2d,'r3)");
9273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LD:
9293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ld\t'f1,'d1('r2d,'r3)");
9303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LE:
9323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "le\t'f1,'d1('r2d,'r3)");
9333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LDGR:
9353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ldgr\t'f5,'r6");
9363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
937f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MS:
938f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "ms\t'r1,'d1('r2d,'r3)");
939f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
9403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STE:
9413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ste\t'f1,'d1('r2d,'r3)");
9423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STD:
9443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "std\t'f1,'d1('r2d,'r3)");
9453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CFDBR:
9473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cfdbr\t'r5,'m2,'f6");
9483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CDFBR:
9503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cdfbr\t'f5,'m2,'r6");
9513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CFEBR:
9533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cfebr\t'r5,'m2,'f6");
9543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CEFBR:
9563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cefbr\t'f5,'m2,'r6");
9573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
958f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CELFBR:
959f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "celfbr\t'f5,'m2,'r6");
960f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
9613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CGEBR:
9623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cgebr\t'r5,'m2,'f6");
9633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CGDBR:
9653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cgdbr\t'r5,'m2,'f6");
9663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CEGBR:
9683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cegbr\t'f5,'m2,'r6");
9693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CDGBR:
9713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cdgbr\t'f5,'m2,'r6");
9723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CDLFBR:
9743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cdlfbr\t'f5,'m2,'r6");
9753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CDLGBR:
9773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cdlgbr\t'f5,'m2,'r6");
9783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CELGBR:
9803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "celgbr\t'f5,'m2,'r6");
9813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLFDBR:
9833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clfdbr\t'r5,'m2,'f6");
9843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
985f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CLFEBR:
986f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "clfebr\t'r5,'m2,'f6");
987f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
988f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case CLGEBR:
989f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "clgebr\t'r5,'m2,'f6");
990f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
9913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLGDBR:
9923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clgdbr\t'r5,'m2,'f6");
9933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AEBR:
9953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "aebr\t'f5,'f6");
9963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
9973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SEBR:
9983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sebr\t'f5,'f6");
9993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MEEBR:
10013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "meebr\t'f5,'f6");
10023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DEBR:
10043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "debr\t'f5,'f6");
10053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ADBR:
10073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "adbr\t'f5,'f6");
10083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SDBR:
10103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sdbr\t'f5,'f6");
10113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MDBR:
10133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mdbr\t'f5,'f6");
10143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DDBR:
10163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ddbr\t'f5,'f6");
10173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CDBR:
10193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cdbr\t'f5,'f6");
10203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CEBR:
10223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cebr\t'f5,'f6");
10233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SQDBR:
10253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sqdbr\t'f5,'f6");
10263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SQEBR:
10283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sqebr\t'f5,'f6");
10293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LCDBR:
10313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lcdbr\t'f5,'f6");
10323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1033f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LCEBR:
1034f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lcebr\t'f5,'f6");
1035f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
10363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STH:
10373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sth\t'r1,'d1('r2d,'r3)");
10383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRDA:
10403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srda\t'r1,'d1('r3)");
10413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRDL:
10433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srdl\t'r1,'d1('r3)");
10443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MADBR:
10463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "madbr\t'f3,'f5,'f6");
10473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MSDBR:
10493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "msdbr\t'f3,'f5,'f6");
10503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case FLOGR:
10523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "flogr\t'r5,'r6");
10533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case FIEBRA:
10553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "fiebra\t'f5,'m2,'f6,'m3");
10563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case FIDBRA:
10583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "fidbra\t'f5,'m2,'f6,'m3");
10593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // TRAP4 is used in calling to native function. it will not be generated
10613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    // in native code.
10623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case TRAP4: {
10633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "trap4");
10643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
10653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    }
106662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case LPGR:
106762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "lpgr\t'r1, 'r2");
106862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
106962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case LPGFR:
107062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "lpgfr\t'r1,'r2");
107162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
10723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    default:
10733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return false;
10743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
10753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return true;
10763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
10773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
10783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Disassembles Six Byte S390 Instructions
10793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// @return true if successfully decoded
10803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochbool Decoder::DecodeSixByte(Instruction* instr) {
10813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // Print the Instruction bits.
10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  out_buffer_pos_ +=
10833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      SNPrintF(out_buffer_ + out_buffer_pos_, "%012" PRIx64 "   ",
10843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch               instr->InstructionBits<SixByteInstr>());
10853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
10863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Opcode opcode = instr->S390OpcodeValue();
10873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  switch (opcode) {
108862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case DUMY:
108962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "dumy\t'r1, 'd2 ( 'r2d, 'r3 )");
109062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
109162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#define DECODE_VRR_C_INSTRUCTIONS(name, opcode_name, opcode_value) \
109262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch  case opcode_name:                                                \
109362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    Format(instr, #name "\t'f1,'f2,'f3");                          \
109462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    break;
109562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      S390_VRR_C_OPCODE_LIST(DECODE_VRR_C_INSTRUCTIONS)
109662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#undef DECODE_VRR_C_INSTRUCTIONS
10973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLILF:
10983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llilf\t'r1,'i7");
10993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLIHF:
11013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llihf\t'r1,'i7");
11023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AFI:
11043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "afi\t'r1,'i7");
11053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
110662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case AIH:
110762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "aih\t'r1,'i7");
110862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
11093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ASI:
11103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "asi\t'd2('r3),'ic");
11113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGSI:
11133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "agsi\t'd2('r3),'ic");
11143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALFI:
11163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "alfi\t'r1,'i7");
11173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AHIK:
11193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ahik\t'r1,'r2,'i1");
11203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGHIK:
11223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "aghik\t'r1,'r2,'i1");
11233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLGFI:
11253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clgfi\t'r1,'i7");
11263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLFI:
11283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clfi\t'r1,'i7");
11293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
113062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case CLIH:
113162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "clih\t'r1,'i7");
113262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
113362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case CIH:
113462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "cih\t'r1,'i2");
113562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
11363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CFI:
11373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cfi\t'r1,'i2");
11383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CGFI:
11403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cgfi\t'r1,'i2");
11413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRASL:
11433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "brasl\t'r1,'ie");
11443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BRCL:
11463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "brcl\t'm1,'i5");
11473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IIHF:
11493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iihf\t'r1,'i7");
11503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LGFI:
1152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lgfi\t'r1,'i7");
1153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
11543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case IILF:
11553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "iilf\t'r1,'i7");
11563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XIHF:
11583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xihf\t'r1,'i7");
11593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XILF:
11613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xilf\t'r1,'i7");
11623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLLK:
11643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sllk\t'r1,'r2,'d2('r3)");
11653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLLG:
11673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sllg\t'r1,'r2,'d2('r3)");
11683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case RLL:
11703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "rll\t'r1,'r2,'d2('r3)");
11713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case RLLG:
11733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "rllg\t'r1,'r2,'d2('r3)");
11743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRLK:
11763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srlk\t'r1,'r2,'d2('r3)");
11773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRLG:
11793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srlg\t'r1,'r2,'d2('r3)");
11803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLAK:
11823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slak\t'r1,'r2,'d2('r3)");
11833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLAG:
11853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slag\t'r1,'r2,'d2('r3)");
11863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRAK:
11883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srak\t'r1,'r2,'d2('r3)");
11893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SRAG:
11913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "srag\t'r1,'r2,'d2('r3)");
11923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case RISBG:
11943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "risbg\t'r1,'r2,'i9,'ia,'ib");
11953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
11963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case RISBGN:
11973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "risbgn\t'r1,'r2,'i9,'ia,'ib");
11983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LOCG:
1200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "locg\t'm2,'r1,'d2('r3)");
1201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LOC:
1203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "loc\t'm2,'r1,'d2('r3)");
1204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
12053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LMY:
12063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lmy\t'r1,'r2,'d2('r3)");
12073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LMG:
12093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lmg\t'r1,'r2,'d2('r3)");
12103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STMY:
12123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stmy\t'r1,'r2,'d2('r3)");
12133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STMG:
12153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stmg\t'r1,'r2,'d2('r3)");
12163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LT:
12183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lt\t'r1,'d2('r2d,'r3)");
12193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LTG:
12213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ltg\t'r1,'d2('r2d,'r3)");
12223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ML:
12243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ml\t'r1,'d2('r2d,'r3)");
12253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AY:
12273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ay\t'r1,'d2('r2d,'r3)");
12283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SY:
12303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sy\t'r1,'d2('r2d,'r3)");
12313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NY:
12333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ny\t'r1,'d2('r2d,'r3)");
12343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OY:
12363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "oy\t'r1,'d2('r2d,'r3)");
12373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XY:
12393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xy\t'r1,'d2('r2d,'r3)");
12403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CY:
12423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cy\t'r1,'d2('r2d,'r3)");
12433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AHY:
12453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ahy\t'r1,'d2('r2d,'r3)");
12463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SHY:
12483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "shy\t'r1,'d2('r2d,'r3)");
12493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGH:
12513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgh\t'r1,'d2('r2d,'r3)");
12523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AG:
12543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ag\t'r1,'d2('r2d,'r3)");
12553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case AGF:
12573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "agf\t'r1,'d2('r2d,'r3)");
12583b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12593b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SG:
12603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sg\t'r1,'d2('r2d,'r3)");
12613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NG:
12633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ng\t'r1,'d2('r2d,'r3)");
12643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OG:
12663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "og\t'r1,'d2('r2d,'r3)");
12673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case XG:
12693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "xg\t'r1,'d2('r2d,'r3)");
12703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CG:
12723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cg\t'r1,'d2('r2d,'r3)");
12733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LB:
12753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lb\t'r1,'d2('r2d,'r3)");
12763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LRVH:
1278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lrvh\t'r1,'d2('r2d,'r3)");
1279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LRV:
1281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lrv\t'r1,'d2('r2d,'r3)");
1282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case LRVG:
1284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "lrvg\t'r1,'d2('r2d,'r3)");
1285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
12863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LG:
12873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lg\t'r1,'d2('r2d,'r3)");
12883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGF:
12903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgf\t'r1,'d2('r2d,'r3)");
12913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLGF:
12933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llgf\t'r1,'d2('r2d,'r3)");
12943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LY:
12963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ly\t'r1,'d2('r2d,'r3)");
12973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
12983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALY:
12993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "aly\t'r1,'d2('r2d,'r3)");
13003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALG:
13023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "alg\t'r1,'d2('r2d,'r3)");
13033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLG:
13053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slg\t'r1,'d2('r2d,'r3)");
13063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SGF:
13083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sgf\t'r1,'d2('r2d,'r3)");
13093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLY:
13113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sly\t'r1,'d2('r2d,'r3)");
13123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLH:
13143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llh\t'r1,'d2('r2d,'r3)");
13153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLGH:
13173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llgh\t'r1,'d2('r2d,'r3)");
13183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLC:
13203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llc\t'r1,'d2('r2d,'r3)");
13213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LLGC:
13233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "llgc\t'r1,'d2('r2d,'r3)");
13243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LDEB:
13263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ldeb\t'f1,'d2('r2d,'r3)");
13273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LAY:
13293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lay\t'r1,'d2('r2d,'r3)");
13303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LARL:
13323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "larl\t'r1,'i5");
13333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LGB:
13353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "lgb\t'r1,'d2('r2d,'r3)");
13363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CHY:
13383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "chy\t'r1,'d2('r2d,'r3)");
13393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLY:
13413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cly\t'r1,'d2('r2d,'r3)");
13423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLIY:
13443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "cliy\t'd2('r3),'i8");
13453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case TMY:
13473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "tmy\t'd2('r3),'i8");
13483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case CLG:
13503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "clg\t'r1,'d2('r2d,'r3)");
13513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case BCTG:
13533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "bctg\t'r1,'d2('r2d,'r3)");
13543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STY:
13563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sty\t'r1,'d2('r2d,'r3)");
13573b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case STRVH:
1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "strvh\t'r1,'d2('r2d,'r3)");
1360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case STRV:
1362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "strv\t'r1,'d2('r2d,'r3)");
1363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
1364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case STRVG:
1365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "strvg\t'r1,'d2('r2d,'r3)");
1366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
13673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STG:
13683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stg\t'r1,'d2('r2d,'r3)");
13693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ICY:
13713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "icy\t'r1,'d2('r2d,'r3)");
13723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MVC:
13743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mvc\t'd3('i8,'r3),'d4('r7)");
13753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MVHI:
13773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mvhi\t'd3('r3),'id");
13783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MVGHI:
13803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mvghi\t'd3('r3),'id");
13813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ALGFI:
13833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "algfi\t'r1,'i7");
13843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLGFI:
13863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slgfi\t'r1,'i7");
13873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SLFI:
13893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "slfi\t'r1,'i7");
13903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13913b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NIHF:
13923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nihf\t'r1,'i7");
13933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case NILF:
13953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "nilf\t'r1,'i7");
13963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
13973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OIHF:
13983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "oihf\t'r1,'i7");
13993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14003b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case OILF:
14013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "oilf\t'r1,'i7");
14023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MSFI:
14043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "msfi\t'r1,'i7");
14053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MSGFI:
14073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "msgfi\t'r1,'i7");
14083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LDY:
14103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ldy\t'f1,'d2('r2d,'r3)");
14113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case LEY:
14133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ley\t'f1,'d2('r2d,'r3)");
14143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
1415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MSG:
1416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "msg\t'r1,'d2('r2d,'r3)");
1417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
141862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case DSG:
141962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "dsg\t'r1,'d2('r2d,'r3)");
142062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
142162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case DSGF:
142262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "dsgf\t'r1,'d2('r2d,'r3)");
142362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
142462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case MSGF:
142562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "msgf\t'r1,'d2('r2d,'r3)");
142662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
1427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    case MSY:
1428f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      Format(instr, "msy\t'r1,'d2('r2d,'r3)");
1429f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      break;
14303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STEY:
14313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stey\t'f1,'d2('r2d,'r3)");
14323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case STDY:
14343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "stdy\t'f1,'d2('r2d,'r3)");
14353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case ADB:
143762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "adb\t'f1,'d1('r2d, 'r3)");
143862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
143962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case CDB:
144062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "cdb\t'f1,'d1('r2d, 'r3)");
144162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
144262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case CEB:
144362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "ceb\t'f1,'d1('r2d, 'r3)");
14443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14453b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SDB:
14463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sdb\t'r1,'d1('r2d, 'r3)");
14473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case MDB:
14493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "mdb\t'r1,'d1('r2d, 'r3)");
14503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case DDB:
14523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "ddb\t'r1,'d1('r2d, 'r3)");
14533b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
14543b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    case SQDB:
14553b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      Format(instr, "sqdb\t'r1,'d1('r2d, 'r3)");
14563b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      break;
145762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch    case PFD:
145862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      Format(instr, "pfd\t'm1,'d2('r2d,'r3)");
145962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch      break;
14603b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    default:
14613b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch      return false;
14623b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
14633b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return true;
14643b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
14653b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14663b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#undef VERIFIY
14673b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14683b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// Disassemble the instruction at *instr_ptr into the output buffer.
14693b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Decoder::InstructionDecode(byte* instr_ptr) {
14703b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Instruction* instr = Instruction::At(instr_ptr);
14713b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  int instrLength = instr->InstructionLength();
14723b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14733b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  if (2 == instrLength)
14743b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DecodeTwoByte(instr);
14753b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  else if (4 == instrLength)
14763b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DecodeFourByte(instr);
14773b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  else
14783b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    DecodeSixByte(instr);
14793b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14803b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return instrLength;
14813b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
14823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14833b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace internal
14843b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace v8
14853b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14863b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//------------------------------------------------------------------------------
14873b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14883b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochnamespace disasm {
14893b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14903b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameOfAddress(byte* addr) const {
149113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  v8::internal::SNPrintF(tmp_buffer_, "%p", static_cast<void*>(addr));
14923b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return tmp_buffer_.start();
14933b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
14943b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14953b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameOfConstant(byte* addr) const {
14963b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return NameOfAddress(addr);
14973b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
14983b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
14993b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameOfCPURegister(int reg) const {
150013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch  return v8::internal::GetRegConfig()->GetGeneralRegisterName(reg);
15013b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15023b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15033b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameOfByteCPURegister(int reg) const {
15043b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();  // S390 does not have the concept of a byte register
15053b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return "nobytereg";
15063b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15073b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15083b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameOfXMMRegister(int reg) const {
15093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // S390 does not have XMM register
15103b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // TODO(joransiu): Consider update this for Vector Regs
15113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  UNREACHABLE();
15123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return "noxmmreg";
15133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochconst char* NameConverter::NameInCode(byte* addr) const {
15163b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // The default name converter is called for unknown code. So we will not try
15173b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  // to access any memory.
15183b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return "";
15193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch//------------------------------------------------------------------------------
15223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochDisassembler::Disassembler(const NameConverter& converter)
15243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    : converter_(converter) {}
15253b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochDisassembler::~Disassembler() {}
15273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Disassembler::InstructionDecode(v8::internal::Vector<char> buffer,
15293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                                    byte* instruction) {
15303b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  v8::internal::Decoder d(converter_, buffer);
15313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  return d.InstructionDecode(instruction);
15323b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15333b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15343b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch// The S390 assembler does not currently use constant pools.
15353b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochint Disassembler::ConstantPoolSizeAt(byte* instruction) { return -1; }
15363b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15373b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdochvoid Disassembler::Disassemble(FILE* f, byte* begin, byte* end) {
15383b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  NameConverter converter;
15393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  Disassembler d(converter);
15403b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  for (byte* pc = begin; pc < end;) {
15413b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    v8::internal::EmbeddedVector<char, 128> buffer;
15423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    buffer[0] = '\0';
15433b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    byte* prev_pc = pc;
15443b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch    pc += d.InstructionDecode(buffer, pc);
154513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch    v8::internal::PrintF(f, "%p    %08x      %s\n", static_cast<void*>(prev_pc),
15463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch                         *reinterpret_cast<int32_t*>(prev_pc), buffer.start());
15473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch  }
15483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}
15493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch}  // namespace disasm
15513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch
15523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch#endif  // V8_TARGET_ARCH_S390
1553