Print this page
rev 2161 : [mq]: initial-intrinsification-changes
rev 2162 : [mq]: code-review-comments-vladimir
rev 2163 : [mq]: client_assertion_fauilure
rev 2164 : [mq]: code-review-comments-tom

Split Close
Expand all
Collapse all
          --- old/src/share/vm/c1/c1_CodeStubs.hpp
          +++ new/src/share/vm/c1/c1_CodeStubs.hpp
↓ open down ↓ 511 lines elided ↑ open up ↑
 512  512    virtual void print_name(outputStream* out) const { out->print("ArrayCopyStub"); }
 513  513  #endif // PRODUCT
 514  514  };
 515  515  
 516  516  //////////////////////////////////////////////////////////////////////////////////////////
 517  517  #ifndef SERIALGC
 518  518  
 519  519  // Code stubs for Garbage-First barriers.
 520  520  class G1PreBarrierStub: public CodeStub {
 521  521   private:
      522 +  bool _do_load;
 522  523    LIR_Opr _addr;
 523  524    LIR_Opr _pre_val;
 524  525    LIR_PatchCode _patch_code;
 525  526    CodeEmitInfo* _info;
 526  527  
 527  528   public:
 528      -  // pre_val (a temporary register) must be a register;
      529 + 
      530 +  // Version that _does_ generate a load of the previous value from addr.
 529  531    // addr (the address of the field to be read) must be a LIR_Address
      532 +  // pre_val (a temporary register) must be a register;
 530  533    G1PreBarrierStub(LIR_Opr addr, LIR_Opr pre_val, LIR_PatchCode patch_code, CodeEmitInfo* info) :
 531      -    _addr(addr), _pre_val(pre_val), _patch_code(patch_code), _info(info)
      534 +    _addr(addr), _pre_val(pre_val), _do_load(true),
      535 +    _patch_code(patch_code), _info(info)
 532  536    {
 533  537      assert(_pre_val->is_register(), "should be temporary register");
 534  538      assert(_addr->is_address(), "should be the address of the field");
 535  539    }
 536  540  
      541 +  // Version that _does not_ generate load of the previous value; the
      542 +  // previous value is assumed to have already been loaded into pre_val.
      543 +  G1PreBarrierStub(LIR_Opr pre_val) :
      544 +    _addr(LIR_OprFact::illegalOpr), _pre_val(pre_val), _do_load(false),
      545 +    _patch_code(lir_patch_none), _info(NULL)
      546 +  {
      547 +    assert(_pre_val->is_register(), "should be a register");
      548 +  }
      549 +
 537  550    LIR_Opr addr() const { return _addr; }
 538  551    LIR_Opr pre_val() const { return _pre_val; }
 539  552    LIR_PatchCode patch_code() const { return _patch_code; }
 540  553    CodeEmitInfo* info() const { return _info; }
      554 +  bool do_load() const { return _do_load; }
 541  555  
 542  556    virtual void emit_code(LIR_Assembler* e);
 543  557    virtual void visit(LIR_OpVisitState* visitor) {
 544      -    // don't pass in the code emit info since it's processed in the fast
 545      -    // path
 546      -    if (_info != NULL)
 547      -      visitor->do_slow_case(_info);
 548      -    else
      558 +    if (_do_load) {
      559 +      // don't pass in the code emit info since it's processed in the fast
      560 +      // path
      561 +      if (_info != NULL)
      562 +        visitor->do_slow_case(_info);
      563 +      else
      564 +        visitor->do_slow_case();
      565 +
      566 +      visitor->do_input(_addr);
      567 +      visitor->do_temp(_pre_val);
      568 +    } else {
 549  569        visitor->do_slow_case();
 550      -    visitor->do_input(_addr);
 551      -    visitor->do_temp(_pre_val);
      570 +      visitor->do_input(_pre_val);
      571 +    }
 552  572    }
 553  573  #ifndef PRODUCT
 554  574    virtual void print_name(outputStream* out) const { out->print("G1PreBarrierStub"); }
 555  575  #endif // PRODUCT
 556  576  };
 557  577  
 558  578  class G1PostBarrierStub: public CodeStub {
 559  579   private:
 560  580    LIR_Opr _addr;
 561  581    LIR_Opr _new_val;
↓ open down ↓ 33 lines elided ↑ open up ↑
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX