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