< prev index next >

src/hotspot/cpu/x86/templateTable_x86.cpp

Print this page

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
< prev index next >