< prev index next >
src/cpu/x86/vm/x86_64.ad
Print this page
*** 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 >