Mercurial > hg > jdk9-shenandoah > hotspot
changeset 9452:f7786999dcd2
Move x86 specific Shenandoah code into src/cpu/x86 subtree.
author | rkennke |
---|---|
date | Thu, 20 Aug 2015 12:10:37 +0200 |
parents | 04773a6b9229 |
children | 1650eab95d25 |
files | src/cpu/x86/vm/shenandoahBarrierSet_x86.cpp src/share/vm/gc/shenandoah/shenandoahBarrierSet.cpp |
diffstat | 2 files changed, 351 insertions(+), 343 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/cpu/x86/vm/shenandoahBarrierSet_x86.cpp Thu Aug 20 12:10:37 2015 +0200 @@ -0,0 +1,351 @@ +/* +Copyright 2015 Red Hat, Inc. and/or its affiliates. + */ + +#include "gc/shenandoah/shenandoahBarrierSet.hpp" + +#include "asm/macroAssembler.hpp" +#include "interpreter/interpreter.hpp" + +#define __ masm-> + +#ifndef CC_INTERP +void ShenandoahBarrierSet::compile_resolve_oop_runtime(MacroAssembler* masm, Register dst) { + + __ push(rscratch1); + + if (dst != rax) { + __ push(rax); + } + if (dst != rbx) { + __ push(rbx); + } + if (dst != rcx) { + __ push(rcx); + } + if (dst != rdx) { + __ push(rdx); + } + if (dst != rdi) { + __ push(rdi); + } + if (dst != rsi) { + __ push(rsi); + } + if (dst != rbp) { + __ push(rbp); + } + if (dst != r8) { + __ push(r8); + } + if (dst != r9) { + __ push(r9); + } + if (dst != r11) { + __ push(r11); + } + if (dst != r12) { + __ push(r12); + } + if (dst != r13) { + __ push(r13); + } + if (dst != r14) { + __ push(r14); + } + if (dst != r15) { + __ push(r15); + } + + __ subptr(rsp, 128); + __ movdbl(Address(rsp, 0), xmm0); + __ movdbl(Address(rsp, 8), xmm1); + __ movdbl(Address(rsp, 16), xmm2); + __ movdbl(Address(rsp, 24), xmm3); + __ movdbl(Address(rsp, 32), xmm4); + __ movdbl(Address(rsp, 40), xmm5); + __ movdbl(Address(rsp, 48), xmm6); + __ movdbl(Address(rsp, 56), xmm7); + __ movdbl(Address(rsp, 64), xmm8); + __ movdbl(Address(rsp, 72), xmm9); + __ movdbl(Address(rsp, 80), xmm10); + __ movdbl(Address(rsp, 88), xmm11); + __ movdbl(Address(rsp, 96), xmm12); + __ movdbl(Address(rsp, 104), xmm13); + __ movdbl(Address(rsp, 112), xmm14); + __ movdbl(Address(rsp, 120), xmm15); + + __ mov(c_rarg1, dst); + __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahBarrierSet::resolve_oop_static), c_rarg1); + __ mov(rscratch1, rax); + + __ movdbl(xmm0, Address(rsp, 0)); + __ movdbl(xmm1, Address(rsp, 8)); + __ movdbl(xmm2, Address(rsp, 16)); + __ movdbl(xmm3, Address(rsp, 24)); + __ movdbl(xmm4, Address(rsp, 32)); + __ movdbl(xmm5, Address(rsp, 40)); + __ movdbl(xmm6, Address(rsp, 48)); + __ movdbl(xmm7, Address(rsp, 56)); + __ movdbl(xmm8, Address(rsp, 64)); + __ movdbl(xmm9, Address(rsp, 72)); + __ movdbl(xmm10, Address(rsp, 80)); + __ movdbl(xmm11, Address(rsp, 88)); + __ movdbl(xmm12, Address(rsp, 96)); + __ movdbl(xmm13, Address(rsp, 104)); + __ movdbl(xmm14, Address(rsp, 112)); + __ movdbl(xmm15, Address(rsp, 120)); + __ addptr(rsp, 128); + + if (dst != r15) { + __ pop(r15); + } + if (dst != r14) { + __ pop(r14); + } + if (dst != r13) { + __ pop(r13); + } + if (dst != r12) { + __ pop(r12); + } + if (dst != r11) { + __ pop(r11); + } + if (dst != r9) { + __ pop(r9); + } + if (dst != r8) { + __ pop(r8); + } + if (dst != rbp) { + __ pop(rbp); + } + if (dst != rsi) { + __ pop(rsi); + } + if (dst != rdi) { + __ pop(rdi); + } + if (dst != rdx) { + __ pop(rdx); + } + if (dst != rcx) { + __ pop(rcx); + } + if (dst != rbx) { + __ pop(rbx); + } + if (dst != rax) { + __ pop(rax); + } + + __ mov(dst, rscratch1); + + __ pop(rscratch1); +} + +// TODO: The following should really live in an X86 specific subclass. +void ShenandoahBarrierSet::compile_resolve_oop(MacroAssembler* masm, Register dst) { + if (ShenandoahReadBarrier) { + + Label is_null; + __ testptr(dst, dst); + __ jcc(Assembler::zero, is_null); + compile_resolve_oop_not_null(masm, dst); + __ bind(is_null); + } +} + +void ShenandoahBarrierSet::compile_resolve_oop_not_null(MacroAssembler* masm, Register dst) { + if (ShenandoahReadBarrier) { + if (ShenandoahVerifyReadsToFromSpace) { + compile_resolve_oop_runtime(masm, dst); + return; + } + __ movptr(dst, Address(dst, -8)); + } +} + +void ShenandoahBarrierSet::compile_resolve_oop_for_write(MacroAssembler* masm, Register dst, bool explicit_null_check, int stack_adjust, int num_state_save, ...) { + + if (! ShenandoahWriteBarrier) { + assert(! ShenandoahConcurrentEvacuation, "Can only do this without concurrent evacuation"); + return compile_resolve_oop(masm, dst); + } + + assert(dst != rscratch1, "different regs"); + //assert(dst != rscratch2, "Need rscratch2"); + + Label done; + + // Resolve oop first. + // TODO: Make this not-null-checking as soon as we have implicit null checks in c1! + + + if (explicit_null_check) { + __ testptr(dst, dst); + __ jcc(Assembler::zero, done); + } + + Address evacuation_in_progress = Address(r15_thread, in_bytes(JavaThread::evacuation_in_progress_offset())); + + __ cmpb(evacuation_in_progress, 0); + + // Now check if evacuation is in progress. + compile_resolve_oop_not_null(masm, dst); + + __ jcc(Assembler::equal, done); + __ push(rscratch1); + __ push(rscratch2); + + __ movptr(rscratch1, dst); + __ shrptr(rscratch1, ShenandoahHeapRegion::RegionSizeShift); + __ movptr(rscratch2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr()); + __ movbool(rscratch2, Address(rscratch2, rscratch1, Address::times_1)); + __ testb(rscratch2, 0x1); + + __ pop(rscratch2); + __ pop(rscratch1); + + __ jcc(Assembler::zero, done); + + intArray save_states = intArray(num_state_save); + va_list vl; + va_start(vl, num_state_save); + for (int i = 0; i < num_state_save; i++) { + save_states.at_put(i, va_arg(vl, int)); + } + va_end(vl); + + __ push(rscratch1); + for (int i = 0; i < num_state_save; i++) { + switch (save_states[i]) { + case noreg: + __ subptr(rsp, Interpreter::stackElementSize); + break; + case ss_rax: + __ push(rax); + break; + case ss_rbx: + __ push(rbx); + break; + case ss_rcx: + __ push(rcx); + break; + case ss_rdx: + __ push(rdx); + break; + case ss_rsi: + __ push(rsi); + break; + case ss_rdi: + __ push(rdi); + break; + case ss_r13: + __ push(r13); + break; + case ss_ftos: + __ subptr(rsp, wordSize); + __ movflt(Address(rsp, 0), xmm0); + break; + case ss_dtos: + __ subptr(rsp, 2 * wordSize); + __ movdbl(Address(rsp, 0), xmm0); + break; + case ss_c_rarg0: + __ push(c_rarg0); + break; + case ss_c_rarg1: + __ push(c_rarg1); + break; + case ss_c_rarg2: + __ push(c_rarg2); + break; + case ss_c_rarg3: + __ push(c_rarg3); + break; + case ss_c_rarg4: + __ push(c_rarg4); + break; + + default: + ShouldNotReachHere(); + } + } + + __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahBarrierSet::resolve_and_maybe_copy_oop_interp), dst); + __ mov(rscratch1, rax); + + for (int i = num_state_save - 1; i >= 0; i--) { + switch (save_states[i]) { + case noreg: + __ addptr(rsp, Interpreter::stackElementSize); + break; + case ss_rax: + __ pop(rax); + break; + case ss_rbx: + __ pop(rbx); + break; + case ss_rcx: + __ pop(rcx); + break; + case ss_rdx: + __ pop(rdx); + break; + case ss_rsi: + __ pop(rsi); + break; + case ss_rdi: + __ pop(rdi); + break; + case ss_r13: + __ pop(r13); + break; + case ss_ftos: + __ movflt(xmm0, Address(rsp, 0)); + __ addptr(rsp, wordSize); + break; + case ss_dtos: + __ movdbl(xmm0, Address(rsp, 0)); + __ addptr(rsp, 2 * Interpreter::stackElementSize); + break; + case ss_c_rarg0: + __ pop(c_rarg0); + break; + case ss_c_rarg1: + __ pop(c_rarg1); + break; + case ss_c_rarg2: + __ pop(c_rarg2); + break; + case ss_c_rarg3: + __ pop(c_rarg3); + break; + case ss_c_rarg4: + __ pop(c_rarg4); + break; + default: + ShouldNotReachHere(); + } + } + + __ mov(dst, rscratch1); + __ pop(rscratch1); + + __ bind(done); +} + +/* +void ShenandoahBarrierSet::compile_resolve_oop_for_write(MacroAssembler* masm, Register dst) { + + Label is_null; + __ testptr(dst, dst); + __ jcc(Assembler::zero, is_null); + compile_resolve_oop_for_write_not_null(masm, dst); + __ bind(is_null); + +} +*/ +#endif
--- a/src/share/vm/gc/shenandoah/shenandoahBarrierSet.cpp Wed Aug 19 23:00:20 2015 +0200 +++ b/src/share/vm/gc/shenandoah/shenandoahBarrierSet.cpp Thu Aug 20 12:10:37 2015 +0200 @@ -3,7 +3,6 @@ */ #include "precompiled.hpp" -#include "asm/macroAssembler.hpp" #include "gc/g1/g1SATBCardTableModRefBS.hpp" #include "gc/shenandoah/brooksPointer.hpp" #include "gc/shenandoah/shenandoahHeap.inline.hpp" @@ -11,8 +10,6 @@ #include "memory/universe.hpp" #include "utilities/array.hpp" -#define __ masm-> - class UpdateRefsForOopClosure: public ExtendedOopClosure { private: @@ -343,343 +340,3 @@ return result; } -#ifndef CC_INTERP -void ShenandoahBarrierSet::compile_resolve_oop_runtime(MacroAssembler* masm, Register dst) { - - __ push(rscratch1); - - if (dst != rax) { - __ push(rax); - } - if (dst != rbx) { - __ push(rbx); - } - if (dst != rcx) { - __ push(rcx); - } - if (dst != rdx) { - __ push(rdx); - } - if (dst != rdi) { - __ push(rdi); - } - if (dst != rsi) { - __ push(rsi); - } - if (dst != rbp) { - __ push(rbp); - } - if (dst != r8) { - __ push(r8); - } - if (dst != r9) { - __ push(r9); - } - if (dst != r11) { - __ push(r11); - } - if (dst != r12) { - __ push(r12); - } - if (dst != r13) { - __ push(r13); - } - if (dst != r14) { - __ push(r14); - } - if (dst != r15) { - __ push(r15); - } - - __ subptr(rsp, 128); - __ movdbl(Address(rsp, 0), xmm0); - __ movdbl(Address(rsp, 8), xmm1); - __ movdbl(Address(rsp, 16), xmm2); - __ movdbl(Address(rsp, 24), xmm3); - __ movdbl(Address(rsp, 32), xmm4); - __ movdbl(Address(rsp, 40), xmm5); - __ movdbl(Address(rsp, 48), xmm6); - __ movdbl(Address(rsp, 56), xmm7); - __ movdbl(Address(rsp, 64), xmm8); - __ movdbl(Address(rsp, 72), xmm9); - __ movdbl(Address(rsp, 80), xmm10); - __ movdbl(Address(rsp, 88), xmm11); - __ movdbl(Address(rsp, 96), xmm12); - __ movdbl(Address(rsp, 104), xmm13); - __ movdbl(Address(rsp, 112), xmm14); - __ movdbl(Address(rsp, 120), xmm15); - - __ mov(c_rarg1, dst); - __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahBarrierSet::resolve_oop_static), c_rarg1); - __ mov(rscratch1, rax); - - __ movdbl(xmm0, Address(rsp, 0)); - __ movdbl(xmm1, Address(rsp, 8)); - __ movdbl(xmm2, Address(rsp, 16)); - __ movdbl(xmm3, Address(rsp, 24)); - __ movdbl(xmm4, Address(rsp, 32)); - __ movdbl(xmm5, Address(rsp, 40)); - __ movdbl(xmm6, Address(rsp, 48)); - __ movdbl(xmm7, Address(rsp, 56)); - __ movdbl(xmm8, Address(rsp, 64)); - __ movdbl(xmm9, Address(rsp, 72)); - __ movdbl(xmm10, Address(rsp, 80)); - __ movdbl(xmm11, Address(rsp, 88)); - __ movdbl(xmm12, Address(rsp, 96)); - __ movdbl(xmm13, Address(rsp, 104)); - __ movdbl(xmm14, Address(rsp, 112)); - __ movdbl(xmm15, Address(rsp, 120)); - __ addptr(rsp, 128); - - if (dst != r15) { - __ pop(r15); - } - if (dst != r14) { - __ pop(r14); - } - if (dst != r13) { - __ pop(r13); - } - if (dst != r12) { - __ pop(r12); - } - if (dst != r11) { - __ pop(r11); - } - if (dst != r9) { - __ pop(r9); - } - if (dst != r8) { - __ pop(r8); - } - if (dst != rbp) { - __ pop(rbp); - } - if (dst != rsi) { - __ pop(rsi); - } - if (dst != rdi) { - __ pop(rdi); - } - if (dst != rdx) { - __ pop(rdx); - } - if (dst != rcx) { - __ pop(rcx); - } - if (dst != rbx) { - __ pop(rbx); - } - if (dst != rax) { - __ pop(rax); - } - - __ mov(dst, rscratch1); - - __ pop(rscratch1); -} - -// TODO: The following should really live in an X86 specific subclass. -void ShenandoahBarrierSet::compile_resolve_oop(MacroAssembler* masm, Register dst) { - if (ShenandoahReadBarrier) { - - Label is_null; - __ testptr(dst, dst); - __ jcc(Assembler::zero, is_null); - compile_resolve_oop_not_null(masm, dst); - __ bind(is_null); - } -} - -void ShenandoahBarrierSet::compile_resolve_oop_not_null(MacroAssembler* masm, Register dst) { - if (ShenandoahReadBarrier) { - if (ShenandoahVerifyReadsToFromSpace) { - compile_resolve_oop_runtime(masm, dst); - return; - } - __ movptr(dst, Address(dst, -8)); - } -} - -void ShenandoahBarrierSet::compile_resolve_oop_for_write(MacroAssembler* masm, Register dst, bool explicit_null_check, int stack_adjust, int num_state_save, ...) { - - if (! ShenandoahWriteBarrier) { - assert(! ShenandoahConcurrentEvacuation, "Can only do this without concurrent evacuation"); - return compile_resolve_oop(masm, dst); - } - - assert(dst != rscratch1, "different regs"); - //assert(dst != rscratch2, "Need rscratch2"); - - Label done; - - // Resolve oop first. - // TODO: Make this not-null-checking as soon as we have implicit null checks in c1! - - - if (explicit_null_check) { - __ testptr(dst, dst); - __ jcc(Assembler::zero, done); - } - - Address evacuation_in_progress = Address(r15_thread, in_bytes(JavaThread::evacuation_in_progress_offset())); - - __ cmpb(evacuation_in_progress, 0); - - // Now check if evacuation is in progress. - compile_resolve_oop_not_null(masm, dst); - - __ jcc(Assembler::equal, done); - __ push(rscratch1); - __ push(rscratch2); - - __ movptr(rscratch1, dst); - __ shrptr(rscratch1, ShenandoahHeapRegion::RegionSizeShift); - __ movptr(rscratch2, (intptr_t) ShenandoahHeap::in_cset_fast_test_addr()); - __ movbool(rscratch2, Address(rscratch2, rscratch1, Address::times_1)); - __ testb(rscratch2, 0x1); - - __ pop(rscratch2); - __ pop(rscratch1); - - __ jcc(Assembler::zero, done); - - intArray save_states = intArray(num_state_save); - va_list vl; - va_start(vl, num_state_save); - for (int i = 0; i < num_state_save; i++) { - save_states.at_put(i, va_arg(vl, int)); - } - va_end(vl); - - __ push(rscratch1); - for (int i = 0; i < num_state_save; i++) { - switch (save_states[i]) { - case noreg: - __ subptr(rsp, Interpreter::stackElementSize); - break; - case ss_rax: - __ push(rax); - break; - case ss_rbx: - __ push(rbx); - break; - case ss_rcx: - __ push(rcx); - break; - case ss_rdx: - __ push(rdx); - break; - case ss_rsi: - __ push(rsi); - break; - case ss_rdi: - __ push(rdi); - break; - case ss_r13: - __ push(r13); - break; - case ss_ftos: - __ subptr(rsp, wordSize); - __ movflt(Address(rsp, 0), xmm0); - break; - case ss_dtos: - __ subptr(rsp, 2 * wordSize); - __ movdbl(Address(rsp, 0), xmm0); - break; - case ss_c_rarg0: - __ push(c_rarg0); - break; - case ss_c_rarg1: - __ push(c_rarg1); - break; - case ss_c_rarg2: - __ push(c_rarg2); - break; - case ss_c_rarg3: - __ push(c_rarg3); - break; - case ss_c_rarg4: - __ push(c_rarg4); - break; - - default: - ShouldNotReachHere(); - } - } - - __ super_call_VM_leaf(CAST_FROM_FN_PTR(address, ShenandoahBarrierSet::resolve_and_maybe_copy_oop_interp), dst); - __ mov(rscratch1, rax); - - for (int i = num_state_save - 1; i >= 0; i--) { - switch (save_states[i]) { - case noreg: - __ addptr(rsp, Interpreter::stackElementSize); - break; - case ss_rax: - __ pop(rax); - break; - case ss_rbx: - __ pop(rbx); - break; - case ss_rcx: - __ pop(rcx); - break; - case ss_rdx: - __ pop(rdx); - break; - case ss_rsi: - __ pop(rsi); - break; - case ss_rdi: - __ pop(rdi); - break; - case ss_r13: - __ pop(r13); - break; - case ss_ftos: - __ movflt(xmm0, Address(rsp, 0)); - __ addptr(rsp, wordSize); - break; - case ss_dtos: - __ movdbl(xmm0, Address(rsp, 0)); - __ addptr(rsp, 2 * Interpreter::stackElementSize); - break; - case ss_c_rarg0: - __ pop(c_rarg0); - break; - case ss_c_rarg1: - __ pop(c_rarg1); - break; - case ss_c_rarg2: - __ pop(c_rarg2); - break; - case ss_c_rarg3: - __ pop(c_rarg3); - break; - case ss_c_rarg4: - __ pop(c_rarg4); - break; - default: - ShouldNotReachHere(); - } - } - - __ mov(dst, rscratch1); - __ pop(rscratch1); - - __ bind(done); -} - -/* -void ShenandoahBarrierSet::compile_resolve_oop_for_write(MacroAssembler* masm, Register dst) { - - Label is_null; - __ testptr(dst, dst); - __ jcc(Assembler::zero, is_null); - compile_resolve_oop_for_write_not_null(masm, dst); - __ bind(is_null); - -} -*/ -#endif