< prev index next >
src/hotspot/cpu/x86/macroAssembler_x86.cpp
Print this page
@@ -3452,23 +3452,21 @@
andl(temp_reg, 0x1);
testl(temp_reg, temp_reg);
jcc(Assembler::notZero, is_flattened);
}
-void MacroAssembler::test_flat_array_klass(Register klass, Register temp_reg,
- Label& is_flat_array) {
- movl(temp_reg, Address(klass, Klass::layout_helper_offset()));
- sarl(temp_reg, Klass::_lh_array_tag_shift);
- cmpl(temp_reg, Klass::_lh_array_tag_vt_value);
- jcc(Assembler::equal, is_flat_array);
+void MacroAssembler::test_flattened_array_oop(Register oop, Register temp_reg,
+ Label&is_flattened_array) {
+ load_storage_props(temp_reg, oop);
+ testb(temp_reg, ArrayStorageProperties::flattened_value);
+ jcc(Assembler::notZero, is_flattened_array);
}
-
-void MacroAssembler::test_flat_array_oop(Register oop, Register temp_reg,
- Label& is_flat_array) {
- load_klass(temp_reg, oop);
- test_flat_array_klass(temp_reg, temp_reg, is_flat_array);
+void MacroAssembler::test_null_free_array_oop(Register oop, Register temp_reg, Label&is_null_free_array) {
+ load_storage_props(temp_reg, oop);
+ testb(temp_reg, ArrayStorageProperties::null_free_value);
+ jcc(Assembler::notZero, is_null_free_array);
}
void MacroAssembler::os_breakpoint() {
// instead of directly emitting a breakpoint, call os:breakpoint for better debugability
// (e.g., MSVC can't call ps() otherwise)
@@ -5086,18 +5084,43 @@
movptr(mirror, Address(mirror, ConstantPool::pool_holder_offset_in_bytes()));
movptr(mirror, Address(mirror, mirror_offset));
resolve_oop_handle(mirror, tmp);
}
+void MacroAssembler::load_metadata(Register dst, Register src) {
+ if (UseCompressedClassPointers) {
+ movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
+ } else {
+ movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
+ }
+}
+
+void MacroAssembler::load_storage_props(Register dst, Register src) {
+ load_metadata(dst, src);
+ if (UseCompressedClassPointers) {
+ shrl(dst, oopDesc::narrow_storage_props_shift);
+ } else {
+ shrq(dst, oopDesc::wide_storage_props_shift);
+ }
+}
+
void MacroAssembler::load_klass(Register dst, Register src) {
+ load_metadata(dst, src);
#ifdef _LP64
if (UseCompressedClassPointers) {
- movl(dst, Address(src, oopDesc::klass_offset_in_bytes()));
+ andl(dst, oopDesc::compressed_klass_mask());
decode_klass_not_null(dst);
} else
#endif
- movptr(dst, Address(src, oopDesc::klass_offset_in_bytes()));
+ {
+#ifdef _LP64
+ shlq(dst, oopDesc::storage_props_nof_bits);
+ shrq(dst, oopDesc::storage_props_nof_bits);
+#else
+ andl(dst, oopDesc::wide_klass_mask());
+#endif
+ }
}
void MacroAssembler::load_prototype_header(Register dst, Register src) {
load_klass(dst, src);
movptr(dst, Address(dst, Klass::prototype_header_offset()));
< prev index next >