< prev index next >

src/hotspot/cpu/ppc/gc/shenandoah/shenandoahBarrierSetAssembler_ppc.cpp

Print this page

  31 #include "gc/shenandoah/mode/shenandoahMode.hpp"
  32 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
  33 #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
  34 #include "gc/shenandoah/shenandoahForwarding.hpp"
  35 #include "gc/shenandoah/shenandoahHeap.hpp"
  36 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
  37 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
  38 #include "gc/shenandoah/shenandoahRuntime.hpp"
  39 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  40 #include "interpreter/interpreter.hpp"
  41 #include "macroAssembler_ppc.hpp"
  42 #include "runtime/javaThread.hpp"
  43 #include "runtime/sharedRuntime.hpp"
  44 #include "utilities/globalDefinitions.hpp"
  45 #include "vm_version_ppc.hpp"
  46 #ifdef COMPILER1
  47 #include "c1/c1_LIRAssembler.hpp"
  48 #include "c1/c1_MacroAssembler.hpp"
  49 #include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
  50 #endif



  51 
  52 #define __ masm->
  53 
  54 void ShenandoahBarrierSetAssembler::satb_barrier(MacroAssembler *masm,
  55                                                  Register base, RegisterOrConstant ind_or_offs,
  56                                                  Register tmp1, Register tmp2, Register tmp3,
  57                                                  MacroAssembler::PreservationLevel preservation_level) {
  58   if (ShenandoahSATBBarrier) {
  59     __ block_comment("satb_barrier (shenandoahgc) {");
  60     satb_barrier_impl(masm, 0, base, ind_or_offs, tmp1, tmp2, tmp3, preservation_level);
  61     __ block_comment("} satb_barrier (shenandoahgc)");
  62   }
  63 }
  64 
  65 void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler *masm, DecoratorSet decorators,
  66                                                            Register base, RegisterOrConstant ind_or_offs,
  67                                                            Register dst,
  68                                                            Register tmp1, Register tmp2,
  69                                                            MacroAssembler::PreservationLevel preservation_level) {
  70   if (ShenandoahLoadRefBarrier) {

1072   assert(jrt_address != nullptr, "load reference barrier runtime routine cannot be found");
1073 
1074   __ save_LR(R11_tmp);
1075   __ push_frame_reg_args(nbytes_save, R11_tmp);
1076 
1077   // Invoke runtime.  Arguments are already stored in the corresponding registers.
1078   __ call_VM_leaf(jrt_address, R3_obj, R4_load_addr);
1079 
1080   // Restore to-be-preserved registers.
1081   __ pop_frame();
1082   __ restore_LR(R11_tmp);
1083   __ restore_volatile_gprs(R1_SP, -nbytes_save, true, false); // Skip 'R3_RET' register.
1084 
1085   __ blr();
1086   __ block_comment("} generate_c1_load_reference_barrier_runtime_stub (shenandoahgc)");
1087 }
1088 
1089 #undef __
1090 
1091 #endif // COMPILER1























































  31 #include "gc/shenandoah/mode/shenandoahMode.hpp"
  32 #include "gc/shenandoah/shenandoahBarrierSet.hpp"
  33 #include "gc/shenandoah/shenandoahBarrierSetAssembler.hpp"
  34 #include "gc/shenandoah/shenandoahForwarding.hpp"
  35 #include "gc/shenandoah/shenandoahHeap.hpp"
  36 #include "gc/shenandoah/shenandoahHeap.inline.hpp"
  37 #include "gc/shenandoah/shenandoahHeapRegion.hpp"
  38 #include "gc/shenandoah/shenandoahRuntime.hpp"
  39 #include "gc/shenandoah/shenandoahThreadLocalData.hpp"
  40 #include "interpreter/interpreter.hpp"
  41 #include "macroAssembler_ppc.hpp"
  42 #include "runtime/javaThread.hpp"
  43 #include "runtime/sharedRuntime.hpp"
  44 #include "utilities/globalDefinitions.hpp"
  45 #include "vm_version_ppc.hpp"
  46 #ifdef COMPILER1
  47 #include "c1/c1_LIRAssembler.hpp"
  48 #include "c1/c1_MacroAssembler.hpp"
  49 #include "gc/shenandoah/c1/shenandoahBarrierSetC1.hpp"
  50 #endif
  51 #ifdef COMPILER2
  52 #include "gc/shenandoah/c2/shenandoahBarrierSetC2.hpp"
  53 #endif
  54 
  55 #define __ masm->
  56 
  57 void ShenandoahBarrierSetAssembler::satb_barrier(MacroAssembler *masm,
  58                                                  Register base, RegisterOrConstant ind_or_offs,
  59                                                  Register tmp1, Register tmp2, Register tmp3,
  60                                                  MacroAssembler::PreservationLevel preservation_level) {
  61   if (ShenandoahSATBBarrier) {
  62     __ block_comment("satb_barrier (shenandoahgc) {");
  63     satb_barrier_impl(masm, 0, base, ind_or_offs, tmp1, tmp2, tmp3, preservation_level);
  64     __ block_comment("} satb_barrier (shenandoahgc)");
  65   }
  66 }
  67 
  68 void ShenandoahBarrierSetAssembler::load_reference_barrier(MacroAssembler *masm, DecoratorSet decorators,
  69                                                            Register base, RegisterOrConstant ind_or_offs,
  70                                                            Register dst,
  71                                                            Register tmp1, Register tmp2,
  72                                                            MacroAssembler::PreservationLevel preservation_level) {
  73   if (ShenandoahLoadRefBarrier) {

1075   assert(jrt_address != nullptr, "load reference barrier runtime routine cannot be found");
1076 
1077   __ save_LR(R11_tmp);
1078   __ push_frame_reg_args(nbytes_save, R11_tmp);
1079 
1080   // Invoke runtime.  Arguments are already stored in the corresponding registers.
1081   __ call_VM_leaf(jrt_address, R3_obj, R4_load_addr);
1082 
1083   // Restore to-be-preserved registers.
1084   __ pop_frame();
1085   __ restore_LR(R11_tmp);
1086   __ restore_volatile_gprs(R1_SP, -nbytes_save, true, false); // Skip 'R3_RET' register.
1087 
1088   __ blr();
1089   __ block_comment("} generate_c1_load_reference_barrier_runtime_stub (shenandoahgc)");
1090 }
1091 
1092 #undef __
1093 
1094 #endif // COMPILER1
1095 
1096 #ifdef COMPILER2
1097 
1098 #undef __
1099 #define __ masm->
1100 
1101 void ShenandoahBarrierSetAssembler::load_c2(const MachNode* node, MacroAssembler* masm,
1102              Register dst, Register addr, int disp, bool narrow, bool acquire) {
1103   if (narrow) {
1104     __ lwz(dst, disp, addr);
1105   } else {
1106     __ ld(dst, disp, addr);
1107   }
1108   if (acquire) {
1109     __ twi_0(dst);
1110     __ isync();
1111   }
1112 }
1113 
1114 void ShenandoahBarrierSetAssembler::store_c2(const MachNode* node, MacroAssembler* masm,
1115               Register dst, int disp, bool dst_narrow,
1116               Register src, bool src_narrow,
1117               Register tmp) {
1118 
1119   // Need to encode into tmp, because we cannot clobber src.
1120   // TODO: Maybe there is a matcher way to test that src is unused after this?
1121   if (dst_narrow && !src_narrow) {
1122     __ mr(tmp, src);
1123     if (ShenandoahBarrierStubC2::maybe_null(node)) {
1124       __ encode_heap_oop(tmp, tmp);
1125     } else {
1126       __ encode_heap_oop_not_null(tmp);
1127     }
1128     src = tmp;
1129   }
1130   if (dst_narrow) {
1131     __ stw(src, disp, dst);
1132   } else {
1133     __ std(src, disp, dst);
1134   }
1135 }
1136 
1137 void ShenandoahBarrierStubC2::emit_code(MacroAssembler& masm) {
1138   Assembler::InlineSkippedInstructionsCounter skip_counter(&masm);
1139 
1140   assert(_needs_keep_alive_barrier || _needs_load_ref_barrier, "Why are you here?");
1141   Unimplemented();
1142 }
1143 
1144 void ShenandoahBarrierStubC2::post_init() {
1145   // Do nothing.
1146 }
1147 
1148 #endif // COMPILER2
< prev index next >