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 bool ShenandoahBarrierStubC2::has_live_vector_registers() {
1102 // TODO: Implement; currently assumes vector registers.
1103 return true;
1104 }
1105
1106 void ShenandoahBarrierStubC2::emit_code(MacroAssembler& masm) {
1107 assert(_needs_keep_alive_barrier || _needs_load_ref_barrier, "Why are you here?");
1108 Unimplemented();
1109 }
1110
1111 void ShenandoahBarrierStubC2::post_init(int offset) {
1112 // Do nothing.
1113 }
1114
1115 #endif // COMPILER2
|