2460 break; |
2460 break; |
2461 default: ShouldNotReachHere(); |
2461 default: ShouldNotReachHere(); |
2462 } |
2462 } |
2463 #endif // _LP64 |
2463 #endif // _LP64 |
2464 } else { |
2464 } else { |
|
2465 #ifdef _LP64 |
|
2466 Register r_lo; |
|
2467 if (right->type() == T_OBJECT || right->type() == T_ARRAY) { |
|
2468 r_lo = right->as_register(); |
|
2469 } else { |
|
2470 r_lo = right->as_register_lo(); |
|
2471 } |
|
2472 #else |
2465 Register r_lo = right->as_register_lo(); |
2473 Register r_lo = right->as_register_lo(); |
2466 Register r_hi = right->as_register_hi(); |
2474 Register r_hi = right->as_register_hi(); |
2467 assert(l_lo != r_hi, "overwriting registers"); |
2475 assert(l_lo != r_hi, "overwriting registers"); |
|
2476 #endif |
2468 switch (code) { |
2477 switch (code) { |
2469 case lir_logic_and: |
2478 case lir_logic_and: |
2470 __ andptr(l_lo, r_lo); |
2479 __ andptr(l_lo, r_lo); |
2471 NOT_LP64(__ andptr(l_hi, r_hi);) |
2480 NOT_LP64(__ andptr(l_hi, r_hi);) |
2472 break; |
2481 break; |
2782 |
2791 |
2783 void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) { |
2792 void LIR_Assembler::call(LIR_OpJavaCall* op, relocInfo::relocType rtype) { |
2784 assert(!os::is_MP() || (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, |
2793 assert(!os::is_MP() || (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, |
2785 "must be aligned"); |
2794 "must be aligned"); |
2786 __ call(AddressLiteral(op->addr(), rtype)); |
2795 __ call(AddressLiteral(op->addr(), rtype)); |
2787 add_call_info(code_offset(), op->info(), op->is_method_handle_invoke()); |
2796 add_call_info(code_offset(), op->info()); |
2788 } |
2797 } |
2789 |
2798 |
2790 |
2799 |
2791 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { |
2800 void LIR_Assembler::ic_call(LIR_OpJavaCall* op) { |
2792 RelocationHolder rh = virtual_call_Relocation::spec(pc()); |
2801 RelocationHolder rh = virtual_call_Relocation::spec(pc()); |
2793 __ movoop(IC_Klass, (jobject)Universe::non_oop_word()); |
2802 __ movoop(IC_Klass, (jobject)Universe::non_oop_word()); |
2794 assert(!os::is_MP() || |
2803 assert(!os::is_MP() || |
2795 (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, |
2804 (__ offset() + NativeCall::displacement_offset) % BytesPerWord == 0, |
2796 "must be aligned"); |
2805 "must be aligned"); |
2797 __ call(AddressLiteral(op->addr(), rh)); |
2806 __ call(AddressLiteral(op->addr(), rh)); |
2798 add_call_info(code_offset(), op->info(), op->is_method_handle_invoke()); |
2807 add_call_info(code_offset(), op->info()); |
2799 } |
2808 } |
2800 |
2809 |
2801 |
2810 |
2802 /* Currently, vtable-dispatch is only enabled for sparc platforms */ |
2811 /* Currently, vtable-dispatch is only enabled for sparc platforms */ |
2803 void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) { |
2812 void LIR_Assembler::vtable_call(LIR_OpJavaCall* op) { |
2804 ShouldNotReachHere(); |
2813 ShouldNotReachHere(); |
2805 } |
|
2806 |
|
2807 |
|
2808 void LIR_Assembler::preserve_SP(LIR_OpJavaCall* op) { |
|
2809 __ movptr(FrameMap::method_handle_invoke_SP_save_opr()->as_register(), rsp); |
|
2810 } |
|
2811 |
|
2812 |
|
2813 void LIR_Assembler::restore_SP(LIR_OpJavaCall* op) { |
|
2814 __ movptr(rsp, FrameMap::method_handle_invoke_SP_save_opr()->as_register()); |
|
2815 } |
2814 } |
2816 |
2815 |
2817 |
2816 |
2818 void LIR_Assembler::emit_static_call_stub() { |
2817 void LIR_Assembler::emit_static_call_stub() { |
2819 address call_pc = __ pc(); |
2818 address call_pc = __ pc(); |