< 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 >