diff -r a8e39cc7b88f -r 651a95f30dfb src/hotspot/cpu/s390/macroAssembler_s390.cpp --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp Thu Dec 14 12:02:16 2017 +0100 +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp Thu Dec 14 13:05:20 2017 +0100 @@ -43,6 +43,8 @@ #include "runtime/interfaceSupport.hpp" #include "runtime/objectMonitor.hpp" #include "runtime/os.hpp" +#include "runtime/safepoint.hpp" +#include "runtime/safepointMechanism.hpp" #include "runtime/sharedRuntime.hpp" #include "runtime/stubRoutines.hpp" #include "utilities/events.hpp" @@ -2019,6 +2021,15 @@ return here + offset; } +void MacroAssembler::instr_size(Register size, Register pc) { + // Extract 2 most significant bits of current instruction. + z_llgc(size, Address(pc)); + z_srl(size, 6); + // Compute (x+3)&6 which translates 0->2, 1->4, 2->4, 3->6. + z_ahi(size, 3); + z_nill(size, 6); +} + // Resize_frame with SP(new) = SP(old) - [offset]. void MacroAssembler::resize_frame_sub(Register offset, Register fp, bool load_fp) { @@ -2705,6 +2716,19 @@ z_st(Z_R0, 0, tmp2, tmp1); } +void MacroAssembler::safepoint_poll(Label& slow_path, Register temp_reg) { + if (SafepointMechanism::uses_thread_local_poll()) { + const Address poll_byte_addr(Z_thread, in_bytes(Thread::polling_page_offset()) + 7 /* Big Endian */); + // Armed page has poll_bit set. + z_tm(poll_byte_addr, SafepointMechanism::poll_bit()); + z_brnaz(slow_path); + } else { + load_const_optimized(temp_reg, SafepointSynchronize::address_of_state()); + z_cli(/*SafepointSynchronize::sz_state()*/4-1, temp_reg, SafepointSynchronize::_not_synchronized); + z_brne(slow_path); + } +} + // Don't rely on register locking, always use Z_R1 as scratch register instead. void MacroAssembler::bang_stack_with_offset(int offset) { // Stack grows down, caller passes positive offset. @@ -6457,27 +6481,6 @@ Assembler::z_brc(Assembler::bcondOverflow /* CC==3 (iterate) */, retry); } -void MacroAssembler::generate_safepoint_check(Label& slow_path, Register scratch, bool may_relocate) { - if (scratch == noreg) scratch = Z_R1; - address Astate = SafepointSynchronize::address_of_state(); - BLOCK_COMMENT("safepoint check:"); - - if (may_relocate) { - ptrdiff_t total_distance = Astate - this->pc(); - if (RelAddr::is_in_range_of_RelAddr32(total_distance)) { - RelocationHolder rspec = external_word_Relocation::spec(Astate); - (this)->relocate(rspec, relocInfo::pcrel_addr_format); - load_absolute_address(scratch, Astate); - } else { - load_const_optimized(scratch, Astate); - } - } else { - load_absolute_address(scratch, Astate); - } - z_cli(/*SafepointSynchronize::sz_state()*/4-1, scratch, SafepointSynchronize::_not_synchronized); - z_brne(slow_path); -} - void MacroAssembler::generate_type_profiling(const Register Rdata, const Register Rreceiver_klass,