--- old/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp 2018-08-20 11:53:30.720405751 +0100 +++ new/src/hotspot/cpu/x86/stubGenerator_x86_64.cpp 2018-08-20 11:53:30.437404908 +0100 @@ -2785,6 +2785,49 @@ return start; } + address generate_data_cache_writeback() { + bool optimized = VM_Version::supports_clflushopt(); + bool no_evict = VM_Version::supports_clwb(); + + const Register src = c_rarg0; // source address + + __ align(CodeEntryAlignment); + + StubCodeMark mark(this, "StubRoutines", "_data_cache_writeback"); + + address start = __ pc(); + __ enter(); + const Address line(src, 0); + __ cache_wb(line); + __ leave(); + __ ret(0); + + return start; + } + + address generate_data_cache_writeback_sync() { + const Register is_pre = c_rarg0; // pre or post sync + + __ align(CodeEntryAlignment); + + StubCodeMark mark(this, "StubRoutines", "_data_cache_writeback_sync"); + + // pre wbsync is a no-op + // post wbsync translates to an sfence + + Label skip; + address start = __ pc(); + __ enter(); + __ cmpl(is_pre, 0); + __ jcc(Assembler::notEqual, skip); + __ cache_wbsync(false); + __ bind(skip); + __ leave(); + __ ret(0); + + return start; + } + void generate_arraycopy_stubs() { address entry; address entry_jbyte_arraycopy; @@ -5777,6 +5820,10 @@ // support for verify_oop (must happen after universe_init) StubRoutines::_verify_oop_subroutine_entry = generate_verify_oop(); + // data cache line writeback + StubRoutines::_data_cache_writeback = generate_data_cache_writeback(); + StubRoutines::_data_cache_writeback_sync = generate_data_cache_writeback_sync(); + // arraycopy stubs used by compilers generate_arraycopy_stubs();