Home | History | Annotate | Download | only in s390
      1 // Copyright 2014 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 // A Disassembler object is used to disassemble a block of code instruction by
      6 // instruction. The default implementation of the NameConverter object can be
      7 // overriden to modify register names or to do symbol lookup on addresses.
      8 //
      9 // The example below will disassemble a block of code and print it to stdout.
     10 //
     11 //   NameConverter converter;
     12 //   Disassembler d(converter);
     13 //   for (byte* pc = begin; pc < end;) {
     14 //     v8::internal::EmbeddedVector<char, 256> buffer;
     15 //     byte* prev_pc = pc;
     16 //     pc += d.InstructionDecode(buffer, pc);
     17 //     printf("%p    %08x      %s\n",
     18 //            prev_pc, *reinterpret_cast<int32_t*>(prev_pc), buffer);
     19 //   }
     20 //
     21 // The Disassembler class also has a convenience method to disassemble a block
     22 // of code into a FILE*, meaning that the above functionality could also be
     23 // achieved by just calling Disassembler::Disassemble(stdout, begin, end);
     24 
     25 #include <assert.h>
     26 #include <stdarg.h>
     27 #include <stdio.h>
     28 #include <string.h>
     29 
     30 #if V8_TARGET_ARCH_S390
     31 
     32 #include "src/base/platform/platform.h"
     33 #include "src/disasm.h"
     34 #include "src/macro-assembler.h"
     35 #include "src/s390/constants-s390.h"
     36 
     37 namespace v8 {
     38 namespace internal {
     39 
     40 const auto GetRegConfig = RegisterConfiguration::Default;
     41 
     42 //------------------------------------------------------------------------------
     43 
     44 // Decoder decodes and disassembles instructions into an output buffer.
     45 // It uses the converter to convert register names and call destinations into
     46 // more informative description.
     47 class Decoder {
     48  public:
     49   Decoder(const disasm::NameConverter& converter, Vector<char> out_buffer)
     50       : converter_(converter), out_buffer_(out_buffer), out_buffer_pos_(0) {
     51     out_buffer_[out_buffer_pos_] = '\0';
     52   }
     53 
     54   ~Decoder() {}
     55 
     56   // Writes one disassembled instruction into 'buffer' (0-terminated).
     57   // Returns the length of the disassembled machine instruction in bytes.
     58   int InstructionDecode(byte* instruction);
     59 
     60  private:
     61   // Bottleneck functions to print into the out_buffer.
     62   void PrintChar(const char ch);
     63   void Print(const char* str);
     64 
     65   // Printing of common values.
     66   void PrintRegister(int reg);
     67   void PrintDRegister(int reg);
     68   void PrintSoftwareInterrupt(SoftwareInterruptCodes svc);
     69 
     70   // Handle formatting of instructions and their options.
     71   int FormatRegister(Instruction* instr, const char* option);
     72   int FormatFloatingRegister(Instruction* instr, const char* option);
     73   int FormatMask(Instruction* instr, const char* option);
     74   int FormatDisplacement(Instruction* instr, const char* option);
     75   int FormatImmediate(Instruction* instr, const char* option);
     76   int FormatOption(Instruction* instr, const char* option);
     77   void Format(Instruction* instr, const char* format);
     78   void Unknown(Instruction* instr);
     79   void UnknownFormat(Instruction* instr, const char* opcname);
     80 
     81   bool DecodeSpecial(Instruction* instr);
     82   bool DecodeGeneric(Instruction* instr);
     83 
     84   const disasm::NameConverter& converter_;
     85   Vector<char> out_buffer_;
     86   int out_buffer_pos_;
     87 
     88   DISALLOW_COPY_AND_ASSIGN(Decoder);
     89 };
     90 
     91 // Support for assertions in the Decoder formatting functions.
     92 #define STRING_STARTS_WITH(string, compare_string) \
     93   (strncmp(string, compare_string, strlen(compare_string)) == 0)
     94 
     95 // Append the ch to the output buffer.
     96 void Decoder::PrintChar(const char ch) { out_buffer_[out_buffer_pos_++] = ch; }
     97 
     98 // Append the str to the output buffer.
     99 void Decoder::Print(const char* str) {
    100   char cur = *str++;
    101   while (cur != '\0' && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
    102     PrintChar(cur);
    103     cur = *str++;
    104   }
    105   out_buffer_[out_buffer_pos_] = 0;
    106 }
    107 
    108 // Print the register name according to the active name converter.
    109 void Decoder::PrintRegister(int reg) {
    110   Print(converter_.NameOfCPURegister(reg));
    111 }
    112 
    113 // Print the double FP register name according to the active name converter.
    114 void Decoder::PrintDRegister(int reg) {
    115   Print(GetRegConfig()->GetDoubleRegisterName(reg));
    116 }
    117 
    118 // Print SoftwareInterrupt codes. Factoring this out reduces the complexity of
    119 // the FormatOption method.
    120 void Decoder::PrintSoftwareInterrupt(SoftwareInterruptCodes svc) {
    121   switch (svc) {
    122     case kCallRtRedirected:
    123       Print("call rt redirected");
    124       return;
    125     case kBreakpoint:
    126       Print("breakpoint");
    127       return;
    128     default:
    129       if (svc >= kStopCode) {
    130         out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d - 0x%x",
    131                                     svc & kStopCodeMask, svc & kStopCodeMask);
    132       } else {
    133         out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", svc);
    134       }
    135       return;
    136   }
    137 }
    138 
    139 // Handle all register based formatting in this function to reduce the
    140 // complexity of FormatOption.
    141 int Decoder::FormatRegister(Instruction* instr, const char* format) {
    142   DCHECK_EQ(format[0], 'r');
    143 
    144   if (format[1] == '1') {  // 'r1: register resides in bit 8-11
    145     int reg = instr->Bits<SixByteInstr, int>(39, 36);
    146     PrintRegister(reg);
    147     return 2;
    148   } else if (format[1] == '2') {  // 'r2: register resides in bit 12-15
    149     int reg = instr->Bits<SixByteInstr, int>(35, 32);
    150     // indicating it is a r0 for displacement, in which case the offset
    151     // should be 0.
    152     if (format[2] == 'd') {
    153       if (reg == 0) return 4;
    154       PrintRegister(reg);
    155       return 3;
    156     } else {
    157       PrintRegister(reg);
    158       return 2;
    159     }
    160   } else if (format[1] == '3') {  // 'r3: register resides in bit 16-19
    161     int reg = instr->Bits<SixByteInstr, int>(31, 28);
    162     PrintRegister(reg);
    163     return 2;
    164   } else if (format[1] == '4') {  // 'r4: register resides in bit 20-23
    165     int reg = instr->Bits<SixByteInstr, int>(27, 24);
    166     PrintRegister(reg);
    167     return 2;
    168   } else if (format[1] == '5') {  // 'r5: register resides in bit 24-27
    169     int reg = instr->Bits<SixByteInstr, int>(23, 20);
    170     PrintRegister(reg);
    171     return 2;
    172   } else if (format[1] == '6') {  // 'r6: register resides in bit 28-31
    173     int reg = instr->Bits<SixByteInstr, int>(19, 16);
    174     PrintRegister(reg);
    175     return 2;
    176   } else if (format[1] == '7') {  // 'r6: register resides in bit 32-35
    177     int reg = instr->Bits<SixByteInstr, int>(15, 12);
    178     PrintRegister(reg);
    179     return 2;
    180   }
    181 
    182   UNREACHABLE();
    183 }
    184 
    185 int Decoder::FormatFloatingRegister(Instruction* instr, const char* format) {
    186   DCHECK_EQ(format[0], 'f');
    187 
    188   // reuse 1, 5 and 6 because it is coresponding
    189   if (format[1] == '1') {  // 'r1: register resides in bit 8-11
    190     RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
    191     int reg = rrinstr->R1Value();
    192     PrintDRegister(reg);
    193     return 2;
    194   } else if (format[1] == '2') {  // 'f2: register resides in bit 12-15
    195     RRInstruction* rrinstr = reinterpret_cast<RRInstruction*>(instr);
    196     int reg = rrinstr->R2Value();
    197     PrintDRegister(reg);
    198     return 2;
    199   } else if (format[1] == '3') {  // 'f3: register resides in bit 16-19
    200     RRDInstruction* rrdinstr = reinterpret_cast<RRDInstruction*>(instr);
    201     int reg = rrdinstr->R1Value();
    202     PrintDRegister(reg);
    203     return 2;
    204   } else if (format[1] == '5') {  // 'f5: register resides in bit 24-28
    205     RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
    206     int reg = rreinstr->R1Value();
    207     PrintDRegister(reg);
    208     return 2;
    209   } else if (format[1] == '6') {  // 'f6: register resides in bit 29-32
    210     RREInstruction* rreinstr = reinterpret_cast<RREInstruction*>(instr);
    211     int reg = rreinstr->R2Value();
    212     PrintDRegister(reg);
    213     return 2;
    214   }
    215   UNREACHABLE();
    216 }
    217 
    218 // FormatOption takes a formatting string and interprets it based on
    219 // the current instructions. The format string points to the first
    220 // character of the option string (the option escape has already been
    221 // consumed by the caller.)  FormatOption returns the number of
    222 // characters that were consumed from the formatting string.
    223 int Decoder::FormatOption(Instruction* instr, const char* format) {
    224   switch (format[0]) {
    225     case 'o': {
    226       if (instr->Bit(10) == 1) {
    227         Print("o");
    228       }
    229       return 1;
    230     }
    231     case '.': {
    232       if (instr->Bit(0) == 1) {
    233         Print(".");
    234       } else {
    235         Print(" ");  // ensure consistent spacing
    236       }
    237       return 1;
    238     }
    239     case 'r': {
    240       return FormatRegister(instr, format);
    241     }
    242     case 'f': {
    243       return FormatFloatingRegister(instr, format);
    244     }
    245     case 'i': {  // int16
    246       return FormatImmediate(instr, format);
    247     }
    248     case 'u': {  // uint16
    249       int32_t value = instr->Bits(15, 0);
    250       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    251       return 6;
    252     }
    253     case 'l': {
    254       // Link (LK) Bit 0
    255       if (instr->Bit(0) == 1) {
    256         Print("l");
    257       }
    258       return 1;
    259     }
    260     case 'a': {
    261       // Absolute Address Bit 1
    262       if (instr->Bit(1) == 1) {
    263         Print("a");
    264       }
    265       return 1;
    266     }
    267     case 't': {  // 'target: target of branch instructions
    268       // target26 or target16
    269       DCHECK(STRING_STARTS_WITH(format, "target"));
    270       if ((format[6] == '2') && (format[7] == '6')) {
    271         int off = ((instr->Bits(25, 2)) << 8) >> 6;
    272         out_buffer_pos_ += SNPrintF(
    273             out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
    274             converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
    275         return 8;
    276       } else if ((format[6] == '1') && (format[7] == '6')) {
    277         int off = ((instr->Bits(15, 2)) << 18) >> 16;
    278         out_buffer_pos_ += SNPrintF(
    279             out_buffer_ + out_buffer_pos_, "%+d -> %s", off,
    280             converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + off));
    281         return 8;
    282       }
    283       break;
    284       case 'm': {
    285         return FormatMask(instr, format);
    286       }
    287     }
    288     case 'd': {  // ds value for offset
    289       return FormatDisplacement(instr, format);
    290     }
    291     default: {
    292       UNREACHABLE();
    293       break;
    294     }
    295   }
    296 
    297   UNREACHABLE();
    298 }
    299 
    300 int Decoder::FormatMask(Instruction* instr, const char* format) {
    301   DCHECK_EQ(format[0], 'm');
    302   int32_t value = 0;
    303   if ((format[1] == '1')) {  // prints the mask format in bits 8-12
    304     value = reinterpret_cast<RRInstruction*>(instr)->R1Value();
    305     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
    306     return 2;
    307   } else if (format[1] == '2') {  // mask format in bits 16-19
    308     value = reinterpret_cast<RXInstruction*>(instr)->B2Value();
    309     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
    310     return 2;
    311   } else if (format[1] == '3') {  // mask format in bits 20-23
    312     value = reinterpret_cast<RRFInstruction*>(instr)->M4Value();
    313     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "0x%x", value);
    314     return 2;
    315   }
    316 
    317   out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    318   return 2;
    319 }
    320 
    321 int Decoder::FormatDisplacement(Instruction* instr, const char* format) {
    322   DCHECK_EQ(format[0], 'd');
    323 
    324   if (format[1] == '1') {  // displacement in 20-31
    325     RSInstruction* rsinstr = reinterpret_cast<RSInstruction*>(instr);
    326     uint16_t value = rsinstr->D2Value();
    327     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    328 
    329     return 2;
    330   } else if (format[1] == '2') {  // displacement in 20-39
    331     RXYInstruction* rxyinstr = reinterpret_cast<RXYInstruction*>(instr);
    332     int32_t value = rxyinstr->D2Value();
    333     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    334     return 2;
    335   } else if (format[1] == '4') {  // SS displacement 2 36-47
    336     SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr);
    337     uint16_t value = ssInstr->D2Value();
    338     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    339     return 2;
    340   } else if (format[1] == '3') {  // SS displacement 1 20 - 32
    341     SSInstruction* ssInstr = reinterpret_cast<SSInstruction*>(instr);
    342     uint16_t value = ssInstr->D1Value();
    343     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    344     return 2;
    345   } else {  // s390 specific
    346     int32_t value = SIGN_EXT_IMM16(instr->Bits(15, 0) & ~3);
    347     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    348     return 1;
    349   }
    350 }
    351 
    352 int Decoder::FormatImmediate(Instruction* instr, const char* format) {
    353   DCHECK_EQ(format[0], 'i');
    354 
    355   if (format[1] == '1') {  // immediate in 16-31
    356     RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
    357     int16_t value = riinstr->I2Value();
    358     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    359     return 2;
    360   } else if (format[1] == '2') {  // immediate in 16-48
    361     RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
    362     int32_t value = rilinstr->I2Value();
    363     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    364     return 2;
    365   } else if (format[1] == '3') {  // immediate in I format
    366     IInstruction* iinstr = reinterpret_cast<IInstruction*>(instr);
    367     int8_t value = iinstr->IValue();
    368     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    369     return 2;
    370   } else if (format[1] == '4') {  // immediate in 16-31, but outputs as offset
    371     RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
    372     int16_t value = riinstr->I2Value() * 2;
    373     if (value >= 0)
    374       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
    375     else
    376       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
    377 
    378     out_buffer_pos_ += SNPrintF(
    379         out_buffer_ + out_buffer_pos_, "%d -> %s", value,
    380         converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
    381     return 2;
    382   } else if (format[1] == '5') {  // immediate in 16-31, but outputs as offset
    383     RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
    384     int32_t value = rilinstr->I2Value() * 2;
    385     if (value >= 0)
    386       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
    387     else
    388       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
    389 
    390     out_buffer_pos_ += SNPrintF(
    391         out_buffer_ + out_buffer_pos_, "%d -> %s", value,
    392         converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
    393     return 2;
    394   } else if (format[1] == '6') {  // unsigned immediate in 16-31
    395     RIInstruction* riinstr = reinterpret_cast<RIInstruction*>(instr);
    396     uint16_t value = riinstr->I2UnsignedValue();
    397     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    398     return 2;
    399   } else if (format[1] == '7') {  // unsigned immediate in 16-47
    400     RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
    401     uint32_t value = rilinstr->I2UnsignedValue();
    402     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    403     return 2;
    404   } else if (format[1] == '8') {  // unsigned immediate in 8-15
    405     SSInstruction* ssinstr = reinterpret_cast<SSInstruction*>(instr);
    406     uint8_t value = ssinstr->Length();
    407     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    408     return 2;
    409   } else if (format[1] == '9') {  // unsigned immediate in 16-23
    410     RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
    411     uint8_t value = rie_instr->I3Value();
    412     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    413     return 2;
    414   } else if (format[1] == 'a') {  // unsigned immediate in 24-31
    415     RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
    416     uint8_t value = rie_instr->I4Value();
    417     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    418     return 2;
    419   } else if (format[1] == 'b') {  // unsigned immediate in 32-39
    420     RIEInstruction* rie_instr = reinterpret_cast<RIEInstruction*>(instr);
    421     uint8_t value = rie_instr->I5Value();
    422     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    423     return 2;
    424   } else if (format[1] == 'c') {  // signed immediate in 8-15
    425     SSInstruction* ssinstr = reinterpret_cast<SSInstruction*>(instr);
    426     int8_t value = ssinstr->Length();
    427     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    428     return 2;
    429   } else if (format[1] == 'd') {  // signed immediate in 32-47
    430     SILInstruction* silinstr = reinterpret_cast<SILInstruction*>(instr);
    431     int16_t value = silinstr->I2Value();
    432     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "%d", value);
    433     return 2;
    434   } else if (format[1] == 'e') {  // immediate in 16-47, but outputs as offset
    435     RILInstruction* rilinstr = reinterpret_cast<RILInstruction*>(instr);
    436     int32_t value = rilinstr->I2Value() * 2;
    437     if (value >= 0)
    438       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*+");
    439     else
    440       out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_, "*");
    441 
    442     out_buffer_pos_ += SNPrintF(
    443         out_buffer_ + out_buffer_pos_, "%d -> %s", value,
    444         converter_.NameOfAddress(reinterpret_cast<byte*>(instr) + value));
    445     return 2;
    446   }
    447 
    448   UNREACHABLE();
    449 }
    450 
    451 // Format takes a formatting string for a whole instruction and prints it into
    452 // the output buffer. All escaped options are handed to FormatOption to be
    453 // parsed further.
    454 void Decoder::Format(Instruction* instr, const char* format) {
    455   char cur = *format++;
    456   while ((cur != 0) && (out_buffer_pos_ < (out_buffer_.length() - 1))) {
    457     if (cur == '\'') {  // Single quote is used as the formatting escape.
    458       format += FormatOption(instr, format);
    459     } else {
    460       out_buffer_[out_buffer_pos_++] = cur;
    461     }
    462     cur = *format++;
    463   }
    464   out_buffer_[out_buffer_pos_] = '\0';
    465 }
    466 
    467 // The disassembler may end up decoding data inlined in the code. We do not want
    468 // it to crash if the data does not resemble any known instruction.
    469 #define VERIFY(condition) \
    470   if (!(condition)) {     \
    471     Unknown(instr);       \
    472     return;               \
    473   }
    474 
    475 // For currently unimplemented decodings the disassembler calls Unknown(instr)
    476 // which will just print "unknown" of the instruction bits.
    477 void Decoder::Unknown(Instruction* instr) { Format(instr, "unknown"); }
    478 
    479 // For currently unimplemented decodings the disassembler calls
    480 // UnknownFormat(instr) which will just print opcode name of the
    481 // instruction bits.
    482 void Decoder::UnknownFormat(Instruction* instr, const char* name) {
    483   char buffer[100];
    484   snprintf(buffer, sizeof(buffer), "%s (unknown-format)", name);
    485   Format(instr, buffer);
    486 }
    487 
    488 #undef VERIFY
    489 #undef STRING_STARTS_WITH
    490 
    491 // Handles special cases of instructions;
    492 // @return true if successfully decoded
    493 bool Decoder::DecodeSpecial(Instruction* instr) {
    494   Opcode opcode = instr->S390OpcodeValue();
    495   switch (opcode) {
    496     case BKPT:
    497       Format(instr, "bkpt");
    498       break;
    499     case DUMY:
    500       Format(instr, "dumy\t'r1, 'd2 ( 'r2d, 'r3 )");
    501       break;
    502     /* RR format */
    503     case LDR:
    504       Format(instr, "ldr\t'f1,'f2");
    505       break;
    506     case BCR:
    507       Format(instr, "bcr\t'm1,'r2");
    508       break;
    509     case OR:
    510       Format(instr, "or\t'r1,'r2");
    511       break;
    512     case CR:
    513       Format(instr, "cr\t'r1,'r2");
    514       break;
    515     case MR:
    516       Format(instr, "mr\t'r1,'r2");
    517       break;
    518     case HER_Z:
    519       Format(instr, "her\t'r1,'r2");
    520       break;
    521     /* RI-b format */
    522     case BRAS:
    523       Format(instr, "bras\t'r1,'i1");
    524       break;
    525     /* RRE format */
    526     case MDBR:
    527       Format(instr, "mdbr\t'f5,'f6");
    528       break;
    529     case SDBR:
    530       Format(instr, "sdbr\t'f5,'f6");
    531       break;
    532     case ADBR:
    533       Format(instr, "adbr\t'f5,'f6");
    534       break;
    535     case CDBR:
    536       Format(instr, "cdbr\t'f5,'f6");
    537       break;
    538     case MEEBR:
    539       Format(instr, "meebr\t'f5,'f6");
    540       break;
    541     case SQDBR:
    542       Format(instr, "sqdbr\t'f5,'f6");
    543       break;
    544     case SQEBR:
    545       Format(instr, "sqebr\t'f5,'f6");
    546       break;
    547     case LCDBR:
    548       Format(instr, "lcdbr\t'f5,'f6");
    549       break;
    550     case LCEBR:
    551       Format(instr, "lcebr\t'f5,'f6");
    552       break;
    553     case LTEBR:
    554       Format(instr, "ltebr\t'f5,'f6");
    555       break;
    556     case LDEBR:
    557       Format(instr, "ldebr\t'f5,'f6");
    558       break;
    559     case CEBR:
    560       Format(instr, "cebr\t'f5,'f6");
    561       break;
    562     case AEBR:
    563       Format(instr, "aebr\t'f5,'f6");
    564       break;
    565     case SEBR:
    566       Format(instr, "sebr\t'f5,'f6");
    567       break;
    568     case DEBR:
    569       Format(instr, "debr\t'f5,'f6");
    570       break;
    571     case LTDBR:
    572       Format(instr, "ltdbr\t'f5,'f6");
    573       break;
    574     case LDGR:
    575       Format(instr, "ldgr\t'f5,'f6");
    576       break;
    577     case DDBR:
    578       Format(instr, "ddbr\t'f5,'f6");
    579       break;
    580     case LZDR:
    581       Format(instr, "lzdr\t'f5");
    582       break;
    583     /* RRF-e format */
    584     case FIEBRA:
    585       Format(instr, "fiebra\t'f5,'m2,'f6,'m3");
    586       break;
    587     case FIDBRA:
    588       Format(instr, "fidbra\t'f5,'m2,'f6,'m3");
    589       break;
    590     /* RX-a format */
    591     case IC_z:
    592       Format(instr, "ic\t'r1,'d1('r2d,'r3)");
    593       break;
    594     case AL:
    595       Format(instr, "al\t'r1,'d1('r2d,'r3)");
    596       break;
    597     case LE:
    598       Format(instr, "le\t'f1,'d1('r2d,'r3)");
    599       break;
    600     case LD:
    601       Format(instr, "ld\t'f1,'d1('r2d,'r3)");
    602       break;
    603     case STE:
    604       Format(instr, "ste\t'f1,'d1('r2d,'r3)");
    605       break;
    606     case STD:
    607       Format(instr, "std\t'f1,'d1('r2d,'r3)");
    608       break;
    609     /* S format */
    610     // TRAP4 is used in calling to native function. it will not be generated
    611     // in native code.
    612     case TRAP4:
    613       Format(instr, "trap4");
    614       break;
    615     /* RIL-a format */
    616     case CFI:
    617       Format(instr, "cfi\t'r1,'i2");
    618       break;
    619     case CGFI:
    620       Format(instr, "cgfi\t'r1,'i2");
    621       break;
    622     case AFI:
    623       Format(instr, "afi\t'r1,'i2");
    624       break;
    625     case AGFI:
    626       Format(instr, "agfi\t'r1,'i2");
    627       break;
    628     case MSFI:
    629       Format(instr, "msfi\t'r1,'i2");
    630       break;
    631     case MSGFI:
    632       Format(instr, "msgfi\t'r1,'i2");
    633       break;
    634     case ALSIH:
    635       Format(instr, "alsih\t'r1,'i2");
    636       break;
    637     case ALSIHN:
    638       Format(instr, "alsihn\t'r1,'i2");
    639       break;
    640     case CIH:
    641       Format(instr, "cih\t'r1,'i2");
    642       break;
    643     case AIH:
    644       Format(instr, "aih\t'r1,'i2");
    645       break;
    646     case LGFI:
    647       Format(instr, "lgfi\t'r1,'i2");
    648       break;
    649     /* SIY format */
    650     case ASI:
    651       Format(instr, "asi\t'd2('r3),'ic");
    652       break;
    653     case AGSI:
    654       Format(instr, "agsi\t'd2('r3),'ic");
    655       break;
    656     /* RXY-a format */
    657     case LT:
    658       Format(instr, "lt\t'r1,'d2('r2d,'r3)");
    659       break;
    660     case LDY:
    661       Format(instr, "ldy\t'f1,'d2('r2d,'r3)");
    662       break;
    663     case LEY:
    664       Format(instr, "ley\t'f1,'d2('r2d,'r3)");
    665       break;
    666     case STDY:
    667       Format(instr, "stdy\t'f1,'d2('r2d,'r3)");
    668       break;
    669     case STEY:
    670       Format(instr, "stey\t'f1,'d2('r2d,'r3)");
    671       break;
    672     /* RXE format */
    673     case LDEB:
    674       Format(instr, "ldeb\t'f1,'d2('r2d,'r3)");
    675       break;
    676     default:
    677       return false;
    678   }
    679   return true;
    680 }
    681 
    682 // Handles common cases of instructions;
    683 // @return true if successfully decoded
    684 bool Decoder::DecodeGeneric(Instruction* instr) {
    685   Opcode opcode = instr->S390OpcodeValue();
    686   switch (opcode) {
    687   /* 2 bytes */
    688 #define DECODE_RR_INSTRUCTIONS(name, opcode_name, opcode_value) \
    689   case opcode_name:                                             \
    690     Format(instr, #name "\t'r1,'r2");                           \
    691     break;
    692   S390_RR_OPCODE_LIST(DECODE_RR_INSTRUCTIONS)
    693 #undef DECODE_RR_INSTRUCTIONS
    694 
    695   /* 4 bytes */
    696 #define DECODE_RS_A_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    697     case opcode_name:                                              \
    698       Format(instr, #name "\t'r1,'r2,'d1('r3)");                   \
    699       break;
    700   S390_RS_A_OPCODE_LIST(DECODE_RS_A_INSTRUCTIONS)
    701 #undef DECODE_RS_A_INSTRUCTIONS
    702 
    703 #define DECODE_RSI_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    704     case opcode_name:                                              \
    705       Format(instr, #name "\t'r1,'r2,'i4");                        \
    706       break;
    707   S390_RSI_OPCODE_LIST(DECODE_RSI_INSTRUCTIONS)
    708 #undef DECODE_RSI_INSTRUCTIONS
    709 
    710 #define DECODE_RI_A_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    711     case opcode_name:                                              \
    712       Format(instr, #name "\t'r1,'i1");                            \
    713       break;
    714   S390_RI_A_OPCODE_LIST(DECODE_RI_A_INSTRUCTIONS)
    715 #undef DECODE_RI_A_INSTRUCTIONS
    716 
    717 #define DECODE_RI_B_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    718     case opcode_name:                                              \
    719       Format(instr, #name "\t'r1,'i4");                            \
    720       break;
    721   S390_RI_B_OPCODE_LIST(DECODE_RI_B_INSTRUCTIONS)
    722 #undef DECODE_RI_B_INSTRUCTIONS
    723 
    724 #define DECODE_RI_C_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    725     case opcode_name:                                              \
    726       Format(instr, #name "\t'm1,'i4");                            \
    727       break;
    728   S390_RI_C_OPCODE_LIST(DECODE_RI_C_INSTRUCTIONS)
    729 #undef DECODE_RI_C_INSTRUCTIONS
    730 
    731 #define DECODE_RRE_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    732     case opcode_name:                                              \
    733       Format(instr, #name "\t'r5,'r6");                            \
    734       break;
    735   S390_RRE_OPCODE_LIST(DECODE_RRE_INSTRUCTIONS)
    736 #undef DECODE_RRE_INSTRUCTIONS
    737 
    738 #define DECODE_RRF_A_INSTRUCTIONS(name, opcode_name, opcode_val)   \
    739     case opcode_name:                                              \
    740       Format(instr, #name "\t'r5,'r6,'r3");                        \
    741       break;
    742   S390_RRF_A_OPCODE_LIST(DECODE_RRF_A_INSTRUCTIONS)
    743 #undef DECODE_RRF_A_INSTRUCTIONS
    744 
    745 #define DECODE_RRF_C_INSTRUCTIONS(name, opcode_name, opcode_val)   \
    746     case opcode_name:                                              \
    747       Format(instr, #name "\t'r5,'r6,'m2");                        \
    748       break;
    749   S390_RRF_C_OPCODE_LIST(DECODE_RRF_C_INSTRUCTIONS)
    750 #undef DECODE_RRF_C_INSTRUCTIONS
    751 
    752 #define DECODE_RRF_E_INSTRUCTIONS(name, opcode_name, opcode_val)   \
    753     case opcode_name:                                              \
    754       Format(instr, #name "\t'r5,'m2,'f6");                        \
    755       break;
    756   S390_RRF_E_OPCODE_LIST(DECODE_RRF_E_INSTRUCTIONS)
    757 #undef DECODE_RRF_E_INSTRUCTIONS
    758 
    759 #define DECODE_RX_A_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    760     case opcode_name:                                              \
    761       Format(instr, #name "\t'r1,'d1('r2d,'r3)");                  \
    762       break;
    763   S390_RX_A_OPCODE_LIST(DECODE_RX_A_INSTRUCTIONS)
    764 #undef DECODE_RX_A_INSTRUCTIONS
    765 
    766 #define DECODE_RX_B_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    767     case opcode_name:                                              \
    768       Format(instr, #name "\t'm1,'d1('r2d,'r3)");                  \
    769       break;
    770   S390_RX_B_OPCODE_LIST(DECODE_RX_B_INSTRUCTIONS)
    771 #undef DECODE_RX_B_INSTRUCTIONS
    772 
    773 #define DECODE_RRD_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    774     case opcode_name:                                              \
    775       Format(instr, #name "\t'f3,'f5,'f6");                        \
    776       break;
    777   S390_RRD_OPCODE_LIST(DECODE_RRD_INSTRUCTIONS)
    778 #undef DECODE_RRD_INSTRUCTIONS
    779 
    780 #define DECODE_SI_INSTRUCTIONS(name, opcode_name, opcode_value)    \
    781     case opcode_name:                                              \
    782       Format(instr, #name "\t'd1('r3),'i8");                       \
    783       break;
    784   S390_SI_OPCODE_LIST(DECODE_SI_INSTRUCTIONS)
    785 #undef DECODE_SI_INSTRUCTIONS
    786 
    787   /* 6 bytes */
    788 #define DECODE_VRR_C_INSTRUCTIONS(name, opcode_name, opcode_value) \
    789   case opcode_name:                                                \
    790     Format(instr, #name "\t'f1,'f2,'f3");                          \
    791     break;
    792   S390_VRR_C_OPCODE_LIST(DECODE_VRR_C_INSTRUCTIONS)
    793 #undef DECODE_VRR_C_INSTRUCTIONS
    794 
    795 #define DECODE_RIL_A_INSTRUCTIONS(name, opcode_name, opcode_value) \
    796   case opcode_name:                                                \
    797     Format(instr, #name "\t'r1,'i7");                              \
    798     break;
    799   S390_RIL_A_OPCODE_LIST(DECODE_RIL_A_INSTRUCTIONS)
    800 #undef DECODE_RIL_A_INSTRUCTIONS
    801 
    802 #define DECODE_RIL_B_INSTRUCTIONS(name, opcode_name, opcode_value) \
    803   case opcode_name:                                                \
    804     Format(instr, #name "\t'r1,'ie");                              \
    805     break;
    806   S390_RIL_B_OPCODE_LIST(DECODE_RIL_B_INSTRUCTIONS)
    807 #undef DECODE_RIL_B_INSTRUCTIONS
    808 
    809 #define DECODE_RIL_C_INSTRUCTIONS(name, opcode_name, opcode_value) \
    810   case opcode_name:                                                \
    811     Format(instr, #name "\t'm1,'ie");                              \
    812     break;
    813   S390_RIL_C_OPCODE_LIST(DECODE_RIL_C_INSTRUCTIONS)
    814 #undef DECODE_RIL_C_INSTRUCTIONS
    815 
    816 #define DECODE_SIY_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    817   case opcode_name:                                                \
    818     Format(instr, #name "\t'd2('r3),'i8");                         \
    819     break;
    820   S390_SIY_OPCODE_LIST(DECODE_SIY_INSTRUCTIONS)
    821 #undef DECODE_SIY_INSTRUCTIONS
    822 
    823 #define DECODE_RIE_D_INSTRUCTIONS(name, opcode_name, opcode_value) \
    824   case opcode_name:                                                \
    825     Format(instr, #name "\t'r1,'r2,'i1");                          \
    826     break;
    827   S390_RIE_D_OPCODE_LIST(DECODE_RIE_D_INSTRUCTIONS)
    828 #undef DECODE_RIE_D_INSTRUCTIONS
    829 
    830 #define DECODE_RIE_E_INSTRUCTIONS(name, opcode_name, opcode_value) \
    831   case opcode_name:                                                \
    832     Format(instr, #name "\t'r1,'r2,'i4");                          \
    833     break;
    834   S390_RIE_E_OPCODE_LIST(DECODE_RIE_E_INSTRUCTIONS)
    835 #undef DECODE_RIE_E_INSTRUCTIONS
    836 
    837 #define DECODE_RIE_F_INSTRUCTIONS(name, opcode_name, opcode_value) \
    838   case opcode_name:                                                \
    839     Format(instr, #name "\t'r1,'r2,'i9,'ia,'ib");                  \
    840     break;
    841   S390_RIE_F_OPCODE_LIST(DECODE_RIE_F_INSTRUCTIONS)
    842 #undef DECODE_RIE_F_INSTRUCTIONS
    843 
    844 #define DECODE_RSY_A_INSTRUCTIONS(name, opcode_name, opcode_value) \
    845   case opcode_name:                                                \
    846     Format(instr, #name "\t'r1,'r2,'d2('r3)");                     \
    847     break;
    848   S390_RSY_A_OPCODE_LIST(DECODE_RSY_A_INSTRUCTIONS)
    849 #undef DECODE_RSY_A_INSTRUCTIONS
    850 
    851 #define DECODE_RSY_B_INSTRUCTIONS(name, opcode_name, opcode_value) \
    852   case opcode_name:                                                \
    853     Format(instr, #name "\t'm2,'r1,'d2('r3)");                     \
    854     break;
    855   S390_RSY_B_OPCODE_LIST(DECODE_RSY_B_INSTRUCTIONS)
    856 #undef DECODE_RSY_B_INSTRUCTIONS
    857 
    858 #define DECODE_RXY_A_INSTRUCTIONS(name, opcode_name, opcode_value) \
    859   case opcode_name:                                                \
    860     Format(instr, #name "\t'r1,'d2('r2d,'r3)");                    \
    861     break;
    862   S390_RXY_A_OPCODE_LIST(DECODE_RXY_A_INSTRUCTIONS)
    863 #undef DECODE_RXY_A_INSTRUCTIONS
    864 
    865 #define DECODE_RXY_B_INSTRUCTIONS(name, opcode_name, opcode_value) \
    866   case opcode_name:                                                \
    867     Format(instr, #name "\t'm1,'d2('r2d,'r3)");                    \
    868     break;
    869   S390_RXY_B_OPCODE_LIST(DECODE_RXY_B_INSTRUCTIONS)
    870 #undef DECODE_RXY_B_INSTRUCTIONS
    871 
    872 #define DECODE_RXE_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    873   case opcode_name:                                                \
    874     Format(instr, #name "\t'f1,'d1('r2d, 'r3)");                   \
    875     break;
    876   S390_RXE_OPCODE_LIST(DECODE_RXE_INSTRUCTIONS)
    877 #undef DECODE_RXE_INSTRUCTIONS
    878 
    879 #define DECODE_SIL_INSTRUCTIONS(name, opcode_name, opcode_value)   \
    880   case opcode_name:                                                \
    881     Format(instr, #name "\t'd3('r3),'id");                         \
    882     break;
    883   S390_SIL_OPCODE_LIST(DECODE_SIL_INSTRUCTIONS)
    884 #undef DECODE_SIL_INSTRUCTIONS
    885 
    886 #define DECODE_SS_A_INSTRUCTIONS(name, opcode_name, opcode_value)  \
    887   case opcode_name:                                                \
    888     Format(instr, #name "\t'd3('i8,'r3),'d4('r7)");                \
    889     break;
    890   S390_SS_A_OPCODE_LIST(DECODE_SS_A_INSTRUCTIONS)
    891 #undef DECODE_SS_A_INSTRUCTIONS
    892 
    893     default:
    894       return false;
    895   }
    896   return true;
    897 }
    898 
    899 // Disassemble the instruction at *instr_ptr into the output buffer.
    900 int Decoder::InstructionDecode(byte* instr_ptr) {
    901   Instruction* instr = Instruction::At(instr_ptr);
    902   int instrLength = instr->InstructionLength();
    903 
    904   // Print the Instruction bits.
    905   if (instrLength == 2) {
    906     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
    907                   "%04x           ", instr->InstructionBits<TwoByteInstr>());
    908   } else if (instrLength == 4) {
    909     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
    910                   "%08x       ", instr->InstructionBits<FourByteInstr>());
    911   } else {
    912     out_buffer_pos_ += SNPrintF(out_buffer_ + out_buffer_pos_,
    913                   "%012" PRIx64 "   ", instr->InstructionBits<SixByteInstr>());
    914   }
    915 
    916   bool decoded = DecodeSpecial(instr);
    917   if (!decoded)
    918     decoded = DecodeGeneric(instr);
    919   if (!decoded)
    920     Unknown(instr);
    921   return instrLength;
    922 }
    923 
    924 }  // namespace internal
    925 }  // namespace v8
    926 
    927 //------------------------------------------------------------------------------
    928 
    929 namespace disasm {
    930 
    931 const char* NameConverter::NameOfAddress(byte* addr) const {
    932   v8::internal::SNPrintF(tmp_buffer_, "%p", static_cast<void*>(addr));
    933   return tmp_buffer_.start();
    934 }
    935 
    936 const char* NameConverter::NameOfConstant(byte* addr) const {
    937   return NameOfAddress(addr);
    938 }
    939 
    940 const char* NameConverter::NameOfCPURegister(int reg) const {
    941   return v8::internal::GetRegConfig()->GetGeneralRegisterName(reg);
    942 }
    943 
    944 const char* NameConverter::NameOfByteCPURegister(int reg) const {
    945   UNREACHABLE();  // S390 does not have the concept of a byte register
    946   return "nobytereg";
    947 }
    948 
    949 const char* NameConverter::NameOfXMMRegister(int reg) const {
    950   // S390 does not have XMM register
    951   // TODO(joransiu): Consider update this for Vector Regs
    952   UNREACHABLE();
    953 }
    954 
    955 const char* NameConverter::NameInCode(byte* addr) const {
    956   // The default name converter is called for unknown code. So we will not try
    957   // to access any memory.
    958   return "";
    959 }
    960 
    961 //------------------------------------------------------------------------------
    962 
    963 int Disassembler::InstructionDecode(v8::internal::Vector<char> buffer,
    964                                     byte* instruction) {
    965   v8::internal::Decoder d(converter_, buffer);
    966   return d.InstructionDecode(instruction);
    967 }
    968 
    969 // The S390 assembler does not currently use constant pools.
    970 int Disassembler::ConstantPoolSizeAt(byte* instruction) { return -1; }
    971 
    972 void Disassembler::Disassemble(FILE* f, byte* begin, byte* end,
    973                                UnimplementedOpcodeAction unimplemented_action) {
    974   NameConverter converter;
    975   Disassembler d(converter, unimplemented_action);
    976   for (byte* pc = begin; pc < end;) {
    977     v8::internal::EmbeddedVector<char, 128> buffer;
    978     buffer[0] = '\0';
    979     byte* prev_pc = pc;
    980     pc += d.InstructionDecode(buffer, pc);
    981     v8::internal::PrintF(f, "%p    %08x      %s\n", static_cast<void*>(prev_pc),
    982                          *reinterpret_cast<int32_t*>(prev_pc), buffer.start());
    983   }
    984 }
    985 
    986 }  // namespace disasm
    987 
    988 #endif  // V8_TARGET_ARCH_S390
    989