< prev index next >
src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
Print this page
*** 1307,1317 ****
bind(L_fallthrough);
}
void MacroAssembler::verify_oop(Register reg, const char* s) {
! if (!VerifyOops) return;
// Pass register number to verify_oop_subroutine
const char* b = NULL;
{
ResourceMark rm;
--- 1307,1321 ----
bind(L_fallthrough);
}
void MacroAssembler::verify_oop(Register reg, const char* s) {
! if (!VerifyOops || VerifyAdapterSharing) {
! // Below address of the code string confuses VerifyAdapterSharing
! // because it may differ between otherwise equivalent adapters.
! return;
! }
// Pass register number to verify_oop_subroutine
const char* b = NULL;
{
ResourceMark rm;
*** 1337,1347 ****
BLOCK_COMMENT("} verify_oop");
}
void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
! if (!VerifyOops) return;
const char* b = NULL;
{
ResourceMark rm;
stringStream ss;
--- 1341,1355 ----
BLOCK_COMMENT("} verify_oop");
}
void MacroAssembler::verify_oop_addr(Address addr, const char* s) {
! if (!VerifyOops || VerifyAdapterSharing) {
! // Below address of the code string confuses VerifyAdapterSharing
! // because it may differ between otherwise equivalent adapters.
! return;
! }
const char* b = NULL;
{
ResourceMark rm;
stringStream ss;
*** 1440,1449 ****
--- 1448,1461 ----
pass_arg1(this, arg_1);
pass_arg2(this, arg_2);
call_VM_leaf_base(entry_point, 3);
}
+ void MacroAssembler::super_call_VM_leaf(address entry_point) {
+ MacroAssembler::call_VM_leaf_base(entry_point, 1);
+ }
+
void MacroAssembler::super_call_VM_leaf(address entry_point, Register arg_0) {
pass_arg0(this, arg_0);
MacroAssembler::call_VM_leaf_base(entry_point, 1);
}
*** 1489,1498 ****
--- 1501,1543 ----
// nothing to do, (later) access of M[reg + offset]
// will provoke OS NULL exception if reg = NULL
}
}
+ void MacroAssembler::test_klass_is_value(Register klass, Register temp_reg, Label& is_value) {
+ ldrw(temp_reg, Address(klass, Klass::access_flags_offset()));
+ andr(temp_reg, temp_reg, JVM_ACC_VALUE);
+ cbnz(temp_reg, is_value);
+ }
+
+ void MacroAssembler::test_field_is_flattenable(Register flags, Register temp_reg, Label& is_flattenable) {
+ (void) temp_reg; // keep signature uniform with x86
+ tbnz(flags, ConstantPoolCacheEntry::is_flattenable_field_shift, is_flattenable);
+ }
+
+ void MacroAssembler::test_field_is_not_flattenable(Register flags, Register temp_reg, Label& not_flattenable) {
+ (void) temp_reg; // keep signature uniform with x86
+ tbz(flags, ConstantPoolCacheEntry::is_flattenable_field_shift, not_flattenable);
+ }
+
+ void MacroAssembler::test_field_is_flattened(Register flags, Register temp_reg, Label& is_flattened) {
+ (void) temp_reg; // keep signature uniform with x86
+ tbnz(flags, ConstantPoolCacheEntry::is_flattened_field_shift, is_flattened);
+ }
+
+ void MacroAssembler::test_flattened_array_oop(Register oop, Register temp_reg, Label& is_flattened_array) {
+ load_storage_props(temp_reg, oop);
+ andr(temp_reg, temp_reg, ArrayStorageProperties::flattened_value);
+ cbnz(temp_reg, is_flattened_array);
+ }
+
+ void MacroAssembler::test_null_free_array_oop(Register oop, Register temp_reg, Label& is_null_free_array) {
+ load_storage_props(temp_reg, oop);
+ andr(temp_reg, temp_reg, ArrayStorageProperties::null_free_value);
+ cbnz(temp_reg, is_null_free_array);
+ }
+
// MacroAssembler protected routines needed to implement
// public methods
void MacroAssembler::mov(Register r, Address dest) {
code_section()->relocate(pc(), dest.rspec());
*** 3681,3699 ****
void MacroAssembler::cmpoop(Register obj1, Register obj2) {
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
bs->obj_equals(this, obj1, obj2);
}
! void MacroAssembler::load_klass(Register dst, Register src) {
if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));
- decode_klass_not_null(dst);
} else {
ldr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
}
}
// ((OopHandle)result).resolve();
void MacroAssembler::resolve_oop_handle(Register result, Register tmp) {
// OopHandle::resolve is an indirection.
access_load_at(T_OBJECT, IN_NATIVE, result, Address(result, 0), tmp, noreg);
}
--- 3726,3753 ----
void MacroAssembler::cmpoop(Register obj1, Register obj2) {
BarrierSetAssembler* bs = BarrierSet::barrier_set()->barrier_set_assembler();
bs->obj_equals(this, obj1, obj2);
}
! void MacroAssembler::load_metadata(Register dst, Register src) {
if (UseCompressedClassPointers) {
ldrw(dst, Address(src, oopDesc::klass_offset_in_bytes()));
} else {
ldr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
}
}
+ void MacroAssembler::load_klass(Register dst, Register src) {
+ load_metadata(dst, src);
+ if (UseCompressedClassPointers) {
+ andr(dst, dst, oopDesc::compressed_klass_mask());
+ decode_klass_not_null(dst);
+ } else {
+ ubfm(dst, dst, 0, 63 - oopDesc::storage_props_nof_bits);
+ }
+ }
+
// ((OopHandle)result).resolve();
void MacroAssembler::resolve_oop_handle(Register result, Register tmp) {
// OopHandle::resolve is an indirection.
access_load_at(T_OBJECT, IN_NATIVE, result, Address(result, 0), tmp, noreg);
}
*** 3705,3714 ****
--- 3759,3777 ----
ldr(dst, Address(dst, ConstantPool::pool_holder_offset_in_bytes()));
ldr(dst, Address(dst, mirror_offset));
resolve_oop_handle(dst, tmp);
}
+ void MacroAssembler::load_storage_props(Register dst, Register src) {
+ load_metadata(dst, src);
+ if (UseCompressedClassPointers) {
+ asrw(dst, dst, oopDesc::narrow_storage_props_shift);
+ } else {
+ asr(dst, dst, oopDesc::wide_storage_props_shift);
+ }
+ }
+
void MacroAssembler::cmp_klass(Register oop, Register trial_klass, Register tmp) {
if (UseCompressedClassPointers) {
ldrw(tmp, Address(oop, oopDesc::klass_offset_in_bytes()));
if (CompressedKlassPointers::base() == NULL) {
cmp(trial_klass, tmp, LSL, CompressedKlassPointers::shift());
*** 4022,4039 ****
}
}
void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators,
Address dst, Register src,
! Register tmp1, Register thread_tmp) {
BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
decorators = AccessInternal::decorator_fixup(decorators);
bool as_raw = (decorators & AS_RAW) != 0;
if (as_raw) {
! bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, thread_tmp);
} else {
! bs->store_at(this, decorators, type, dst, src, tmp1, thread_tmp);
}
}
void MacroAssembler::resolve(DecoratorSet decorators, Register obj) {
// Use stronger ACCESS_WRITE|ACCESS_READ by default.
--- 4085,4102 ----
}
}
void MacroAssembler::access_store_at(BasicType type, DecoratorSet decorators,
Address dst, Register src,
! Register tmp1, Register thread_tmp, Register tmp3) {
BarrierSetAssembler *bs = BarrierSet::barrier_set()->barrier_set_assembler();
decorators = AccessInternal::decorator_fixup(decorators);
bool as_raw = (decorators & AS_RAW) != 0;
if (as_raw) {
! bs->BarrierSetAssembler::store_at(this, decorators, type, dst, src, tmp1, thread_tmp, tmp3);
} else {
! bs->store_at(this, decorators, type, dst, src, tmp1, thread_tmp, tmp3);
}
}
void MacroAssembler::resolve(DecoratorSet decorators, Register obj) {
// Use stronger ACCESS_WRITE|ACCESS_READ by default.
*** 4053,4069 ****
Register thread_tmp, DecoratorSet decorators) {
access_load_at(T_OBJECT, IN_HEAP | IS_NOT_NULL | decorators, dst, src, tmp1, thread_tmp);
}
void MacroAssembler::store_heap_oop(Address dst, Register src, Register tmp1,
! Register thread_tmp, DecoratorSet decorators) {
! access_store_at(T_OBJECT, IN_HEAP | decorators, dst, src, tmp1, thread_tmp);
}
// Used for storing NULLs.
void MacroAssembler::store_heap_oop_null(Address dst) {
! access_store_at(T_OBJECT, IN_HEAP, dst, noreg, noreg, noreg);
}
Address MacroAssembler::allocate_metadata_address(Metadata* obj) {
assert(oop_recorder() != NULL, "this assembler needs a Recorder");
int index = oop_recorder()->allocate_metadata_index(obj);
--- 4116,4132 ----
Register thread_tmp, DecoratorSet decorators) {
access_load_at(T_OBJECT, IN_HEAP | IS_NOT_NULL | decorators, dst, src, tmp1, thread_tmp);
}
void MacroAssembler::store_heap_oop(Address dst, Register src, Register tmp1,
! Register thread_tmp, Register tmp3, DecoratorSet decorators) {
! access_store_at(T_OBJECT, IN_HEAP | decorators, dst, src, tmp1, thread_tmp, tmp3);
}
// Used for storing NULLs.
void MacroAssembler::store_heap_oop_null(Address dst) {
! access_store_at(T_OBJECT, IN_HEAP, dst, noreg, noreg, noreg, noreg);
}
Address MacroAssembler::allocate_metadata_address(Metadata* obj) {
assert(oop_recorder() != NULL, "this assembler needs a Recorder");
int index = oop_recorder()->allocate_metadata_index(obj);
*** 5863,5867 ****
--- 5926,5966 ----
mov(dst, c_rarg0);
}
pop(saved_regs, sp);
}
+
+ // C2 compiled method's prolog code
+ // Moved here from aarch64.ad to support Valhalla code belows
+ void MacroAssembler::verified_entry(Compile* C, int sp_inc) {
+
+ // n.b. frame size includes space for return pc and rfp
+ const long framesize = C->frame_size_in_bytes();
+ assert(framesize % (2 * wordSize) == 0, "must preserve 2 * wordSize alignment");
+
+ // insert a nop at the start of the prolog so we can patch in a
+ // branch if we need to invalidate the method later
+ nop();
+
+ int bangsize = C->bang_size_in_bytes();
+ if (C->need_stack_bang(bangsize) && UseStackBanging)
+ generate_stack_overflow_check(bangsize);
+
+ build_frame(framesize);
+
+ if (NotifySimulator) {
+ notify(Assembler::method_entry);
+ }
+
+ if (VerifyStackAtCalls) {
+ Unimplemented();
+ }
+ }
+
+ void MacroAssembler::unpack_value_args(Compile* C, bool receiver_only) {
+ // Called from MachVEP node
+ unimplemented("Support for ValueTypePassFieldsAsArgs and ValueTypeReturnedAsFields is not implemented");
+ }
+
+ void MacroAssembler::store_value_type_fields_to_buf(ciValueKlass* vk) {
+ super_call_VM_leaf(StubRoutines::store_value_type_fields_to_buf());
+ }
< prev index next >