< prev index next >

src/hotspot/cpu/s390/macroAssembler_s390.cpp

Print this page
rev 56779 : 8233328: fix minimal VM build on Linux s390x

*** 35,47 **** --- 35,49 ---- #include "memory/resourceArea.hpp" #include "memory/universe.hpp" #include "oops/accessDecorators.hpp" #include "oops/compressedOops.inline.hpp" #include "oops/klass.inline.hpp" + #ifdef COMPILER2 #include "opto/compile.hpp" #include "opto/intrinsicnode.hpp" #include "opto/matcher.hpp" + #endif #include "prims/methodHandles.hpp" #include "registerSaver_s390.hpp" #include "runtime/biasedLocking.hpp" #include "runtime/icache.hpp" #include "runtime/interfaceSupport.inline.hpp"
*** 2923,2933 **** BLOCK_COMMENT("} IC miss handler"); return labelOffset; } void MacroAssembler::nmethod_UEP(Label& ic_miss) { ! Register ic_reg = as_Register(Matcher::inline_cache_reg_encode()); int klass_offset = oopDesc::klass_offset_in_bytes(); if (!ImplicitNullChecks || MacroAssembler::needs_explicit_null_check(klass_offset)) { if (VM_Version::has_CompareBranch()) { z_cgij(Z_ARG1, 0, Assembler::bcondEqual, ic_miss); } else { --- 2925,2935 ---- BLOCK_COMMENT("} IC miss handler"); return labelOffset; } void MacroAssembler::nmethod_UEP(Label& ic_miss) { ! Register ic_reg = Z_inline_cache; int klass_offset = oopDesc::klass_offset_in_bytes(); if (!ImplicitNullChecks || MacroAssembler::needs_explicit_null_check(klass_offset)) { if (VM_Version::has_CompareBranch()) { z_cgij(Z_ARG1, 0, Assembler::bcondEqual, ic_miss); } else {
*** 5398,5407 **** --- 5400,5410 ---- BLOCK_COMMENT("} has_negatives"); return offset() - block_start; } + #ifdef COMPILER2 // kill: cnt1, cnt2, odd_reg, even_reg; early clobber: result unsigned int MacroAssembler::string_compare(Register str1, Register str2, Register cnt1, Register cnt2, Register odd_reg, Register even_reg, Register result, int ae) { int block_start = offset();
*** 5509,5518 **** --- 5512,5522 ---- BLOCK_COMMENT("} string_compare"); return offset() - block_start; } + #endif unsigned int MacroAssembler::array_equals(bool is_array_equ, Register ary1, Register ary2, Register limit, Register odd_reg, Register even_reg, Register result, bool is_byte) { int block_start = offset();
*** 5608,5617 **** --- 5612,5622 ---- BLOCK_COMMENT("} array_equals"); return offset() - block_start; } + #ifdef COMPILER2 // kill: haycnt, needlecnt, odd_reg, even_reg; early clobber: result unsigned int MacroAssembler::string_indexof(Register result, Register haystack, Register haycnt, Register needle, Register needlecnt, int needlecntval, Register odd_reg, Register even_reg, int ae) { int block_start = offset();
*** 5835,5845 **** } BLOCK_COMMENT("} string_indexof_char"); return offset() - block_start; } ! //------------------------------------------------- // Constants (scalar and oop) in constant pool //------------------------------------------------- --- 5840,5850 ---- } BLOCK_COMMENT("} string_indexof_char"); return offset() - block_start; } ! #endif //------------------------------------------------- // Constants (scalar and oop) in constant pool //-------------------------------------------------
*** 6148,6247 **** bind(retry); Assembler::z_trtt(r1, r2, m3); Assembler::z_brc(Assembler::bcondOverflow /* CC==3 (iterate) */, retry); } - - void MacroAssembler::generate_type_profiling(const Register Rdata, - const Register Rreceiver_klass, - const Register Rwanted_receiver_klass, - const Register Rmatching_row, - bool is_virtual_call) { - const int row_size = in_bytes(ReceiverTypeData::receiver_offset(1)) - - in_bytes(ReceiverTypeData::receiver_offset(0)); - const int num_rows = ReceiverTypeData::row_limit(); - NearLabel found_free_row; - NearLabel do_increment; - NearLabel found_no_slot; - - BLOCK_COMMENT("type profiling {"); - - // search for: - // a) The type given in Rwanted_receiver_klass. - // b) The *first* empty row. - - // First search for a) only, just running over b) with no regard. - // This is possible because - // wanted_receiver_class == receiver_class && wanted_receiver_class == 0 - // is never true (receiver_class can't be zero). - for (int row_num = 0; row_num < num_rows; row_num++) { - // Row_offset should be a well-behaved positive number. The generated code relies - // on that wrt constant code size. Add2reg can handle all row_offset values, but - // will have to vary generated code size. - int row_offset = in_bytes(ReceiverTypeData::receiver_offset(row_num)); - assert(Displacement::is_shortDisp(row_offset), "Limitation of generated code"); - - // Is Rwanted_receiver_klass in this row? - if (VM_Version::has_CompareBranch()) { - z_lg(Rwanted_receiver_klass, row_offset, Z_R0, Rdata); - // Rmatching_row = Rdata + row_offset; - add2reg(Rmatching_row, row_offset, Rdata); - // if (*row_recv == (intptr_t) receiver_klass) goto fill_existing_slot; - compare64_and_branch(Rwanted_receiver_klass, Rreceiver_klass, Assembler::bcondEqual, do_increment); - } else { - add2reg(Rmatching_row, row_offset, Rdata); - z_cg(Rreceiver_klass, row_offset, Z_R0, Rdata); - z_bre(do_increment); - } - } - - // Now that we did not find a match, let's search for b). - - // We could save the first calculation of Rmatching_row if we woud search for a) in reverse order. - // We would then end up here with Rmatching_row containing the value for row_num == 0. - // We would not see much benefit, if any at all, because the CPU can schedule - // two instructions together with a branch anyway. - for (int row_num = 0; row_num < num_rows; row_num++) { - int row_offset = in_bytes(ReceiverTypeData::receiver_offset(row_num)); - - // Has this row a zero receiver_klass, i.e. is it empty? - if (VM_Version::has_CompareBranch()) { - z_lg(Rwanted_receiver_klass, row_offset, Z_R0, Rdata); - // Rmatching_row = Rdata + row_offset - add2reg(Rmatching_row, row_offset, Rdata); - // if (*row_recv == (intptr_t) 0) goto found_free_row - compare64_and_branch(Rwanted_receiver_klass, (intptr_t)0, Assembler::bcondEqual, found_free_row); - } else { - add2reg(Rmatching_row, row_offset, Rdata); - load_and_test_long(Rwanted_receiver_klass, Address(Rdata, row_offset)); - z_bre(found_free_row); // zero -> Found a free row. - } - } - - // No match, no empty row found. - // Increment total counter to indicate polymorphic case. - if (is_virtual_call) { - add2mem_64(Address(Rdata, CounterData::count_offset()), 1, Rmatching_row); - } - z_bru(found_no_slot); - - // Here we found an empty row, but we have not found Rwanted_receiver_klass. - // Rmatching_row holds the address to the first empty row. - bind(found_free_row); - // Store receiver_klass into empty slot. - z_stg(Rreceiver_klass, 0, Z_R0, Rmatching_row); - - // Increment the counter of Rmatching_row. - bind(do_increment); - ByteSize counter_offset = ReceiverTypeData::receiver_count_offset(0) - ReceiverTypeData::receiver_offset(0); - add2mem_64(Address(Rmatching_row, counter_offset), 1, Rdata); - - bind(found_no_slot); - - BLOCK_COMMENT("} type profiling"); - } - //--------------------------------------- // Helpers for Intrinsic Emitters //--------------------------------------- /** --- 6153,6162 ----
< prev index next >