< prev index next >

src/hotspot/cpu/aarch64/gc/shenandoah/shenandoah_aarch64.ad

Print this page
rev 54386 : 8221766: Load-reference barriers for Shenandoah


  28 encode %{
  29   enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, iRegINoSp res) %{
  30     MacroAssembler _masm(&cbuf);
  31     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
  32     Register tmp = $tmp$$Register;
  33     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
  34     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
  35                                                    /*acquire*/ false, /*release*/ true, /*weak*/ false, /*is_cae*/ false, $res$$Register);
  36   %}
  37 
  38   enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, iRegINoSp res) %{
  39     MacroAssembler _masm(&cbuf);
  40     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
  41     Register tmp = $tmp$$Register;
  42     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
  43     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
  44                                                    /*acquire*/ true, /*release*/ true, /*weak*/ false, /*is_cae*/ false, $res$$Register);
  45   %}
  46 %}
  47 
  48 instruct shenandoahRB(iRegPNoSp dst, iRegP src, rFlagsReg cr) %{
  49   match(Set dst (ShenandoahReadBarrier src));
  50   format %{ "shenandoah_rb $dst,$src" %}
  51   ins_encode %{
  52     Register s = $src$$Register;
  53     Register d = $dst$$Register;
  54     __ ldr(d, Address(s, ShenandoahBrooksPointer::byte_offset()));
  55   %}
  56   ins_pipe(pipe_class_memory);
  57 %}
  58 
  59 
  60 instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
  61 
  62   match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
  63   ins_cost(2 * VOLATILE_REF_COST);
  64 
  65   effect(TEMP tmp, KILL cr);
  66 
  67   format %{
  68     "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
  69   %}
  70 
  71   ins_encode(aarch64_enc_cmpxchg_oop_shenandoah(mem, oldval, newval, tmp, res));
  72 
  73   ins_pipe(pipe_slow);
  74 %}
  75 
  76 instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
  77 
  78   match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
  79   ins_cost(2 * VOLATILE_REF_COST);




  28 encode %{
  29   enc_class aarch64_enc_cmpxchg_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, iRegINoSp res) %{
  30     MacroAssembler _masm(&cbuf);
  31     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
  32     Register tmp = $tmp$$Register;
  33     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
  34     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
  35                                                    /*acquire*/ false, /*release*/ true, /*weak*/ false, /*is_cae*/ false, $res$$Register);
  36   %}
  37 
  38   enc_class aarch64_enc_cmpxchg_acq_oop_shenandoah(memory mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, iRegINoSp res) %{
  39     MacroAssembler _masm(&cbuf);
  40     guarantee($mem$$index == -1 && $mem$$disp == 0, "impossible encoding");
  41     Register tmp = $tmp$$Register;
  42     __ mov(tmp, $oldval$$Register); // Must not clobber oldval.
  43     ShenandoahBarrierSet::assembler()->cmpxchg_oop(&_masm, $mem$$Register, tmp, $newval$$Register,
  44                                                    /*acquire*/ true, /*release*/ true, /*weak*/ false, /*is_cae*/ false, $res$$Register);
  45   %}
  46 %}
  47 












  48 instruct compareAndSwapP_shenandoah(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
  49 
  50   match(Set res (ShenandoahCompareAndSwapP mem (Binary oldval newval)));
  51   ins_cost(2 * VOLATILE_REF_COST);
  52 
  53   effect(TEMP tmp, KILL cr);
  54 
  55   format %{
  56     "cmpxchg_shenandoah $mem, $oldval, $newval\t# (ptr) if $mem == $oldval then $mem <-- $newval with temp $tmp"
  57   %}
  58 
  59   ins_encode(aarch64_enc_cmpxchg_oop_shenandoah(mem, oldval, newval, tmp, res));
  60 
  61   ins_pipe(pipe_slow);
  62 %}
  63 
  64 instruct compareAndSwapN_shenandoah(iRegINoSp res, indirect mem, iRegN oldval, iRegN newval, iRegNNoSp tmp, rFlagsReg cr) %{
  65 
  66   match(Set res (ShenandoahCompareAndSwapN mem (Binary oldval newval)));
  67   ins_cost(2 * VOLATILE_REF_COST);


< prev index next >