515 // We choose the unordered semantics by default because we have |
515 // We choose the unordered semantics by default because we have |
516 // adapted the `do_put_xxx' and `do_get_xxx' procedures for the case |
516 // adapted the `do_put_xxx' and `do_get_xxx' procedures for the case |
517 // of volatile fields. |
517 // of volatile fields. |
518 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, |
518 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, |
519 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
519 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
520 bool require_atomic_access = false) { |
520 bool require_atomic_access = false, bool unaligned = false, |
|
521 bool mismatched = false) { |
521 // This version computes alias_index from bottom_type |
522 // This version computes alias_index from bottom_type |
522 return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(), |
523 return make_load(ctl, adr, t, bt, adr->bottom_type()->is_ptr(), |
523 mo, control_dependency, require_atomic_access); |
524 mo, control_dependency, require_atomic_access, |
|
525 unaligned, mismatched); |
524 } |
526 } |
525 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type, |
527 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, const TypePtr* adr_type, |
526 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
528 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
527 bool require_atomic_access = false) { |
529 bool require_atomic_access = false, bool unaligned = false, |
|
530 bool mismatched = false) { |
528 // This version computes alias_index from an address type |
531 // This version computes alias_index from an address type |
529 assert(adr_type != NULL, "use other make_load factory"); |
532 assert(adr_type != NULL, "use other make_load factory"); |
530 return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type), |
533 return make_load(ctl, adr, t, bt, C->get_alias_index(adr_type), |
531 mo, control_dependency, require_atomic_access); |
534 mo, control_dependency, require_atomic_access, |
|
535 unaligned, mismatched); |
532 } |
536 } |
533 // This is the base version which is given an alias index. |
537 // This is the base version which is given an alias index. |
534 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx, |
538 Node* make_load(Node* ctl, Node* adr, const Type* t, BasicType bt, int adr_idx, |
535 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
539 MemNode::MemOrd mo, LoadNode::ControlDependency control_dependency = LoadNode::DependsOnlyOnTest, |
536 bool require_atomic_access = false); |
540 bool require_atomic_access = false, bool unaligned = false, |
|
541 bool mismatched = false); |
537 |
542 |
538 // Create & transform a StoreNode and store the effect into the |
543 // Create & transform a StoreNode and store the effect into the |
539 // parser's memory state. |
544 // parser's memory state. |
540 // |
545 // |
541 // We must ensure that stores of object references will be visible |
546 // We must ensure that stores of object references will be visible |
544 // semantics, if the stored value is an object reference that might |
549 // semantics, if the stored value is an object reference that might |
545 // point to a new object and may become externally visible. |
550 // point to a new object and may become externally visible. |
546 Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, |
551 Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, |
547 const TypePtr* adr_type, |
552 const TypePtr* adr_type, |
548 MemNode::MemOrd mo, |
553 MemNode::MemOrd mo, |
549 bool require_atomic_access = false) { |
554 bool require_atomic_access = false, |
|
555 bool unaligned = false, |
|
556 bool mismatched = false) { |
550 // This version computes alias_index from an address type |
557 // This version computes alias_index from an address type |
551 assert(adr_type != NULL, "use other store_to_memory factory"); |
558 assert(adr_type != NULL, "use other store_to_memory factory"); |
552 return store_to_memory(ctl, adr, val, bt, |
559 return store_to_memory(ctl, adr, val, bt, |
553 C->get_alias_index(adr_type), |
560 C->get_alias_index(adr_type), |
554 mo, require_atomic_access); |
561 mo, require_atomic_access, |
|
562 unaligned, mismatched); |
555 } |
563 } |
556 // This is the base version which is given alias index |
564 // This is the base version which is given alias index |
557 // Return the new StoreXNode |
565 // Return the new StoreXNode |
558 Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, |
566 Node* store_to_memory(Node* ctl, Node* adr, Node* val, BasicType bt, |
559 int adr_idx, |
567 int adr_idx, |
560 MemNode::MemOrd, |
568 MemNode::MemOrd, |
561 bool require_atomic_access = false); |
569 bool require_atomic_access = false, |
|
570 bool unaligned = false, |
|
571 bool mismatched = false); |
562 |
572 |
563 |
573 |
564 // All in one pre-barrier, store, post_barrier |
574 // All in one pre-barrier, store, post_barrier |
565 // Insert a write-barrier'd store. This is to let generational GC |
575 // Insert a write-barrier'd store. This is to let generational GC |
566 // work; we have to flag all oop-stores before the next GC point. |
576 // work; we have to flag all oop-stores before the next GC point. |
610 Node* obj, // containing obj |
621 Node* obj, // containing obj |
611 Node* adr, // actual adress to store val at |
622 Node* adr, // actual adress to store val at |
612 const TypePtr* adr_type, |
623 const TypePtr* adr_type, |
613 Node* val, |
624 Node* val, |
614 BasicType bt, |
625 BasicType bt, |
615 MemNode::MemOrd mo); |
626 MemNode::MemOrd mo, |
|
627 bool mismatched = false); |
616 |
628 |
617 // For the few case where the barriers need special help |
629 // For the few case where the barriers need special help |
618 void pre_barrier(bool do_load, Node* ctl, |
630 void pre_barrier(bool do_load, Node* ctl, |
619 Node* obj, Node* adr, uint adr_idx, Node* val, const TypeOopPtr* val_type, |
631 Node* obj, Node* adr, uint adr_idx, Node* val, const TypeOopPtr* val_type, |
620 Node* pre_val, |
632 Node* pre_val, |