< prev index next >

src/cpu/x86/vm/x86_64.ad

Print this page
rev 8961 : [mq]: diff-shenandoah.patch

*** 6401,6410 **** --- 6401,6445 ---- __ movl($dst$$Register, $src$$Register); %} 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); match(Set dst (EncodeP src)); effect(KILL cr);
< prev index next >