6647 Register s = $src$$Register;
6648 __ movptr(d, Address(r12, s, Address::times_1, BrooksPointer::byte_offset()));
6649 %}
6650 ins_pipe(ialu_reg_mem);
6651 %}
6652
6653 instruct shenandoahRBNarrowShift(rRegP dst, rRegN src) %{
6654 predicate(UseCompressedOops && (Universe::narrow_oop_shift() == Address::times_8));
6655 match(Set dst (ShenandoahReadBarrier (DecodeN src)));
6656 effect(DEF dst, USE src);
6657 ins_cost(125); // XXX
6658 format %{ "shenandoah_rb $dst, $src" %}
6659 ins_encode %{
6660 Register d = $dst$$Register;
6661 Register s = $src$$Register;
6662 __ movptr(d, Address(r12, s, Address::times_8, BrooksPointer::byte_offset()));
6663 %}
6664 ins_pipe(ialu_reg_mem);
6665 %}
6666
6667 instruct shenandoahWB(rRegP dst, rRegP src, rFlagsReg cr) %{
6668 match(Set dst (ShenandoahWriteBarrier src));
6669 effect(DEF dst, USE src, KILL cr);
6670 ins_cost(300); // XXX
6671 format %{ "shenandoah_wb $dst,$src" %}
6672 ins_encode %{
6673 #if INCLUDE_SHENANDOAHGC
6674 Register s = $src$$Register;
6675 Register d = $dst$$Register;
6676 // We need that first read barrier in order to trigger a SEGV/NPE on incoming NULL.
6677 // Also, it brings s into d in preparation for the call to shenandoah_write_barrier().
6678 __ movptr(d, Address(s, BrooksPointer::byte_offset()));
6679 __ shenandoah_write_barrier(d);
6680 #else
6681 ShouldNotReachHere();
6682 #endif
6683 %}
6684 ins_pipe(pipe_slow);
6685 %}
6686
6687 // Convert oop pointer into compressed form
6688 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
6689 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
6690 match(Set dst (EncodeP src));
6691 effect(KILL cr);
6692 format %{ "encode_heap_oop $dst,$src" %}
6693 ins_encode %{
6694 Register s = $src$$Register;
6695 Register d = $dst$$Register;
6696 if (s != d) {
6697 __ movq(d, s);
6698 }
6699 __ encode_heap_oop(d);
6700 %}
6701 ins_pipe(ialu_reg_long);
6702 %}
6703
6704 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
6705 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
6706 match(Set dst (EncodeP src));
|
6647 Register s = $src$$Register;
6648 __ movptr(d, Address(r12, s, Address::times_1, BrooksPointer::byte_offset()));
6649 %}
6650 ins_pipe(ialu_reg_mem);
6651 %}
6652
6653 instruct shenandoahRBNarrowShift(rRegP dst, rRegN src) %{
6654 predicate(UseCompressedOops && (Universe::narrow_oop_shift() == Address::times_8));
6655 match(Set dst (ShenandoahReadBarrier (DecodeN src)));
6656 effect(DEF dst, USE src);
6657 ins_cost(125); // XXX
6658 format %{ "shenandoah_rb $dst, $src" %}
6659 ins_encode %{
6660 Register d = $dst$$Register;
6661 Register s = $src$$Register;
6662 __ movptr(d, Address(r12, s, Address::times_8, BrooksPointer::byte_offset()));
6663 %}
6664 ins_pipe(ialu_reg_mem);
6665 %}
6666
6667 // Convert oop pointer into compressed form
6668 instruct encodeHeapOop(rRegN dst, rRegP src, rFlagsReg cr) %{
6669 predicate(n->bottom_type()->make_ptr()->ptr() != TypePtr::NotNull);
6670 match(Set dst (EncodeP src));
6671 effect(KILL cr);
6672 format %{ "encode_heap_oop $dst,$src" %}
6673 ins_encode %{
6674 Register s = $src$$Register;
6675 Register d = $dst$$Register;
6676 if (s != d) {
6677 __ movq(d, s);
6678 }
6679 __ encode_heap_oop(d);
6680 %}
6681 ins_pipe(ialu_reg_long);
6682 %}
6683
6684 instruct encodeHeapOop_not_null(rRegN dst, rRegP src, rFlagsReg cr) %{
6685 predicate(n->bottom_type()->make_ptr()->ptr() == TypePtr::NotNull);
6686 match(Set dst (EncodeP src));
|