in src/hotspot/share/ci/ciTypeFlow.cpp [877:1488]
bool ciTypeFlow::StateVector::apply_one_bytecode(ciBytecodeStream* str) {
_trap_bci = -1;
_trap_index = 0;
if (CITraceTypeFlow) {
tty->print_cr(">> Interpreting bytecode %d:%s", str->cur_bci(),
Bytecodes::name(str->cur_bc()));
}
switch(str->cur_bc()) {
case Bytecodes::_aaload: do_aaload(str); break;
case Bytecodes::_aastore:
{
pop_object();
pop_int();
pop_objArray();
break;
}
case Bytecodes::_aconst_null:
{
push_null();
break;
}
case Bytecodes::_aload: load_local_object(str->get_index()); break;
case Bytecodes::_aload_0: load_local_object(0); break;
case Bytecodes::_aload_1: load_local_object(1); break;
case Bytecodes::_aload_2: load_local_object(2); break;
case Bytecodes::_aload_3: load_local_object(3); break;
case Bytecodes::_anewarray:
{
pop_int();
bool will_link;
ciKlass* element_klass = str->get_klass(will_link);
if (!will_link) {
trap(str, element_klass, str->get_klass_index());
} else {
push_object(ciObjArrayKlass::make(element_klass));
}
break;
}
case Bytecodes::_areturn:
case Bytecodes::_ifnonnull:
case Bytecodes::_ifnull:
{
pop_object();
break;
}
case Bytecodes::_monitorenter:
{
pop_object();
set_monitor_count(monitor_count() + 1);
break;
}
case Bytecodes::_monitorexit:
{
pop_object();
assert(monitor_count() > 0, "must be a monitor to exit from");
set_monitor_count(monitor_count() - 1);
break;
}
case Bytecodes::_arraylength:
{
pop_array();
push_int();
break;
}
case Bytecodes::_astore: store_local_object(str->get_index()); break;
case Bytecodes::_astore_0: store_local_object(0); break;
case Bytecodes::_astore_1: store_local_object(1); break;
case Bytecodes::_astore_2: store_local_object(2); break;
case Bytecodes::_astore_3: store_local_object(3); break;
case Bytecodes::_athrow:
{
NEEDS_CLEANUP;
pop_object();
break;
}
case Bytecodes::_baload:
case Bytecodes::_caload:
case Bytecodes::_iaload:
case Bytecodes::_saload:
{
pop_int();
ciTypeArrayKlass* array_klass = pop_typeArray();
// Put assert here for right type?
push_int();
break;
}
case Bytecodes::_bastore:
case Bytecodes::_castore:
case Bytecodes::_iastore:
case Bytecodes::_sastore:
{
pop_int();
pop_int();
pop_typeArray();
// assert here?
break;
}
case Bytecodes::_bipush:
case Bytecodes::_iconst_m1:
case Bytecodes::_iconst_0:
case Bytecodes::_iconst_1:
case Bytecodes::_iconst_2:
case Bytecodes::_iconst_3:
case Bytecodes::_iconst_4:
case Bytecodes::_iconst_5:
case Bytecodes::_sipush:
{
push_int();
break;
}
case Bytecodes::_checkcast: do_checkcast(str); break;
case Bytecodes::_d2f:
{
pop_double();
push_float();
break;
}
case Bytecodes::_d2i:
{
pop_double();
push_int();
break;
}
case Bytecodes::_d2l:
{
pop_double();
push_long();
break;
}
case Bytecodes::_dadd:
case Bytecodes::_ddiv:
case Bytecodes::_dmul:
case Bytecodes::_drem:
case Bytecodes::_dsub:
{
pop_double();
pop_double();
push_double();
break;
}
case Bytecodes::_daload:
{
pop_int();
ciTypeArrayKlass* array_klass = pop_typeArray();
// Put assert here for right type?
push_double();
break;
}
case Bytecodes::_dastore:
{
pop_double();
pop_int();
pop_typeArray();
// assert here?
break;
}
case Bytecodes::_dcmpg:
case Bytecodes::_dcmpl:
{
pop_double();
pop_double();
push_int();
break;
}
case Bytecodes::_dconst_0:
case Bytecodes::_dconst_1:
{
push_double();
break;
}
case Bytecodes::_dload: load_local_double(str->get_index()); break;
case Bytecodes::_dload_0: load_local_double(0); break;
case Bytecodes::_dload_1: load_local_double(1); break;
case Bytecodes::_dload_2: load_local_double(2); break;
case Bytecodes::_dload_3: load_local_double(3); break;
case Bytecodes::_dneg:
{
pop_double();
push_double();
break;
}
case Bytecodes::_dreturn:
{
pop_double();
break;
}
case Bytecodes::_dstore: store_local_double(str->get_index()); break;
case Bytecodes::_dstore_0: store_local_double(0); break;
case Bytecodes::_dstore_1: store_local_double(1); break;
case Bytecodes::_dstore_2: store_local_double(2); break;
case Bytecodes::_dstore_3: store_local_double(3); break;
case Bytecodes::_dup:
{
push(type_at_tos());
break;
}
case Bytecodes::_dup_x1:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
push(value1);
push(value2);
push(value1);
break;
}
case Bytecodes::_dup_x2:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
ciType* value3 = pop_value();
push(value1);
push(value3);
push(value2);
push(value1);
break;
}
case Bytecodes::_dup2:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
push(value2);
push(value1);
push(value2);
push(value1);
break;
}
case Bytecodes::_dup2_x1:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
ciType* value3 = pop_value();
push(value2);
push(value1);
push(value3);
push(value2);
push(value1);
break;
}
case Bytecodes::_dup2_x2:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
ciType* value3 = pop_value();
ciType* value4 = pop_value();
push(value2);
push(value1);
push(value4);
push(value3);
push(value2);
push(value1);
break;
}
case Bytecodes::_f2d:
{
pop_float();
push_double();
break;
}
case Bytecodes::_f2i:
{
pop_float();
push_int();
break;
}
case Bytecodes::_f2l:
{
pop_float();
push_long();
break;
}
case Bytecodes::_fadd:
case Bytecodes::_fdiv:
case Bytecodes::_fmul:
case Bytecodes::_frem:
case Bytecodes::_fsub:
{
pop_float();
pop_float();
push_float();
break;
}
case Bytecodes::_faload:
{
pop_int();
ciTypeArrayKlass* array_klass = pop_typeArray();
// Put assert here.
push_float();
break;
}
case Bytecodes::_fastore:
{
pop_float();
pop_int();
ciTypeArrayKlass* array_klass = pop_typeArray();
// Put assert here.
break;
}
case Bytecodes::_fcmpg:
case Bytecodes::_fcmpl:
{
pop_float();
pop_float();
push_int();
break;
}
case Bytecodes::_fconst_0:
case Bytecodes::_fconst_1:
case Bytecodes::_fconst_2:
{
push_float();
break;
}
case Bytecodes::_fload: load_local_float(str->get_index()); break;
case Bytecodes::_fload_0: load_local_float(0); break;
case Bytecodes::_fload_1: load_local_float(1); break;
case Bytecodes::_fload_2: load_local_float(2); break;
case Bytecodes::_fload_3: load_local_float(3); break;
case Bytecodes::_fneg:
{
pop_float();
push_float();
break;
}
case Bytecodes::_freturn:
{
pop_float();
break;
}
case Bytecodes::_fstore: store_local_float(str->get_index()); break;
case Bytecodes::_fstore_0: store_local_float(0); break;
case Bytecodes::_fstore_1: store_local_float(1); break;
case Bytecodes::_fstore_2: store_local_float(2); break;
case Bytecodes::_fstore_3: store_local_float(3); break;
case Bytecodes::_getfield: do_getfield(str); break;
case Bytecodes::_getstatic: do_getstatic(str); break;
case Bytecodes::_goto:
case Bytecodes::_goto_w:
case Bytecodes::_nop:
case Bytecodes::_return:
{
// do nothing.
break;
}
case Bytecodes::_i2b:
case Bytecodes::_i2c:
case Bytecodes::_i2s:
case Bytecodes::_ineg:
{
pop_int();
push_int();
break;
}
case Bytecodes::_i2d:
{
pop_int();
push_double();
break;
}
case Bytecodes::_i2f:
{
pop_int();
push_float();
break;
}
case Bytecodes::_i2l:
{
pop_int();
push_long();
break;
}
case Bytecodes::_iadd:
case Bytecodes::_iand:
case Bytecodes::_idiv:
case Bytecodes::_imul:
case Bytecodes::_ior:
case Bytecodes::_irem:
case Bytecodes::_ishl:
case Bytecodes::_ishr:
case Bytecodes::_isub:
case Bytecodes::_iushr:
case Bytecodes::_ixor:
{
pop_int();
pop_int();
push_int();
break;
}
case Bytecodes::_if_acmpeq:
case Bytecodes::_if_acmpne:
{
pop_object();
pop_object();
break;
}
case Bytecodes::_if_icmpeq:
case Bytecodes::_if_icmpge:
case Bytecodes::_if_icmpgt:
case Bytecodes::_if_icmple:
case Bytecodes::_if_icmplt:
case Bytecodes::_if_icmpne:
{
pop_int();
pop_int();
break;
}
case Bytecodes::_ifeq:
case Bytecodes::_ifle:
case Bytecodes::_iflt:
case Bytecodes::_ifge:
case Bytecodes::_ifgt:
case Bytecodes::_ifne:
case Bytecodes::_ireturn:
case Bytecodes::_lookupswitch:
case Bytecodes::_tableswitch:
{
pop_int();
break;
}
case Bytecodes::_iinc:
{
int lnum = str->get_index();
check_int(local(lnum));
store_to_local(lnum);
break;
}
case Bytecodes::_iload: load_local_int(str->get_index()); break;
case Bytecodes::_iload_0: load_local_int(0); break;
case Bytecodes::_iload_1: load_local_int(1); break;
case Bytecodes::_iload_2: load_local_int(2); break;
case Bytecodes::_iload_3: load_local_int(3); break;
case Bytecodes::_instanceof:
{
// Check for uncommon trap:
do_checkcast(str);
pop_object();
push_int();
break;
}
case Bytecodes::_invokeinterface: do_invoke(str, true); break;
case Bytecodes::_invokespecial: do_invoke(str, true); break;
case Bytecodes::_invokestatic: do_invoke(str, false); break;
case Bytecodes::_invokevirtual: do_invoke(str, true); break;
case Bytecodes::_invokedynamic: do_invoke(str, false); break;
case Bytecodes::_istore: store_local_int(str->get_index()); break;
case Bytecodes::_istore_0: store_local_int(0); break;
case Bytecodes::_istore_1: store_local_int(1); break;
case Bytecodes::_istore_2: store_local_int(2); break;
case Bytecodes::_istore_3: store_local_int(3); break;
case Bytecodes::_jsr:
case Bytecodes::_jsr_w: do_jsr(str); break;
case Bytecodes::_l2d:
{
pop_long();
push_double();
break;
}
case Bytecodes::_l2f:
{
pop_long();
push_float();
break;
}
case Bytecodes::_l2i:
{
pop_long();
push_int();
break;
}
case Bytecodes::_ladd:
case Bytecodes::_land:
case Bytecodes::_ldiv:
case Bytecodes::_lmul:
case Bytecodes::_lor:
case Bytecodes::_lrem:
case Bytecodes::_lsub:
case Bytecodes::_lxor:
{
pop_long();
pop_long();
push_long();
break;
}
case Bytecodes::_laload:
{
pop_int();
ciTypeArrayKlass* array_klass = pop_typeArray();
// Put assert here for right type?
push_long();
break;
}
case Bytecodes::_lastore:
{
pop_long();
pop_int();
pop_typeArray();
// assert here?
break;
}
case Bytecodes::_lcmp:
{
pop_long();
pop_long();
push_int();
break;
}
case Bytecodes::_lconst_0:
case Bytecodes::_lconst_1:
{
push_long();
break;
}
case Bytecodes::_ldc:
case Bytecodes::_ldc_w:
case Bytecodes::_ldc2_w:
{
do_ldc(str);
break;
}
case Bytecodes::_lload: load_local_long(str->get_index()); break;
case Bytecodes::_lload_0: load_local_long(0); break;
case Bytecodes::_lload_1: load_local_long(1); break;
case Bytecodes::_lload_2: load_local_long(2); break;
case Bytecodes::_lload_3: load_local_long(3); break;
case Bytecodes::_lneg:
{
pop_long();
push_long();
break;
}
case Bytecodes::_lreturn:
{
pop_long();
break;
}
case Bytecodes::_lshl:
case Bytecodes::_lshr:
case Bytecodes::_lushr:
{
pop_int();
pop_long();
push_long();
break;
}
case Bytecodes::_lstore: store_local_long(str->get_index()); break;
case Bytecodes::_lstore_0: store_local_long(0); break;
case Bytecodes::_lstore_1: store_local_long(1); break;
case Bytecodes::_lstore_2: store_local_long(2); break;
case Bytecodes::_lstore_3: store_local_long(3); break;
case Bytecodes::_multianewarray: do_multianewarray(str); break;
case Bytecodes::_new: do_new(str); break;
case Bytecodes::_newarray: do_newarray(str); break;
case Bytecodes::_pop:
{
pop();
break;
}
case Bytecodes::_pop2:
{
pop();
pop();
break;
}
case Bytecodes::_putfield: do_putfield(str); break;
case Bytecodes::_putstatic: do_putstatic(str); break;
case Bytecodes::_ret: do_ret(str); break;
case Bytecodes::_swap:
{
ciType* value1 = pop_value();
ciType* value2 = pop_value();
push(value1);
push(value2);
break;
}
case Bytecodes::_wide:
default:
{
// The iterator should skip this.
ShouldNotReachHere();
break;
}
}
if (CITraceTypeFlow) {
print_on(tty);
}
return (_trap_bci != -1);
}