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
|