< prev index next >
src/hotspot/cpu/x86/macroAssembler_x86.hpp
Print this page
@@ -99,11 +99,19 @@
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);
+ // valueKlass queries, kills temp_reg
void test_klass_is_value(Register klass, Register temp_reg, Label& is_value);
+ void test_klass_is_empty_value(Register klass, Register temp_reg, Label& is_empty_value);
+
+ // Get the default value oop for the given ValueKlass
+ void get_default_value_oop(Register value_klass, Register temp_reg, Register obj);
+ // The empty value oop, for the given ValueKlass ("empty" as in no instance fields)
+ // get_default_value_oop with extra assertion for empty value klass
+ void get_empty_value_oop(Register value_klass, Register temp_reg, Register obj);
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);
@@ -344,10 +352,17 @@
void access_load_at(BasicType type, DecoratorSet decorators, Register dst, Address src,
Register tmp1, Register thread_tmp);
void access_store_at(BasicType type, DecoratorSet decorators, Address dst, Register src,
Register tmp1, Register tmp2, Register tmp3 = noreg);
+ void access_value_copy(DecoratorSet decorators, Register src, Register dst, Register value_klass);
+
+ // value type data payload offsets...
+ void first_field_offset(Register value_klass, Register offset);
+ void data_for_oop(Register oop, Register data, Register value_klass);
+
+
// Resolves obj access. Result is placed in the same register.
// All other registers are preserved.
void resolve(DecoratorSet decorators, Register obj);
void load_heap_oop(Register dst, Address src, Register tmp1 = noreg,
@@ -532,10 +547,19 @@
// Callee saved registers handling
void push_callee_saved_registers();
void pop_callee_saved_registers();
// allocation
+
+ // Object / value buffer allocation...
+ // Allocate instance of klass, assumes klass initialized by caller
+ // new_obj prefers to be rax
+ // Kills t1 and t2, perserves klass, return allocation in new_obj (rsi on LP64)
+ void allocate_instance(Register klass, Register new_obj,
+ Register t1, Register t2,
+ bool clear_fields, Label& alloc_failed);
+
void eden_allocate(
Register thread, // Current thread
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
@@ -551,10 +575,13 @@
Register t2, // temp register
Label& slow_case // continuation point if fast allocation fails
);
void zero_memory(Register address, Register length_in_bytes, int offset_in_bytes, Register temp);
+ // For field "index" within "klass", return value_klass ...
+ void get_value_field_klass(Register klass, Register index, Register value_klass);
+
// interface method calling
void lookup_interface_method(Register recv_klass,
Register intf_klass,
RegisterOrConstant itable_index,
Register method_result,
< prev index next >