--- old/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2019-03-26 15:45:25.338492676 +0000 +++ new/src/hotspot/cpu/aarch64/macroAssembler_aarch64.hpp 2019-03-26 15:45:24.458456049 +0000 @@ -27,6 +27,8 @@ #define CPU_AARCH64_MACROASSEMBLER_AARCH64_HPP #include "asm/assembler.hpp" +#include "runtime/signature.hpp" + // MacroAssembler extends Assembler by frequently used macros. // @@ -584,6 +586,18 @@ 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_flat_array_klass(Register klass, Register temp_reg, Label& is_flat_array); + void test_flat_array_oop(Register oop, Register temp_reg, Label& is_flat_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; @@ -1141,6 +1155,19 @@ void adrp(Register reg1, const Address &dest, unsigned long &byte_offset); + + enum RegState { + reg_readonly, + reg_writable, + reg_written + }; + +// 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); + bool unpack_value_helper(const GrowableArray* sig, int& sig_index, VMReg from, VMRegPair* regs_to, int& to_index, RegState reg_state[], int ret_off); + void verified_entry(Compile* C, int sp_inc); + void tableswitch(Register index, jint lowbound, jint highbound, Label &jumptable, Label &jumptable_end, int stride = 1) { adr(rscratch1, jumptable); @@ -1233,6 +1260,8 @@ 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);