< prev index next >

src/hotspot/cpu/x86/x86_64.ad

Print this page
@@ -898,11 +898,12 @@
      __ jump(RuntimeAddress(SharedRuntime::get_handle_wrong_method_stub())); // slow path
  
      __ bind(L_skip_barrier);
    }
  
-   __ verified_entry(framesize, C->output()->need_stack_bang(bangsize)?bangsize:0, false, C->stub_function() != NULL);
+   int max_monitors = C->method() != NULL ? C->max_monitors() : 0;
+   __ verified_entry(framesize, C->output()->need_stack_bang(bangsize)?bangsize:0, false, C->stub_function() != NULL, max_monitors);
  
    C->output()->set_frame_complete(cbuf.insts_size());
  
    if (C->has_mach_constant_base_node()) {
      // NOTE: We set the table base offset here because users might be

@@ -996,11 +997,13 @@
    if (do_polling() && C->is_method_compilation()) {
      MacroAssembler _masm(&cbuf);
      Label dummy_label;
      Label* code_stub = &dummy_label;
      if (!C->output()->in_scratch_emit_size()) {
-       code_stub = &C->output()->safepoint_poll_table()->add_safepoint(__ offset());
+       C2SafepointPollStub* stub = new (C->comp_arena()) C2SafepointPollStub(__ offset());
+       C->output()->add_stub(stub);
+       code_stub = &stub->entry();
      }
      __ relocate(relocInfo::poll_return_type);
      __ safepoint_poll(*code_stub, r15_thread, true /* at_return */, true /* in_nmethod */);
    }
  }

@@ -5188,20 +5191,44 @@
  %}
  
  // Load narrow Klass Pointer
  instruct loadNKlass(rRegN dst, memory mem)
  %{
+   predicate(!UseCompactObjectHeaders);
    match(Set dst (LoadNKlass mem));
  
    ins_cost(125); // XXX
    format %{ "movl    $dst, $mem\t# compressed klass ptr" %}
    ins_encode %{
      __ movl($dst$$Register, $mem$$Address);
    %}
    ins_pipe(ialu_reg_mem); // XXX
  %}
  
+ instruct loadNKlassLilliput(rRegN dst, indOffset8 mem, rFlagsReg cr)
+ %{
+   predicate(UseCompactObjectHeaders);
+   match(Set dst (LoadNKlass mem));
+   effect(TEMP_DEF dst, KILL cr);
+   ins_cost(125); // XXX
+   format %{ "movl    $dst, $mem\t# compressed klass ptr" %}
+   ins_encode %{
+     assert($mem$$disp == oopDesc::klass_offset_in_bytes(), "expect correct offset 4, but got: %d", $mem$$disp);
+     assert($mem$$index == 4, "expect no index register: %d", $mem$$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);
+     __ movq(dst, Address(obj, oopDesc::mark_offset_in_bytes()));
+     __ testb(dst, markWord::monitor_value);
+     __ jcc(Assembler::notZero, stub->entry());
+     __ bind(stub->continuation());
+     __ shrq(dst, markWord::klass_shift);
+   %}
+   ins_pipe(pipe_slow); // XXX
+ %}
+ 
  // Load Float
  instruct loadF(regF dst, memory mem)
  %{
    match(Set dst (LoadF mem));
  

@@ -12222,10 +12249,11 @@
    ins_pipe(ialu_cr_reg_imm);
  %}
  
  instruct compN_mem_imm_klass(rFlagsRegU cr, memory mem, immNKlass src)
  %{
+   predicate(!UseCompactObjectHeaders);
    match(Set cr (CmpN src (LoadNKlass mem)));
  
    format %{ "cmpl    $mem, $src\t# compressed klass ptr" %}
    ins_encode %{
      __ cmp_narrow_klass($mem$$Address, (Klass*)$src$$constant);

@@ -12920,11 +12948,11 @@
    effect(TEMP tmp, TEMP scr, TEMP cx1, TEMP cx2, USE_KILL box);
    ins_cost(300);
    format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr,$cx1,$cx2" %}
    ins_encode %{
      __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                  $scr$$Register, $cx1$$Register, $cx2$$Register,
+                  $scr$$Register, $cx1$$Register, $cx2$$Register, r15_thread,
                   _counters, _rtm_counters, _stack_rtm_counters,
                   ((Method*)(ra_->C->method()->constant_encoding()))->method_data(),
                   true, ra_->C->profile_rtm());
    %}
    ins_pipe(pipe_slow);

@@ -12936,11 +12964,11 @@
    effect(TEMP tmp, TEMP scr, TEMP cx1, USE_KILL box);
    ins_cost(300);
    format %{ "fastlock $object,$box\t! kills $box,$tmp,$scr" %}
    ins_encode %{
      __ fast_lock($object$$Register, $box$$Register, $tmp$$Register,
-                  $scr$$Register, $cx1$$Register, noreg, _counters, NULL, NULL, NULL, false, false);
+                  $scr$$Register, $cx1$$Register, noreg, r15_thread, NULL, NULL, NULL, NULL, false, false);
    %}
    ins_pipe(pipe_slow);
  %}
  
  instruct cmpFastUnlock(rFlagsReg cr, rRegP object, rax_RegP box, rRegP tmp) %{
< prev index next >