< prev index next >

src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp

Print this page

        

*** 26,35 **** --- 26,40 ---- #ifndef CPU_AARCH64_MACROASSEMBLER_AARCH64_HPP #define CPU_AARCH64_MACROASSEMBLER_AARCH64_HPP #include "asm/assembler.hpp" #include "oops/compressedOops.hpp" + #include "utilities/macros.hpp" + #include "runtime/signature.hpp" + + + class ciValueKlass; // MacroAssembler extends Assembler by frequently used macros. // // Instructions for which a 'better' code sequence exists depending // on arguments should also go in here.
*** 583,592 **** --- 588,607 ---- virtual void null_check(Register reg, int offset = -1); static bool needs_explicit_null_check(intptr_t offset); static bool uses_implicit_null_check(void* address); + void test_klass_is_value(Register klass, Register temp_reg, Label& is_value); + + void test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable); + void test_field_is_not_flattenable(Register flags, Register temp_reg, Label& notFlattenable); + void test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened); + + // Check klass/oops is flat value type array (oop->_klass->_layout_helper & vt_bit) + void test_flattened_array_oop(Register klass, Register temp_reg, Label& is_flattened_array); + void test_null_free_array_oop(Register oop, Register temp_reg, Label& is_null_free_array); + static address target_addr_for_insn(address insn_addr, unsigned insn); static address target_addr_for_insn(address insn_addr) { unsigned insn = *(unsigned*)insn_addr; return target_addr_for_insn(insn_addr, insn); }
*** 787,796 **** --- 802,814 ---- // C 'boolean' to Java boolean: x == 0 ? 0 : 1 void c2bool(Register x); // oop manipulations + void load_metadata(Register dst, Register src); + void load_storage_props(Register dst, Register src); + void load_klass(Register dst, Register src); void store_klass(Register dst, Register src); void cmp_klass(Register oop, Register trial_klass, Register tmp); void resolve_oop_handle(Register result, Register tmp = r5);
*** 798,808 **** void access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src, Register tmp1, Register tmp_thread); void access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src, ! Register tmp1, Register tmp_thread); // Resolves obj for access. Result is placed in the same register. // All other registers are preserved. void resolve(DecoratorSet decorators, Register obj); --- 816,826 ---- void access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src, Register tmp1, Register tmp_thread); void access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src, ! Register tmp1, Register tmp_thread, Register tmp3 = noreg); // Resolves obj for access. Result is placed in the same register. // All other registers are preserved. void resolve(DecoratorSet decorators, Register obj);
*** 810,820 **** Register thread_tmp = noreg, DecoratorSet decorators = 0); void load_heap_oop_not_null(Register dst, Address src, Register tmp1 = noreg, Register thread_tmp = noreg, DecoratorSet decorators = 0); void store_heap_oop(Address dst, Register src, Register tmp1 = noreg, ! Register tmp_thread = noreg, DecoratorSet decorators = 0); // currently unimplemented // Used for storing NULL. All other oop constants should be // stored using routines that take a jobject. void store_heap_oop_null(Address dst); --- 828,838 ---- Register thread_tmp = noreg, DecoratorSet decorators = 0); void load_heap_oop_not_null(Register dst, Address src, Register tmp1 = noreg, Register thread_tmp = noreg, DecoratorSet decorators = 0); void store_heap_oop(Address dst, Register src, Register tmp1 = noreg, ! Register tmp_thread = noreg, Register tmp3 = noreg, DecoratorSet decorators = 0); // currently unimplemented // Used for storing NULL. All other oop constants should be // stored using routines that take a jobject. void store_heap_oop_null(Address dst);
*** 1141,1150 **** --- 1159,1199 ---- void sub(Register Rd, Register Rn, RegisterOrConstant decrement); void subw(Register Rd, Register Rn, RegisterOrConstant decrement); void adrp(Register reg1, const Address &dest, unsigned long &byte_offset); + + enum RegState { + reg_readonly, + reg_writable, + reg_written + }; + + void verified_entry(Compile* C, int sp_inc); + + int store_value_type_fields_to_buf(ciValueKlass* vk, bool from_interpreter = true); + + // Unpack all value type arguments passed as oops + void unpack_value_args(Compile* C, bool receiver_only); + bool move_helper(VMReg from, VMReg to, BasicType bt, RegState reg_state[], int ret_off, int extra_stack_offset); + bool unpack_value_helper(const GrowableArray<SigEntry>* sig, int& sig_index, VMReg from, VMRegPair* regs_to, int& to_index, + RegState reg_state[], int ret_off, int extra_stack_offset); + bool pack_value_helper(const GrowableArray<SigEntry>* sig, int& sig_index, int vtarg_index, + VMReg to, VMRegPair* regs_from, int regs_from_count, int& from_index, RegState reg_state[], + int ret_off, int extra_stack_offset); + void restore_stack(Compile* C); + + int shuffle_value_args(bool is_packing, bool receiver_only, int extra_stack_offset, + BasicType* sig_bt, const GrowableArray<SigEntry>* sig_cc, + int args_passed, int args_on_stack, VMRegPair* regs, + int args_passed_to, int args_on_stack_to, VMRegPair* regs_to); + bool shuffle_value_args_spill(bool is_packing, const GrowableArray<SigEntry>* sig_cc, int sig_cc_index, + VMRegPair* regs_from, int from_index, int regs_from_count, + RegState* reg_state, int sp_inc, int extra_stack_offset); + VMReg spill_reg_for(VMReg reg); + + void tableswitch(Register index, jint lowbound, jint highbound, Label &jumptable, Label &jumptable_end, int stride = 1) { adr(rscratch1, jumptable); subsw(rscratch2, index, lowbound); subsw(zr, rscratch2, highbound - lowbound);
*** 1233,1242 **** --- 1282,1293 ---- void string_equals(Register a1, Register a2, Register result, Register cnt1, int elem_size); void fill_words(Register base, Register cnt, Register value); + void fill_words(Register base, u_int64_t cnt, Register value); + void zero_words(Register base, u_int64_t cnt); void zero_words(Register ptr, Register cnt); void zero_dcache_blocks(Register base, Register cnt); static const int zero_words_block_size;
*** 1360,1369 **** --- 1411,1423 ---- spill(tmp1, true, dst_offset); unspill(tmp1, true, src_offset+8); spill(tmp1, true, dst_offset+8); } } + + #include "asm/macroAssembler_common.hpp" + }; #ifdef ASSERT inline bool AbstractAssembler::pd_check_instruction_mark() { return false; } #endif
< prev index next >