< prev index next >

src/hotspot/share/gc/shenandoah/c1/shenandoahBarrierSetC1.hpp

Print this page
rev 55751 : 8228369: Shenandoah: Refactor LRB C1 stubs


  73       else
  74         visitor->do_slow_case();
  75 
  76       visitor->do_input(_addr);
  77       visitor->do_temp(_pre_val);
  78     } else {
  79       visitor->do_slow_case();
  80       visitor->do_input(_pre_val);
  81     }
  82   }
  83 #ifndef PRODUCT
  84   virtual void print_name(outputStream* out) const { out->print("ShenandoahPreBarrierStub"); }
  85 #endif // PRODUCT
  86 };
  87 
  88 class ShenandoahLoadReferenceBarrierStub: public CodeStub {
  89   friend class ShenandoahBarrierSetC1;
  90 private:
  91   LIR_Opr _obj;
  92   LIR_Opr _result;


  93 
  94 public:
  95   ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result) :
  96     _obj(obj), _result(result)
  97   {
  98     assert(_obj->is_register(), "should be register");
  99     assert(_result->is_register(), "should be register");


 100   }
 101 
 102   LIR_Opr obj() const { return _obj; }
 103   LIR_Opr result() const { return _result; }


 104 
 105   virtual void emit_code(LIR_Assembler* e);
 106   virtual void visit(LIR_OpVisitState* visitor) {
 107     visitor->do_slow_case();
 108     visitor->do_input(_obj);
 109     visitor->do_temp(_result);


 110   }
 111 #ifndef PRODUCT
 112   virtual void print_name(outputStream* out) const { out->print("ShenandoahLoadReferenceBarrierStub"); }
 113 #endif // PRODUCT
 114 };
 115 
 116 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
 117  friend class LIR_OpVisitState;
 118 
 119 private:
 120   LIR_Opr _addr;
 121   LIR_Opr _cmp_value;
 122   LIR_Opr _new_value;
 123   LIR_Opr _tmp1;
 124   LIR_Opr _tmp2;
 125 
 126 public:
 127   LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
 128                                  LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
 129     : LIR_Op(lir_none, result, NULL)  // no info


 157 
 158   virtual void emit_code(LIR_Assembler* masm);
 159 
 160   virtual void print_instr(outputStream* out) const {
 161     addr()->print(out);      out->print(" ");
 162     cmp_value()->print(out); out->print(" ");
 163     new_value()->print(out); out->print(" ");
 164     tmp1()->print(out);      out->print(" ");
 165     tmp2()->print(out);      out->print(" ");
 166   }
 167 #ifndef PRODUCT
 168   virtual const char* name() const {
 169     return "shenandoah_cas_obj";
 170   }
 171 #endif // PRODUCT
 172 };
 173 
 174 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
 175 private:
 176   CodeBlob* _pre_barrier_c1_runtime_code_blob;

 177 
 178   void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
 179 
 180   LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj);
 181   LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
 182 
 183   LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj);
 184 
 185   LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
 186 
 187 public:
 188   CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }

 189 
 190 protected:
 191 
 192   virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
 193   virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
 194 
 195   virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
 196 
 197   virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
 198 
 199 public:
 200 
 201   virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
 202   virtual const char* rtcall_name_for_address(address entry);
 203 };
 204 
 205 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP


  73       else
  74         visitor->do_slow_case();
  75 
  76       visitor->do_input(_addr);
  77       visitor->do_temp(_pre_val);
  78     } else {
  79       visitor->do_slow_case();
  80       visitor->do_input(_pre_val);
  81     }
  82   }
  83 #ifndef PRODUCT
  84   virtual void print_name(outputStream* out) const { out->print("ShenandoahPreBarrierStub"); }
  85 #endif // PRODUCT
  86 };
  87 
  88 class ShenandoahLoadReferenceBarrierStub: public CodeStub {
  89   friend class ShenandoahBarrierSetC1;
  90 private:
  91   LIR_Opr _obj;
  92   LIR_Opr _result;
  93   LIR_Opr _tmp1;
  94   LIR_Opr _tmp2;
  95 
  96 public:
  97   ShenandoahLoadReferenceBarrierStub(LIR_Opr obj, LIR_Opr result, LIR_Opr tmp1, LIR_Opr tmp2) :
  98     _obj(obj), _result(result), _tmp1(tmp1), _tmp2(tmp2)
  99   {
 100     assert(_obj->is_register(), "should be register");
 101     assert(_result->is_register(), "should be register");
 102     assert(_tmp1->is_register(), "should be register");
 103     assert(_tmp2->is_register(), "should be register");
 104   }
 105 
 106   LIR_Opr obj() const { return _obj; }
 107   LIR_Opr result() const { return _result; }
 108   LIR_Opr tmp1() const { return _tmp1; }
 109   LIR_Opr tmp2() const { return _tmp2; }
 110 
 111   virtual void emit_code(LIR_Assembler* e);
 112   virtual void visit(LIR_OpVisitState* visitor) {
 113     visitor->do_slow_case();
 114     visitor->do_input(_obj);
 115     visitor->do_temp(_result);
 116     visitor->do_temp(_tmp1);
 117     visitor->do_temp(_tmp2);
 118   }
 119 #ifndef PRODUCT
 120   virtual void print_name(outputStream* out) const { out->print("ShenandoahLoadReferenceBarrierStub"); }
 121 #endif // PRODUCT
 122 };
 123 
 124 class LIR_OpShenandoahCompareAndSwap : public LIR_Op {
 125  friend class LIR_OpVisitState;
 126 
 127 private:
 128   LIR_Opr _addr;
 129   LIR_Opr _cmp_value;
 130   LIR_Opr _new_value;
 131   LIR_Opr _tmp1;
 132   LIR_Opr _tmp2;
 133 
 134 public:
 135   LIR_OpShenandoahCompareAndSwap(LIR_Opr addr, LIR_Opr cmp_value, LIR_Opr new_value,
 136                                  LIR_Opr t1, LIR_Opr t2, LIR_Opr result)
 137     : LIR_Op(lir_none, result, NULL)  // no info


 165 
 166   virtual void emit_code(LIR_Assembler* masm);
 167 
 168   virtual void print_instr(outputStream* out) const {
 169     addr()->print(out);      out->print(" ");
 170     cmp_value()->print(out); out->print(" ");
 171     new_value()->print(out); out->print(" ");
 172     tmp1()->print(out);      out->print(" ");
 173     tmp2()->print(out);      out->print(" ");
 174   }
 175 #ifndef PRODUCT
 176   virtual const char* name() const {
 177     return "shenandoah_cas_obj";
 178   }
 179 #endif // PRODUCT
 180 };
 181 
 182 class ShenandoahBarrierSetC1 : public BarrierSetC1 {
 183 private:
 184   CodeBlob* _pre_barrier_c1_runtime_code_blob;
 185   CodeBlob* _load_reference_barrier_rt_code_blob;
 186 
 187   void pre_barrier(LIRGenerator* gen, CodeEmitInfo* info, DecoratorSet decorators, LIR_Opr addr_opr, LIR_Opr pre_val);
 188 
 189   LIR_Opr load_reference_barrier(LIRGenerator* gen, LIR_Opr obj);
 190   LIR_Opr storeval_barrier(LIRGenerator* gen, LIR_Opr obj, CodeEmitInfo* info, DecoratorSet decorators);
 191 
 192   LIR_Opr load_reference_barrier_impl(LIRGenerator* gen, LIR_Opr obj);
 193 
 194   LIR_Opr ensure_in_register(LIRGenerator* gen, LIR_Opr obj);
 195 
 196 public:
 197   CodeBlob* pre_barrier_c1_runtime_code_blob() { return _pre_barrier_c1_runtime_code_blob; }
 198   CodeBlob* load_reference_barrier_rt_code_blob() { return _load_reference_barrier_rt_code_blob; }
 199 
 200 protected:
 201 
 202   virtual void store_at_resolved(LIRAccess& access, LIR_Opr value);
 203   virtual void load_at_resolved(LIRAccess& access, LIR_Opr result);
 204 
 205   virtual LIR_Opr atomic_cmpxchg_at_resolved(LIRAccess& access, LIRItem& cmp_value, LIRItem& new_value);
 206 
 207   virtual LIR_Opr atomic_xchg_at_resolved(LIRAccess& access, LIRItem& value);
 208 
 209 public:
 210 
 211   virtual void generate_c1_runtime_stubs(BufferBlob* buffer_blob);
 212   virtual const char* rtcall_name_for_address(address entry);
 213 };
 214 
 215 #endif // SHARE_GC_SHENANDOAH_C1_SHENANDOAHBARRIERSETC1_HPP
< prev index next >