Path: blob/aarch64-shenandoah-jdk8u272-b10/hotspot/src/share/vm/c1/c1_InstructionPrinter.cpp
32285 views
/*1* Copyright (c) 1999, 2014, Oracle and/or its affiliates. All rights reserved.2* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.3*4* This code is free software; you can redistribute it and/or modify it5* under the terms of the GNU General Public License version 2 only, as6* published by the Free Software Foundation.7*8* This code is distributed in the hope that it will be useful, but WITHOUT9* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or10* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License11* version 2 for more details (a copy is included in the LICENSE file that12* accompanied this code).13*14* You should have received a copy of the GNU General Public License version15* 2 along with this work; if not, write to the Free Software Foundation,16* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.17*18* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA19* or visit www.oracle.com if you need additional information or have any20* questions.21*22*/2324#include "precompiled.hpp"25#include "c1/c1_InstructionPrinter.hpp"26#include "c1/c1_ValueStack.hpp"27#include "ci/ciArray.hpp"28#include "ci/ciInstance.hpp"29#include "ci/ciObject.hpp"303132#ifndef PRODUCT3334const char* InstructionPrinter::basic_type_name(BasicType type) {35switch (type) {36case T_BOOLEAN: return "boolean";37case T_BYTE : return "byte";38case T_CHAR : return "char";39case T_SHORT : return "short";40case T_INT : return "int";41case T_LONG : return "long";42case T_FLOAT : return "float";43case T_DOUBLE : return "double";44case T_ARRAY : return "array";45case T_OBJECT : return "object";46default : return "???";47}48}495051const char* InstructionPrinter::cond_name(If::Condition cond) {52switch (cond) {53case If::eql: return "==";54case If::neq: return "!=";55case If::lss: return "<";56case If::leq: return "<=";57case If::gtr: return ">";58case If::geq: return ">=";59case If::aeq: return "|>=|";60case If::beq: return "|<=|";61}62ShouldNotReachHere();63return NULL;64}656667const char* InstructionPrinter::op_name(Bytecodes::Code op) {68switch (op) {69// arithmetic ops70case Bytecodes::_iadd : // fall through71case Bytecodes::_ladd : // fall through72case Bytecodes::_fadd : // fall through73case Bytecodes::_dadd : return "+";74case Bytecodes::_isub : // fall through75case Bytecodes::_lsub : // fall through76case Bytecodes::_fsub : // fall through77case Bytecodes::_dsub : return "-";78case Bytecodes::_imul : // fall through79case Bytecodes::_lmul : // fall through80case Bytecodes::_fmul : // fall through81case Bytecodes::_dmul : return "*";82case Bytecodes::_idiv : // fall through83case Bytecodes::_ldiv : // fall through84case Bytecodes::_fdiv : // fall through85case Bytecodes::_ddiv : return "/";86case Bytecodes::_irem : // fall through87case Bytecodes::_lrem : // fall through88case Bytecodes::_frem : // fall through89case Bytecodes::_drem : return "%";90// shift ops91case Bytecodes::_ishl : // fall through92case Bytecodes::_lshl : return "<<";93case Bytecodes::_ishr : // fall through94case Bytecodes::_lshr : return ">>";95case Bytecodes::_iushr: // fall through96case Bytecodes::_lushr: return ">>>";97// logic ops98case Bytecodes::_iand : // fall through99case Bytecodes::_land : return "&";100case Bytecodes::_ior : // fall through101case Bytecodes::_lor : return "|";102case Bytecodes::_ixor : // fall through103case Bytecodes::_lxor : return "^";104}105return Bytecodes::name(op);106}107108109bool InstructionPrinter::is_illegal_phi(Value v) {110Phi* phi = v ? v->as_Phi() : NULL;111if (phi && phi->is_illegal()) {112return true;113}114return false;115}116117118bool InstructionPrinter::is_phi_of_block(Value v, BlockBegin* b) {119Phi* phi = v ? v->as_Phi() : NULL;120return phi && phi->block() == b;121}122123124void InstructionPrinter::print_klass(ciKlass* klass) {125klass->name()->print_symbol_on(output());126}127128129void InstructionPrinter::print_object(Value obj) {130ValueType* type = obj->type();131if (type->as_ObjectConstant() != NULL) {132ciObject* value = type->as_ObjectConstant()->value();133if (value->is_null_object()) {134output()->print("null");135} else if (!value->is_loaded()) {136output()->print("<unloaded object " INTPTR_FORMAT ">", p2i(value));137} else {138output()->print("<object " INTPTR_FORMAT " klass=", p2i(value->constant_encoding()));139print_klass(value->klass());140output()->print(">");141}142} else if (type->as_InstanceConstant() != NULL) {143ciInstance* value = type->as_InstanceConstant()->value();144if (value->is_loaded()) {145output()->print("<instance " INTPTR_FORMAT " klass=", p2i(value->constant_encoding()));146print_klass(value->klass());147output()->print(">");148} else {149output()->print("<unloaded instance " INTPTR_FORMAT ">", p2i(value));150}151} else if (type->as_ArrayConstant() != NULL) {152output()->print("<array " INTPTR_FORMAT ">", p2i(type->as_ArrayConstant()->value()->constant_encoding()));153} else if (type->as_ClassConstant() != NULL) {154ciInstanceKlass* klass = type->as_ClassConstant()->value();155if (!klass->is_loaded()) {156output()->print("<unloaded> ");157}158output()->print("class ");159print_klass(klass);160} else if (type->as_MethodConstant() != NULL) {161ciMethod* m = type->as_MethodConstant()->value();162output()->print("<method %s.%s>", m->holder()->name()->as_utf8(), m->name()->as_utf8());163} else {164output()->print("???");165}166}167168169void InstructionPrinter::print_temp(Value value) {170output()->print("%c%d", value->type()->tchar(), value->id());171}172173174void InstructionPrinter::print_field(AccessField* field) {175print_value(field->obj());176output()->print("._%d", field->offset());177}178179180void InstructionPrinter::print_indexed(AccessIndexed* indexed) {181print_value(indexed->array());182output()->put('[');183print_value(indexed->index());184output()->put(']');185if (indexed->length() != NULL) {186output()->put('(');187print_value(indexed->length());188output()->put(')');189}190}191192193void InstructionPrinter::print_monitor(AccessMonitor* monitor) {194output()->print("monitor[%d](", monitor->monitor_no());195print_value(monitor->obj());196output()->put(')');197}198199200void InstructionPrinter::print_op2(Op2* instr) {201print_value(instr->x());202output()->print(" %s ", op_name(instr->op()));203print_value(instr->y());204}205206207void InstructionPrinter::print_value(Value value) {208if (value == NULL) {209output()->print("NULL");210} else {211print_temp(value);212}213}214215216void InstructionPrinter::print_instr(Instruction* instr) {217instr->visit(this);218}219220221void InstructionPrinter::print_stack(ValueStack* stack) {222int start_position = output()->position();223if (stack->stack_is_empty()) {224output()->print("empty stack");225} else {226output()->print("stack [");227for (int i = 0; i < stack->stack_size();) {228if (i > 0) output()->print(", ");229output()->print("%d:", i);230Value value = stack->stack_at_inc(i);231print_value(value);232Phi* phi = value->as_Phi();233if (phi != NULL) {234if (phi->operand()->is_valid()) {235output()->print(" ");236phi->operand()->print(output());237}238}239}240output()->put(']');241}242if (!stack->no_active_locks()) {243// print out the lines on the line below this244// one at the same indentation level.245output()->cr();246fill_to(start_position, ' ');247output()->print("locks [");248for (int i = i = 0; i < stack->locks_size(); i++) {249Value t = stack->lock_at(i);250if (i > 0) output()->print(", ");251output()->print("%d:", i);252if (t == NULL) {253// synchronized methods push null on the lock stack254output()->print("this");255} else {256print_value(t);257}258}259output()->print("]");260}261}262263264void InstructionPrinter::print_inline_level(BlockBegin* block) {265output()->print_cr("inlining depth %d", block->scope()->level());266}267268269void InstructionPrinter::print_unsafe_op(UnsafeOp* op, const char* name) {270output()->print("%s", name);271output()->print(".(");272}273274void InstructionPrinter::print_unsafe_raw_op(UnsafeRawOp* op, const char* name) {275print_unsafe_op(op, name);276output()->print("base ");277print_value(op->base());278if (op->has_index()) {279output()->print(", index "); print_value(op->index());280output()->print(", log2_scale %d", op->log2_scale());281}282}283284285void InstructionPrinter::print_unsafe_object_op(UnsafeObjectOp* op, const char* name) {286print_unsafe_op(op, name);287print_value(op->object());288output()->print(", ");289print_value(op->offset());290}291292293void InstructionPrinter::print_phi(int i, Value v, BlockBegin* b) {294Phi* phi = v->as_Phi();295output()->print("%2d ", i);296print_value(v);297// print phi operands298if (phi && phi->block() == b) {299output()->print(" [");300for (int j = 0; j < phi->operand_count(); j ++) {301output()->print(" ");302Value opd = phi->operand_at(j);303if (opd) print_value(opd);304else output()->print("NULL");305}306output()->print("] ");307}308print_alias(v);309}310311312void InstructionPrinter::print_alias(Value v) {313if (v != v->subst()) {314output()->print("alias "); print_value(v->subst());315}316}317318319void InstructionPrinter::fill_to(int pos, char filler) {320while (output()->position() < pos) output()->put(filler);321}322323324void InstructionPrinter::print_head() {325const char filler = '_';326fill_to(bci_pos , filler); output()->print("bci" );327fill_to(use_pos , filler); output()->print("use" );328fill_to(temp_pos , filler); output()->print("tid" );329fill_to(instr_pos, filler); output()->print("instr");330fill_to(end_pos , filler);331output()->cr();332}333334335void InstructionPrinter::print_line(Instruction* instr) {336// print instruction data on one line337if (instr->is_pinned()) output()->put('.');338fill_to(bci_pos ); output()->print("%d", instr->printable_bci());339fill_to(use_pos ); output()->print("%d", instr->use_count());340fill_to(temp_pos ); print_temp(instr);341fill_to(instr_pos); print_instr(instr);342output()->cr();343// add a line for StateSplit instructions w/ non-empty stacks344// (make it robust so we can print incomplete instructions)345StateSplit* split = instr->as_StateSplit();346if (split != NULL && split->state() != NULL && !split->state()->stack_is_empty()) {347fill_to(instr_pos); print_stack(split->state());348output()->cr();349}350}351352353void InstructionPrinter::do_Phi(Phi* x) {354output()->print("phi function"); // make that more detailed later355if (x->is_illegal())356output()->print(" (illegal)");357}358359360void InstructionPrinter::do_Local(Local* x) {361output()->print("local[index %d]", x->java_index());362}363364365void InstructionPrinter::do_Constant(Constant* x) {366ValueType* t = x->type();367switch (t->tag()) {368case intTag : output()->print("%d" , t->as_IntConstant ()->value()); break;369case longTag : output()->print(JLONG_FORMAT, t->as_LongConstant()->value()); output()->print("L"); break;370case floatTag : output()->print("%g" , t->as_FloatConstant ()->value()); break;371case doubleTag : output()->print("%gD" , t->as_DoubleConstant()->value()); break;372case objectTag : print_object(x); break;373case addressTag: output()->print("bci:%d", t->as_AddressConstant()->value()); break;374default : output()->print("???"); break;375}376}377378379void InstructionPrinter::do_LoadField(LoadField* x) {380print_field(x);381output()->print(" (%c)", type2char(x->field()->type()->basic_type()));382output()->print(" %s", x->field()->name()->as_utf8());383}384385386void InstructionPrinter::do_StoreField(StoreField* x) {387print_field(x);388output()->print(" := ");389print_value(x->value());390output()->print(" (%c)", type2char(x->field()->type()->basic_type()));391output()->print(" %s", x->field()->name()->as_utf8());392}393394395void InstructionPrinter::do_ArrayLength(ArrayLength* x) {396print_value(x->array());397output()->print(".length");398}399400401void InstructionPrinter::do_LoadIndexed(LoadIndexed* x) {402print_indexed(x);403output()->print(" (%c)", type2char(x->elt_type()));404if (x->check_flag(Instruction::NeedsRangeCheckFlag)) {405output()->print(" [rc]");406}407}408409410void InstructionPrinter::do_StoreIndexed(StoreIndexed* x) {411print_indexed(x);412output()->print(" := ");413print_value(x->value());414output()->print(" (%c)", type2char(x->elt_type()));415if (x->check_flag(Instruction::NeedsRangeCheckFlag)) {416output()->print(" [rc]");417}418}419420void InstructionPrinter::do_NegateOp(NegateOp* x) {421output()->put('-');422print_value(x->x());423}424425426void InstructionPrinter::do_ArithmeticOp(ArithmeticOp* x) {427print_op2(x);428}429430431void InstructionPrinter::do_ShiftOp(ShiftOp* x) {432print_op2(x);433}434435436void InstructionPrinter::do_LogicOp(LogicOp* x) {437print_op2(x);438}439440441void InstructionPrinter::do_CompareOp(CompareOp* x) {442print_op2(x);443}444445446void InstructionPrinter::do_IfOp(IfOp* x) {447print_value(x->x());448output()->print(" %s ", cond_name(x->cond()));449print_value(x->y());450output()->print(" ? ");451print_value(x->tval());452output()->print(" : ");453print_value(x->fval());454}455456457void InstructionPrinter::do_Convert(Convert* x) {458output()->print("%s(", Bytecodes::name(x->op()));459print_value(x->value());460output()->put(')');461}462463464void InstructionPrinter::do_NullCheck(NullCheck* x) {465output()->print("null_check(");466print_value(x->obj());467output()->put(')');468if (!x->can_trap()) {469output()->print(" (eliminated)");470}471}472473474void InstructionPrinter::do_TypeCast(TypeCast* x) {475output()->print("type_cast(");476print_value(x->obj());477output()->print(") ");478if (x->declared_type()->is_klass())479print_klass(x->declared_type()->as_klass());480else481output()->print("%s", type2name(x->declared_type()->basic_type()));482}483484485void InstructionPrinter::do_Invoke(Invoke* x) {486if (x->receiver() != NULL) {487print_value(x->receiver());488output()->print(".");489}490491output()->print("%s(", Bytecodes::name(x->code()));492for (int i = 0; i < x->number_of_arguments(); i++) {493if (i > 0) output()->print(", ");494print_value(x->argument_at(i));495}496output()->print_cr(")");497fill_to(instr_pos);498output()->print("%s.%s%s",499x->target()->holder()->name()->as_utf8(),500x->target()->name()->as_utf8(),501x->target()->signature()->as_symbol()->as_utf8());502}503504505void InstructionPrinter::do_NewInstance(NewInstance* x) {506output()->print("new instance ");507print_klass(x->klass());508}509510511void InstructionPrinter::do_NewTypeArray(NewTypeArray* x) {512output()->print("new %s array [", basic_type_name(x->elt_type()));513print_value(x->length());514output()->put(']');515}516517518void InstructionPrinter::do_NewObjectArray(NewObjectArray* x) {519output()->print("new object array [");520print_value(x->length());521output()->print("] ");522print_klass(x->klass());523}524525526void InstructionPrinter::do_NewMultiArray(NewMultiArray* x) {527output()->print("new multi array [");528Values* dims = x->dims();529for (int i = 0; i < dims->length(); i++) {530if (i > 0) output()->print(", ");531print_value(dims->at(i));532}533output()->print("] ");534print_klass(x->klass());535}536537538void InstructionPrinter::do_MonitorEnter(MonitorEnter* x) {539output()->print("enter ");540print_monitor(x);541}542543544void InstructionPrinter::do_MonitorExit(MonitorExit* x) {545output()->print("exit ");546print_monitor(x);547}548549550void InstructionPrinter::do_Intrinsic(Intrinsic* x) {551const char* name = vmIntrinsics::name_at(x->id());552if (name[0] == '_') name++; // strip leading bug from _hashCode, etc.553const char* kname = vmSymbols::name_for(vmIntrinsics::class_for(x->id()));554if (strchr(name, '_') == NULL) {555kname = NULL;556} else {557const char* kptr = strrchr(kname, '/');558if (kptr != NULL) kname = kptr + 1;559}560if (kname == NULL)561output()->print("%s(", name);562else563output()->print("%s.%s(", kname, name);564for (int i = 0; i < x->number_of_arguments(); i++) {565if (i > 0) output()->print(", ");566print_value(x->argument_at(i));567}568output()->put(')');569}570571572void InstructionPrinter::do_BlockBegin(BlockBegin* x) {573// print block id574BlockEnd* end = x->end();575output()->print("B%d ", x->block_id());576577// print flags578bool printed_flag = false;579if (x->is_set(BlockBegin::std_entry_flag)) {580if (!printed_flag) output()->print("(");581output()->print("S"); printed_flag = true;582}583if (x->is_set(BlockBegin::osr_entry_flag)) {584if (!printed_flag) output()->print("(");585output()->print("O"); printed_flag = true;586}587if (x->is_set(BlockBegin::exception_entry_flag)) {588if (!printed_flag) output()->print("(");589output()->print("E"); printed_flag = true;590}591if (x->is_set(BlockBegin::subroutine_entry_flag)) {592if (!printed_flag) output()->print("(");593output()->print("s"); printed_flag = true;594}595if (x->is_set(BlockBegin::parser_loop_header_flag)) {596if (!printed_flag) output()->print("(");597output()->print("LH"); printed_flag = true;598}599if (x->is_set(BlockBegin::backward_branch_target_flag)) {600if (!printed_flag) output()->print("(");601output()->print("b"); printed_flag = true;602}603if (x->is_set(BlockBegin::was_visited_flag)) {604if (!printed_flag) output()->print("(");605output()->print("V"); printed_flag = true;606}607if (printed_flag) output()->print(") ");608609// print block bci range610output()->print("[%d, %d]", x->bci(), (end == NULL ? -1 : end->printable_bci()));611612// print block successors613if (end != NULL && end->number_of_sux() > 0) {614output()->print(" ->");615for (int i = 0; i < end->number_of_sux(); i++) {616output()->print(" B%d", end->sux_at(i)->block_id());617}618}619// print exception handlers620if (x->number_of_exception_handlers() > 0) {621output()->print(" (xhandlers ");622for (int i = 0; i < x->number_of_exception_handlers(); i++) {623if (i > 0) output()->print(" ");624output()->print("B%d", x->exception_handler_at(i)->block_id());625}626output()->put(')');627}628629// print dominator block630if (x->dominator() != NULL) {631output()->print(" dom B%d", x->dominator()->block_id());632}633634// print predecessors and successors635if (x->successors()->length() > 0) {636output()->print(" sux:");637for (int i = 0; i < x->successors()->length(); i ++) {638output()->print(" B%d", x->successors()->at(i)->block_id());639}640}641642if (x->number_of_preds() > 0) {643output()->print(" pred:");644for (int i = 0; i < x->number_of_preds(); i ++) {645output()->print(" B%d", x->pred_at(i)->block_id());646}647}648649if (!_print_phis) {650return;651}652653// print phi functions654bool has_phis_in_locals = false;655bool has_phis_on_stack = false;656657if (x->end() && x->end()->state()) {658ValueStack* state = x->state();659660int i = 0;661while (!has_phis_on_stack && i < state->stack_size()) {662Value v = state->stack_at_inc(i);663has_phis_on_stack = is_phi_of_block(v, x);664}665666do {667for (i = 0; !has_phis_in_locals && i < state->locals_size();) {668Value v = state->local_at(i);669has_phis_in_locals = is_phi_of_block(v, x);670// also ignore illegal HiWords671if (v && !v->type()->is_illegal()) i += v->type()->size(); else i ++;672}673state = state->caller_state();674} while (state != NULL);675676}677678// print values in locals679if (has_phis_in_locals) {680output()->cr(); output()->print_cr("Locals:");681682ValueStack* state = x->state();683do {684for (int i = 0; i < state->locals_size();) {685Value v = state->local_at(i);686if (v) {687print_phi(i, v, x); output()->cr();688// also ignore illegal HiWords689i += (v->type()->is_illegal() ? 1 : v->type()->size());690} else {691i ++;692}693}694output()->cr();695state = state->caller_state();696} while (state != NULL);697}698699// print values on stack700if (has_phis_on_stack) {701output()->print_cr("Stack:");702int i = 0;703while (i < x->state()->stack_size()) {704int o = i;705Value v = x->state()->stack_at_inc(i);706if (v) {707print_phi(o, v, x); output()->cr();708}709}710}711}712713714void InstructionPrinter::do_CheckCast(CheckCast* x) {715output()->print("checkcast(");716print_value(x->obj());717output()->print(") ");718print_klass(x->klass());719}720721722void InstructionPrinter::do_InstanceOf(InstanceOf* x) {723output()->print("instanceof(");724print_value(x->obj());725output()->print(") ");726print_klass(x->klass());727}728729730void InstructionPrinter::do_Goto(Goto* x) {731output()->print("goto B%d", x->default_sux()->block_id());732if (x->is_safepoint()) output()->print(" (safepoint)");733}734735736void InstructionPrinter::do_If(If* x) {737output()->print("if ");738print_value(x->x());739output()->print(" %s ", cond_name(x->cond()));740print_value(x->y());741output()->print(" then B%d else B%d", x->sux_at(0)->block_id(), x->sux_at(1)->block_id());742if (x->is_safepoint()) output()->print(" (safepoint)");743}744745746void InstructionPrinter::do_IfInstanceOf(IfInstanceOf* x) {747output()->print("<IfInstanceOf>");748}749750751void InstructionPrinter::do_TableSwitch(TableSwitch* x) {752output()->print("tableswitch ");753if (x->is_safepoint()) output()->print("(safepoint) ");754print_value(x->tag());755output()->cr();756int l = x->length();757for (int i = 0; i < l; i++) {758fill_to(instr_pos);759output()->print_cr("case %5d: B%d", x->lo_key() + i, x->sux_at(i)->block_id());760}761fill_to(instr_pos);762output()->print("default : B%d", x->default_sux()->block_id());763}764765766void InstructionPrinter::do_LookupSwitch(LookupSwitch* x) {767output()->print("lookupswitch ");768if (x->is_safepoint()) output()->print("(safepoint) ");769print_value(x->tag());770output()->cr();771int l = x->length();772for (int i = 0; i < l; i++) {773fill_to(instr_pos);774output()->print_cr("case %5d: B%d", x->key_at(i), x->sux_at(i)->block_id());775}776fill_to(instr_pos);777output()->print("default : B%d", x->default_sux()->block_id());778}779780781void InstructionPrinter::do_Return(Return* x) {782if (x->result() == NULL) {783output()->print("return");784} else {785output()->print("%creturn ", x->type()->tchar());786print_value(x->result());787}788}789790791void InstructionPrinter::do_Throw(Throw* x) {792output()->print("throw ");793print_value(x->exception());794}795796797void InstructionPrinter::do_Base(Base* x) {798output()->print("std entry B%d", x->std_entry()->block_id());799if (x->number_of_sux() > 1) {800output()->print(" osr entry B%d", x->osr_entry()->block_id());801}802}803804805void InstructionPrinter::do_OsrEntry(OsrEntry* x) {806output()->print("osr entry");807}808809810void InstructionPrinter::do_ExceptionObject(ExceptionObject* x) {811output()->print("incoming exception");812}813814815void InstructionPrinter::do_RoundFP(RoundFP* x) {816output()->print("round_fp ");817print_value(x->input());818}819820821void InstructionPrinter::do_UnsafeGetRaw(UnsafeGetRaw* x) {822print_unsafe_raw_op(x, "UnsafeGetRaw");823output()->put(')');824}825826827void InstructionPrinter::do_UnsafePutRaw(UnsafePutRaw* x) {828print_unsafe_raw_op(x, "UnsafePutRaw");829output()->print(", value ");830print_value(x->value());831output()->put(')');832}833834835void InstructionPrinter::do_UnsafeGetObject(UnsafeGetObject* x) {836print_unsafe_object_op(x, "UnsafeGetObject");837output()->put(')');838}839840841void InstructionPrinter::do_UnsafePutObject(UnsafePutObject* x) {842print_unsafe_object_op(x, "UnsafePutObject");843output()->print(", value ");844print_value(x->value());845output()->put(')');846}847848void InstructionPrinter::do_UnsafeGetAndSetObject(UnsafeGetAndSetObject* x) {849print_unsafe_object_op(x, x->is_add()?"UnsafeGetAndSetObject (add)":"UnsafeGetAndSetObject");850output()->print(", value ");851print_value(x->value());852output()->put(')');853}854855void InstructionPrinter::do_UnsafePrefetchRead(UnsafePrefetchRead* x) {856print_unsafe_object_op(x, "UnsafePrefetchRead");857output()->put(')');858}859860void InstructionPrinter::do_RangeCheckPredicate(RangeCheckPredicate* x) {861862if (x->x() != NULL && x->y() != NULL) {863output()->print("if ");864print_value(x->x());865output()->print(" %s ", cond_name(x->cond()));866print_value(x->y());867output()->print(" then deoptimize!");868} else {869output()->print("always deoptimize!");870}871}872873#ifdef ASSERT874void InstructionPrinter::do_Assert(Assert* x) {875output()->print("assert ");876print_value(x->x());877output()->print(" %s ", cond_name(x->cond()));878print_value(x->y());879}880#endif881882void InstructionPrinter::do_UnsafePrefetchWrite(UnsafePrefetchWrite* x) {883print_unsafe_object_op(x, "UnsafePrefetchWrite");884output()->put(')');885}886887void InstructionPrinter::do_ProfileCall(ProfileCall* x) {888output()->print("profile ");889print_value(x->recv());890output()->print(" %s.%s", x->method()->holder()->name()->as_utf8(), x->method()->name()->as_utf8());891if (x->known_holder() != NULL) {892output()->print(", ");893print_klass(x->known_holder());894output()->print(" ");895}896for (int i = 0; i < x->nb_profiled_args(); i++) {897if (i > 0) output()->print(", ");898print_value(x->profiled_arg_at(i));899if (x->arg_needs_null_check(i)) {900output()->print(" [NC]");901}902}903output()->put(')');904}905906void InstructionPrinter::do_ProfileReturnType(ProfileReturnType* x) {907output()->print("profile ret type ");908print_value(x->ret());909output()->print(" %s.%s", x->method()->holder()->name()->as_utf8(), x->method()->name()->as_utf8());910output()->put(')');911}912void InstructionPrinter::do_ProfileInvoke(ProfileInvoke* x) {913output()->print("profile_invoke ");914output()->print(" %s.%s", x->inlinee()->holder()->name()->as_utf8(), x->inlinee()->name()->as_utf8());915output()->put(')');916917}918919void InstructionPrinter::do_RuntimeCall(RuntimeCall* x) {920output()->print("call_rt %s(", x->entry_name());921for (int i = 0; i < x->number_of_arguments(); i++) {922if (i > 0) output()->print(", ");923print_value(x->argument_at(i));924}925output()->put(')');926}927928void InstructionPrinter::do_MemBar(MemBar* x) {929if (os::is_MP()) {930LIR_Code code = x->code();931switch (code) {932case lir_membar_acquire : output()->print("membar_acquire"); break;933case lir_membar_release : output()->print("membar_release"); break;934case lir_membar : output()->print("membar"); break;935case lir_membar_loadload : output()->print("membar_loadload"); break;936case lir_membar_storestore: output()->print("membar_storestore"); break;937case lir_membar_loadstore : output()->print("membar_loadstore"); break;938case lir_membar_storeload : output()->print("membar_storeload"); break;939default : ShouldNotReachHere(); break;940}941}942}943944#endif // PRODUCT945946947