src/cpu/sparc/vm/methodHandles_sparc.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File 7063628 Cdiff src/cpu/sparc/vm/methodHandles_sparc.cpp

src/cpu/sparc/vm/methodHandles_sparc.cpp

Print this page

        

*** 285,297 **** Label L_ok_1, L_ok_2, L_ok_3, L_ok_4; BLOCK_COMMENT("verify_clean {"); // Magic numbers must check out: __ set((int32_t) MAGIC_NUMBER_1, O7_temp); ! __ cmp(O7_temp, L0_magic_number_1); ! __ br(Assembler::equal, false, Assembler::pt, L_ok_1); ! __ delayed()->nop(); __ stop("damaged ricochet frame: MAGIC_NUMBER_1 not found"); __ BIND(L_ok_1); // Arguments pointer must look reasonable: --- 285,295 ---- Label L_ok_1, L_ok_2, L_ok_3, L_ok_4; BLOCK_COMMENT("verify_clean {"); // Magic numbers must check out: __ set((int32_t) MAGIC_NUMBER_1, O7_temp); ! __ cmp_and_br_short(O7_temp, L0_magic_number_1, Assembler::equal, Assembler::pt, L_ok_1); __ stop("damaged ricochet frame: MAGIC_NUMBER_1 not found"); __ BIND(L_ok_1); // Arguments pointer must look reasonable:
*** 299,311 **** Register FP_temp = O5_temp; __ add(FP, STACK_BIAS, FP_temp); #else Register FP_temp = FP; #endif ! __ cmp(L4_saved_args_base, FP_temp); ! __ br(Assembler::greaterEqualUnsigned, false, Assembler::pt, L_ok_2); ! __ delayed()->nop(); __ stop("damaged ricochet frame: L4 < FP"); __ BIND(L_ok_2); // Disable until we decide on it's fate // __ sub(L4_saved_args_base, UNREASONABLE_STACK_MOVE * Interpreter::stackElementSize, O7_temp); --- 297,307 ---- Register FP_temp = O5_temp; __ add(FP, STACK_BIAS, FP_temp); #else Register FP_temp = FP; #endif ! __ cmp_and_brx_short(L4_saved_args_base, FP_temp, Assembler::greaterEqualUnsigned, Assembler::pt, L_ok_2); __ stop("damaged ricochet frame: L4 < FP"); __ BIND(L_ok_2); // Disable until we decide on it's fate // __ sub(L4_saved_args_base, UNREASONABLE_STACK_MOVE * Interpreter::stackElementSize, O7_temp);
*** 314,332 **** // __ delayed()->nop(); // __ stop("damaged ricochet frame: (L4 - UNREASONABLE_STACK_MOVE) > FP"); __ BIND(L_ok_3); extract_conversion_dest_type(_masm, L5_conversion, O7_temp); ! __ cmp(O7_temp, T_VOID); ! __ br(Assembler::equal, false, Assembler::pt, L_ok_4); ! __ delayed()->nop(); extract_conversion_vminfo(_masm, L5_conversion, O5_temp); __ ld_ptr(L4_saved_args_base, __ argument_offset(O5_temp, O5_temp), O7_temp); assert(__ is_simm13(RETURN_VALUE_PLACEHOLDER), "must be simm13"); ! __ cmp(O7_temp, (int32_t) RETURN_VALUE_PLACEHOLDER); ! __ brx(Assembler::equal, false, Assembler::pt, L_ok_4); ! __ delayed()->nop(); __ stop("damaged ricochet frame: RETURN_VALUE_PLACEHOLDER not found"); __ BIND(L_ok_4); BLOCK_COMMENT("} verify_clean"); } #endif //ASSERT --- 310,324 ---- // __ delayed()->nop(); // __ stop("damaged ricochet frame: (L4 - UNREASONABLE_STACK_MOVE) > FP"); __ BIND(L_ok_3); extract_conversion_dest_type(_masm, L5_conversion, O7_temp); ! __ cmp_and_br_short(O7_temp, T_VOID, Assembler::equal, Assembler::pt, L_ok_4); extract_conversion_vminfo(_masm, L5_conversion, O5_temp); __ ld_ptr(L4_saved_args_base, __ argument_offset(O5_temp, O5_temp), O7_temp); assert(__ is_simm13(RETURN_VALUE_PLACEHOLDER), "must be simm13"); ! __ cmp_and_brx_short(O7_temp, (int32_t) RETURN_VALUE_PLACEHOLDER, Assembler::equal, Assembler::pt, L_ok_4); __ stop("damaged ricochet frame: RETURN_VALUE_PLACEHOLDER not found"); __ BIND(L_ok_4); BLOCK_COMMENT("} verify_clean"); } #endif //ASSERT
*** 361,373 **** __ ldsw(G3_amh_conversion, stack_move_reg); __ sra(stack_move_reg, CONV_STACK_MOVE_SHIFT, stack_move_reg); if (VerifyMethodHandles) { Label L_ok, L_bad; int32_t stack_move_limit = 0x0800; // extra-large ! __ cmp(stack_move_reg, stack_move_limit); ! __ br(Assembler::greaterEqual, false, Assembler::pn, L_bad); ! __ delayed()->nop(); __ cmp(stack_move_reg, -stack_move_limit); __ br(Assembler::greater, false, Assembler::pt, L_ok); __ delayed()->nop(); __ BIND(L_bad); __ stop("load_stack_move of garbage value"); --- 353,363 ---- __ ldsw(G3_amh_conversion, stack_move_reg); __ sra(stack_move_reg, CONV_STACK_MOVE_SHIFT, stack_move_reg); if (VerifyMethodHandles) { Label L_ok, L_bad; int32_t stack_move_limit = 0x0800; // extra-large ! __ cmp_and_br_short(stack_move_reg, stack_move_limit, Assembler::greaterEqual, Assembler::pn, L_bad); __ cmp(stack_move_reg, -stack_move_limit); __ br(Assembler::greater, false, Assembler::pt, L_ok); __ delayed()->nop(); __ BIND(L_bad); __ stop("load_stack_move of garbage value");
*** 399,415 **** void MethodHandles::verify_argslot(MacroAssembler* _masm, Register argslot_reg, Register temp_reg, const char* error_message) { // Verify that argslot lies within (Gargs, FP]. Label L_ok, L_bad; BLOCK_COMMENT("verify_argslot {"); __ add(FP, STACK_BIAS, temp_reg); // STACK_BIAS is zero on !_LP64 ! __ cmp(argslot_reg, temp_reg); ! __ brx(Assembler::greaterUnsigned, false, Assembler::pn, L_bad); ! __ delayed()->nop(); ! __ cmp(Gargs, argslot_reg); ! __ brx(Assembler::lessEqualUnsigned, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_argslot"); } --- 389,401 ---- void MethodHandles::verify_argslot(MacroAssembler* _masm, Register argslot_reg, Register temp_reg, const char* error_message) { // Verify that argslot lies within (Gargs, FP]. Label L_ok, L_bad; BLOCK_COMMENT("verify_argslot {"); + __ cmp_and_brx_short(Gargs, argslot_reg, Assembler::greaterUnsigned, Assembler::pn, L_bad); __ add(FP, STACK_BIAS, temp_reg); // STACK_BIAS is zero on !_LP64 ! __ cmp_and_brx_short(argslot_reg, temp_reg, Assembler::lessEqualUnsigned, Assembler::pt, L_ok); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_argslot"); }
*** 432,449 **** arg_slots = temp_reg; } } __ add(arg_slot_base_reg, __ argument_offset(arg_slots, temp_reg), temp_reg); __ add(FP, STACK_BIAS, temp2_reg); // STACK_BIAS is zero on !_LP64 ! __ cmp(temp_reg, temp2_reg); ! __ brx(Assembler::greaterUnsigned, false, Assembler::pn, L_bad); ! __ delayed()->nop(); // Gargs points to the first word so adjust by BytesPerWord __ add(arg_slot_base_reg, BytesPerWord, temp_reg); ! __ cmp(Gargs, temp_reg); ! __ brx(Assembler::lessEqualUnsigned, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_argslots"); } --- 418,431 ---- arg_slots = temp_reg; } } __ add(arg_slot_base_reg, __ argument_offset(arg_slots, temp_reg), temp_reg); __ add(FP, STACK_BIAS, temp2_reg); // STACK_BIAS is zero on !_LP64 ! __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::greaterUnsigned, Assembler::pn, L_bad); // Gargs points to the first word so adjust by BytesPerWord __ add(arg_slot_base_reg, BytesPerWord, temp_reg); ! __ cmp_and_brx_short(Gargs, temp_reg, Assembler::lessEqualUnsigned, Assembler::pt, L_ok); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_argslots"); }
*** 500,524 **** klass_addr <= SystemDictionaryHandles::Long_klass().raw_value(), "must be one of the SystemDictionaryHandles"); Label L_ok, L_bad; BLOCK_COMMENT("verify_klass {"); __ verify_oop(obj_reg); ! __ br_null(obj_reg, false, Assembler::pn, L_bad); ! __ delayed()->nop(); __ load_klass(obj_reg, temp_reg); __ set(ExternalAddress(klass_addr), temp2_reg); __ ld_ptr(Address(temp2_reg, 0), temp2_reg); ! __ cmp(temp_reg, temp2_reg); ! __ brx(Assembler::equal, false, Assembler::pt, L_ok); ! __ delayed()->nop(); intptr_t super_check_offset = klass->super_check_offset(); __ ld_ptr(Address(temp_reg, super_check_offset), temp_reg); __ set(ExternalAddress(klass_addr), temp2_reg); __ ld_ptr(Address(temp2_reg, 0), temp2_reg); ! __ cmp(temp_reg, temp2_reg); ! __ brx(Assembler::equal, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_klass"); } --- 482,501 ---- klass_addr <= SystemDictionaryHandles::Long_klass().raw_value(), "must be one of the SystemDictionaryHandles"); Label L_ok, L_bad; BLOCK_COMMENT("verify_klass {"); __ verify_oop(obj_reg); ! __ br_null_short(obj_reg, Assembler::pn, L_bad); __ load_klass(obj_reg, temp_reg); __ set(ExternalAddress(klass_addr), temp2_reg); __ ld_ptr(Address(temp2_reg, 0), temp2_reg); ! __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok); intptr_t super_check_offset = klass->super_check_offset(); __ ld_ptr(Address(temp_reg, super_check_offset), temp_reg); __ set(ExternalAddress(klass_addr), temp2_reg); __ ld_ptr(Address(temp2_reg, 0), temp2_reg); ! __ cmp_and_brx_short(temp_reg, temp2_reg, Assembler::equal, Assembler::pt, L_ok); __ BIND(L_bad); __ stop(error_message); __ BIND(L_ok); BLOCK_COMMENT("} verify_klass"); }
*** 669,681 **** return offset; } else { #ifdef ASSERT { Label L_ok; ! __ cmp(arg_slots.as_register(), 0); ! __ br(Assembler::greaterEqual, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ stop("negative arg_slots"); __ bind(L_ok); } #endif __ sll_ptr(arg_slots.as_register(), LogBytesPerWord, temp_reg); --- 646,656 ---- return offset; } else { #ifdef ASSERT { Label L_ok; ! __ cmp_and_br_short(arg_slots.as_register(), 0, Assembler::greaterEqual, Assembler::pt, L_ok); __ stop("negative arg_slots"); __ bind(L_ok); } #endif __ sll_ptr(arg_slots.as_register(), LogBytesPerWord, temp_reg);
*** 746,758 **** __ BIND(loop); // pull one word down each time through the loop __ ld_ptr( Address(temp_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(temp_reg, offset) ); __ add(temp_reg, wordSize, temp_reg); ! __ cmp(temp_reg, argslot_reg); ! __ brx(Assembler::lessUnsigned, false, Assembler::pt, loop); ! __ delayed()->nop(); // FILLME } // Now move the argslot down, to point to the opened-up space. __ add(argslot_reg, offset, argslot_reg); BLOCK_COMMENT("} insert_arg_slots"); --- 721,731 ---- __ BIND(loop); // pull one word down each time through the loop __ ld_ptr( Address(temp_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(temp_reg, offset) ); __ add(temp_reg, wordSize, temp_reg); ! __ cmp_and_brx_short(temp_reg, argslot_reg, Assembler::lessUnsigned, Assembler::pt, loop); } // Now move the argslot down, to point to the opened-up space. __ add(argslot_reg, offset, argslot_reg); BLOCK_COMMENT("} insert_arg_slots");
*** 795,807 **** __ BIND(L_loop); // pull one word up each time through the loop __ ld_ptr( Address(temp_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(temp_reg, offset) ); __ sub(temp_reg, wordSize, temp_reg); ! __ cmp(temp_reg, Gargs); ! __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pt, L_loop); ! __ delayed()->nop(); // FILLME } // And adjust the argslot address to point at the deletion point. __ add(argslot_reg, offset, argslot_reg); --- 768,778 ---- __ BIND(L_loop); // pull one word up each time through the loop __ ld_ptr( Address(temp_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(temp_reg, offset) ); __ sub(temp_reg, wordSize, temp_reg); ! __ cmp_and_brx_short(temp_reg, Gargs, Assembler::greaterEqualUnsigned, Assembler::pt, L_loop); } // And adjust the argslot address to point at the deletion point. __ add(argslot_reg, offset, argslot_reg);
*** 846,857 **** __ delayed()->nop(); __ br(Assembler::less, false, Assembler::pn, L_break); __ delayed()->nop(); __ ld_ptr( Address(argslot_reg, 0), temp_reg); __ st_ptr(temp_reg, Address(Gargs, 0)); ! __ ba(false, L_break); ! __ delayed()->nop(); // FILLME __ BIND(L_plural); // Loop for 2 or more: // top = &argslot[slot_count] // while (top > argslot) *(--Gargs) = *(--top) --- 817,827 ---- __ delayed()->nop(); __ br(Assembler::less, false, Assembler::pn, L_break); __ delayed()->nop(); __ ld_ptr( Address(argslot_reg, 0), temp_reg); __ st_ptr(temp_reg, Address(Gargs, 0)); ! __ ba_short(L_break); __ BIND(L_plural); // Loop for 2 or more: // top = &argslot[slot_count] // while (top > argslot) *(--Gargs) = *(--top)
*** 861,873 **** __ BIND(L_loop); __ sub(top_reg, wordSize, top_reg); __ sub(Gargs, wordSize, Gargs ); __ ld_ptr( Address(top_reg, 0), temp2_reg); __ st_ptr(temp2_reg, Address(Gargs, 0)); ! __ cmp(top_reg, argslot_reg); ! __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop); ! __ delayed()->nop(); // FILLME __ BIND(L_break); } BLOCK_COMMENT("} push_arg_slots"); } --- 831,841 ---- __ BIND(L_loop); __ sub(top_reg, wordSize, top_reg); __ sub(Gargs, wordSize, Gargs ); __ ld_ptr( Address(top_reg, 0), temp2_reg); __ st_ptr(temp2_reg, Address(Gargs, 0)); ! __ cmp_and_brx_short(top_reg, argslot_reg, Assembler::greaterUnsigned, Assembler::pt, L_loop); __ BIND(L_break); } BLOCK_COMMENT("} push_arg_slots"); }
*** 895,926 **** if (positive_distance_in_slots.is_register()) { __ cmp(positive_distance_in_slots.as_register(), (int32_t) 0); __ br(Assembler::lessEqual, false, Assembler::pn, L_bad); __ delayed()->nop(); } ! __ cmp(bottom_reg, top_reg); ! __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ BIND(L_bad); __ stop("valid bounds (copy up)"); __ BIND(L_ok); } #endif ! __ cmp(bottom_reg, top_reg); ! __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pn, L_break); ! __ delayed()->nop(); // work top down to bottom, copying contiguous data upwards // In pseudo-code: // while (--top >= bottom) *(top + distance) = *(top + 0); RegisterOrConstant offset = __ argument_offset(positive_distance_in_slots, positive_distance_in_slots.register_or_noreg()); __ BIND(L_loop); __ sub(top_reg, wordSize, top_reg); __ ld_ptr( Address(top_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(top_reg, offset) ); ! __ cmp(top_reg, bottom_reg); ! __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop); ! __ delayed()->nop(); // FILLME assert(Interpreter::stackElementSize == wordSize, "else change loop"); __ BIND(L_break); BLOCK_COMMENT("} move_arg_slots_up"); } --- 863,888 ---- if (positive_distance_in_slots.is_register()) { __ cmp(positive_distance_in_slots.as_register(), (int32_t) 0); __ br(Assembler::lessEqual, false, Assembler::pn, L_bad); __ delayed()->nop(); } ! __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_ok); __ BIND(L_bad); __ stop("valid bounds (copy up)"); __ BIND(L_ok); } #endif ! __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::greaterEqualUnsigned, Assembler::pn, L_break); // work top down to bottom, copying contiguous data upwards // In pseudo-code: // while (--top >= bottom) *(top + distance) = *(top + 0); RegisterOrConstant offset = __ argument_offset(positive_distance_in_slots, positive_distance_in_slots.register_or_noreg()); __ BIND(L_loop); __ sub(top_reg, wordSize, top_reg); __ ld_ptr( Address(top_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(top_reg, offset) ); ! __ cmp_and_brx_short(top_reg, bottom_reg, Assembler::greaterUnsigned, Assembler::pt, L_loop); assert(Interpreter::stackElementSize == wordSize, "else change loop"); __ BIND(L_break); BLOCK_COMMENT("} move_arg_slots_up"); }
*** 949,980 **** if (negative_distance_in_slots.is_register()) { __ cmp(negative_distance_in_slots.as_register(), (int32_t) 0); __ br(Assembler::greaterEqual, false, Assembler::pn, L_bad); __ delayed()->nop(); } ! __ cmp(bottom_reg, top_reg); ! __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ BIND(L_bad); __ stop("valid bounds (copy down)"); __ BIND(L_ok); } #endif ! __ cmp(bottom_reg, top_reg); ! __ brx(Assembler::greaterEqualUnsigned, false, Assembler::pn, L_break); ! __ delayed()->nop(); // work bottom up to top, copying contiguous data downwards // In pseudo-code: // while (bottom < top) *(bottom - distance) = *(bottom + 0), bottom++; RegisterOrConstant offset = __ argument_offset(negative_distance_in_slots, negative_distance_in_slots.register_or_noreg()); __ BIND(L_loop); __ ld_ptr( Address(bottom_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(bottom_reg, offset) ); __ add(bottom_reg, wordSize, bottom_reg); ! __ cmp(bottom_reg, top_reg); ! __ brx(Assembler::lessUnsigned, false, Assembler::pt, L_loop); ! __ delayed()->nop(); // FILLME assert(Interpreter::stackElementSize == wordSize, "else change loop"); __ BIND(L_break); BLOCK_COMMENT("} move_arg_slots_down"); } --- 911,936 ---- if (negative_distance_in_slots.is_register()) { __ cmp(negative_distance_in_slots.as_register(), (int32_t) 0); __ br(Assembler::greaterEqual, false, Assembler::pn, L_bad); __ delayed()->nop(); } ! __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_ok); __ BIND(L_bad); __ stop("valid bounds (copy down)"); __ BIND(L_ok); } #endif ! __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::greaterEqualUnsigned, Assembler::pn, L_break); // work bottom up to top, copying contiguous data downwards // In pseudo-code: // while (bottom < top) *(bottom - distance) = *(bottom + 0), bottom++; RegisterOrConstant offset = __ argument_offset(negative_distance_in_slots, negative_distance_in_slots.register_or_noreg()); __ BIND(L_loop); __ ld_ptr( Address(bottom_reg, 0 ), temp2_reg); __ st_ptr(temp2_reg, Address(bottom_reg, offset) ); __ add(bottom_reg, wordSize, bottom_reg); ! __ cmp_and_brx_short(bottom_reg, top_reg, Assembler::lessUnsigned, Assembler::pt, L_loop); assert(Interpreter::stackElementSize == wordSize, "else change loop"); __ BIND(L_break); BLOCK_COMMENT("} move_arg_slots_down"); }
*** 1327,1339 **** __ load_heap_oop(G3_amh_argument, O1_klass); // This is a Class object! load_klass_from_Class(_masm, O1_klass, O2_scratch, O3_scratch); Label L_done; __ ld_ptr(vmarg, O2_scratch); ! __ tst(O2_scratch); ! __ brx(Assembler::zero, false, Assembler::pn, L_done); // No cast if null. ! __ delayed()->nop(); __ load_klass(O2_scratch, O2_scratch); // Live at this point: // - O0_argslot : argslot index in vmarg; may be required in the failing path // - O1_klass : klass required by the target method --- 1283,1293 ---- __ load_heap_oop(G3_amh_argument, O1_klass); // This is a Class object! load_klass_from_Class(_masm, O1_klass, O2_scratch, O3_scratch); Label L_done; __ ld_ptr(vmarg, O2_scratch); ! __ br_null_short(O2_scratch, Assembler::pn, L_done); // No cast if null. __ load_klass(O2_scratch, O2_scratch); // Live at this point: // - O0_argslot : argslot index in vmarg; may be required in the failing path // - O1_klass : klass required by the target method
*** 1434,1445 **** __ br(Assembler::zero, false, Assembler::pn, zero_extend); __ delayed()->nop(); // this path is taken for int->byte, int->short __ sra(O1_scratch, G5_vminfo, O1_scratch); ! __ ba(false, done); ! __ delayed()->nop(); __ bind(zero_extend); // this is taken for int->char __ srl(O1_scratch, G5_vminfo, O1_scratch); --- 1388,1398 ---- __ br(Assembler::zero, false, Assembler::pn, zero_extend); __ delayed()->nop(); // this path is taken for int->byte, int->short __ sra(O1_scratch, G5_vminfo, O1_scratch); ! __ ba_short(done); __ bind(zero_extend); // this is taken for int->char __ srl(O1_scratch, G5_vminfo, O1_scratch);
*** 1858,1870 **** #ifdef ASSERT if (VerifyMethodHandles) { BLOCK_COMMENT("verify collect_count_constant {"); __ load_method_handle_vmslots(O3_scratch, G3_method_handle, O2_scratch); Label L_count_ok; ! __ cmp(O3_scratch, collect_count_constant); ! __ br(Assembler::equal, false, Assembler::pt, L_count_ok); ! __ delayed()->nop(); __ stop("bad vminfo in AMH.conv"); __ BIND(L_count_ok); BLOCK_COMMENT("} verify collect_count_constant"); } #endif //ASSERT --- 1811,1821 ---- #ifdef ASSERT if (VerifyMethodHandles) { BLOCK_COMMENT("verify collect_count_constant {"); __ load_method_handle_vmslots(O3_scratch, G3_method_handle, O2_scratch); Label L_count_ok; ! __ cmp_and_br_short(O3_scratch, collect_count_constant, Assembler::equal, Assembler::pt, L_count_ok); __ stop("bad vminfo in AMH.conv"); __ BIND(L_count_ok); BLOCK_COMMENT("} verify collect_count_constant"); } #endif //ASSERT
*** 1907,1919 **** #ifdef ASSERT if (VerifyMethodHandles && dest_slot_constant < 0) { BLOCK_COMMENT("verify dest_slot_constant {"); extract_conversion_vminfo(_masm, RicochetFrame::L5_conversion, O3_scratch); Label L_vminfo_ok; ! __ cmp(O3_scratch, dest_slot_constant); ! __ br(Assembler::equal, false, Assembler::pt, L_vminfo_ok); ! __ delayed()->nop(); __ stop("bad vminfo in AMH.conv"); __ BIND(L_vminfo_ok); BLOCK_COMMENT("} verify dest_slot_constant"); } #endif //ASSERT --- 1858,1868 ---- #ifdef ASSERT if (VerifyMethodHandles && dest_slot_constant < 0) { BLOCK_COMMENT("verify dest_slot_constant {"); extract_conversion_vminfo(_masm, RicochetFrame::L5_conversion, O3_scratch); Label L_vminfo_ok; ! __ cmp_and_br_short(O3_scratch, dest_slot_constant, Assembler::equal, Assembler::pt, L_vminfo_ok); __ stop("bad vminfo in AMH.conv"); __ BIND(L_vminfo_ok); BLOCK_COMMENT("} verify dest_slot_constant"); } #endif //ASSERT
*** 1949,1966 **** // (As it happens, all movements involve an argument list size change.) // If there are variable parameters, use dynamic checks to skip around the whole mess. Label L_done; if (keep3_count.is_register()) { ! __ tst(keep3_count.as_register()); ! __ br(Assembler::zero, false, Assembler::pn, L_done); ! __ delayed()->nop(); } if (close_count.is_register()) { ! __ cmp(close_count.as_register(), open_count); ! __ br(Assembler::equal, false, Assembler::pn, L_done); ! __ delayed()->nop(); } if (move_keep3 && fix_arg_base) { bool emit_move_down = false, emit_move_up = false, emit_guard = false; if (!close_count.is_constant()) { --- 1898,1911 ---- // (As it happens, all movements involve an argument list size change.) // If there are variable parameters, use dynamic checks to skip around the whole mess. Label L_done; if (keep3_count.is_register()) { ! __ cmp_and_br_short(keep3_count.as_register(), 0, Assembler::equal, Assembler::pn, L_done); } if (close_count.is_register()) { ! __ cmp_and_br_short(close_count.as_register(), open_count, Assembler::equal, Assembler::pn, L_done); } if (move_keep3 && fix_arg_base) { bool emit_move_down = false, emit_move_up = false, emit_guard = false; if (!close_count.is_constant()) {
*** 1997,2008 **** O4_scratch, G5_scratch); } } if (emit_guard) { ! __ ba(false, L_done); // assumes emit_move_up is true also ! __ delayed()->nop(); __ BIND(L_move_up); } if (emit_move_up) { // Move arguments up if |+dest+| < |-collect-| --- 1942,1952 ---- O4_scratch, G5_scratch); } } if (emit_guard) { ! __ ba_short(L_done); // assumes emit_move_up is true also __ BIND(L_move_up); } if (emit_move_up) { // Move arguments up if |+dest+| < |-collect-|
*** 2131,2142 **** __ sll_ptr(O5_dest_type, LogBytesPerWord, O5_dest_type); __ ld_ptr(O7_temp, O5_dest_type, O7_temp); #ifdef ASSERT { Label L_ok; ! __ br_notnull(O7_temp, false, Assembler::pt, L_ok); ! __ delayed()->nop(); __ stop("bad method handle return"); __ BIND(L_ok); } #endif //ASSERT __ JMP(O7_temp, 0); --- 2075,2085 ---- __ sll_ptr(O5_dest_type, LogBytesPerWord, O5_dest_type); __ ld_ptr(O7_temp, O5_dest_type, O7_temp); #ifdef ASSERT { Label L_ok; ! __ br_notnull_short(O7_temp, Assembler::pt, L_ok); __ stop("bad method handle return"); __ BIND(L_ok); } #endif //ASSERT __ JMP(O7_temp, 0);
*** 2190,2204 **** if (length_can_be_zero) { // handle the null pointer case, if zero is allowed Label L_skip; if (length_constant < 0) { load_conversion_vminfo(_masm, G3_amh_conversion, O3_scratch); ! __ br_zero(Assembler::notZero, false, Assembler::pn, O3_scratch, L_skip); ! __ delayed()->nop(); } ! __ br_null(O1_array, false, Assembler::pn, L_array_is_empty); ! __ delayed()->nop(); __ BIND(L_skip); } __ null_check(O1_array, oopDesc::klass_offset_in_bytes()); __ load_klass(O1_array, O2_array_klass); --- 2133,2146 ---- if (length_can_be_zero) { // handle the null pointer case, if zero is allowed Label L_skip; if (length_constant < 0) { load_conversion_vminfo(_masm, G3_amh_conversion, O3_scratch); ! __ cmp_zero_and_br(Assembler::notZero, O3_scratch, L_skip); ! __ delayed()->nop(); // to avoid back-to-back cbcond instructions } ! __ br_null_short(O1_array, Assembler::pn, L_array_is_empty); __ BIND(L_skip); } __ null_check(O1_array, oopDesc::klass_offset_in_bytes()); __ load_klass(O1_array, O2_array_klass);
*** 2208,2219 **** load_klass_from_Class(_masm, O3_klass, O4_scratch, G5_scratch); Label L_ok_array_klass, L_bad_array_klass, L_bad_array_length; __ check_klass_subtype(O2_array_klass, O3_klass, O4_scratch, G5_scratch, L_ok_array_klass); // If we get here, the type check failed! ! __ ba(false, L_bad_array_klass); ! __ delayed()->nop(); __ BIND(L_ok_array_klass); // Check length. if (length_constant >= 0) { __ ldsw(Address(O1_array, length_offset), O4_scratch); --- 2150,2160 ---- load_klass_from_Class(_masm, O3_klass, O4_scratch, G5_scratch); Label L_ok_array_klass, L_bad_array_klass, L_bad_array_length; __ check_klass_subtype(O2_array_klass, O3_klass, O4_scratch, G5_scratch, L_ok_array_klass); // If we get here, the type check failed! ! __ ba_short(L_bad_array_klass); __ BIND(L_ok_array_klass); // Check length. if (length_constant >= 0) { __ ldsw(Address(O1_array, length_offset), O4_scratch);
*** 2245,2256 **** __ delayed()->nop(); // single argument case, with no array movement __ BIND(L_array_is_empty); remove_arg_slots(_masm, -stack_move_unit() * array_slots, O0_argslot, O1_scratch, O2_scratch, O3_scratch); ! __ ba(false, L_args_done); // no spreading to do ! __ delayed()->nop(); __ BIND(L_insert_arg_space); // come here in the usual case, stack_move < 0 (2 or more spread arguments) // Live: O1_array, O2_argslot_limit, O3_stack_move insert_arg_slots(_masm, O3_stack_move, O0_argslot, O4_scratch, G5_scratch, O1_scratch); --- 2186,2196 ---- __ delayed()->nop(); // single argument case, with no array movement __ BIND(L_array_is_empty); remove_arg_slots(_masm, -stack_move_unit() * array_slots, O0_argslot, O1_scratch, O2_scratch, O3_scratch); ! __ ba_short(L_args_done); // no spreading to do __ BIND(L_insert_arg_space); // come here in the usual case, stack_move < 0 (2 or more spread arguments) // Live: O1_array, O2_argslot_limit, O3_stack_move insert_arg_slots(_masm, O3_stack_move, O0_argslot, O4_scratch, G5_scratch, O1_scratch);
*** 2287,2299 **** __ add(O4_fill_ptr, -Interpreter::stackElementSize * elem_slots, O4_fill_ptr); move_typed_arg(_masm, elem_type, true, Address(O1_source, 0), Address(O4_fill_ptr, 0), O2_scratch); // must be an even register for !_LP64 long moves (uses O2/O3) __ add(O1_source, type2aelembytes(elem_type), O1_source); ! __ cmp(O4_fill_ptr, O0_argslot); ! __ brx(Assembler::greaterUnsigned, false, Assembler::pt, L_loop); ! __ delayed()->nop(); // FILLME } else if (length_constant == 0) { // nothing to copy } else { int elem_offset = elem0_offset; int slot_offset = length_constant * Interpreter::stackElementSize; --- 2227,2237 ---- __ add(O4_fill_ptr, -Interpreter::stackElementSize * elem_slots, O4_fill_ptr); move_typed_arg(_masm, elem_type, true, Address(O1_source, 0), Address(O4_fill_ptr, 0), O2_scratch); // must be an even register for !_LP64 long moves (uses O2/O3) __ add(O1_source, type2aelembytes(elem_type), O1_source); ! __ cmp_and_brx_short(O4_fill_ptr, O0_argslot, Assembler::greaterUnsigned, Assembler::pt, L_loop); } else if (length_constant == 0) { // nothing to copy } else { int elem_offset = elem0_offset; int slot_offset = length_constant * Interpreter::stackElementSize;
src/cpu/sparc/vm/methodHandles_sparc.cpp
Index Unified diffs Context diffs Sdiffs Wdiffs Patch New Old Previous File Next File