< prev index next >

src/hotspot/cpu/aarch64/aarch64.ad

Print this page
@@ -7325,20 +7325,46 @@
  
  // Load Narrow Klass Pointer
  instruct loadNKlass(iRegNNoSp dst, memory4 mem)
  %{
    match(Set dst (LoadNKlass mem));
-   predicate(!needs_acquiring_load(n));
+   predicate(!needs_acquiring_load(n) && !UseCompactObjectHeaders);
  
    ins_cost(4 * INSN_COST);
    format %{ "ldrw  $dst, $mem\t# compressed class ptr" %}
  
    ins_encode(aarch64_enc_ldrw(dst, mem));
  
    ins_pipe(iload_reg_mem);
  %}
  
+ instruct loadNKlassLilliput(iRegNNoSp dst, memory4 mem, rFlagsReg cr)
+ %{
+   match(Set dst (LoadNKlass mem));
+   effect(KILL cr);
+   predicate(!needs_acquiring_load(n) && UseCompactObjectHeaders);
+ 
+   ins_cost(4 * INSN_COST);
+   format %{ "ldrw  $dst, $mem\t# compressed class ptr" %}
+   ins_encode %{
+     assert($mem$$disp == oopDesc::klass_offset_in_bytes(), "expect correct offset");
+     assert($mem$$index$$Register == noreg, "expect no index");
+     Register dst = $dst$$Register;
+     Register obj = $mem$$base$$Register;
+     C2LoadNKlassStub* stub = new (Compile::current()->comp_arena()) C2LoadNKlassStub(dst);
+     Compile::current()->output()->add_stub(stub);
+     __ ldr(dst, Address(obj, oopDesc::mark_offset_in_bytes()));
+     // NOTE: We can't use tbnz here, because the target is sometimes too far away
+     // and cannot be encoded.
+     __ tst(dst, markWord::monitor_value);
+     __ br(Assembler::NE, stub->entry());
+     __ bind(stub->continuation());
+     __ lsr(dst, dst, markWord::klass_shift);
+   %}
+   ins_pipe(pipe_slow);
+ %}
+ 
  // Load Float
  instruct loadF(vRegF dst, memory4 mem)
  %{
    match(Set dst (LoadF mem));
    predicate(!needs_acquiring_load(n));
< prev index next >