775 |
775 |
776 #ifdef _LP64 |
776 #ifdef _LP64 |
777 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
777 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
778 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
778 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
779 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
779 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
780 load_store = kit->gvn().transform(new ShenandoahCompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo)); |
780 if (ShenandoahCASBarrier) { |
|
781 load_store = kit->gvn().transform(new ShenandoahCompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo)); |
|
782 } else { |
|
783 load_store = kit->gvn().transform(new CompareAndExchangeNNode(kit->control(), mem, adr, newval_enc, oldval_enc, adr_type, value_type->make_narrowoop(), mo)); |
|
784 } |
781 } else |
785 } else |
782 #endif |
786 #endif |
783 { |
787 { |
784 load_store = kit->gvn().transform(new ShenandoahCompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo)); |
788 if (ShenandoahCASBarrier) { |
|
789 load_store = kit->gvn().transform(new ShenandoahCompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo)); |
|
790 } else { |
|
791 load_store = kit->gvn().transform(new CompareAndExchangePNode(kit->control(), mem, adr, new_val, expected_val, adr_type, value_type->is_oopptr(), mo)); |
|
792 } |
785 } |
793 } |
786 |
794 |
787 access.set_raw_access(load_store); |
795 access.set_raw_access(load_store); |
788 pin_atomic_op(access); |
796 pin_atomic_op(access); |
789 |
797 |
813 Node* adr = access.addr().node(); |
821 Node* adr = access.addr().node(); |
814 #ifdef _LP64 |
822 #ifdef _LP64 |
815 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
823 if (adr->bottom_type()->is_ptr_to_narrowoop()) { |
816 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
824 Node *newval_enc = kit->gvn().transform(new EncodePNode(new_val, new_val->bottom_type()->make_narrowoop())); |
817 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
825 Node *oldval_enc = kit->gvn().transform(new EncodePNode(expected_val, expected_val->bottom_type()->make_narrowoop())); |
818 if (is_weak_cas) { |
826 if (ShenandoahCASBarrier) { |
819 load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
827 if (is_weak_cas) { |
|
828 load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
|
829 } else { |
|
830 load_store = kit->gvn().transform(new ShenandoahCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
|
831 } |
820 } else { |
832 } else { |
821 load_store = kit->gvn().transform(new ShenandoahCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
833 if (is_weak_cas) { |
|
834 load_store = kit->gvn().transform(new WeakCompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
|
835 } else { |
|
836 load_store = kit->gvn().transform(new CompareAndSwapNNode(kit->control(), mem, adr, newval_enc, oldval_enc, mo)); |
|
837 } |
822 } |
838 } |
823 } else |
839 } else |
824 #endif |
840 #endif |
825 { |
841 { |
826 if (is_weak_cas) { |
842 if (ShenandoahCASBarrier) { |
827 load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
843 if (is_weak_cas) { |
|
844 load_store = kit->gvn().transform(new ShenandoahWeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
|
845 } else { |
|
846 load_store = kit->gvn().transform(new ShenandoahCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
|
847 } |
828 } else { |
848 } else { |
829 load_store = kit->gvn().transform(new ShenandoahCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
849 if (is_weak_cas) { |
|
850 load_store = kit->gvn().transform(new WeakCompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
|
851 } else { |
|
852 load_store = kit->gvn().transform(new CompareAndSwapPNode(kit->control(), mem, adr, new_val, expected_val, mo)); |
|
853 } |
830 } |
854 } |
831 } |
855 } |
832 access.set_raw_access(load_store); |
856 access.set_raw_access(load_store); |
833 pin_atomic_op(access); |
857 pin_atomic_op(access); |
834 return load_store; |
858 return load_store; |