src/cpu/mips/vm/disassembler_mips.cpp

Wed, 29 Mar 2017 09:41:51 +0800

author
aoqi
date
Wed, 29 Mar 2017 09:41:51 +0800
changeset 392
4bfb40d1e17a
parent 379
00a9fa322917
child 402
16a6a17346a7
permissions
-rw-r--r--

#4662 TieredCompilation is turned off.
TieredCompilation is not supported yet.

     1 /*
     2  * Copyright (c) 1997, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * Copyright (c) 2015, 2016, Loongson Technology. All rights reserved.
     4  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     5  *
     6  * This code is free software; you can redistribute it and/or modify it
     7  * under the terms of the GNU General Public License version 2 only, as
     8  * published by the Free Software Foundation.
     9  *
    10  * This code is distributed in the hope that it will be useful, but WITHOUT
    11  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    12  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    13  * version 2 for more details (a copy is included in the LICENSE file that
    14  * accompanied this code).
    15  *
    16  * You should have received a copy of the GNU General Public License version
    17  * 2 along with this work; if not, write to the Free Software Foundation,
    18  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    19  *
    20  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    21  * or visit www.oracle.com if you need additional information or have any
    22  * questions.
    23  *
    24  */
    26 #ifdef USE_PRAGMA_IDENT_SRC
    27 #pragma ident "@(#)disassembler_mips.cpp	1.35 03/12/23 16:36:14 JVM"
    28 #endif
    29 # include "precompiled.hpp"
    30 # include "depChecker_mips.hpp"
    31 # include "runtime/fprofiler.hpp"
    34 class mips32_env : public DisassemblerEnv {
    35  private:
    36   nmethod*      code;
    37   outputStream* output;
    38  public:
    39   mips32_env(nmethod* rcode, outputStream* routput) {
    40     code   = rcode;
    41     output = routput;
    42   }
    43   void print_label(intptr_t value);
    44   void print_raw(const char* str) { output->print_raw(str); }
    45   void print(const char* format, ...);
    46   char* string_for_offset(intptr_t value);
    47   char* string_for_constant(unsigned char* pc, intptr_t value, int is_decimal);
    48 };
    51 void mips32_env::print_label(intptr_t value) {
    52  if (!Universe::is_fully_initialized()) {
    53    output->print(INTPTR_FORMAT, value);
    54    return;
    55  }
    56   address adr = (address) value;
    57   if (StubRoutines::contains(adr)) {
    58     StubCodeDesc* desc = StubCodeDesc::desc_for(adr);
    59     const char * desc_name = "unknown stub";
    60     if (desc != NULL) {
    61       desc_name = desc->name();
    62     }
    63     output->print("Stub::%s", desc_name);
    64     if (WizardMode) output->print(" " INTPTR_FORMAT, value);
    65   } else {
    66     output->print(INTPTR_FORMAT, value); 
    67   }
    68 }
    70 void mips32_env::print(const char* format, ...) {
    71   va_list ap;
    72   va_start(ap, format);
    73   output->vprint(format, ap);
    74   va_end(ap);
    75 }
    77 char* mips32_env::string_for_offset(intptr_t value) {
    78   stringStream st;
    79   if (!Universe::is_fully_initialized()) {
    80    st.print("%d", value);
    81    return st.as_string();
    82  }
    83   BarrierSet* bs = Universe::heap()->barrier_set();
    84   BarrierSet::Name bsn = bs->kind();
    86   if (bs->kind() == BarrierSet::CardTableModRef && (jbyte*) value == ((CardTableModRefBS*)(bs))->byte_map_base) {
    87     st.print("word_map_base");
    88   } else {
    89     st.print("%d", value);
    90   }
    91   return st.as_string();
    92 }
    94 char* mips32_env::string_for_constant(unsigned char* pc, intptr_t value, int is_decimal) {
    95   stringStream st;
    96   oop obj = NULL;
    97 #ifndef CORE
    98   if (code && (obj = code->embeddedOop_at(pc))!=NULL) {
    99     obj->print_value_on(&st);
   100   } else
   101 #endif
   102   {
   103     if (is_decimal == 1) {
   104       st.print("%d", value);
   105     } else {
   106       st.print("0x%lx", value);
   107     }
   108   }
   109   return st.as_string();
   110 }
   112 #define PRINT_NOP() \
   113   env->print("nop");
   115 #define PRINT_ORRI(OP) \
   116   env->print("%s %s, %s, 0x%x", OP, as_Register(Assembler::rt(insn))->name(), \
   117       as_Register(Assembler::rs(insn))->name(), \
   118       (short)Assembler::low16(insn) )
   120 #define PRINT_ORRL(OP) \
   121   env->print("%s %s, %s, ", OP, as_Register(Assembler::rs(insn))->name(), \
   122       as_Register(Assembler::rt(insn))->name()); \
   123   env->print_label( (intptr_t)start + 4 + ((short)Assembler::low16(insn)<<2) ) 
   125 #define PRINT_J(OP) \
   126   env->print("%s ", (char*)OP); \
   127   env->print_label( ( ( (intptr_t)start + 4 ) & 0xc0000000 ) | ( Assembler::low26(insn) << 2 ) ); \
   128   env->print("");
   130 #define PRINT_ORSL(OP) \
   131   env->print("%s %s, ", OP, as_Register(Assembler::rs(insn))->name()); \
   132   env->print_label( (intptr_t)start + 4 + (short)Assembler::low16(insn) ); \
   133   env->print("");
   135 #define PRINT_OROB(OP) \
   136   env->print("%s %s, 0x%x(%s)", OP, as_Register(Assembler::rt(insn))->name(), \
   137       (short)Assembler::low16(insn), \
   138       as_Register(Assembler::rs(insn))->name() )
   140 #define PRINT_OFOB(OP) \
   141   env->print("%s %s, 0x%x(%s)", OP, as_FloatRegister(Assembler::rt(insn))->name(), \
   142       (short)Assembler::low16(insn), \
   143       as_Register(Assembler::rs(insn))->name() )
   146 #define PRINT_ORRS(OP) \
   147   env->print("%s %s, %s, %d", OP, as_Register(Assembler::rd(insn))->name(), \
   148       as_Register(Assembler::rt(insn))->name(), \
   149       Assembler::sa(insn) )
   151 #define PRINT_ORRR(OP) \
   152   env->print("%s %s, %s, %s", OP, as_Register(Assembler::rd(insn))->name(), \
   153       as_Register(Assembler::rs(insn))->name(), \
   154       as_Register(Assembler::rt(insn))->name() )
   156 #define PRINT_ORRII(OP) \
   157   env->print("%s %s, %s, 0x%x, 0x%x", OP,as_Register(Assembler::rt(insn))->name(), \
   158       as_Register(Assembler::rs(insn))->name(), \
   159                         ((short)Assembler::low(insn, 11)), \
   160                         ((short)Assembler::low(insn, 6)) )
   162 #define PRINT_ORRRI_GSLDC2(OP) \
   163   env->print("%s %s, 0x%x(%s, %s)", OP, is_float?as_FloatRegister(Assembler::rt(insn))->name():as_Register(Assembler::rt(insn))->name(), \
   164       ((short)Assembler::low(insn, 11) >> 3), \
   165       as_Register(Assembler::rs(insn))->name(), \
   166       as_Register(Assembler::rd(insn))->name())
   168 #define PRINT_COP1X(OP) \
   169   env->print("%s %s, %s, %s, %s", OP, as_FloatRegister(Assembler::sa(insn))->name(), \
   170       as_FloatRegister(Assembler::rt(insn))->name(),  \
   171       as_FloatRegister(Assembler::rd(insn))->name(),  \
   172       as_FloatRegister(Assembler::rs(insn))->name())
   174 /*
   175  * "<< 17 >> 23 << 4" is short for "<< 17 >> 17 >> 6 << 4". vAddr = sign_extend(offset << 4 ) + GPR[base]
   176  * "<< 17 >> 17": sign-extending
   177  * ">> 6": offset pos
   178  * "<< 4": offset << 4
   179  */
   180 #define PRINT_ORRRI_GSLQ(OP) \
   181   env->print("%s %s, %s, %d(%s)", OP, as_Register((insn)&0x1f)->name(), \
   182       as_Register(Assembler::rt(insn))->name(), (Assembler::low(insn, 15) << 17 >> 23 << 4), \
   183       as_Register(Assembler::rs(insn))->name())
   185 #define PRINT_ORRR_2(OP) \
   186   env->print("%s %s, %s, %s", OP, as_Register(Assembler::rd(insn))->name(), \
   187       as_Register(Assembler::rt(insn))->name(), \
   188       as_Register(Assembler::rs(insn))->name() )
   190 #define PRINT_ORS(OP) \
   191   env->print("%s %s", OP, as_Register(Assembler::rs(insn))->name())
   193 #define PRINT_ORD(OP) \
   194   env->print("%s %s", OP, as_Register(Assembler::rd(insn))->name())
   196 #define PRINT_ORR(OP) \
   197   env->print("%s %s, %s", OP, as_Register(Assembler::rs(insn))->name(), \
   198       as_Register(Assembler::rt(insn))->name())
   200 #define PRINT_ORR_2(OP) \
   201   env->print("%s %s, %s", OP, as_Register(Assembler::rt(insn))->name(), \
   202       as_Register(Assembler::rd(insn))->name())
   204 #define PRINT_FLOAT(OP) \
   205   env->print("%s.%s %s, %s, %s", OP, fmt, as_FloatRegister(Assembler::sa(insn))->name(), \
   206       as_FloatRegister(Assembler::rd(insn))->name(),  \
   207       as_FloatRegister(Assembler::rt(insn))->name() )
   209 #define PRINT_CVT(OP) \
   210   env->print("%s.%s %s, %s", OP, fmt, as_FloatRegister(Assembler::sa(insn))->name(), \
   211       as_FloatRegister(Assembler::rd(insn))->name() )
   213 #define PRINT_C_COND_FMT(OP) \
   214   env->print("%s.%s $fcc%d, %s, %s", OP, fmt, fcc, as_FloatRegister(Assembler::rt(insn))->name(), \
   215       as_FloatRegister(Assembler::rd(insn))->name())
   217 static const char* fmt_str(int fmt) {
   218   switch(fmt) {
   219   case Assembler::single_fmt:
   220     return "s";
   221   case Assembler::double_fmt:
   222     return "d";
   223   case Assembler::word_fmt:
   224     return "w";
   225   case Assembler::long_fmt:
   226     return "l";
   227   case Assembler::ps_fmt:
   228     return "ps";
   229   }
   231   return "";
   232 }
   234 address Disassembler::decode_instruction(address start, DisassemblerEnv* env) {
   235   int insn = *(int*)start;
   236   int opcode = Assembler::opcode(insn);
   237   int special;
   238   const char *fmt;
   239   int flag = 0;
   240   int fcc = 0;
   242   if (insn == 0)
   243   {
   244     PRINT_NOP();
   245     return start+4;
   246   }
   248   switch(opcode) {
   249     // case op
   250     // case special_op
   251     // case regimm_op
   252     // case cop0_op not
   253     // case cop1_op
   254     // case cop2_op not
   255     // case cop1x_op
   256     // case special2_op
   257     // case special3_op
   258     // case gs_lwc2_op
   259     // case gs_ldc2_op
   260     // case gs_swc2_op
   261     // case gs_sdc2_op
   262     case Assembler::j_op:
   263     case Assembler::jal_op:
   264       PRINT_J(Assembler::ops_name[opcode]);
   265       break;
   266     case Assembler::beq_op:
   267     case Assembler::bne_op:
   268     case Assembler::blez_op:
   269     case Assembler::bgtz_op:
   270       PRINT_ORRL(Assembler::ops_name[opcode]);
   271       break;
   272     case Assembler::addi_op:
   273     case Assembler::addiu_op:
   274     case Assembler::slti_op:
   275     case Assembler::sltiu_op:
   276     case Assembler::ori_op:
   277     case Assembler::andi_op:
   278     case Assembler::xori_op:
   279     case Assembler::daddi_op:
   280     case Assembler::daddiu_op:
   281       PRINT_ORRI(Assembler::ops_name[opcode]);
   282       break;
   283     case Assembler::lui_op:
   284       env->print("lui %s, 0x%x", as_Register(Assembler::rt(insn))->name(), (short)Assembler::low16(insn) ); \
   285       break;
   286     case Assembler::beql_op:
   287     case Assembler::bnel_op:
   288     case Assembler::blezl_op:
   289     case Assembler::bgtzl_op:
   290       PRINT_ORRL(Assembler::ops_name[opcode]);
   291       break;
   292     case Assembler::ldl_op:
   293     case Assembler::ldr_op:
   294     case Assembler::lb_op:
   295     case Assembler::lh_op:
   296     case Assembler::lwl_op:
   297     case Assembler::lw_op:
   298     case Assembler::lbu_op:
   299     case Assembler::lhu_op:
   300     case Assembler::lwr_op:
   301     case Assembler::lwu_op:
   302     case Assembler::sb_op:
   303     case Assembler::sh_op:
   304     case Assembler::swl_op:
   305     case Assembler::sw_op:
   306     case Assembler::sdl_op:
   307     case Assembler::sdr_op:
   308     case Assembler::swr_op:
   309     case Assembler::ll_op:
   310     case Assembler::lld_op:
   311     case Assembler::ld_op:
   312     case Assembler::sc_op:
   313     case Assembler::scd_op:
   314     case Assembler::sd_op:
   315       PRINT_OROB(Assembler::ops_name[opcode]);
   316       break;
   317     case Assembler::sdc1_op:
   318     case Assembler::ldc1_op:
   319     case Assembler::lwc1_op:
   320     case Assembler::swc1_op:
   321       PRINT_OFOB(Assembler::ops_name[opcode]);
   322       break;
   324     case Assembler::special_op: {
   325       special = Assembler::special(insn);
   326       switch(special) {
   327         case Assembler::sll_op:
   328           PRINT_ORRS(Assembler::special_name[special]);
   329           break;
   330         case Assembler::srl_op:
   331           if (insn & (1 << 21)) {
   332              PRINT_ORRS("rotr");
   333           } else {
   334              PRINT_ORRS(Assembler::special_name[special]);
   335           }
   336           break;
   337         case Assembler::sra_op:
   338           PRINT_ORRS(Assembler::special_name[special]);
   339           break;
   340         case Assembler::dsll_op:
   341           PRINT_ORRS(Assembler::special_name[special]);
   342           break;
   343         case Assembler::dsrl_op:
   344           if (insn & (1 << 21)) {
   345              PRINT_ORRS("drotr");
   346           } else {
   347              PRINT_ORRS(Assembler::special_name[special]);
   348           }
   349           break;
   350         case Assembler::dsra_op:
   351           PRINT_ORRS(Assembler::special_name[special]);
   352           break;
   353         case Assembler::dsll32_op:
   354           PRINT_ORRS(Assembler::special_name[special]);
   355           break;
   356         case Assembler::dsrl32_op:
   357           if (insn & (1 << 21)) {
   358              PRINT_ORRS("drotr32");
   359           } else {
   360              PRINT_ORRS(Assembler::special_name[special]);
   361           }
   362           break;
   363         case Assembler::dsra32_op:
   364           PRINT_ORRS(Assembler::special_name[special]);
   365           break;
   367         case Assembler::movci_op:
   368           flag = insn & (1 << 16);
   369           if (flag) {
   370             env->print("movt %s, %s", as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rs(insn))->name());
   371           } else {
   372             env->print("movf %s, %s", as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rs(insn))->name());
   373           }
   374           break;
   376         case Assembler::sllv_op:
   377           PRINT_ORRR_2(Assembler::special_name[special]);
   378           break;
   379         case Assembler::srlv_op:
   380           if (insn & (1 << 6)) {
   381              PRINT_ORRR_2("rotrv");
   382           } else {
   383              PRINT_ORRR_2(Assembler::special_name[special]);
   384           }
   385           break;
   386         case Assembler::srav_op:
   387           PRINT_ORRR_2(Assembler::special_name[special]);
   388           break;
   389         case Assembler::dsllv_op:
   390           PRINT_ORRR_2(Assembler::special_name[special]);
   391           break;
   392         case Assembler::dsrlv_op:
   393           if (insn & (1 << 6)) {
   394              PRINT_ORRR_2("drotrv");
   395           } else {
   396              PRINT_ORRR_2(Assembler::special_name[special]);
   397           }
   398           break;
   399         case Assembler::dsrav_op:
   400           PRINT_ORRR_2(Assembler::special_name[special]);
   401           break;
   403         case Assembler::jr_op:
   404         case Assembler::jalr_op:
   405         case Assembler::mthi_op:
   406         case Assembler::mtlo_op:
   407           PRINT_ORS(Assembler::special_name[special]);
   408           break;
   410         case Assembler::syscall_op:
   411         case Assembler::break_op:
   412           env->print("%s 0x%x\n", Assembler::special_name[special], bitfield(insn, 6, 20)>>10);
   413           break;
   415         case Assembler::sync_op:
   416           env->print("sync\n");
   417           break;
   419         case Assembler::mfhi_op:
   420         case Assembler::mflo_op:
   421           PRINT_ORD(Assembler::special_name[special]);
   422           break;
   424         case Assembler::mult_op:
   425         case Assembler::multu_op:
   426         case Assembler::div_op:
   427         case Assembler::divu_op:
   428         case Assembler::dmult_op:
   429         case Assembler::dmultu_op:
   430         case Assembler::ddiv_op:
   431         case Assembler::ddivu_op:
   432           PRINT_ORR(Assembler::special_name[special]);
   433           break;
   435         case Assembler::add_op:
   436         case Assembler::addu_op:
   437         case Assembler::sub_op:
   438         case Assembler::subu_op:
   439         case Assembler::and_op:
   440         case Assembler::or_op:
   441         case Assembler::xor_op:
   442         case Assembler::nor_op:
   443         case Assembler::slt_op:
   444         case Assembler::sltu_op:
   445         case Assembler::movz_op:
   446         case Assembler::movn_op:
   447         case Assembler::dadd_op:
   448         case Assembler::daddu_op:
   449         case Assembler::dsub_op:
   450         case Assembler::dsubu_op:
   451           PRINT_ORRR(Assembler::special_name[special]);
   452           break;
   454         case Assembler::tge_op:
   455         case Assembler::tgeu_op:
   456         case Assembler::tlt_op:
   457         case Assembler::tltu_op:
   458         case Assembler::teq_op:
   459         case Assembler::tne_op:
   460           env->print("%s 0x%x, %s, %s\n", Assembler::special_name[special], bitfield(insn, 6, 10),
   461               as_Register(Assembler::rs(insn))->name(),
   462               as_Register(Assembler::rt(insn))->name() );
   463           break;
   465         default:
   466           //Unimplemented();
   467           env->print("0x%x\n", insn);
   468       }
   469       break;
   470     } //special_op
   472     case Assembler::regimm_op: {
   473       special  = Assembler::rt(insn);
   474       switch(special) {
   475         case Assembler::bltz_op:
   476         case Assembler::bgez_op:
   477         case Assembler::bltzl_op:
   478         case Assembler::bgezl_op:
   479         case Assembler::bltzal_op:
   480         case Assembler::bgezal_op:
   481         case Assembler::bltzall_op:
   482         case Assembler::bgezall_op:
   483           env->print("[%lx]%s %s, ", *(int *)start, Assembler::regimm_name[special], as_Register(Assembler::rs(insn))->name());
   484           env->print_label( (intptr_t)start + 4 + 4 * (short)Assembler::low16(insn) );
   485           break;
   487         case Assembler::tgei_op:
   488         case Assembler::tgeiu_op:
   489         case Assembler::tlti_op:
   490         case Assembler::tltiu_op:
   491         case Assembler::teqi_op:
   492         case Assembler::tnei_op:
   493           env->print("%s %s, %d\n", Assembler::regimm_name[special], 
   494               as_Register(Assembler::rs(insn))->name(),
   495               (short)Assembler::low16(insn));
   496           break;
   498         default:
   499           //Unimplemented();
   500           env->print("0x%x\n", insn);
   501       }
   502       break;
   503     } //regimm_op
   505     case Assembler::cop0_op: {
   506       //Unimplemented();
   507       break;
   508     } //cop0_op
   510     case Assembler::cop1_op: {
   511       special = Assembler::rs(insn);
   512       switch(special) {
   513         case Assembler::mfc1_op:
   514           env->print("mfc1 %s, %s", as_Register(Assembler::rt(insn))->name(), as_FloatRegister(Assembler::rd(insn))->name());
   515           break;
   516         case Assembler::mtc1_op:
   517           env->print("mtc1 %s, %s", as_Register(Assembler::rt(insn))->name(), as_FloatRegister(Assembler::rd(insn))->name());
   518           break;
   519         case Assembler::cfc1_op:
   520           PRINT_ORR_2("cfc1");
   521           break;
   522         case Assembler::ctc1_op:
   523           PRINT_ORR_2("ctc1");
   524           break;
   525         case Assembler::dmfc1_op:
   526           env->print("dmfc1 %s, %s", as_Register(Assembler::rt(insn))->name(), as_FloatRegister(Assembler::rd(insn))->name());
   527           break;
   528         case Assembler::dmtc1_op:
   529           PRINT_ORR_2("dmtc1");
   530           env->print("dmtc1 %s, %s", as_Register(Assembler::rt(insn))->name(), as_FloatRegister(Assembler::rd(insn))->name());
   531           break;
   533         case Assembler::bc1f_op:
   534           special = Assembler::rt(insn);
   535           fcc = (special >> 2) & 0x7;
   536           special = special & 0x3;
   537           switch(special) {
   538             case Assembler::bcf_op:
   539               env->print("bc1f $fcc%d ", fcc);
   540               env->print_label( (intptr_t)start + 4 + (short)Assembler::low16(insn) );
   541               //env->print("\n");
   542               break;
   543             case Assembler::bcfl_op:
   544               env->print("bc1fl $fcc%d ", fcc);
   545               env->print_label( (intptr_t)start + 4 + (short)Assembler::low16(insn) );
   546               //env->print("\n");
   547               break;
   548             case Assembler::bct_op:
   549               env->print("bc1t $fcc%d ", fcc);
   550               env->print_label( (intptr_t)start + 4 + (short)Assembler::low16(insn) );
   551               //env->print("\n");
   552               break;
   553             case Assembler::bctl_op:
   554               env->print("bc1tl $fcc%d ", fcc);
   555               env->print_label( (intptr_t)start + 4 + (short)Assembler::low16(insn) );
   556               //env->print("\n");
   557               break;
   558             default:
   559               //Unimplemented();
   560               env->print("0x%x\n", insn);
   561           }
   562           break;
   563         case Assembler::single_fmt:
   564         case Assembler::double_fmt:
   565         case Assembler::word_fmt:
   566         case Assembler::long_fmt:
   567           fmt = fmt_str(special);
   568           special = Assembler::special(insn);
   569           switch(special) {
   570             case Assembler::fadd_op:
   571             case Assembler::fsub_op:
   572             case Assembler::fmul_op:
   573             case Assembler::fdiv_op:
   574             case Assembler::fsqrt_op:
   575             case Assembler::fabs_op:
   576             case Assembler::fmov_op:
   577             case Assembler::fneg_op:
   578             case Assembler::froundl_op:
   579             case Assembler::ftruncl_op:
   580             case Assembler::fceill_op:
   581             case Assembler::ffloorl_op:
   582             case Assembler::froundw_op:
   583             case Assembler::ftruncw_op:
   584             case Assembler::fceilw_op:
   585             case Assembler::ffloorw_op:
   586               PRINT_FLOAT(Assembler::cop1_name[special]);
   587               break;
   589             case Assembler::fcvts_op:
   590               PRINT_CVT("cvt.s");
   591               break;
   592             case Assembler::fcvtd_op:
   593               PRINT_CVT("cvt.d");
   594               break;
   595             case Assembler::fcvtw_op:
   596               PRINT_CVT("cvt.w");
   597               break;
   598             case Assembler::fcvtl_op:
   599               PRINT_CVT("cvt.l");
   600               break;
   601             case Assembler::fcvtps_op:
   602               assert(Assembler::rs(insn) == Assembler::single_fmt, "");
   603               env->print("cvt.ps.s %s, %s, %s", as_FloatRegister(Assembler::sa(insn))->name(), as_FloatRegister(Assembler::rd(insn))->name(), as_FloatRegister(Assembler::rt(insn))->name());
   604               break;
   605             case Assembler::f_cond:
   606             case Assembler::un_cond:
   607             case Assembler::eq_cond:
   608             case Assembler::ueq_cond:
   609             case Assembler::olt_cond:
   610             case Assembler::ult_cond:
   611             case Assembler::ole_cond:
   612             case Assembler::ule_cond:
   613             case Assembler::sf_cond:
   614             case Assembler::ngle_cond:
   615             case Assembler::seq_cond:
   616             case Assembler::ngl_cond:
   617             case Assembler::lt_cond:
   618             case Assembler::nge_cond:
   619             case Assembler::le_cond:
   620             case Assembler::ngt_cond:
   621               fcc = (insn >> 8) & 0x7;
   622               PRINT_C_COND_FMT(Assembler::cop1_name[special]);
   623               break;
   624             default:
   625               //tty->print_cr("0x%x(%x)", insn, opcode);
   626               //Unimplemented();
   627               env->print("0x%x\n", insn);
   628           }
   629           break;
   630         case Assembler::ps_fmt:
   631           fmt = fmt_str(special);
   632           special = Assembler::special(insn);
   633           switch(special) {
   634             case Assembler::fadd_op:
   635             case Assembler::fsub_op:
   636             case Assembler::fmul_op:
   637             case Assembler::fabs_op:
   638             case Assembler::fmov_op:
   639             case Assembler::fneg_op:
   640               PRINT_FLOAT(Assembler::cop1_name[special]);
   641               break;
   642             default:
   643               //tty->print_cr("0x%x(%x)", insn, opcode);
   644               //Unimplemented();
   645               env->print("0x%x\n", insn);
   646           }
   647       }
   648       break;
   649     } //cop1_op
   651     case Assembler::gs_cop2_op: {
   652       //Unimplemented();
   653       env->print("0x%x\n", insn);
   654       break;
   655     } //gs_cop2_op
   657     case Assembler::cop1x_op: {
   658       special = Assembler::special(insn);
   659       switch(special) {
   660         case Assembler::madd_s_op:
   661         case Assembler::madd_d_op:
   662         case Assembler::madd_ps_op:
   663         case Assembler::msub_s_op:
   664         case Assembler::msub_d_op:
   665         case Assembler::msub_ps_op:
   666         case Assembler::nmadd_s_op:
   667         case Assembler::nmadd_d_op:
   668         case Assembler::nmadd_ps_op:
   669         case Assembler::nmsub_s_op:
   670         case Assembler::nmsub_d_op:
   671         case Assembler::nmsub_ps_op:
   672           PRINT_COP1X(Assembler::cop1x_name[Assembler::special(insn)]);
   673           break;
   674       }
   675       break;
   676     } //cop1x_op
   678     case Assembler::special2_op: {
   679       special = Assembler::special(insn);
   680       switch(special) {
   681         case Assembler::mul_op:
   682         case Assembler::gsdiv_op:
   683         case Assembler::gsddiv_op:
   684         case Assembler::gsmod_op:
   685         case Assembler::gsdmod_op:
   686         case Assembler::gsdmult_op:
   687           PRINT_ORRR(Assembler::special2_name[special]);
   688           break;
   689         case Assembler::madd_op:
   690         case Assembler::msub_op:
   691           PRINT_ORR(Assembler::special2_name[special]);
   692           break;
   693         case Assembler::gs0x03_op:
   694           if ( (insn & (0x1f << 6)) == (18 << 6) ) {
   695              PRINT_ORR("gsandn");
   696           }
   697           break;
   698         case Assembler::gs0x06_op:
   699           if ( (insn & (0x1f << 6)) == (18 << 6) ) {
   700              PRINT_ORR("gsorn");
   701           }
   702           break;
   703       }
   704       break;
   705     } //special2_op
   707     case Assembler::special3_op: {
   708       special = Assembler::special(insn);
   709     int msb = (insn>>11) & 0x1f;
   710     int lsb = (insn>>6)  & 0x1f;
   711       switch(special) {
   712         case Assembler::ext_op:
   713           env->print("ext, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(),
   714           as_Register(Assembler::rs(insn))->name(), lsb, msb + 1);
   715           break;
   716         case Assembler::dext_op:
   717           env->print("dext, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(), 
   718           as_Register(Assembler::rs(insn))->name(), lsb, msb + 1);
   719           break;
   720         case Assembler::ins_op:
   721           env->print("ins, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(), 
   722           as_Register(Assembler::rs(insn))->name(), lsb, msb - lsb + 1);
   723           break;
   724         case Assembler::dinsm_op:
   725           env->print("dinsm, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(), 
   726           as_Register(Assembler::rs(insn))->name(), lsb, msb - lsb + 33);
   727           break;
   728         case Assembler::dinsu_op:
   729           env->print("dinsu, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(), 
   730           as_Register(Assembler::rs(insn))->name(), lsb + 32, msb - lsb + 1);
   731           break;
   732         case Assembler::dins_op:
   733           env->print("dins, %s, %s, 0x%x, 0x%x", as_Register(Assembler::rt(insn))->name(), 
   734           as_Register(Assembler::rs(insn))->name(), lsb, msb - lsb + 1);
   735           break;
   736         case Assembler::re1_op: {
   737           int dsp = (insn>>6)&0x1f;
   738           bool op_is_imm = false;
   739           switch(dsp) {
   740             case Assembler::repl_qb_op:
   741             case Assembler::repl_ph_op:
   742               op_is_imm = true;
   743             case Assembler::absq_s_qb_op:
   744             case Assembler::replv_qb_op:
   745             case Assembler::absq_s_ph_op:
   746             case Assembler::replv_ph_op:
   747             case Assembler::absq_s_w_op:
   748             case Assembler::bitrev_op: {
   749               const char* dsp_names[] = {
   750                 "", "absq_s.qb", "repl.qb", "replv.qb", "precequ.ph.qbl", "precequ.ph.qbr", "precequ.ph.qbla", "precequ.ph.qbra",
   751                 "", "absq_s.ph", "repl.ph", "replv.ph", "preceq.w.phl",   "preceq.w.phr",   "",                "",
   752                 "", "absq_s.w",  "",        "",         "",               "",               "",                "",
   753                 "", "",          "",        "bitrev",   "preceu.ph.qbl",  "preceu.ph.qbr",  "preceu.ph.qbla",  "preceu.ph.qbra"
   754               };
   755               if (op_is_imm)
   756                 env->print("%s %s, 0x%x", dsp_names[dsp], as_Register(Assembler::rd(insn))->name(), (insn>>16)&0x3ff);
   757               else
   758                 env->print("%s %s, %s", dsp_names[dsp], as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rt(insn))->name());
   759               break;
   760             }
   761             default:
   762               break;
   763           }
   764           break;
   765         } //Assembler::re1_op
   766         case Assembler::re2_op: {
   767           int dsp = (insn>>6)&0x1f;
   768           bool op_is_imm = false;
   769           switch(dsp) {
   770             case Assembler::repl_ob_op:
   771             case Assembler::repl_qh_op:
   772               op_is_imm = true;
   773             case Assembler::replv_ob_op:
   774             case Assembler::absq_s_qh_op:
   775             case Assembler::replv_qh_op:
   776             case Assembler::absq_s_pw_op:
   777             case Assembler::repl_pw_op:
   778             case Assembler::replv_pw_op: {
   780               const char* dsp_names[] = {
   781                 "", "",          "",        "",         "",              "",              "",                "",
   782                 "", "absq_s.qh", "repl.qh", "replv.qh", "preceq.pw.qhl", "preceq.pw.qhr", "preceq.pw.phla ", "preceq.pw.phra",
   783                 "", "absq_s.pw", "repl.pw", "replv.pw", "preceq.l.pwl",  "preceq.l.pwr",  "",                "",
   784                 "", "",          "",        "",         "preceu.qh.obl", "preceu.qh.obr", "preceu.qh.obla",  "preceu.qh.obra"
   785               };
   786               if (op_is_imm)
   787                 env->print("%s %s, 0x%x", dsp_names[dsp], as_Register(Assembler::rd(insn))->name(), (insn>>16)&0x3ff);
   788               else
   789                 env->print("%s %s, %s", dsp_names[dsp], as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rt(insn))->name());
   790               break;
   791             }
   792             default:
   793               break;
   794           }
   795           break;
   796         } //Assembler::re2_op
   797         case Assembler::bshfl_op:
   798           if ( (insn & (0x1f << 6)) == (Assembler::seb_op << 6) ) {
   799              env->print("seb, %s, %s", as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rt(insn))->name());
   800           } else if ( (insn & (0x1f << 6)) == (Assembler::seh_op << 6) ) {
   801              env->print("seh, %s, %s", as_Register(Assembler::rd(insn))->name(), as_Register(Assembler::rt(insn))->name());
   802           } else {
   803              env->print("Invalid instruction");
   804           }
   805           break;
   806      }
   807       break;
   808     } //special3_op
   810     case Assembler::gs_lwc2_op: {
   811       if ((Assembler::special(insn) & 0x20) != 0 ) {
   812         //gslq rq, rt, offset(base)
   813         if ( (insn & (1 << 15)) == 0) {
   814           special = Assembler::gslq_op;
   815           PRINT_ORRRI_GSLQ(Assembler::gs_lwc2_name[special]);
   816         } else {
   817           //gsLQC1
   818           env->print("gs_lwc2_op 0x%x\n", insn);
   819         }
   820       } else {
   821         env->print("gs_lwc2_op 0x%x\n", insn);
   822       }
   823       break;
   824     } //gs_lwc2_op
   826     case Assembler::gs_ldc2_op: {
   827       special = Assembler::special(insn) & 0x7;
   828       bool is_float = false;
   829       switch(special) {
   830         case Assembler::gslbx_op:
   831         case Assembler::gslhx_op:
   832         case Assembler::gslwx_op:
   833         case Assembler::gsldx_op:
   834           PRINT_ORRRI_GSLDC2(Assembler::gs_ldc2_name[special]);
   835           break;
   836         case Assembler::gslwxc1_op:
   837         case Assembler::gsldxc1_op:
   838           is_float = true;
   839           PRINT_ORRRI_GSLDC2(Assembler::gs_ldc2_name[special]);
   840           break;
   841         default:
   842           break;
   843       }
   844       break;
   845     } //gs_ldc2_op
   847     case Assembler::gs_swc2_op: {
   848       if ((Assembler::special(insn) & 0x20) != 0 ) {
   849         //gssq rq, rt, offset(base)
   850         if ( (insn & (1 << 15)) == 0) {
   851           //gsSQ
   852           special = Assembler::gssq_op;
   853           PRINT_ORRRI_GSLQ(Assembler::gs_swc2_name[special]);
   854         } else {
   855           //gsSQC1
   856           env->print("0x%x\n", insn);
   857         }
   858       } else {
   859         env->print("0x%x\n", insn);
   860       }
   861       break;
   862     } //gs_swc2_op
   864     case Assembler::gs_sdc2_op: {
   865       special = Assembler::special(insn) & 0x7;
   866       bool is_float = false;
   867       switch(special) {
   868         case Assembler::gssbx_op:
   869         case Assembler::gsshx_op:
   870         case Assembler::gsswx_op:
   871         case Assembler::gssdx_op:
   872           PRINT_ORRRI_GSLDC2(Assembler::gs_sdc2_name[special]);
   873           break;
   874         case Assembler::gsswxc1_op:
   875         case Assembler::gssdxc1_op:
   876           is_float = true;
   877           PRINT_ORRRI_GSLDC2(Assembler::gs_sdc2_name[special]);
   878           break;
   879         default:
   880           break;
   881       }
   882       break;
   883     } //gs_sdc2_op
   885     default:
   886       //tty->print_cr("0x%x(%x)", insn, opcode);
   887       //Unimplemented();
   888       env->print("0x%x\n", insn);
   889   }
   891   return start+4;
   892 }
   894 /*
   895 void Disassembler::decode(address start, address end, outputStream* st, CodeComments c) {
   896   if (!load_library())  return;
   897   decode_env env(CodeCache::find_blob_unsafe(start), st, c);
   898   env.decode_instructions(start, end);
   899 }
   900 */
   902 void Disassembler::decode(CodeBlob* cb, outputStream* st) {
   903 #ifndef CORE
   904   st = st ? st : tty;
   905   st->print_cr("Decoding CodeBlob " INTPTR_FORMAT, cb);
   906   decode(cb->content_begin(), cb->content_end(), st);
   907 #endif
   908 }
   911 void Disassembler::decode(u_char* begin, u_char* end, outputStream* st) {
   912   st = st ? st : tty;
   914   const int show_bytes = false; // for disassembler debugging
   916   mips32_env env(NULL, st);
   917   unsigned char*  p = (unsigned char*) begin;
   918   CodeBlob* cb = CodeCache::find_blob_unsafe(begin);
   919   while (p < (unsigned char*) end) {
   920   if (cb != NULL) {
   921     cb->print_block_comment(st, (unsigned char*)(p - cb->content_begin()));
   922   }
   924     unsigned char* p0 = p;
   925     st->print("   "INTPTR_FORMAT ": ", p);
   926     p = decode_instruction(p, &env);
   927     if (show_bytes) {
   928       st->print("\t\t\t");
   929       while (p0 < p) st->print("%x ", *p0++);
   930     }
   931     st->cr();
   932   }
   933 }
   936 void Disassembler::decode(nmethod* nm, outputStream* st) {
   937 #ifndef CORE
   938   st = st ? st : tty;
   940   st->print_cr("Decoding compiled method " INTPTR_FORMAT ":", nm);
   941   st->print("Code:");
   942   st->cr();
   944   mips32_env env(nm, st);
   946   // Print constant table.
   947   if (nm->consts_size() > 0) {
   948     nm->print_nmethod_labels(st, nm->consts_begin());
   949     int offset = 0;
   950     for (address p = nm->consts_begin(); p < nm->consts_end(); p += 4, offset += 4) {
   951       if ((offset % 8) == 0) {
   952         st->print_cr("  " PTR_FORMAT " (offset: %4d): " PTR32_FORMAT "   " PTR64_FORMAT, p, offset, *((int32_t*) p), *((int64_t*) p));
   953       } else {
   954         st->print_cr("  " PTR_FORMAT " (offset: %4d): " PTR32_FORMAT,                    p, offset, *((int32_t*) p));
   955       }
   956     }
   957   }
   959 #ifdef COMPILER1
   960   unsigned char* p = nm->code_begin();
   961 #else
   962   unsigned char* p = nm->content_begin();
   963 #endif
   964   unsigned char* end = nm->content_end();
   965   while (p < end) {
   966     if (p == nm->entry_point())             st->print_cr("[Entry Point]");
   967     if (p == nm->verified_entry_point())    st->print_cr("[Verified Entry Point]");
   968     if (p == nm->exception_begin())         st->print_cr("[Exception Handler]");
   969     if (p == nm->stub_begin())              st->print_cr("[Stub Code]");
   970     if (p == nm->consts_begin())            st->print_cr("[Constants]");
   971     nm->print_block_comment(st, (unsigned char*)(p - nm->content_begin()));
   972     unsigned char* p0 = p;
   973     st->print("  " INTPTR_FORMAT ": ", p);
   974     p = decode_instruction(p, &env);
   975     nm->print_code_comment_on(st, 40, p0, p);
   976     st->cr();
   977     // Output pc bucket ticks if we have any
   978     address bucket_pc = FlatProfiler::bucket_start_for(p);
   979     if (bucket_pc != NULL && bucket_pc > p0 && bucket_pc <= p) {
   980       int bucket_count = FlatProfiler::bucket_count_for(bucket_pc);
   981       tty->print_cr("[%d]", bucket_count);
   982     }
   983   }
   984 #endif
   985 }

mercurial