2692
2693 // Class initialization barrier for static methods
2694 if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2695 const Register method = temp;
2696 const Register klass = temp;
2697 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
2698 assert(thread != noreg, "x86_32 not supported");
2699
2700 __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2701 __ load_method_holder(klass, method);
2702 __ clinit_barrier(klass, thread, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2703 }
2704 }
2705
2706 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2707 Register cache,
2708 Register index) {
2709 const Register temp = rbx;
2710 assert_different_registers(cache, index, temp);
2711
2712 Label resolved;
2713
2714 Bytecodes::Code code = bytecode();
2715 switch (code) {
2716 case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2717 case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2718 default: break;
2719 }
2720
2721 assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2722 __ load_field_entry(cache, index);
2723 if (byte_no == f1_byte) {
2724 __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2725 } else {
2726 __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2727 }
2728 __ cmpl(temp, code); // have we resolved this bytecode?
2729 __ jcc(Assembler::equal, resolved);
2730
2731 // resolve first time through
2732 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2733 __ movl(temp, code);
2734 __ call_VM(noreg, entry, temp);
2735 // Update registers with resolved info
2736 __ load_field_entry(cache, index);
2737
2738 __ bind(resolved);
2739 }
2740
2741 void TemplateTable::load_resolved_field_entry(Register obj,
2742 Register cache,
2743 Register tos_state,
2744 Register offset,
2745 Register flags,
2746 bool is_static = false) {
2747 assert_different_registers(cache, tos_state, flags, offset);
2748
2749 // Field offset
2750 __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2751
2752 // Flags
2753 __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2754
2755 // TOS state
2756 __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2757
2758 // Klass overwrite register
|
2692
2693 // Class initialization barrier for static methods
2694 if (VM_Version::supports_fast_class_init_checks() && bytecode() == Bytecodes::_invokestatic) {
2695 const Register method = temp;
2696 const Register klass = temp;
2697 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
2698 assert(thread != noreg, "x86_32 not supported");
2699
2700 __ movptr(method, Address(cache, in_bytes(ResolvedMethodEntry::method_offset())));
2701 __ load_method_holder(klass, method);
2702 __ clinit_barrier(klass, thread, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2703 }
2704 }
2705
2706 void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
2707 Register cache,
2708 Register index) {
2709 const Register temp = rbx;
2710 assert_different_registers(cache, index, temp);
2711
2712 Label L_clinit_barrier_slow;
2713 Label resolved;
2714
2715 Bytecodes::Code code = bytecode();
2716 switch (code) {
2717 case Bytecodes::_nofast_getfield: code = Bytecodes::_getfield; break;
2718 case Bytecodes::_nofast_putfield: code = Bytecodes::_putfield; break;
2719 default: break;
2720 }
2721
2722 assert(byte_no == f1_byte || byte_no == f2_byte, "byte_no out of range");
2723 __ load_field_entry(cache, index);
2724 if (byte_no == f1_byte) {
2725 __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::get_code_offset())));
2726 } else {
2727 __ load_unsigned_byte(temp, Address(cache, in_bytes(ResolvedFieldEntry::put_code_offset())));
2728 }
2729 __ cmpl(temp, code); // have we resolved this bytecode?
2730 __ jcc(Assembler::equal, resolved);
2731
2732 // resolve first time through
2733 __ bind(L_clinit_barrier_slow);
2734 address entry = CAST_FROM_FN_PTR(address, InterpreterRuntime::resolve_from_cache);
2735 __ movl(temp, code);
2736 __ call_VM(noreg, entry, temp);
2737 // Update registers with resolved info
2738 __ load_field_entry(cache, index);
2739
2740 __ bind(resolved);
2741
2742 // Class initialization barrier for static fields
2743 if (VM_Version::supports_fast_class_init_checks() &&
2744 (bytecode() == Bytecodes::_getstatic || bytecode() == Bytecodes::_putstatic)) {
2745 const Register field_holder = temp;
2746 const Register thread = LP64_ONLY(r15_thread) NOT_LP64(noreg);
2747 assert(thread != noreg, "x86_32 not supported");
2748
2749 __ movptr(field_holder, Address(cache, in_bytes(ResolvedFieldEntry::field_holder_offset())));
2750 __ clinit_barrier(field_holder, thread, nullptr /*L_fast_path*/, &L_clinit_barrier_slow);
2751 }
2752 }
2753
2754 void TemplateTable::load_resolved_field_entry(Register obj,
2755 Register cache,
2756 Register tos_state,
2757 Register offset,
2758 Register flags,
2759 bool is_static = false) {
2760 assert_different_registers(cache, tos_state, flags, offset);
2761
2762 // Field offset
2763 __ load_sized_value(offset, Address(cache, in_bytes(ResolvedFieldEntry::field_offset_offset())), sizeof(int), true /*is_signed*/);
2764
2765 // Flags
2766 __ load_unsigned_byte(flags, Address(cache, in_bytes(ResolvedFieldEntry::flags_offset())));
2767
2768 // TOS state
2769 __ load_unsigned_byte(tos_state, Address(cache, in_bytes(ResolvedFieldEntry::type_offset())));
2770
2771 // Klass overwrite register
|