Mercurial > hg > openjdk6-mips
changeset 11:d3aee0aef6b6
Avoid anti-dependency when moving long operand between registers(reg2reg) and enable the safepoint return.
1. Avoid anti-dependency when moving long operand between registers(reg2reg)
2. Enable the safepoint return.
3. Do some codes cleaning work.
author | YANG Yongqiang <yangyongqiang@loongson.cn> |
---|---|
date | Sun, 24 Oct 2010 14:32:13 +0000 |
parents | 7eeee95a5a53 |
children | 89199c685d4a |
files | hotspot/src/cpu/mips/vm/c1_LIRAssembler_mips.cpp hotspot/src/share/vm/oops/oop.inline.hpp hotspot/src/share/vm/runtime/reflection.cpp |
diffstat | 3 files changed, 1306 insertions(+), 1417 deletions(-) [+] |
line wrap: on
line diff
--- a/hotspot/src/cpu/mips/vm/c1_LIRAssembler_mips.cpp Sat Oct 23 21:08:56 2010 +0000 +++ b/hotspot/src/cpu/mips/vm/c1_LIRAssembler_mips.cpp Sun Oct 24 14:32:13 2010 +0000 @@ -53,7 +53,6 @@ assert_different_registers(tmp1, tmp2, tmp3, extra); tmp1 = extra; } else if (tmp2 == preserve) { - //////assert_different_registers(tmp1, tmp2, tmp3, extra); tmp2 = extra; } else if (tmp3 == preserve) { assert_different_registers(tmp1, tmp2, tmp3, extra); @@ -79,7 +78,6 @@ } //FIXME, which register should be used? LIR_Opr LIR_Assembler::receiverOpr() { - //return FrameMap::ecx_oop_opr; return FrameMap::_t0_oop_opr; } @@ -165,7 +163,6 @@ } else { ShouldNotReachHere(); } - } else { ShouldNotReachHere(); } @@ -173,7 +170,6 @@ void LIR_Assembler::pop(LIR_Opr opr) { if (opr->is_single_cpu() ) { - // __ pop(opr->rinfo().as_register()); __ pop(opr->as_register()); } else { assert(false, "Must be single word register or floating-point register"); @@ -184,7 +180,6 @@ Address LIR_Assembler::as_Address(LIR_Address* addr) { Register reg = addr->base()->as_register(); // now we need this for parameter pass - //assert(reg != SP && reg != FP, "address must be in heap, not stack"); return Address(reg, addr->disp()); } @@ -244,7 +239,7 @@ Register OSR_buf = osrBufferPointer()->as_register(); - // note: we do osr only if the expression stack at the loop beginning is empty, + // note: we do osr only if the expression stack at the loop beginning is empty, // in which case the spill area is empty too and we don't have to setup // spilled locals // @@ -320,11 +315,8 @@ Address lock_addr = frame_map()->address_for_monitor_lock(monitor_no); __ lea(lock_reg, lock_addr); // unlock object - // MonitorAccessStub* slow_case = new MonitorExitStub(lock_, true, monitor_no); MonitorAccessStub* slow_case = new MonitorExitStub(lock_opr, true, monitor_no); - // _slow_case_stubs->append(slow_case); // temporary fix: must be created after exceptionhandler, therefore as call stub - //_call_stubs->append(slow_case); _slow_case_stubs->append(slow_case); if (UseFastLocking) { // try inlined fast unlocking first, revert to slow locking if it fails @@ -368,13 +360,11 @@ // but since this never gets executed it doesn't really make // much difference. // -// for (int i = 0; i < (NativeCall::instruction_size/4 + 1) ; i++ ) { - for (int i = 0; i < (NativeCall::instruction_size/2+1) ; i++ ) { + for (int i = 0; i < (NativeCall::instruction_size/4 + 1) ; i++ ) { __ nop(); } // generate code for exception handler - //address handler_base = __ start_a_stub(1*K);//by_css address handler_base = __ start_a_stub(exception_handler_size); if (handler_base == NULL) { //no enough space @@ -390,8 +380,6 @@ if (compilation()->has_exception_handlers() || JvmtiExport::can_post_exceptions()) { // the exception oop and pc are in V0 and V1 // no other registers need to be preserved, so invalidate them -// __ invalidate_registers(false, true, true, false, true, true); - // check that there is really an exception __ verify_not_null_oop(V0); @@ -405,8 +393,6 @@ // the exception oop is in V0 // no other registers need to be preserved, so invalidate them -// __ invalidate_registers(false, true, true, true, true, true); - // check that there is really an exception __ verify_not_null_oop(V0); @@ -419,19 +405,11 @@ // unwind activation and forward exception to caller // V0: exception - /*if (compilation()->jvmpi_event_method_exit_enabled()) { - __ jmp(Runtime1::entry_for(Runtime1::jvmpi_unwind_exception_id), + __ jmp(Runtime1::entry_for(Runtime1::unwind_exception_id), relocInfo::runtime_call_type); - } else*/ { - __ jmp(Runtime1::entry_for(Runtime1::unwind_exception_id), - relocInfo::runtime_call_type); - } __ delayed()->nop(); __ end_a_stub(); - - - - } +} void LIR_Assembler::emit_deopt_handler() { // if the last instruction is a call (typically to do a throw which @@ -459,11 +437,6 @@ //FIXE:: may be wrong, Address_Literal __ lw(AT, __ as_Address(here) ); __ push(AT); - - //XXXXX:FIXE need jump - -// __ jr(RuntimeAddress(SharedRuntime::deopt_blob()->unpack())); - assert(code_offset() - offset <= deopt_handler_size, "overflow"); __ end_a_stub(); @@ -478,12 +451,6 @@ // get two string object in T0&T1 //receiver already in T0 __ lw(T1, arg1->as_register()); - - // Get addresses of first characters from both Strings - { - // CodeEmitInfo* info = new CodeEmitInfo(scope, 0, NULL); - // add_debug_info_for_null_check_here(info); - } __ lw (T2, T0, java_lang_String::value_offset_in_bytes()); //value, T_CHAR array __ lw (AT, T0, java_lang_String::offset_offset_in_bytes()); //offset __ shl(AT, 1); @@ -491,10 +458,7 @@ __ addi(T2, T2, arrayOopDesc::base_offset_in_bytes(T_CHAR)); // Now T2 is the address of the first char in first string(T0) - { - // CodeEmitInfo* info = new CodeEmitInfo(scope, 0, NULL); - add_debug_info_for_null_check_here(info); - } + add_debug_info_for_null_check_here(info); __ lw (T3, T1, java_lang_String::value_offset_in_bytes()); __ lw (AT, T1, java_lang_String::offset_offset_in_bytes()); __ shl(AT, 1); @@ -537,24 +501,20 @@ __ subu(V0, T5, T6); __ bind(LoopEnd); - //return_op(FrameMap::_v0RInfo, false); - //FIXME return_op(FrameMap::_v0_opr); } -//void LIR_Assembler::return_op(RInfo result, bool result_is_oop) { void LIR_Assembler::return_op(LIR_Opr result) { assert(result->is_illegal() || !result->is_single_cpu() || result->as_register() == V0, "word returns are in V0"); // Pop the stack before the safepoint code __ leave(); - //FIXME I have no idea it is safe to use A0 -/* __ lui(AT, Assembler::split_high((intptr_t)os::get_polling_page() + __ lui(AT, Assembler::split_high((intptr_t)os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()))); __ relocate(relocInfo::poll_return_type); __ lw(AT, AT, Assembler::split_low((intptr_t)os::get_polling_page() + (SafepointPollOffset % os::vm_page_size()))); -*/ + __ jr(RA); __ delayed()->nop(); } @@ -589,115 +549,112 @@ assert(dest->is_register(), "should not call otherwise"); LIR_Const* c = src->as_constant_ptr(); switch (c->type()) { - case T_INT: - { - jint con = c->as_jint(); - if (dest->is_single_cpu()) { - assert(patch_code == lir_patch_none, "no patching handled here"); - __ move(dest->as_register(), con); - } else { - assert(dest->is_single_fpu(), "wrong register kind"); - __ move(AT, con); - __ mtc1(AT, dest->as_float_reg()); - } - } - break; - - case T_LONG: - { - jlong con = c->as_jlong(); - jint* conhi = (jint*)&con + 1; - jint* conlow = (jint*)&con; - - if (dest->is_double_cpu()) { - __ move(dest->as_register_lo(), *conlow); - __ move(dest->as_register_hi(), *conhi); - } else { - // assert(dest->is_double(), "wrong register kind"); - __ move(AT, *conlow); - __ mtc1(AT, dest->as_double_reg()); - __ move(AT, *conhi); - __ mtc1(AT, dest->as_double_reg()+1); - } - } - break; - - case T_OBJECT: - { - if (patch_code == lir_patch_none) { - if (c->as_jobject() == NULL) { - NEEDS_CLEANUP - int oop_index = __ oop_recorder()->allocate_index(c->as_jobject()); - RelocationHolder rspec = oop_Relocation::spec(oop_index); - __ relocate(rspec); - __ lui(dest->as_register(), Assembler::split_high((int) c->as_jobject() )); - __ addiu( dest->as_register() , dest->as_register() , Assembler::split_low((int) c->as_jobject())); - - - //__ move(dest->as_register(), ZERO); - } else { - int oop_index = __ oop_recorder()->find_index(c->as_jobject()); - RelocationHolder rspec = oop_Relocation::spec(oop_index); - __ relocate(rspec); - __ lui(dest->as_register(), Assembler::split_high((int)c->as_jobject())); - __ addiu(dest->as_register(), dest->as_register(), Assembler::split_low((int)c->as_jobject())); - } - } else { - jobject2reg_with_patching(dest->as_register(), info); - } - } - break; - - case T_FLOAT: - { - address const_addr = float_constant(c->as_jfloat()); - assert (const_addr != NULL, "must create float constant in the constant table"); - - if (dest->is_single_fpu()) { - __ relocate(relocInfo::internal_pc_type); - __ lui(AT, Assembler::split_high((int)const_addr)); - __ addiu(AT, AT, Assembler::split_low((int)const_addr)); - __ lwc1(dest->as_float_reg(), AT, 0); - - } else { - assert(dest->is_single_cpu(), "Must be a cpu register."); - assert(dest->as_register() != AT, "AT can not be allocated."); - - __ relocate(relocInfo::internal_pc_type); - __ lui(AT, Assembler::split_high((int)const_addr)); - __ addiu(AT, AT, Assembler::split_low((int)const_addr)); - __ lw(dest->as_register(), AT, 0); - } - } - break; - - case T_DOUBLE: - { - address const_addr = double_constant(c->as_jdouble()); - assert (const_addr != NULL, "must create double constant in the constant table"); - - if (dest->is_double_fpu()) { - __ relocate(relocInfo::internal_pc_type); - __ lui(AT, Assembler::split_high((int)const_addr)); - __ addiu(AT, AT, Assembler::split_low((int)const_addr)); - __ lwc1(dest->as_double_reg(), AT, 0); - __ lwc1(dest->as_double_reg()+1, AT, 4); - } else { -// assert(dest->is_long(), "Must be a long register."); - assert(dest->as_register_lo() != AT, "AT can not be allocated."); - assert(dest->as_register_hi() != AT, "AT can not be allocated."); - - __ relocate(relocInfo::internal_pc_type); - __ lui(AT, Assembler::split_high((int)const_addr)); - __ addiu(AT, AT, Assembler::split_low((int)const_addr)); - __ lw(dest->as_register_lo(), AT, 0); - __ lw(dest->as_register_hi(), AT, 4); - } - } - break; - - default: - ShouldNotReachHere(); + case T_INT: + { + jint con = c->as_jint(); + if (dest->is_single_cpu()) { + assert(patch_code == lir_patch_none, "no patching handled here"); + __ move(dest->as_register(), con); + } else { + assert(dest->is_single_fpu(), "wrong register kind"); + __ move(AT, con); + __ mtc1(AT, dest->as_float_reg()); + } + } + break; + + case T_LONG: + { + jlong con = c->as_jlong(); + jint* conhi = (jint*)&con + 1; + jint* conlow = (jint*)&con; + + if (dest->is_double_cpu()) { + __ move(dest->as_register_lo(), *conlow); + __ move(dest->as_register_hi(), *conhi); + } else { + // assert(dest->is_double(), "wrong register kind"); + __ move(AT, *conlow); + __ mtc1(AT, dest->as_double_reg()); + __ move(AT, *conhi); + __ mtc1(AT, dest->as_double_reg()+1); + } + } + break; + + case T_OBJECT: + { + if (patch_code == lir_patch_none) { + if (c->as_jobject() == NULL) { + NEEDS_CLEANUP + int oop_index = __ oop_recorder()->allocate_index(c->as_jobject()); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + __ relocate(rspec); + __ lui(dest->as_register(), Assembler::split_high((int) c->as_jobject() )); + __ addiu( dest->as_register() , dest->as_register() , + Assembler::split_low((int) c->as_jobject())); + } else { + int oop_index = __ oop_recorder()->find_index(c->as_jobject()); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + __ relocate(rspec); + __ lui(dest->as_register(), Assembler::split_high((int)c->as_jobject())); + __ addiu(dest->as_register(), dest->as_register(), Assembler::split_low((int)c->as_jobject())); + } + } else { + jobject2reg_with_patching(dest->as_register(), info); + } + } + break; + + case T_FLOAT: + { + address const_addr = float_constant(c->as_jfloat()); + assert (const_addr != NULL, "must create float constant in the constant table"); + + if (dest->is_single_fpu()) { + __ relocate(relocInfo::internal_pc_type); + __ lui(AT, Assembler::split_high((int)const_addr)); + __ addiu(AT, AT, Assembler::split_low((int)const_addr)); + __ lwc1(dest->as_float_reg(), AT, 0); + + } else { + assert(dest->is_single_cpu(), "Must be a cpu register."); + assert(dest->as_register() != AT, "AT can not be allocated."); + + __ relocate(relocInfo::internal_pc_type); + __ lui(AT, Assembler::split_high((int)const_addr)); + __ addiu(AT, AT, Assembler::split_low((int)const_addr)); + __ lw(dest->as_register(), AT, 0); + } + } + break; + + case T_DOUBLE: + { + address const_addr = double_constant(c->as_jdouble()); + assert (const_addr != NULL, "must create double constant in the constant table"); + + if (dest->is_double_fpu()) { + __ relocate(relocInfo::internal_pc_type); + __ lui(AT, Assembler::split_high((int)const_addr)); + __ addiu(AT, AT, Assembler::split_low((int)const_addr)); + __ lwc1(dest->as_double_reg(), AT, 0); + __ lwc1(dest->as_double_reg()+1, AT, 4); + } else { + assert(dest->as_register_lo() != AT, "AT can not be allocated."); + assert(dest->as_register_hi() != AT, "AT can not be allocated."); + + __ relocate(relocInfo::internal_pc_type); + __ lui(AT, Assembler::split_high((int)const_addr)); + __ addiu(AT, AT, Assembler::split_low((int)const_addr)); + __ lw(dest->as_register_lo(), AT, 0); + __ lw(dest->as_register_hi(), AT, 4); + } + } + break; + + default: + ShouldNotReachHere(); } } @@ -804,8 +761,16 @@ } else if (dest->is_double_cpu()) { // assert(src->is_double_cpu() && !src->overlaps(dest), "must match and not overlap"); assert(src->is_double_cpu(),"must match and not overlap"); - move_regs(src->as_register_lo(), dest->as_register_lo()); - move_regs(src->as_register_hi(), dest->as_register_hi()); + if (src->as_register_hi() != dest->as_register_lo()) { + move_regs(src->as_register_lo(), dest->as_register_lo()); + move_regs(src->as_register_hi(), dest->as_register_hi()); + } else if (src->as_register_lo() != dest->as_register_hi()) { + move_regs(src->as_register_hi(), dest->as_register_hi()); + move_regs(src->as_register_lo(), dest->as_register_lo()); + } else { + swap_reg(src->as_register_lo(), src->as_register_hi()); + } + } } else { // float to int or int to float moves @@ -855,15 +820,15 @@ } else { ShouldNotReachHere(); } - - } +} + //FIXME void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info,bool pop_fpu_stack, bool/*unaliged*/) { - LIR_Address* to_addr = dest->as_address_ptr(); - Register dest_reg = to_addr->base()->as_register(); + LIR_Address* to_addr = dest->as_address_ptr(); + Register dest_reg = to_addr->base()->as_register(); PatchingStub* patch = NULL; bool needs_patching = (patch_code != lir_patch_none); - Register disp_reg = NOREG; + Register disp_reg = NOREG; int disp_value = to_addr->disp(); if (type == T_ARRAY || type == T_OBJECT) { @@ -879,8 +844,8 @@ } if (info != NULL) { - add_debug_info_for_null_check_here(info); - } + add_debug_info_for_null_check_here(info); + } if (needs_patching) { disp_reg = AT; __ lui(AT, Assembler::split_high(disp_value)); @@ -926,41 +891,36 @@ } break; - case T_LONG:{ - - Register from_lo = src->as_register_lo(); - Register from_hi = src->as_register_hi(); - Register base = to_addr->base()->as_register(); - Register index = noreg; - if (to_addr->index()->is_register()) { - index = to_addr->index()->as_register(); - } - if (base == from_lo || index == from_lo) { - assert(base != from_hi, "can't be"); - assert(index == noreg || (index != base && index != from_hi), "can't handle this"); - // __ movl(as_Address_hi(to_addr), from_hi); - __ sw(from_hi,as_Address_hi(to_addr)); - if (patch != NULL) { - patching_epilog(patch, lir_patch_high, base, info); - patch = new PatchingStub(_masm, PatchingStub::access_field_id); - patch_code = lir_patch_low; - } - //__ movl(as_Address_lo(to_addr), from_lo); - __ sw(from_lo,as_Address_lo(to_addr)); - } else { - assert(index == noreg || (index != base && index != from_lo), "can't handle this"); - // __ movl(as_Address_lo(to_addr), from_lo); - __ sw(from_lo,as_Address_lo(to_addr)); - if (patch != NULL) { - patching_epilog(patch, lir_patch_low, base, info); - patch = new PatchingStub(_masm, PatchingStub::access_field_id); - patch_code = lir_patch_high; - } - //__ movl(as_Address_hi(to_addr), from_hi); - __ sw(from_hi,as_Address_hi(to_addr)); - } + case T_LONG: { + Register from_lo = src->as_register_lo(); + Register from_hi = src->as_register_hi(); + Register base = to_addr->base()->as_register(); + Register index = noreg; + if (to_addr->index()->is_register()) { + index = to_addr->index()->as_register(); + } + if (base == from_lo || index == from_lo) { + assert(base != from_hi, "can't be"); + assert(index == noreg || (index != base && index != from_hi), "can't handle this"); + __ sw(from_hi,as_Address_hi(to_addr)); + if (patch != NULL) { + patching_epilog(patch, lir_patch_high, base, info); + patch = new PatchingStub(_masm, PatchingStub::access_field_id); + patch_code = lir_patch_low; + } + __ sw(from_lo,as_Address_lo(to_addr)); + } else { + assert(index == noreg || (index != base && index != from_lo), "can't handle this"); + __ sw(from_lo,as_Address_lo(to_addr)); + if (patch != NULL) { + patching_epilog(patch, lir_patch_low, base, info); + patch = new PatchingStub(_masm, PatchingStub::access_field_id); + patch_code = lir_patch_high; + } + __ sw(from_hi,as_Address_hi(to_addr)); + } break; - } + } case T_ADDRESS: case T_ARRAY: case T_OBJECT: @@ -1020,8 +980,6 @@ if (needs_patching) { patching_epilog(patch, patch_code, to_addr->base()->as_register(), info); } - - } @@ -1030,7 +988,6 @@ assert(src->is_stack(), "should not call otherwise"); assert(dest->is_register(), "should not call otherwise"); if (dest->is_single_cpu()) { - // __ movl(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix())); __ lw(dest->as_register(), frame_map()->address_for_slot(src->single_stack_ix())); if (type == T_ARRAY || type == T_OBJECT) { __ verify_oop(dest->as_register()); @@ -1058,29 +1015,13 @@ void LIR_Assembler::stack2stack(LIR_Opr src, LIR_Opr dest, BasicType type) { if (src->is_single_stack()) { -// __ pushl(frame_map()->address_for_slot(src ->single_stack_ix())); __ lw(AT, frame_map()->address_for_slot(src ->single_stack_ix())); - //__ push(AT); - //__ push(frame_map()->address_for_slot(src ->single_stack_ix())); - // __ popl (frame_map()->address_for_slot(dest->single_stack_ix())); - // __ pop (frame_map()->address_for_slot(dest->single_stack_ix())); __ sw(AT, frame_map()->address_for_slot(dest->single_stack_ix())); - } else if (src->is_double_stack()) { - //__ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 0)); - // __ push(frame_map()->address_for_slot(src ->double_stack_ix(), 0)); __ lw(AT, frame_map()->address_for_slot(src ->double_stack_ix())); __ sw(AT, frame_map()->address_for_slot(dest->double_stack_ix())); - // __ pushl(frame_map()->address_for_slot(src ->double_stack_ix(), 4)); - // __ push(frame_map()->address_for_slot(src ->double_stack_ix(), 4)); __ lw(AT, frame_map()->address_for_slot(src ->double_stack_ix(),4)); __ sw(AT, frame_map()->address_for_slot(dest ->double_stack_ix(),4)); - - //__ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 4)); - //__ pop (frame_map()->address_for_slot(dest->double_stack_ix(), 4)); - //__ popl (frame_map()->address_for_slot(dest->double_stack_ix(), 0)); - // __ pop (frame_map()->address_for_slot(dest->double_stack_ix(), 0)); - } else { ShouldNotReachHere(); } @@ -1089,12 +1030,11 @@ // if patching needed, be sure the instruction at offset is a MoveMemReg -//void LIR_Assembler::mem2reg(LIR_Address* addr, RInfo to_reg, BasicType type, LIR_Op1::LIR_PatchCode patch_code, CodeEmitInfo* info) { void LIR_Assembler::mem2reg(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool) { assert(src->is_address(), "should not call otherwise"); - assert(dest->is_register(), "should not call otherwise"); - LIR_Address* addr = src->as_address_ptr(); - Address from_addr = as_Address(addr); + assert(dest->is_register(), "should not call otherwise"); + LIR_Address* addr = src->as_address_ptr(); + Address from_addr = as_Address(addr); Register src_reg = addr->base()->as_register(); Register disp_reg = noreg; @@ -1124,155 +1064,146 @@ switch(type) { case T_BOOLEAN: - case T_BYTE: - { - //assert(to_reg.is_word(), "just check"); - if (disp_reg == noreg) { - __ lb(dest->as_register(), src_reg, disp_value); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lb(dest->as_register(), AT, 0); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lb(dest->as_register(), AT, Assembler::split_low(disp_value)); - } + case T_BYTE: { + //assert(to_reg.is_word(), "just check"); + if (disp_reg == noreg) { + __ lb(dest->as_register(), src_reg, disp_value); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lb(dest->as_register(), AT, 0); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lb(dest->as_register(), AT, Assembler::split_low(disp_value)); } - break; + } + break; - case T_CHAR: - { + case T_CHAR: { //assert(to_reg.is_word(), "just check"); - - if (disp_reg == noreg) { - __ lhu(dest->as_register(), src_reg, disp_value); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lhu(dest->as_register(), AT, 0); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lhu(dest->as_register(), AT, Assembler::split_low(disp_value)); - } + if (disp_reg == noreg) { + __ lhu(dest->as_register(), src_reg, disp_value); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lhu(dest->as_register(), AT, 0); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lhu(dest->as_register(), AT, Assembler::split_low(disp_value)); } - break; + } + break; - case T_SHORT: - { + case T_SHORT: { // assert(to_reg.is_word(), "just check"); - - if (disp_reg == noreg) { - __ lh(dest->as_register(), src_reg, disp_value); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lh(dest->as_register(), AT, 0); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lh(dest->as_register(), AT, Assembler::split_low(disp_value)); - } + if (disp_reg == noreg) { + __ lh(dest->as_register(), src_reg, disp_value); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lh(dest->as_register(), AT, 0); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lh(dest->as_register(), AT, Assembler::split_low(disp_value)); } - break; + } + break; case T_INT: case T_OBJECT: - case T_ARRAY: - { + case T_ARRAY: { //assert(to_reg.is_word(), "just check"); - - if (disp_reg == noreg) { - __ lw(dest->as_register(), src_reg, disp_value); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lw(dest->as_register(), AT, 0); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lw(dest->as_register(), AT, Assembler::split_low(disp_value)); - } + if (disp_reg == noreg) { + __ lw(dest->as_register(), src_reg, disp_value); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lw(dest->as_register(), AT, 0); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lw(dest->as_register(), AT, Assembler::split_low(disp_value)); } - break; + } + break; - case T_LONG: - { + case T_LONG: { Register to_lo = dest->as_register_lo(); - Register to_hi = dest->as_register_hi(); - Register base = addr->base()->as_register(); - Register index = noreg; - if (addr->index()->is_register()) { - index = addr->index()->as_register(); - } - if ((base == to_lo && index == to_hi) ||(base == to_hi && index == to_lo)) { - // addresses with 2 registers are only formed as a result of - // array access so this code will never have to deal with - // patches or null checks. - assert(info == NULL && patch == NULL, "must be"); - __ lea(to_hi, as_Address(addr)); - __ lw(to_lo, Address(to_hi)); - __ lw(to_hi, Address(to_hi, BytesPerWord)); - } else if (base == to_lo || index == to_lo) { - assert(base != to_hi, "can't be"); - assert(index == noreg || (index != base && index != to_hi), "can't handle this"); - __ lw(to_hi, as_Address_hi(addr)); - if (patch != NULL) { - patching_epilog(patch, lir_patch_high, base, info); - patch = new PatchingStub(_masm, PatchingStub::access_field_id); - patch_code = lir_patch_low; - } - __ lw(to_lo, as_Address_lo(addr)); - } else { - assert(index == noreg || (index != base && index != to_lo), "can't handle this"); - __ lw(to_lo, as_Address_lo(addr)); - if (patch != NULL) { - patching_epilog(patch, lir_patch_low, base, info); - patch = new PatchingStub(_masm, PatchingStub::access_field_id); - patch_code = lir_patch_high; - } - __ lw(to_hi, as_Address_hi(addr)); - } - break; - } - case T_FLOAT: - { - //assert(to_reg.is_float(), "just check"); - if (disp_reg == noreg) { - __ lwc1(dest->as_float_reg(), src_reg, disp_value); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lwc1(dest->as_float_reg(), AT, 0); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lwc1(dest->as_float_reg(), AT, Assembler::split_low(disp_value)); - } + Register to_hi = dest->as_register_hi(); + Register base = addr->base()->as_register(); + Register index = noreg; + if (addr->index()->is_register()) { + index = addr->index()->as_register(); + } + if ((base == to_lo && index == to_hi) ||(base == to_hi && index == to_lo)) { + // addresses with 2 registers are only formed as a result of + // array access so this code will never have to deal with + // patches or null checks. + assert(info == NULL && patch == NULL, "must be"); + __ lea(to_hi, as_Address(addr)); + __ lw(to_lo, Address(to_hi)); + __ lw(to_hi, Address(to_hi, BytesPerWord)); + } else if (base == to_lo || index == to_lo) { + assert(base != to_hi, "can't be"); + assert(index == noreg || (index != base && index != to_hi), "can't handle this"); + __ lw(to_hi, as_Address_hi(addr)); + if (patch != NULL) { + patching_epilog(patch, lir_patch_high, base, info); + patch = new PatchingStub(_masm, PatchingStub::access_field_id); + patch_code = lir_patch_low; + } + __ lw(to_lo, as_Address_lo(addr)); + } else { + assert(index == noreg || (index != base && index != to_lo), "can't handle this"); + __ lw(to_lo, as_Address_lo(addr)); + if (patch != NULL) { + patching_epilog(patch, lir_patch_low, base, info); + patch = new PatchingStub(_masm, PatchingStub::access_field_id); + patch_code = lir_patch_high; + } + __ lw(to_hi, as_Address_hi(addr)); + } + } + break; + + case T_FLOAT: { + //assert(to_reg.is_float(), "just check"); + if (disp_reg == noreg) { + __ lwc1(dest->as_float_reg(), src_reg, disp_value); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lwc1(dest->as_float_reg(), AT, 0); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lwc1(dest->as_float_reg(), AT, Assembler::split_low(disp_value)); } - break; + } + break; - case T_DOUBLE: - { - //assert(to_reg.is_double(), "just check"); + case T_DOUBLE: { + //assert(to_reg.is_double(), "just check"); - if (disp_reg == noreg) { - __ lwc1(dest->as_double_reg(), src_reg, disp_value); - __ lwc1(dest->as_double_reg()+1, src_reg, disp_value+4); - } else if (needs_patching) { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lwc1(dest->as_double_reg(), AT, 0); - __ lwc1(dest->as_double_reg()+1, AT, 4); - } else { - __ add(AT, src_reg, disp_reg); - offset = code_offset(); - __ lwc1(dest->as_double_reg(), AT, Assembler::split_low(disp_value)); - __ lwc1(dest->as_double_reg()+1, AT, Assembler::split_low(disp_value) + 4); - } + if (disp_reg == noreg) { + __ lwc1(dest->as_double_reg(), src_reg, disp_value); + __ lwc1(dest->as_double_reg()+1, src_reg, disp_value+4); + } else if (needs_patching) { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lwc1(dest->as_double_reg(), AT, 0); + __ lwc1(dest->as_double_reg()+1, AT, 4); + } else { + __ add(AT, src_reg, disp_reg); + offset = code_offset(); + __ lwc1(dest->as_double_reg(), AT, Assembler::split_low(disp_value)); + __ lwc1(dest->as_double_reg()+1, AT, Assembler::split_low(disp_value) + 4); } - break; + } + break; default: ShouldNotReachHere(); @@ -1340,7 +1271,6 @@ return; } if (opr1->is_single_cpu()) { - Register reg_op1 = opr1->as_register(); if (opr2->is_single_cpu()) { #ifdef OPT_RANGECHECK @@ -1348,43 +1278,43 @@ #endif Register reg_op2 = opr2->as_register(); switch (condition) { - case lir_cond_equal: - __ beq(reg_op1, reg_op2, *op->label()); - break; - case lir_cond_notEqual: - __ bne(reg_op1, reg_op2, *op->label()); - break; - case lir_cond_less: - // AT = 1 TRUE - __ slt(AT, reg_op1, reg_op2); - __ bne(AT, ZERO, *op->label()); - break; - case lir_cond_lessEqual: - // AT = 0 TRUE - __ slt(AT, reg_op2, reg_op1); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_belowEqual: - // AT = 0 TRUE - __ sltu(AT, reg_op2, reg_op1); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_greaterEqual: - // AT = 0 TRUE - __ slt(AT, reg_op1, reg_op2); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_aboveEqual: - // AT = 0 TRUE - __ sltu(AT, reg_op1, reg_op2); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_greater: - // AT = 1 TRUE - __ slt(AT, reg_op2, reg_op1); - __ bne(AT, ZERO, *op->label()); - break; - default: ShouldNotReachHere(); + case lir_cond_equal: + __ beq(reg_op1, reg_op2, *op->label()); + break; + case lir_cond_notEqual: + __ bne(reg_op1, reg_op2, *op->label()); + break; + case lir_cond_less: + // AT = 1 TRUE + __ slt(AT, reg_op1, reg_op2); + __ bne(AT, ZERO, *op->label()); + break; + case lir_cond_lessEqual: + // AT = 0 TRUE + __ slt(AT, reg_op2, reg_op1); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_belowEqual: + // AT = 0 TRUE + __ sltu(AT, reg_op2, reg_op1); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_greaterEqual: + // AT = 0 TRUE + __ slt(AT, reg_op1, reg_op2); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_aboveEqual: + // AT = 0 TRUE + __ sltu(AT, reg_op1, reg_op2); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_greater: + // AT = 1 TRUE + __ slt(AT, reg_op2, reg_op1); + __ bne(AT, ZERO, *op->label()); + break; + default: ShouldNotReachHere(); } } else if (opr2->is_constant()) { jint temp_value; @@ -1399,825 +1329,814 @@ } switch (condition) { - case lir_cond_equal: + case lir_cond_equal: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); #endif - if (temp_value) { - if (is_object) { - int oop_index = __ oop_recorder()->allocate_index((jobject)temp_value); - RelocationHolder rspec = oop_Relocation::spec(oop_index); - __ relocate(rspec); - } - __ move(AT, temp_value); - __ beq(reg_op1, AT, *op->label()); - } else { - __ beq(reg_op1, ZERO, *op->label()); - } - break; - - case lir_cond_notEqual: + if (temp_value) { + if (is_object) { + int oop_index = __ oop_recorder()->allocate_index((jobject)temp_value); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + __ relocate(rspec); + } + __ move(AT, temp_value); + __ beq(reg_op1, AT, *op->label()); + } else { + __ beq(reg_op1, ZERO, *op->label()); + } + break; + + case lir_cond_notEqual: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); +#endif + if (temp_value) { + if (is_object) { + int oop_index = __ oop_recorder()->allocate_index((jobject)temp_value); + RelocationHolder rspec = oop_Relocation::spec(oop_index); + __ relocate(rspec); + } + __ move(AT, temp_value); + __ bne(reg_op1, AT, *op->label()); + } else { + __ bne(reg_op1, ZERO, *op->label()); + } + break; + + case lir_cond_less: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); #endif - if (temp_value) { - if (is_object) { - int oop_index = __ oop_recorder()->allocate_index((jobject)temp_value); - RelocationHolder rspec = oop_Relocation::spec(oop_index); - __ relocate(rspec); - } - __ move(AT, temp_value); - __ bne(reg_op1, AT, *op->label()); - } else { - __ bne(reg_op1, ZERO, *op->label()); - } - break; + // AT = 1 TRUE + if (Assembler::is_simm16(temp_value)) { + __ slti(AT, reg_op1, temp_value); + } else { + __ move(AT, temp_value); + __ slt(AT, reg_op1, AT); + } + __ bne(AT, ZERO, *op->label()); + break; - case lir_cond_less: + case lir_cond_lessEqual: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); #endif - // AT = 1 TRUE - if (Assembler::is_simm16(temp_value)) { - __ slti(AT, reg_op1, temp_value); - } else { - __ move(AT, temp_value); - __ slt(AT, reg_op1, AT); - } - __ bne(AT, ZERO, *op->label()); - break; + // AT = 0 TRUE + __ move(AT, temp_value); + __ slt(AT, AT, reg_op1); + __ beq(AT, ZERO, *op->label()); + break; + + case lir_cond_belowEqual: + // AT = 0 TRUE +#ifdef OPT_RANGECHECK + if (op->check()) { + __ move(AT, temp_value); + add_debug_info_for_range_check_here(op->info(), temp_value); + __ tgeu(AT, reg_op1, 29); + } else { +#endif + __ move(AT, temp_value); + __ sltu(AT, AT, reg_op1); + __ beq(AT, ZERO, *op->label()); +#ifdef OPT_RANGECHECK + } +#endif + break; - case lir_cond_lessEqual: + case lir_cond_greaterEqual: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); #endif - // AT = 0 TRUE - __ move(AT, temp_value); - __ slt(AT, AT, reg_op1); - __ beq(AT, ZERO, *op->label()); - break; + // AT = 0 TRUE + if (Assembler::is_simm16(temp_value)) { + __ slti(AT, reg_op1, temp_value); + } else { + __ move(AT, temp_value); + __ slt(AT, reg_op1, AT); + } + __ beq(AT, ZERO, *op->label()); + break; - case lir_cond_belowEqual: - // AT = 0 TRUE + case lir_cond_aboveEqual: #ifdef OPT_RANGECHECK - if (op->check()) { - __ move(AT, temp_value); - add_debug_info_for_range_check_here(op->info(), temp_value); - __ tgeu(AT, reg_op1, 29); - } else { + assert(!op->check(), "just check"); #endif - __ move(AT, temp_value); - __ sltu(AT, AT, reg_op1); - __ beq(AT, ZERO, *op->label()); -#ifdef OPT_RANGECHECK - } -#endif - break; - - case lir_cond_greaterEqual: + // AT = 0 TRUE + if (Assembler::is_simm16(temp_value)) { + __ sltiu(AT, reg_op1, temp_value); + } else { + __ move(AT, temp_value); + __ sltu(AT, reg_op1, AT); + } + __ beq(AT, ZERO, *op->label()); + break; + + case lir_cond_greater: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); #endif - // AT = 0 TRUE - if (Assembler::is_simm16(temp_value)) { - __ slti(AT, reg_op1, temp_value); - } else { - __ move(AT, temp_value); - __ slt(AT, reg_op1, AT); - } - __ beq(AT, ZERO, *op->label()); - break; - - case lir_cond_aboveEqual: + // AT = 1 TRUE + __ move(AT, temp_value); + __ slt(AT, AT, reg_op1); + __ bne(AT, ZERO, *op->label()); + break; + + default: ShouldNotReachHere(); + } + + } else { + if (opr2->is_address()) { + __ lw(AT, as_Address(opr2->pointer()->as_address())); + } else if (opr2->is_stack()) { + __ lw(AT, frame_map()->address_for_slot(opr2->single_stack_ix())); + } else { + ShouldNotReachHere(); + } + switch (condition) { + case lir_cond_equal: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); +#endif + __ beq(reg_op1, AT, *op->label()); + break; + case lir_cond_notEqual: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); +#endif + __ bne(reg_op1, AT, *op->label()); + break; + case lir_cond_less: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); #endif - // AT = 0 TRUE - if (Assembler::is_simm16(temp_value)) { - __ sltiu(AT, reg_op1, temp_value); - } else { - __ move(AT, temp_value); - __ sltu(AT, reg_op1, AT); - } - __ beq(AT, ZERO, *op->label()); - break; - - case lir_cond_greater: + // AT = 1 TRUE + __ slt(AT, reg_op1, AT); + __ bne(AT, ZERO, *op->label()); + break; + case lir_cond_lessEqual: #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); +#endif + // AT = 0 TRUE + __ slt(AT, AT, reg_op1); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_belowEqual: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); +#endif + // AT = 0 TRUE + __ sltu(AT, AT, reg_op1); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_greaterEqual: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); #endif - // AT = 1 TRUE - __ move(AT, temp_value); - __ slt(AT, AT, reg_op1); - __ bne(AT, ZERO, *op->label()); - break; - - default: ShouldNotReachHere(); - } - - } else { - if (opr2->is_address()) { - __ lw(AT, as_Address(opr2->pointer()->as_address())); - } else if (opr2->is_stack()) { - __ lw(AT, frame_map()->address_for_slot(opr2->single_stack_ix())); - } else { - ShouldNotReachHere(); - } - switch (condition) { - case lir_cond_equal: + // AT = 0 TRUE + __ slt(AT, reg_op1, AT); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_aboveEqual: + // AT = 0 TRUE +#ifdef OPT_RANGECHECK + if (op->check()) { + add_debug_info_for_range_check_here(op->info(), opr1->rinfo()); + __ tgeu(reg_op1, AT, 29); + } else { +#endif + __ sltu(AT, reg_op1, AT); + __ beq(AT, ZERO, *op->label()); #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + } +#endif + break; + case lir_cond_greater: +#ifdef OPT_RANGECHECK + assert(!op->check(), "just check"); #endif - __ beq(reg_op1, AT, *op->label()); - break; - case lir_cond_notEqual: + // AT = 1 TRUE + __ slt(AT, AT, reg_op1); + __ bne(AT, ZERO, *op->label()); + break; + default: ShouldNotReachHere(); + } + } +#ifdef OPT_RANGECHECK + if (!op->check()) +#endif + __ delayed()->nop(); + + } else if(opr1->is_address() || opr1->is_stack()) { #ifdef OPT_RANGECHECK assert(!op->check(), "just check"); #endif - __ bne(reg_op1, AT, *op->label()); - break; - case lir_cond_less: -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - // AT = 1 TRUE - __ slt(AT, reg_op1, AT); - __ bne(AT, ZERO, *op->label()); - break; - case lir_cond_lessEqual: -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - // AT = 0 TRUE - __ slt(AT, AT, reg_op1); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_belowEqual: -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - // AT = 0 TRUE - __ sltu(AT, AT, reg_op1); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_greaterEqual: -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - // AT = 0 TRUE - __ slt(AT, reg_op1, AT); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_aboveEqual: - // AT = 0 TRUE -#ifdef OPT_RANGECHECK - if (op->check()) { - add_debug_info_for_range_check_here(op->info(), opr1->rinfo()); - __ tgeu(reg_op1, AT, 29); - } else { -#endif - __ sltu(AT, reg_op1, AT); - __ beq(AT, ZERO, *op->label()); -#ifdef OPT_RANGECHECK - } -#endif - break; - case lir_cond_greater: -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - // AT = 1 TRUE - __ slt(AT, AT, reg_op1); - __ bne(AT, ZERO, *op->label()); - break; - default: ShouldNotReachHere(); - } - } -#ifdef OPT_RANGECHECK - if (!op->check()) -#endif - __ delayed()->nop(); - - } else if(opr1->is_address() || opr1->is_stack()) { -#ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); -#endif - if (opr2->is_constant()) { - jint temp_value; - if (opr2->as_constant_ptr()->type() == T_INT) { - temp_value = (jint)opr2->as_constant_ptr()->as_jint(); - } else if (opr2->as_constant_ptr()->type() == T_OBJECT) { - temp_value = (jint)opr2->as_constant_ptr()->as_jobject(); + if (opr2->is_constant()) { + jint temp_value; + if (opr2->as_constant_ptr()->type() == T_INT) { + temp_value = (jint)opr2->as_constant_ptr()->as_jint(); + } else if (opr2->as_constant_ptr()->type() == T_OBJECT) { + temp_value = (jint)opr2->as_constant_ptr()->as_jobject(); + } else { + ShouldNotReachHere(); + } + + if (Assembler::is_simm16(temp_value)) { + if (opr1->is_address()) { + __ lw(AT, as_Address(opr1->pointer()->as_address())); + } else { + __ lw(AT, frame_map()->address_for_slot(opr1->single_stack_ix())); + } + + switch(condition) { + + case lir_cond_equal: + __ addi(AT, AT, -(int)temp_value); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_notEqual: + __ addi(AT, AT, -(int)temp_value); + __ bne(AT, ZERO, *op->label()); + break; + case lir_cond_less: + // AT = 1 TRUE + __ slti(AT, AT, temp_value); + __ bne(AT, ZERO, *op->label()); + break; + case lir_cond_lessEqual: + // AT = 0 TRUE + __ addi(AT, AT, -temp_value); + __ slt(AT, ZERO, AT); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_belowEqual: + // AT = 0 TRUE + __ addiu(AT, AT, -temp_value); + __ sltu(AT, ZERO, AT); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_greaterEqual: + // AT = 0 TRUE + __ slti(AT, AT, temp_value); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_aboveEqual: + // AT = 0 TRUE + __ sltiu(AT, AT, temp_value); + __ beq(AT, ZERO, *op->label()); + break; + case lir_cond_greater: + // AT = 1 TRUE + __ addi(AT, AT, -temp_value); + __ slt(AT, ZERO, AT); + __ bne(AT, ZERO, *op->label()); + break; + + default: + Unimplemented(); + } + } else { + Unimplemented(); + } } else { - ShouldNotReachHere(); - } - - if (Assembler::is_simm16(temp_value)) { - if (opr1->is_address()) { - __ lw(AT, as_Address(opr1->pointer()->as_address())); - } else { - __ lw(AT, frame_map()->address_for_slot(opr1->single_stack_ix())); - } - - switch(condition) { - - case lir_cond_equal: - __ addi(AT, AT, -(int)temp_value); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_notEqual: - __ addi(AT, AT, -(int)temp_value); - __ bne(AT, ZERO, *op->label()); - break; - case lir_cond_less: - // AT = 1 TRUE - __ slti(AT, AT, temp_value); - __ bne(AT, ZERO, *op->label()); - break; - case lir_cond_lessEqual: - // AT = 0 TRUE - __ addi(AT, AT, -temp_value); - __ slt(AT, ZERO, AT); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_belowEqual: - // AT = 0 TRUE - __ addiu(AT, AT, -temp_value); - __ sltu(AT, ZERO, AT); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_greaterEqual: - // AT = 0 TRUE - __ slti(AT, AT, temp_value); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_aboveEqual: - // AT = 0 TRUE - __ sltiu(AT, AT, temp_value); - __ beq(AT, ZERO, *op->label()); - break; - case lir_cond_greater: - // AT = 1 TRUE - __ addi(AT, AT, -temp_value); - __ slt(AT, ZERO, AT); - __ bne(AT, ZERO, *op->label()); - break; - - - default: - //jerome_for_debug - Unimplemented(); - } - } else { Unimplemented(); } - } else { - Unimplemented(); - } - - __ delayed()->nop(); - - } else if(opr1->is_double_cpu()) { + __ delayed()->nop(); + + } else if(opr1->is_double_cpu()) { #ifdef OPT_RANGECHECK assert(!op->check(), "just check"); #endif - Register opr1_lo = opr1->as_register_lo(); - Register opr1_hi = opr1->as_register_hi(); - - if (opr2->is_double_cpu()) { - Register opr2_lo = opr2->as_register_lo(); - Register opr2_hi = opr2->as_register_hi(); - switch (condition) { - case lir_cond_equal: - { - Label L; - __ bne(opr1_lo, opr2_lo, L); - __ delayed()->nop(); - __ beq(opr1_hi, opr2_hi, *op->label()); - __ delayed()->nop(); - __ bind(L); - } - break; - - case lir_cond_notEqual: - __ bne(opr1_lo, opr2_lo, *op->label()); - __ delayed()->nop(); - __ bne(opr1_hi, opr2_hi, *op->label()); - __ delayed()->nop(); - break; - - case lir_cond_less: - { - Label L; - - // if hi less then jump - __ slt(AT, opr1_hi, opr2_hi); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - // if hi great then fail - __ bne(opr1_hi, opr2_hi, L); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr1_lo, opr2_lo); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_lessEqual: - { - Label L; - - // if hi great then fail - __ slt(AT, opr2_hi, opr1_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi less then jump - __ bne(opr2_hi, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr2_lo, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_belowEqual: - { - Label L; - - // if hi great then fail - __ sltu(AT, opr2_hi, opr1_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi less then jump - __ bne(opr2_hi, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr2_lo, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_greaterEqual: - { - Label L; - - // if hi less then fail - __ slt(AT, opr1_hi, opr2_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi great then jump - __ bne(opr2_hi, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr1_lo, opr2_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_aboveEqual: - { - Label L; - - // if hi less then fail - __ sltu(AT, opr1_hi, opr2_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi great then jump - __ bne(opr2_hi, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr1_lo, opr2_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_greater: - { - Label L; - - // if hi great then jump - __ slt(AT, opr2_hi, opr1_hi); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - // if hi less then fail - __ bne(opr2_hi, opr1_hi, L); - __ delayed(); - - // now just comp lo as unsigned - __ sltu(AT, opr2_lo, opr1_lo); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - default: ShouldNotReachHere(); - } - - } else if(opr2->is_constant()) { - jlong lv = opr2->as_jlong(); - jint iv_lo = (jint)lv; - jint iv_hi = (jint)(lv>>32); - bool is_zero = (lv==0); - - switch (condition) { - case lir_cond_equal: - if (is_zero) { - __ orr(AT, opr1_lo, opr1_hi); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - } else { - Label L; - __ move(T8, iv_lo); - __ bne(opr1_lo, T8, L); - __ delayed(); - __ move(T8, iv_hi); - __ beq(opr1_hi, T8, *op->label()); - __ delayed()->nop(); - __ bind(L); - } - break; - - case lir_cond_notEqual: - if (is_zero) { - __ orr(AT, opr1_lo, opr1_hi); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - } else { - __ move(T8, iv_lo); - __ bne(opr1_lo, T8, *op->label()); - __ delayed(); - __ move(T8, iv_hi); - __ bne(opr1_hi, T8, *op->label()); - __ delayed()->nop(); - } - break; - - case lir_cond_less: - if (is_zero) { - __ bltz(opr1_hi, *op->label()); - __ delayed()->nop(); - } else { - Label L; - - // if hi less then jump - __ move(T8, iv_hi); - __ slt(AT, opr1_hi, T8); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - // if hi great then fail - __ bne(opr1_hi, T8, L); - __ delayed(); - - // now just comp lo as unsigned - if (Assembler::is_simm16(iv_lo)) { - __ sltiu(AT, opr1_lo, iv_lo); - } else { - __ move(T8, iv_lo); - __ sltu(AT, opr1_lo, T8); - } - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_lessEqual: - if (is_zero) { - __ bltz(opr1_hi, *op->label()); - __ delayed()->nop(); - __ orr(AT, opr1_hi, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed(); - } else { - Label L; - - // if hi great then fail - __ move(T8, iv_hi); - __ slt(AT, T8, opr1_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi less then jump - __ bne(T8, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ move(T8, iv_lo); - __ sltu(AT, T8, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_belowEqual: - if (is_zero) { - __ orr(AT, opr1_hi, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - } else { - Label L; - - // if hi great then fail - __ move(T8, iv_hi); - __ sltu(AT, T8, opr1_hi); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi less then jump - __ bne(T8, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - __ move(T8, iv_lo); - __ sltu(AT, T8, opr1_lo); - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_greaterEqual: - if (is_zero) { - __ bgez(opr1_hi, *op->label()); - __ delayed()->nop(); - } else { - Label L; - - // if hi less then fail - __ move(T8, iv_hi); - __ slt(AT, opr1_hi, T8); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi great then jump - __ bne(T8, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - if (Assembler::is_simm16(iv_lo)) { - __ sltiu(AT, opr1_lo, iv_lo); - } else { - __ move(T8, iv_lo); - __ sltu(AT, opr1_lo, T8); - } - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_aboveEqual: - if (is_zero) { - __ b(*op->label()); - __ delayed()->nop(); - } else { - Label L; - - // if hi less then fail - __ move(T8, iv_hi); - __ sltu(AT, opr1_hi, T8); - __ bne(AT, ZERO, L); - __ delayed()->nop(); - - // if hi great then jump - __ bne(T8, opr1_hi, *op->label()); - __ delayed(); - - // now just comp lo as unsigned - if (Assembler::is_simm16(iv_lo)) { - __ sltiu(AT, opr1_lo, iv_lo); - } else { - __ move(T8, iv_lo); - __ sltu(AT, opr1_lo, T8); - } - __ beq(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - case lir_cond_greater: - if (is_zero) { - Label L; - __ bgtz(opr1_hi, *op->label()); - __ delayed()->nop(); - __ bne(opr1_hi, ZERO, L); - __ delayed()->nop(); - __ bne(opr1_lo, ZERO, *op->label()); - __ delayed()->nop(); - __ bind(L); - } else { - Label L; - - // if hi great then jump - __ move(T8, iv_hi); - __ slt(AT, T8, opr1_hi); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - // if hi less then fail - __ bne(T8, opr1_hi, L); - __ delayed(); - - // now just comp lo as unsigned - __ move(T8, iv_lo); - __ sltu(AT, T8, opr1_lo); - __ bne(AT, ZERO, *op->label()); - __ delayed()->nop(); - - __ bind(L); - } - break; - - default: - ShouldNotReachHere(); - } - } else { - Unimplemented(); - } - } else if (opr1->is_single_fpu()) { + Register opr1_lo = opr1->as_register_lo(); + Register opr1_hi = opr1->as_register_hi(); + + if (opr2->is_double_cpu()) { + Register opr2_lo = opr2->as_register_lo(); + Register opr2_hi = opr2->as_register_hi(); + switch (condition) { + case lir_cond_equal: { + Label L; + __ bne(opr1_lo, opr2_lo, L); + __ delayed()->nop(); + __ beq(opr1_hi, opr2_hi, *op->label()); + __ delayed()->nop(); + __ bind(L); + } + break; + + case lir_cond_notEqual: + __ bne(opr1_lo, opr2_lo, *op->label()); + __ delayed()->nop(); + __ bne(opr1_hi, opr2_hi, *op->label()); + __ delayed()->nop(); + break; + + case lir_cond_less: { + Label L; + + // if hi less then jump + __ slt(AT, opr1_hi, opr2_hi); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + // if hi great then fail + __ bne(opr1_hi, opr2_hi, L); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr1_lo, opr2_lo); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_lessEqual: { + Label L; + + // if hi great then fail + __ slt(AT, opr2_hi, opr1_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi less then jump + __ bne(opr2_hi, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr2_lo, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_belowEqual: { + Label L; + + // if hi great then fail + __ sltu(AT, opr2_hi, opr1_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi less then jump + __ bne(opr2_hi, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr2_lo, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_greaterEqual: { + Label L; + + // if hi less then fail + __ slt(AT, opr1_hi, opr2_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi great then jump + __ bne(opr2_hi, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr1_lo, opr2_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_aboveEqual: { + Label L; + + // if hi less then fail + __ sltu(AT, opr1_hi, opr2_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi great then jump + __ bne(opr2_hi, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr1_lo, opr2_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_greater: { + Label L; + + // if hi great then jump + __ slt(AT, opr2_hi, opr1_hi); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + // if hi less then fail + __ bne(opr2_hi, opr1_hi, L); + __ delayed(); + + // now just comp lo as unsigned + __ sltu(AT, opr2_lo, opr1_lo); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + default: ShouldNotReachHere(); + } + + } else if(opr2->is_constant()) { + jlong lv = opr2->as_jlong(); + jint iv_lo = (jint)lv; + jint iv_hi = (jint)(lv>>32); + bool is_zero = (lv==0); + + switch (condition) { + case lir_cond_equal: + if (is_zero) { + __ orr(AT, opr1_lo, opr1_hi); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + } else { + Label L; + __ move(T8, iv_lo); + __ bne(opr1_lo, T8, L); + __ delayed(); + __ move(T8, iv_hi); + __ beq(opr1_hi, T8, *op->label()); + __ delayed()->nop(); + __ bind(L); + } + break; + + case lir_cond_notEqual: + if (is_zero) { + __ orr(AT, opr1_lo, opr1_hi); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + } else { + __ move(T8, iv_lo); + __ bne(opr1_lo, T8, *op->label()); + __ delayed(); + __ move(T8, iv_hi); + __ bne(opr1_hi, T8, *op->label()); + __ delayed()->nop(); + } + break; + + case lir_cond_less: + if (is_zero) { + __ bltz(opr1_hi, *op->label()); + __ delayed()->nop(); + } else { + Label L; + + // if hi less then jump + __ move(T8, iv_hi); + __ slt(AT, opr1_hi, T8); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + // if hi great then fail + __ bne(opr1_hi, T8, L); + __ delayed(); + + // now just comp lo as unsigned + if (Assembler::is_simm16(iv_lo)) { + __ sltiu(AT, opr1_lo, iv_lo); + } else { + __ move(T8, iv_lo); + __ sltu(AT, opr1_lo, T8); + } + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_lessEqual: + if (is_zero) { + __ bltz(opr1_hi, *op->label()); + __ delayed()->nop(); + __ orr(AT, opr1_hi, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed(); + } else { + Label L; + + // if hi great then fail + __ move(T8, iv_hi); + __ slt(AT, T8, opr1_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi less then jump + __ bne(T8, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ move(T8, iv_lo); + __ sltu(AT, T8, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_belowEqual: + if (is_zero) { + __ orr(AT, opr1_hi, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + } else { + Label L; + + // if hi great then fail + __ move(T8, iv_hi); + __ sltu(AT, T8, opr1_hi); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi less then jump + __ bne(T8, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + __ move(T8, iv_lo); + __ sltu(AT, T8, opr1_lo); + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_greaterEqual: + if (is_zero) { + __ bgez(opr1_hi, *op->label()); + __ delayed()->nop(); + } else { + Label L; + + // if hi less then fail + __ move(T8, iv_hi); + __ slt(AT, opr1_hi, T8); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi great then jump + __ bne(T8, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + if (Assembler::is_simm16(iv_lo)) { + __ sltiu(AT, opr1_lo, iv_lo); + } else { + __ move(T8, iv_lo); + __ sltu(AT, opr1_lo, T8); + } + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_aboveEqual: + if (is_zero) { + __ b(*op->label()); + __ delayed()->nop(); + } else { + Label L; + + // if hi less then fail + __ move(T8, iv_hi); + __ sltu(AT, opr1_hi, T8); + __ bne(AT, ZERO, L); + __ delayed()->nop(); + + // if hi great then jump + __ bne(T8, opr1_hi, *op->label()); + __ delayed(); + + // now just comp lo as unsigned + if (Assembler::is_simm16(iv_lo)) { + __ sltiu(AT, opr1_lo, iv_lo); + } else { + __ move(T8, iv_lo); + __ sltu(AT, opr1_lo, T8); + } + __ beq(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + case lir_cond_greater: + if (is_zero) { + Label L; + __ bgtz(opr1_hi, *op->label()); + __ delayed()->nop(); + __ bne(opr1_hi, ZERO, L); + __ delayed()->nop(); + __ bne(opr1_lo, ZERO, *op->label()); + __ delayed()->nop(); + __ bind(L); + } else { + Label L; + + // if hi great then jump + __ move(T8, iv_hi); + __ slt(AT, T8, opr1_hi); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + // if hi less then fail + __ bne(T8, opr1_hi, L); + __ delayed(); + + // now just comp lo as unsigned + __ move(T8, iv_lo); + __ sltu(AT, T8, opr1_lo); + __ bne(AT, ZERO, *op->label()); + __ delayed()->nop(); + + __ bind(L); + } + break; + + default: + ShouldNotReachHere(); + } + } else { + Unimplemented(); + } + } else if (opr1->is_single_fpu()) { #ifdef OPT_RANGECHECK assert(!op->check(), "just check"); #endif - assert(opr2->is_single_fpu(), "change the code"); - - FloatRegister reg_op1 = opr1->as_float_reg(); - FloatRegister reg_op2 = opr2->as_float_reg(); - // bool un_ls - bool un_jump = (op->ublock()->label()==op->label()); - - Label& L = *op->label(); - - switch (condition) { - case lir_cond_equal: - if (un_jump) - __ c_ueq_s(reg_op1, reg_op2); - else - __ c_eq_s(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_notEqual: - if (un_jump) - __ c_eq_s(reg_op1, reg_op2); - else - __ c_ueq_s(reg_op1, reg_op2); - __ bc1f(L); - - break; - - case lir_cond_less: - if (un_jump) - __ c_ult_s(reg_op1, reg_op2); - else - __ c_olt_s(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_lessEqual: - case lir_cond_belowEqual: - if (un_jump) - __ c_ule_s(reg_op1, reg_op2); - else - __ c_ole_s(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_greaterEqual: - case lir_cond_aboveEqual: - if (un_jump) - __ c_olt_s(reg_op1, reg_op2); - else - __ c_ult_s(reg_op1, reg_op2); - __ bc1f(L); - - break; - - case lir_cond_greater: - if (un_jump) - __ c_ole_s(reg_op1, reg_op2); - else - __ c_ule_s(reg_op1, reg_op2); - __ bc1f(L); - - break; - - default: - ShouldNotReachHere(); - } - __ delayed()->nop(); - } else if (opr1->is_double_fpu()) { + assert(opr2->is_single_fpu(), "change the code"); + + FloatRegister reg_op1 = opr1->as_float_reg(); + FloatRegister reg_op2 = opr2->as_float_reg(); + // bool un_ls + bool un_jump = (op->ublock()->label()==op->label()); + + Label& L = *op->label(); + + switch (condition) { + case lir_cond_equal: + if (un_jump) + __ c_ueq_s(reg_op1, reg_op2); + else + __ c_eq_s(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_notEqual: + if (un_jump) + __ c_eq_s(reg_op1, reg_op2); + else + __ c_ueq_s(reg_op1, reg_op2); + __ bc1f(L); + + break; + + case lir_cond_less: + if (un_jump) + __ c_ult_s(reg_op1, reg_op2); + else + __ c_olt_s(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_lessEqual: + case lir_cond_belowEqual: + if (un_jump) + __ c_ule_s(reg_op1, reg_op2); + else + __ c_ole_s(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_greaterEqual: + case lir_cond_aboveEqual: + if (un_jump) + __ c_olt_s(reg_op1, reg_op2); + else + __ c_ult_s(reg_op1, reg_op2); + __ bc1f(L); + + break; + + case lir_cond_greater: + if (un_jump) + __ c_ole_s(reg_op1, reg_op2); + else + __ c_ule_s(reg_op1, reg_op2); + __ bc1f(L); + + break; + + default: + ShouldNotReachHere(); + } + __ delayed()->nop(); + } else if (opr1->is_double_fpu()) { #ifdef OPT_RANGECHECK - assert(!op->check(), "just check"); + assert(!op->check(), "just check"); #endif - assert(opr2->is_double_fpu(), "change the code"); - - FloatRegister reg_op1 = opr1->as_double_reg(); - FloatRegister reg_op2 = opr2->as_double_reg(); - bool un_jump = (op->ublock()->label()==op->label()); - Label& L = *op->label(); - - switch (condition) { - case lir_cond_equal: - if (un_jump) - __ c_ueq_d(reg_op1, reg_op2); - else - __ c_eq_d(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_notEqual: - if (un_jump) - __ c_eq_d(reg_op1, reg_op2); - else - __ c_ueq_d(reg_op1, reg_op2); - __ bc1f(L); - - break; - - case lir_cond_less: - if (un_jump) - __ c_ult_d(reg_op1, reg_op2); - else - __ c_olt_d(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_lessEqual: - case lir_cond_belowEqual: - if (un_jump) - __ c_ule_d(reg_op1, reg_op2); - else - __ c_ole_d(reg_op1, reg_op2); - __ bc1t(L); - - break; - - case lir_cond_greaterEqual: - case lir_cond_aboveEqual: - if (un_jump) - __ c_olt_d(reg_op1, reg_op2); - else - __ c_ult_d(reg_op1, reg_op2); - __ bc1f(L); - - break; - - case lir_cond_greater: - if (un_jump) - __ c_ole_d(reg_op1, reg_op2); - else - __ c_ule_d(reg_op1, reg_op2); - __ bc1f(L); - - break; - - default: - ShouldNotReachHere(); - } - - __ delayed()->nop(); - } else { + assert(opr2->is_double_fpu(), "change the code"); + + FloatRegister reg_op1 = opr1->as_double_reg(); + FloatRegister reg_op2 = opr2->as_double_reg(); + bool un_jump = (op->ublock()->label()==op->label()); + Label& L = *op->label(); + + switch (condition) { + case lir_cond_equal: + if (un_jump) + __ c_ueq_d(reg_op1, reg_op2); + else + __ c_eq_d(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_notEqual: + if (un_jump) + __ c_eq_d(reg_op1, reg_op2); + else + __ c_ueq_d(reg_op1, reg_op2); + __ bc1f(L); + + break; + + case lir_cond_less: + if (un_jump) + __ c_ult_d(reg_op1, reg_op2); + else + __ c_olt_d(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_lessEqual: + case lir_cond_belowEqual: + if (un_jump) + __ c_ule_d(reg_op1, reg_op2); + else + __ c_ole_d(reg_op1, reg_op2); + __ bc1t(L); + + break; + + case lir_cond_greaterEqual: + case lir_cond_aboveEqual: + if (un_jump) + __ c_olt_d(reg_op1, reg_op2); + else + __ c_ult_d(reg_op1, reg_op2); + __ bc1f(L); + + break; + + case lir_cond_greater: + if (un_jump) + __ c_ole_d(reg_op1, reg_op2); + else + __ c_ule_d(reg_op1, reg_op2); + __ bc1f(L); + + break; + + default: + ShouldNotReachHere(); + } + __ delayed()->nop(); + } else { Unimplemented(); } } @@ -2226,7 +2145,6 @@ void LIR_Assembler::emit_opConvert(LIR_OpConvert* op) { LIR_Opr value = op->in_opr(); LIR_Opr src = op->in_opr(); - // RInfo dst = op->result_opr()->rinfo(); LIR_Opr dest = op->result_opr(); Bytecodes::Code code = op->bytecode(); @@ -2235,191 +2153,180 @@ move_regs(src->as_register(), dest->as_register_lo()); __ sra (dest->as_register_hi(), dest->as_register_lo(), 31); break; - case Bytecodes::_l2i: move_regs (src->as_register_lo(), dest->as_register()); break; + case Bytecodes::_i2b: - move_regs (src->as_register(), dest->as_register()); + move_regs (src->as_register(), dest->as_register()); __ sign_extend_byte(dest->as_register()); break; + case Bytecodes::_i2c: __ andi(dest->as_register(), src->as_register(), 0xFFFF); break; + case Bytecodes::_i2s: - move_regs (src->as_register(), dest->as_register()); + move_regs (src->as_register(), dest->as_register()); __ sign_extend_short(dest->as_register()); break; - case Bytecodes::_f2d: - __ cvt_d_s(dest->as_double_reg(), src->as_float_reg()); + + case Bytecodes::_f2d: + __ cvt_d_s(dest->as_double_reg(), src->as_float_reg()); break; + case Bytecodes::_d2f: - __ cvt_s_d(dest->as_float_reg(), src->as_double_reg()); - break; - case Bytecodes::_i2f: - { - FloatRegister df = dest->as_float_reg(); - if(src->is_single_cpu()) { - __ mtc1(src->as_register(), df); - __ cvt_s_w(df, df); - } else if (src->is_stack()) { - Address src_addr = src->is_single_stack() - ? frame_map()->address_for_slot(src->single_stack_ix()) - : frame_map()->address_for_slot(src->double_stack_ix()); - __ lw(AT, src_addr); - __ mtc1(AT, df); - __ cvt_s_w(df, df); - } else { - Unimplemented(); - } - - - } - break; - case Bytecodes::_i2d: - { - FloatRegister dd = dest->as_double_reg(); - if (src->is_single_cpu()) { - __ mtc1(src->as_register(), dd); - __ cvt_d_w(dd, dd); - } else if (src->is_stack()) { - Address src_addr = src->is_single_stack() - ? frame_map()->address_for_slot(value->single_stack_ix()) - : frame_map()->address_for_slot(value->double_stack_ix()); - __ lw(AT, src_addr); - __ mtc1(AT, dd); - __ cvt_d_w(dd, dd); - } else { - Unimplemented(); - } - } - break; - case Bytecodes::_f2i: - { - FloatRegister fval = src->as_float_reg(); - Register dreg = dest->as_register(); - - Label L; - __ c_un_s(fval, fval); //NaN? - __ bc1t(L); - __ delayed(); - __ move(dreg, ZERO); - - __ trunc_w_s(F30, fval); - __ mfc1(dreg, F30); - __ bind(L); - } - break; - case Bytecodes::_d2i: - { - FloatRegister dval = src->as_double_reg(); - Register dreg = dest->as_register(); - - Label L; - __ c_un_d(dval, dval); //NaN? - __ bc1t(L); - __ delayed(); - __ move(dreg, ZERO); - - __ trunc_w_d(F30, dval); - __ mfc1(dreg, F30); - __ bind(L); - } - break; - case Bytecodes::_l2f: - { - FloatRegister ldf = dest->as_float_reg(); - if (src->is_double_cpu()) { - __ mtc1(src->as_register_lo(), ldf); - __ mtc1(src->as_register_hi(), ldf + 1); - __ cvt_s_l(ldf, ldf); - } else if (src->is_double_stack()) { - Address src_addr=frame_map()->address_for_slot(value->double_stack_ix()); - __ lw(AT, src_addr); - __ mtc1(AT, ldf); - __ lw(AT, src_addr.base(), src_addr.disp() + 4); - __ mtc1(AT, ldf + 1); - __ cvt_s_l(ldf, ldf); - } else { - Unimplemented(); - } - } - break; - case Bytecodes::_l2d: - { - FloatRegister ldd = dest->as_double_reg(); - if (src->is_double_cpu()) { - __ mtc1(src->as_register_lo(), ldd); - __ mtc1(src->as_register_hi(), ldd + 1); - __ cvt_d_l(ldd, ldd); - } else if (src->is_double_stack()) { - Address src_addr = frame_map()->address_for_slot(src->double_stack_ix()); - __ lw(AT, src_addr); - __ mtc1(AT, ldd); - __ lw(AT, src_addr.base(), src_addr.disp() + 4); - __ mtc1(AT, ldd + 1); - __ cvt_d_l(ldd, ldd); - } else { - Unimplemented(); - } - } - break; - + __ cvt_s_d(dest->as_float_reg(), src->as_double_reg()); + break; + case Bytecodes::_i2f: { + FloatRegister df = dest->as_float_reg(); + if(src->is_single_cpu()) { + __ mtc1(src->as_register(), df); + __ cvt_s_w(df, df); + } else if (src->is_stack()) { + Address src_addr = src->is_single_stack() + ? frame_map()->address_for_slot(src->single_stack_ix()) + : frame_map()->address_for_slot(src->double_stack_ix()); + __ lw(AT, src_addr); + __ mtc1(AT, df); + __ cvt_s_w(df, df); + } else { + Unimplemented(); + } + break; + } + case Bytecodes::_i2d: { + FloatRegister dd = dest->as_double_reg(); + if (src->is_single_cpu()) { + __ mtc1(src->as_register(), dd); + __ cvt_d_w(dd, dd); + } else if (src->is_stack()) { + Address src_addr = src->is_single_stack() + ? frame_map()->address_for_slot(value->single_stack_ix()) + : frame_map()->address_for_slot(value->double_stack_ix()); + __ lw(AT, src_addr); + __ mtc1(AT, dd); + __ cvt_d_w(dd, dd); + } else { + Unimplemented(); + } + break; + } + case Bytecodes::_f2i: { + FloatRegister fval = src->as_float_reg(); + Register dreg = dest->as_register(); + + Label L; + __ c_un_s(fval, fval); //NaN? + __ bc1t(L); + __ delayed(); + __ move(dreg, ZERO); + + __ trunc_w_s(F30, fval); + __ mfc1(dreg, F30); + __ bind(L); + break; + } + case Bytecodes::_d2i: { + FloatRegister dval = src->as_double_reg(); + Register dreg = dest->as_register(); + + Label L; + __ c_un_d(dval, dval); //NaN? + __ bc1t(L); + __ delayed(); + __ move(dreg, ZERO); - case Bytecodes::_f2l: - { - FloatRegister fval = src->as_float_reg(); - Register dlo = dest->as_register_lo(); - Register dhi = dest->as_register_hi(); - - Label L; - __ move(dhi, ZERO); - __ c_un_s(fval, fval); //NaN? - __ bc1t(L); - __ delayed(); - __ move(dlo, ZERO); - - __ trunc_l_s(F30, fval); - __ mfc1(dlo, F30); - __ mfc1(dhi, F31); - __ bind(L); - } - break; - case Bytecodes::_d2l: - { - FloatRegister dval = src->as_double_reg(); - Register dlo = dest->as_register_lo(); - Register dhi = dest->as_register_hi(); - - Label L; - __ move(dhi, ZERO); - __ c_un_d(dval, dval); //NaN? - __ bc1t(L); - __ delayed(); - __ move(dlo, ZERO); - - __ trunc_l_d(F30, dval); - __ mfc1(dlo, F30); - __ mfc1(dhi, F31); - __ bind(L); - } - break; - - - default: ShouldNotReachHere(); + __ trunc_w_d(F30, dval); + __ mfc1(dreg, F30); + __ bind(L); + break; + } + case Bytecodes::_l2f: { + FloatRegister ldf = dest->as_float_reg(); + if (src->is_double_cpu()) { + __ mtc1(src->as_register_lo(), ldf); + __ mtc1(src->as_register_hi(), ldf + 1); + __ cvt_s_l(ldf, ldf); + } else if (src->is_double_stack()) { + Address src_addr=frame_map()->address_for_slot(value->double_stack_ix()); + __ lw(AT, src_addr); + __ mtc1(AT, ldf); + __ lw(AT, src_addr.base(), src_addr.disp() + 4); + __ mtc1(AT, ldf + 1); + __ cvt_s_l(ldf, ldf); + } else { + Unimplemented(); + } + break; + } + case Bytecodes::_l2d: { + FloatRegister ldd = dest->as_double_reg(); + if (src->is_double_cpu()) { + __ mtc1(src->as_register_lo(), ldd); + __ mtc1(src->as_register_hi(), ldd + 1); + __ cvt_d_l(ldd, ldd); + } else if (src->is_double_stack()) { + Address src_addr = frame_map()->address_for_slot(src->double_stack_ix()); + __ lw(AT, src_addr); + __ mtc1(AT, ldd); + __ lw(AT, src_addr.base(), src_addr.disp() + 4); + __ mtc1(AT, ldd + 1); + __ cvt_d_l(ldd, ldd); + } else { + Unimplemented(); + } + break; + } + + case Bytecodes::_f2l: { + FloatRegister fval = src->as_float_reg(); + Register dlo = dest->as_register_lo(); + Register dhi = dest->as_register_hi(); + + Label L; + __ move(dhi, ZERO); + __ c_un_s(fval, fval); //NaN? + __ bc1t(L); + __ delayed(); + __ move(dlo, ZERO); + + __ trunc_l_s(F30, fval); + __ mfc1(dlo, F30); + __ mfc1(dhi, F31); + __ bind(L); + break; + } + case Bytecodes::_d2l: { + FloatRegister dval = src->as_double_reg(); + Register dlo = dest->as_register_lo(); + Register dhi = dest->as_register_hi(); + + Label L; + __ move(dhi, ZERO); + __ c_un_d(dval, dval); //NaN? + __ bc1t(L); + __ delayed(); + __ move(dlo, ZERO); + + __ trunc_l_d(F30, dval); + __ mfc1(dlo, F30); + __ mfc1(dhi, F31); + __ bind(L); + break; + } + + default: ShouldNotReachHere(); } } void LIR_Assembler::emit_alloc_obj(LIR_OpAllocObj* op) { if (op->init_check()) { - // __ cmpl(Address(op->klass()->as_register(), - // instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc)), - // instanceKlass::fully_initialized); add_debug_info_for_null_check_here(op->stub()->info()); - // __ jcc(Assembler::notEqual, *op->stub()->entry()); - __ lw(AT,Address(op->klass()->as_register(),instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc))); - __ addi(AT, AT, -instanceKlass::fully_initialized); + __ lw(AT,Address(op->klass()->as_register(), + instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc))); + __ addi(AT, AT, -instanceKlass::fully_initialized); __ bne(AT,ZERO,*op->stub()->entry()); __ delayed()->nop(); } @@ -2436,8 +2343,6 @@ } void LIR_Assembler::emit_alloc_array(LIR_OpAllocArray* op) { - - if (UseSlowPath || (!UseFastNewObjectArray && (op->type() == T_OBJECT || op->type() == T_ARRAY)) || (!UseFastNewTypeArray && (op->type() != T_OBJECT && op->type() != T_ARRAY))) { @@ -2483,7 +2388,7 @@ __ lw(k_RInfo, k_RInfo, objArrayKlass::element_klass_offset_in_bytes() + sizeof(oopDesc)); // get super_check_offset - //for SIGBUS, FIXME, Jerome + //for SIGBUS, FIXME, Jerome __ nop(); __ nop(); __ lw(T9, k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes()); @@ -2604,16 +2509,12 @@ __ delayed()->nop(); __ bind(profile_done); } else { - // __ jcc(Assembler::equal, done); __ beq(obj, ZERO, done); __ delayed()->nop(); } __ verify_oop(obj); - // __ beq(obj, ZERO, done); - // __ delayed()->nop(); - if (op->fast_check()) { // get object class // not a safepoint as obj null check happens earlier @@ -2672,7 +2573,6 @@ // assert(dst != klass_RInfo && dst != k_RInfo, "need 3 registers"); // super_check_offset - // __ lw(T9, k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes()); __ lw(Rtmp1, k_RInfo, sizeof(oopDesc) + Klass::super_check_offset_offset_in_bytes()); // See if we get an immediate positive hit __ add(AT, klass_RInfo, Rtmp1); @@ -2731,8 +2631,8 @@ Label one; if (obj == k_RInfo) { - k_RInfo = klass_RInfo; - klass_RInfo = obj; + k_RInfo = klass_RInfo; + klass_RInfo = obj; } // patching may screw with our temporaries on sparc, @@ -2740,7 +2640,6 @@ if (!k->is_loaded()) { jobject2reg_with_patching(k_RInfo, op->info_for_patch()); } else { - // ciObject2reg(k, k_RInfo); jobject2reg(k->encoding(), k_RInfo); } @@ -2761,7 +2660,7 @@ // not a safepoint as obj null check happens earlier __ lw(klass_RInfo, obj, oopDesc::klass_offset_in_bytes()); if (k->is_loaded()) { - // assert(dst != obj, "need different registers so we have a temporary"); + // assert(dst != obj, "need different registers so we have a temporary"); // See if we get an immediate positive hit __ lw(AT, klass_RInfo, k->super_check_offset()); @@ -2770,10 +2669,9 @@ if (sizeof(oopDesc) + Klass::secondary_super_cache_offset_in_bytes() == k->super_check_offset()) { // check for self //ciObject2reg(k, AT); - jobject2reg(k->encoding(), AT); - - __ beq(klass_RInfo, k_RInfo, one); - __ delayed()->nop(); + jobject2reg(k->encoding(), AT); + __ beq(klass_RInfo, k_RInfo, one); + __ delayed()->nop(); // array __ lw(T8, klass_RInfo, sizeof(oopDesc) + Klass::secondary_supers_offset_in_bytes()); @@ -2884,13 +2782,8 @@ } void LIR_Assembler::cmove(LIR_Condition condition, LIR_Opr opr1, LIR_Opr opr2, LIR_Opr result) { - } - - - - - -//void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info) { +} + void LIR_Assembler::arith_op(LIR_Code code, LIR_Opr left, LIR_Opr right, LIR_Opr dest, CodeEmitInfo* info,bool pop_fpu_stack) { assert(info == NULL || ((code == lir_rem || code == lir_div || code == lir_sub) && right->is_double_cpu()), "info is only for ldiv/lrem"); if (left->is_double_cpu()) { @@ -3533,9 +3426,6 @@ } */ __ relocate(static_stub_Relocation::spec(call_pc)); - //__ movl(ebx, (jobject)NULL); - //__ lw(T7, (jobject)NULL); -// __ move(T7, ZERO); jobject o=NULL; int oop_index = __ oop_recorder()->allocate_index((jobject)o); RelocationHolder rspec = oop_Relocation::spec(oop_index); @@ -3545,16 +3435,12 @@ // must be set to -1 at code generation time // assert(!os::is_MP() || ((__ offset() + 1) % BytesPerWord) == 0, "must be aligned on MP"); - //__ jmp((address)-1, relocInfo::runtime_call_type); - //jerome_for_debug - __ lui(AT, Assembler::split_high((int)-1)); + __ lui(AT, Assembler::split_high((int)-1)); __ addiu(AT, AT, Assembler::split_low((int)-1)); - __ jr(AT); + __ jr(AT); __ delayed()->nop(); assert(__ offset() - start <= call_stub_size, "stub too big") __ end_a_stub(); - - } @@ -3928,11 +3814,11 @@ __ andr(SP, SP, AT); // push argument __ sw(length, SP, 4 * wordSize); - /*if (dst_pos != A3)*/ __ move(A3, dst_pos); - /*if (dst != A2)*/ __ move(A2, dst); - /*if (src_pos != A1)*/ __ move(A1, src_pos); - /*if (src != A0)*/ __ move(A0, src); - // make call + __ move(A3, dst_pos); + __ move(A2, dst); + __ move(A1, src_pos); + __ move(A0, src); + // make call address entry = CAST_FROM_FN_PTR(address, Runtime1::arraycopy); __ call(entry, relocInfo::runtime_call_type); __ delayed()->nop(); @@ -3942,20 +3828,19 @@ #endif __ lw(SP, java_thread, in_bytes(JavaThread::last_Java_sp_offset())); -// __ beq(V0, ZERO, done); __ beq(V0, ZERO, *stub->continuation()); __ delayed()->nop(); - __ super_pop(length); - __ super_pop(dst_pos); - __ super_pop(src_pos); - __ super_pop(dst); - __ super_pop(src); - - - __ b(*stub->entry()); - __ delayed()->nop(); - __ bind(*stub->continuation()); - return; + __ super_pop(length); + __ super_pop(dst_pos); + __ super_pop(src_pos); + __ super_pop(dst); + __ super_pop(src); + + + __ b(*stub->entry()); + __ delayed()->nop(); + __ bind(*stub->continuation()); + return; } assert(default_type != NULL && default_type->is_array_klass() @@ -4061,8 +3946,8 @@ if (length!=A2) __ move(A2, length); } - __ move(A3, src_pos ); - assert_different_registers(A0, dst_pos, dst); + __ move(A3, src_pos ); + assert_different_registers(A0, dst_pos, dst); __ sll(AT, AT, shift_amount); __ addi(AT, AT, arrayOopDesc::base_offset_in_bytes(basic_type)); __ add(A1, dst, AT); @@ -4078,11 +3963,11 @@ } else { __ call_VM_leaf(CAST_FROM_FN_PTR(address, Runtime1::primitive_arraycopy), 3); } - __ super_pop(length); - __ super_pop(dst_pos); - __ super_pop(src_pos); - __ super_pop(dst); - __ super_pop(src); + __ super_pop(length); + __ super_pop(dst_pos); + __ super_pop(src_pos); + __ super_pop(dst); + __ super_pop(src); __ bind(*stub->continuation()); } @@ -4240,12 +4125,12 @@ } void LIR_Assembler::emit_delay(LIR_OpDelay*) { - Unimplemented(); + Unimplemented(); } void LIR_Assembler::monitor_address(int monitor_no, LIR_Opr dst) { - __ lea(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no)); + __ lea(dst->as_register(), frame_map()->address_for_monitor_lock(monitor_no)); } void LIR_Assembler::negate(LIR_Opr left, LIR_Opr dest) { @@ -4256,6 +4141,7 @@ Register hi = left->as_register_hi(); Register dlo = dest->as_register_lo(); Register dhi = dest->as_register_hi(); + assert(dlo != hi, "register checks"); __ nor(dlo, ZERO, lo); __ addiu(dlo, dlo, 1); __ sltiu(AT, dlo, 1); @@ -4291,7 +4177,6 @@ __ relocate(rspec); __ lui(reg, Assembler::split_high((int)o)); __ addiu(reg, reg, Assembler::split_low((int)o)); - // __ move(reg, ZERO); } else { int oop_index = __ oop_recorder()->find_index(o); RelocationHolder rspec = oop_Relocation::spec(oop_index); @@ -4303,11 +4188,11 @@ void LIR_Assembler::rt_call(LIR_Opr result, address dest, const LIR_OprList* args, LIR_Opr tmp, CodeEmitInfo* info) { assert(!tmp->is_valid(), "don't need temporary"); - __ call(dest, relocInfo::runtime_call_type); - __ delayed()->nop(); - if (info != NULL) { - add_call_info_here(info); - } + __ call(dest, relocInfo::runtime_call_type); + __ delayed()->nop(); + if (info != NULL) { + add_call_info_here(info); + } } /* by yyq 7/22/2009 @@ -4323,32 +4208,30 @@ if(src->is_register() && dest->is_address()) { if(src->is_double_cpu()) { - __ sw(src->as_register_lo(), as_Address(dest->as_address_ptr())); - __ sw(src->as_register_hi(), as_Address(dest->as_address_ptr()).base(), + __ sw(src->as_register_lo(), as_Address(dest->as_address_ptr())); + __ sw(src->as_register_hi(), as_Address(dest->as_address_ptr()).base(), as_Address(dest->as_address_ptr()).disp() +4); } else if (src->is_double_fpu()) { - __ swc1(src->as_fpu_lo(), as_Address(dest->as_address_ptr())); - __ swc1(src->as_fpu_hi(), as_Address(dest->as_address_ptr()).base(), + __ swc1(src->as_fpu_lo(), as_Address(dest->as_address_ptr())); + __ swc1(src->as_fpu_hi(), as_Address(dest->as_address_ptr()).base(), as_Address(dest->as_address_ptr()).disp() +4); - } else { - ShouldNotReachHere(); + ShouldNotReachHere(); } } else if (src->is_address() && dest->is_register()){ if(dest->is_double_cpu()) { - __ lw(dest->as_register_lo(), as_Address(src->as_address_ptr())); - __ lw(dest->as_register_hi(), as_Address(src->as_address_ptr()).base(), + __ lw(dest->as_register_lo(), as_Address(src->as_address_ptr())); + __ lw(dest->as_register_hi(), as_Address(src->as_address_ptr()).base(), as_Address(src->as_address_ptr()).disp() +4); } else if (dest->is_double_fpu()) { - __ lwc1(dest->as_fpu_lo(), as_Address(src->as_address_ptr())); - __ lwc1(dest->as_fpu_hi(), as_Address(src->as_address_ptr()).base(), + __ lwc1(dest->as_fpu_lo(), as_Address(src->as_address_ptr())); + __ lwc1(dest->as_fpu_hi(), as_Address(src->as_address_ptr()).base(), as_Address(src->as_address_ptr()).disp() +4); } else { - ShouldNotReachHere(); + ShouldNotReachHere(); } - } else { - ShouldNotReachHere(); + ShouldNotReachHere(); } }
--- a/hotspot/src/share/vm/oops/oop.inline.hpp Sat Oct 23 21:08:56 2010 +0000 +++ b/hotspot/src/share/vm/oops/oop.inline.hpp Sun Oct 24 14:32:13 2010 +0000 @@ -341,6 +341,10 @@ inline void oopDesc::release_double_field_put(int offset, jdouble contents) { OrderAccess::release_store(double_field_addr(offset), contents); } inline int oopDesc::size_given_klass(Klass* klass) { + if (klass == NULL) { + tty->print_cr("null klass %p", __builtin_return_address(0)); + } + int lh = klass->layout_helper(); int s = lh >> LogHeapWordSize; // deliver size scaled by wordSize
--- a/hotspot/src/share/vm/runtime/reflection.cpp Sat Oct 23 21:08:56 2010 +0000 +++ b/hotspot/src/share/vm/runtime/reflection.cpp Sun Oct 24 14:32:13 2010 +0000 @@ -862,6 +862,7 @@ // resolve based on the receiver if (instanceKlass::cast(reflected_method->method_holder())->is_interface()) { // resolve interface call + tty->print_cr("resolve interface call"); if (ReflectionWrapResolutionErrors) { // new default: 6531596 // Match resolution errors with those thrown due to reflection inlining @@ -881,6 +882,7 @@ } } else { // if the method can be overridden, we resolve using the vtable index. + tty->print_cr("resolve not interface call"); int index = reflected_method->vtable_index(); method = reflected_method; if (index != methodOopDesc::nonvirtual_vtable_index) { @@ -949,7 +951,6 @@ if (ptypes->length() != args_len) { THROW_MSG_0(vmSymbols::java_lang_IllegalArgumentException(), "wrong number of arguments"); } - // Create object to contain parameters for the JavaCall JavaCallArguments java_args(method->size_of_parameters()); @@ -1000,6 +1001,7 @@ if (HAS_PENDING_EXCEPTION) { // Method threw an exception; wrap it in an InvocationTargetException + method->print_on(tty); oop target_exception = PENDING_EXCEPTION; CLEAR_PENDING_EXCEPTION; JavaCallArguments args(Handle(THREAD, target_exception));