1 /* 2 * Copyright (c) 2018, 2025, Oracle and/or its affiliates. All rights reserved. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 4 * 5 * This code is free software; you can redistribute it and/or modify it 6 * under the terms of the GNU General Public License version 2 only, as 7 * published by the Free Software Foundation. 8 * 9 * This code is distributed in the hope that it will be useful, but WITHOUT 10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 12 * version 2 for more details (a copy is included in the LICENSE file that 13 * accompanied this code). 14 * 15 * You should have received a copy of the GNU General Public License version 16 * 2 along with this work; if not, write to the Free Software Foundation, 17 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. 18 * 19 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA 20 * or visit www.oracle.com if you need additional information or have any 21 * questions. 22 * 23 */ 24 25 #ifndef CPU_AARCH64_GC_SHARED_BARRIERSETASSEMBLER_AARCH64_HPP 26 #define CPU_AARCH64_GC_SHARED_BARRIERSETASSEMBLER_AARCH64_HPP 27 28 #include "asm/macroAssembler.hpp" 29 #include "gc/shared/barrierSet.hpp" 30 #include "gc/shared/barrierSetNMethod.hpp" 31 #include "memory/allocation.hpp" 32 #include "oops/access.hpp" 33 #ifdef COMPILER2 34 #include "opto/optoreg.hpp" 35 36 class BarrierStubC2; 37 class Node; 38 #endif // COMPILER2 39 40 enum class NMethodPatchingType { 41 stw_instruction_and_data_patch, 42 conc_instruction_and_data_patch, 43 conc_data_patch 44 }; 45 46 class BarrierSetAssembler: public CHeapObj<mtGC> { 47 public: 48 virtual void arraycopy_prologue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, 49 Register src, Register dst, Register count, RegSet saved_regs) {} 50 virtual void arraycopy_epilogue(MacroAssembler* masm, DecoratorSet decorators, bool is_oop, 51 Register start, Register count, Register tmp, RegSet saved_regs) {} 52 53 virtual void copy_load_at(MacroAssembler* masm, 54 DecoratorSet decorators, 55 BasicType type, 56 size_t bytes, 57 Register dst1, 58 Register dst2, 59 Address src, 60 Register tmp); 61 62 virtual void copy_store_at(MacroAssembler* masm, 63 DecoratorSet decorators, 64 BasicType type, 65 size_t bytes, 66 Address dst, 67 Register src1, 68 Register src2, 69 Register tmp1, 70 Register tmp2, 71 Register tmp3); 72 73 virtual void copy_load_at(MacroAssembler* masm, 74 DecoratorSet decorators, 75 BasicType type, 76 size_t bytes, 77 FloatRegister dst1, 78 FloatRegister dst2, 79 Address src, 80 Register tmp1, 81 Register tmp2, 82 FloatRegister vec_tmp); 83 84 virtual void copy_store_at(MacroAssembler* masm, 85 DecoratorSet decorators, 86 BasicType type, 87 size_t bytes, 88 Address dst, 89 FloatRegister src1, 90 FloatRegister src2, 91 Register tmp1, 92 Register tmp2, 93 Register tmp3, 94 FloatRegister vec_tmp1, 95 FloatRegister vec_tmp2, 96 FloatRegister vec_tmp3); 97 98 virtual void load_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, 99 Register dst, Address src, Register tmp1, Register tmp2); 100 virtual void store_at(MacroAssembler* masm, DecoratorSet decorators, BasicType type, 101 Address dst, Register val, Register tmp1, Register tmp2, Register tmp3); 102 103 virtual void flat_field_copy(MacroAssembler* masm, DecoratorSet decorators, 104 Register src, Register dst, Register inline_layout_info); 105 106 virtual void try_resolve_jobject_in_native(MacroAssembler* masm, Register jni_env, 107 Register obj, Register tmp, Label& slowpath); 108 109 virtual void tlab_allocate(MacroAssembler* masm, 110 Register obj, // result: pointer to object after successful allocation 111 Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise 112 int con_size_in_bytes, // object size in bytes if known at compile time 113 Register t1, // temp register 114 Register t2, // temp register 115 Label& slow_case // continuation point if fast allocation fails 116 ); 117 118 virtual void barrier_stubs_init() {} 119 120 virtual NMethodPatchingType nmethod_patching_type() { return NMethodPatchingType::stw_instruction_and_data_patch; } 121 122 virtual void nmethod_entry_barrier(MacroAssembler* masm, Label* slow_path, Label* continuation, Label* guard); 123 virtual void c2i_entry_barrier(MacroAssembler* masm); 124 125 virtual void check_oop(MacroAssembler* masm, Register obj, Register tmp1, Register tmp2, Label& error); 126 127 virtual bool supports_instruction_patching() { 128 NMethodPatchingType patching_type = nmethod_patching_type(); 129 return patching_type == NMethodPatchingType::conc_instruction_and_data_patch || 130 patching_type == NMethodPatchingType::stw_instruction_and_data_patch; 131 } 132 133 static address patching_epoch_addr(); 134 static void clear_patching_epoch(); 135 static void increment_patching_epoch(); 136 137 #ifdef COMPILER2 138 OptoReg::Name encode_float_vector_register_size(const Node* node, 139 OptoReg::Name opto_reg); 140 OptoReg::Name refine_register(const Node* node, 141 OptoReg::Name opto_reg); 142 #endif // COMPILER2 143 }; 144 145 #ifdef COMPILER2 146 147 // This class saves and restores the registers that need to be preserved across 148 // the runtime call represented by a given C2 barrier stub. Use as follows: 149 // { 150 // SaveLiveRegisters save(masm, stub); 151 // .. 152 // __ blr(...); 153 // .. 154 // } 155 class SaveLiveRegisters { 156 private: 157 struct RegisterData { 158 VMReg _reg; 159 int _slots; // slots occupied once pushed into stack 160 161 // Used by GrowableArray::find() 162 bool operator == (const RegisterData& other) { 163 return _reg == other._reg; 164 } 165 }; 166 167 MacroAssembler* const _masm; 168 RegSet _gp_regs; 169 FloatRegSet _fp_regs; 170 FloatRegSet _neon_regs; 171 FloatRegSet _sve_regs; 172 PRegSet _p_regs; 173 174 static enum RC rc_class(VMReg reg); 175 static bool is_same_register(VMReg reg1, VMReg reg2); 176 static int decode_float_vector_register_size(OptoReg::Name opto_reg); 177 178 public: 179 void initialize(BarrierStubC2* stub); 180 SaveLiveRegisters(MacroAssembler* masm, BarrierStubC2* stub); 181 ~SaveLiveRegisters(); 182 }; 183 184 #endif // COMPILER2 185 186 #endif // CPU_AARCH64_GC_SHARED_BARRIERSETASSEMBLER_AARCH64_HPP