518 ArrayCopyStub(LIR_OpArrayCopy* op): _op(op) { }
519
520 LIR_Opr src() const { return _op->src(); }
521 LIR_Opr src_pos() const { return _op->src_pos(); }
522 LIR_Opr dst() const { return _op->dst(); }
523 LIR_Opr dst_pos() const { return _op->dst_pos(); }
524 LIR_Opr length() const { return _op->length(); }
525 LIR_Opr tmp() const { return _op->tmp(); }
526
527 virtual void emit_code(LIR_Assembler* e);
528 virtual CodeEmitInfo* info() const { return _op->info(); }
529 virtual void visit(LIR_OpVisitState* visitor) {
530 // don't pass in the code emit info since it's processed in the fast path
531 visitor->do_slow_case();
532 }
533 #ifndef PRODUCT
534 virtual void print_name(outputStream* out) const { out->print("ArrayCopyStub"); }
535 #endif // PRODUCT
536 };
537
538 //////////////////////////////////////////////////////////////////////////////////////////
539 #if INCLUDE_ALL_GCS
540
541 // Code stubs for Garbage-First barriers.
542 class G1PreBarrierStub: public CodeStub {
543 private:
544 bool _do_load;
545 LIR_Opr _addr;
546 LIR_Opr _pre_val;
547 LIR_PatchCode _patch_code;
548 CodeEmitInfo* _info;
549
550 public:
551 // Version that _does_ generate a load of the previous value from addr.
552 // addr (the address of the field to be read) must be a LIR_Address
553 // pre_val (a temporary register) must be a register;
554 G1PreBarrierStub(LIR_Opr addr, LIR_Opr pre_val, LIR_PatchCode patch_code, CodeEmitInfo* info) :
555 _addr(addr), _pre_val(pre_val), _do_load(true),
556 _patch_code(patch_code), _info(info)
557 {
|
518 ArrayCopyStub(LIR_OpArrayCopy* op): _op(op) { }
519
520 LIR_Opr src() const { return _op->src(); }
521 LIR_Opr src_pos() const { return _op->src_pos(); }
522 LIR_Opr dst() const { return _op->dst(); }
523 LIR_Opr dst_pos() const { return _op->dst_pos(); }
524 LIR_Opr length() const { return _op->length(); }
525 LIR_Opr tmp() const { return _op->tmp(); }
526
527 virtual void emit_code(LIR_Assembler* e);
528 virtual CodeEmitInfo* info() const { return _op->info(); }
529 virtual void visit(LIR_OpVisitState* visitor) {
530 // don't pass in the code emit info since it's processed in the fast path
531 visitor->do_slow_case();
532 }
533 #ifndef PRODUCT
534 virtual void print_name(outputStream* out) const { out->print("ArrayCopyStub"); }
535 #endif // PRODUCT
536 };
537
538 class C1ThreadLocalSafepoint: public CodeStub {
539 private:
540 address _safepoint_pc;
541 bool _is_return;
542
543 public:
544 C1ThreadLocalSafepoint(bool is_return) : _is_return(is_return) { }
545
546 bool is_return() { return _is_return; }
547
548 address safepoint_pc() { return _safepoint_pc; }
549 void set_safepoint_pc(address pc) { _safepoint_pc = pc; }
550
551 virtual void emit_code(LIR_Assembler* e);
552 virtual void visit(LIR_OpVisitState* visitor) {
553 // don't pass in the code emit info since it's processed in the fast path
554 visitor->do_slow_case();
555 }
556 #ifndef PRODUCT
557 virtual void print_name(outputStream* out) const { out->print("C1ThreadLocalSafepoint"); }
558 #endif // PRODUCT
559 };
560
561 //////////////////////////////////////////////////////////////////////////////////////////
562 #if INCLUDE_ALL_GCS
563
564 // Code stubs for Garbage-First barriers.
565 class G1PreBarrierStub: public CodeStub {
566 private:
567 bool _do_load;
568 LIR_Opr _addr;
569 LIR_Opr _pre_val;
570 LIR_PatchCode _patch_code;
571 CodeEmitInfo* _info;
572
573 public:
574 // Version that _does_ generate a load of the previous value from addr.
575 // addr (the address of the field to be read) must be a LIR_Address
576 // pre_val (a temporary register) must be a register;
577 G1PreBarrierStub(LIR_Opr addr, LIR_Opr pre_val, LIR_PatchCode patch_code, CodeEmitInfo* info) :
578 _addr(addr), _pre_val(pre_val), _do_load(true),
579 _patch_code(patch_code), _info(info)
580 {
|