--- old/src/cpu/x86/vm/x86_64.ad 2015-10-14 13:53:43.668628192 +0200 +++ new/src/cpu/x86/vm/x86_64.ad 2015-10-14 13:53:43.555630925 +0200 @@ -6403,6 +6403,41 @@ ins_pipe(ialu_reg_reg); // XXX %} +instruct shenandoahRB(rRegP dst, rRegP src, rFlagsReg cr) %{ + match(Set dst (ShenandoahReadBarrier src)); + effect(DEF dst, USE src); + ins_cost(125); // XXX + format %{ "shenandoah_rb $dst,$src" %} + ins_encode %{ + Register s = $src$$Register; + Register d = $dst$$Register; + __ movptr(d, Address(s, -8)); + %} + ins_pipe(ialu_reg_mem); +%} + +instruct shenandoahWB(rax_RegP dst, rdi_RegP src, rFlagsReg cr) %{ + match(Set dst (ShenandoahWriteBarrier src)); + effect(DEF dst, USE_KILL src, KILL cr); + ins_cost(300); // XXX + format %{ "shenandoah_wb $dst,$src" %} + ins_encode %{ + Label done; + Register s = $src$$Register; + Register d = $dst$$Register; + assert(s == rdi, "need rdi"); + assert(d == rax, "result in rax"); + Address evacuation_in_progress = Address(r15_thread, in_bytes(JavaThread::evacuation_in_progress_offset())); + __ movptr(d, Address(s, -8)); + __ cmpb(evacuation_in_progress, 0); + __ movptr(d, Address(s, -8)); + __ jcc(Assembler::equal, done); + __ call(RuntimeAddress(CAST_FROM_FN_PTR(address, StubRoutines::x86::shenandoah_wb()))); + __ bind(done); + %} + ins_pipe(pipe_slow); +%} + // Convert oop pointer into compressed form instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{ predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);