< prev index next >

src/cpu/x86/vm/x86_64.ad

Print this page

        

@@ -6401,10 +6401,45 @@
     __ 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 >