< prev index next > src/hotspot/cpu/riscv/macroAssembler_riscv.hpp
Print this page
#include "asm/assembler.inline.hpp"
#include "code/vmreg.hpp"
#include "metaprogramming/enableIf.hpp"
#include "oops/compressedOops.hpp"
#include "utilities/powerOfTwo.hpp"
+ #include "runtime/signature.hpp"
+
+ class ciInlineKlass;
// MacroAssembler extends Assembler by frequently used macros.
//
// Instructions for which a 'better' code sequence exists depending
// on arguments should also go in here.
void call_VM_leaf(address entry_point,
Register arg_0, Register arg_1, Register arg_2);
// These always tightly bind to MacroAssembler::call_VM_base
// bypassing the virtual implementation
+ void super_call_VM_leaf(address entry_point);
void super_call_VM_leaf(address entry_point, Register arg_0);
void super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1);
void super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2);
void super_call_VM_leaf(address entry_point, Register arg_0, Register arg_1, Register arg_2, Register arg_3);
void access_load_at(BasicType type, DecoratorSet decorators, Register dst,
Address src, Register tmp1, Register tmp2);
void access_store_at(BasicType type, DecoratorSet decorators, Address dst,
Register val, Register tmp1, Register tmp2, Register tmp3);
void load_klass(Register dst, Register src, Register tmp = t0);
+ void load_prototype_header(Register dst, Register src, Register tmp = t0);
void load_narrow_klass_compact(Register dst, Register src);
void store_klass(Register dst, Register src, Register tmp = t0);
void cmp_klass_beq(Register obj, Register klass,
Register tmp1, Register tmp2,
Label &L, bool is_far = false);
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_field_is_null_free_inline_type(Register flags, Register temp_reg, Label& is_null_free);
+ void test_field_is_not_null_free_inline_type(Register flags, Register temp_reg, Label& not_null_free_inline_type);
+ void test_field_is_flat(Register flags, Register temp_reg, Label& is_flat);
+
+ void test_markword_is_inline_type(Register markword, Label& is_inline_type);
+ void test_oop_is_not_inline_type(Register object, Register tmp, Label& not_inline_type, bool can_be_null = true);
+ void test_oop_prototype_bit(Register oop, Register temp_reg, int32_t tst_bit, bool jmp_set, Label& jmp_label);
+ void test_flat_array_oop(Register klass, Register temp_reg, Label& is_flat_array);
+ void test_null_free_array_oop(Register oop, Register temp_reg, Label& is_null_free_array);
+ void test_non_flat_array_oop(Register oop, Register temp_reg, Label&is_non_flat_array);
+ void test_non_null_free_array_oop(Register oop, Register temp_reg, Label&is_non_null_free_array);
+
+ // Check array klass layout helper for flat or null-free arrays...
+ void test_flat_array_layout(Register lh, Label& is_flat_array);
+
+ void inline_layout_info(Register holder_klass, Register index, Register layout_info);
+
+ void flat_field_copy(DecoratorSet decorators, Register src, Register dst, Register inline_layout_info);
+
+ // inline type data payload offsets...
+ void payload_offset(Register inline_klass, Register offset);
+ void payload_address(Register oop, Register data, Register inline_klass);
+
// interface method calling
void lookup_interface_method(Register recv_klass,
Register intf_klass,
RegisterOrConstant itable_index,
Register method_result,
}
return adr;
}
// allocation
+
void tlab_allocate(
Register obj, // result: pointer to object after successful allocation
Register var_size_in_bytes, // object size in bytes if unknown at compile time; invalid otherwise
int con_size_in_bytes, // object size in bytes if known at compile time
Register tmp1, // temp register
// Frame creation and destruction shared between JITs.
void build_frame(int framesize);
void remove_frame(int framesize);
+ void verified_entry(Compile* C, int sp_inc);
+
void reserved_stack_check();
void get_polling_page(Register dest, relocInfo::relocType rtype);
void read_polling_page(Register r, int32_t offset, relocInfo::relocType rtype);
void clinit_barrier(Register klass, Register tmp, Label* L_fast_path = nullptr, Label* L_slow_path = nullptr);
void load_method_holder_cld(Register result, Register method);
void load_method_holder(Register holder, Register method);
+ void load_metadata(Register dst, Register src);
void compute_index(Register str1, Register trailing_zeros, Register match_mask,
Register result, Register char_tmp, Register tmp,
bool haystack_isL);
void compute_match_mask(Register src, Register pattern, Register match_mask,
static bool is_membar(address addr) {
return (Bytes::get_native_u4(addr) & 0x7f) == 0b1111 && extract_funct3(addr) == 0;
}
static uint32_t get_membar_kind(address addr);
static void set_membar_kind(address addr, uint32_t order_kind);
+
+ public:
+ // Inline type specific methods
+ #include "asm/macroAssembler_common.hpp"
};
#ifdef ASSERT
inline bool AbstractAssembler::pd_check_instruction_mark() { return false; }
#endif
< prev index next >