801 } else {
802 ShouldNotReachHere();
803 }
804
805 }
806
807
808 void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool /* unaligned */) {
809 LIR_Address* to_addr = dest->as_address_ptr();
810 PatchingStub* patch = NULL;
811 Register compressed_src = rscratch1;
812
813 if (patch_code != lir_patch_none) {
814 deoptimize_trap(info);
815 return;
816 }
817
818 if (type == T_ARRAY || type == T_OBJECT) {
819 __ verify_oop(src->as_register());
820
821 if (UseCompressedOops && !wide) {
822 __ encode_heap_oop(compressed_src, src->as_register());
823 } else {
824 compressed_src = src->as_register();
825 }
826 }
827
828 int null_check_here = code_offset();
829 switch (type) {
830 case T_FLOAT: {
831 __ strs(src->as_float_reg(), as_Address(to_addr));
832 break;
833 }
834
835 case T_DOUBLE: {
836 __ strd(src->as_double_reg(), as_Address(to_addr));
837 break;
838 }
839
840 case T_ARRAY: // fall through
841 case T_OBJECT: // fall through
842 if (UseCompressedOops && !wide) {
843 __ strw(compressed_src, as_Address(to_addr, rscratch2));
844 } else {
845 __ shenandoah_store_check(compressed_src, as_Address(to_addr));
846 __ str(compressed_src, as_Address(to_addr));
847 }
848 break;
849 case T_METADATA:
850 // We get here to store a method pointer to the stack to pass to
851 // a dtrace runtime call. This can't work on 64 bit with
852 // compressed klass ptrs: T_METADATA can be a compressed klass
853 // ptr or a 64 bit method pointer.
854 ShouldNotReachHere();
855 __ str(src->as_register(), as_Address(to_addr));
856 break;
857 case T_ADDRESS:
858 __ str(src->as_register(), as_Address(to_addr));
859 break;
860 case T_INT:
861 __ strw(src->as_register(), as_Address(to_addr));
862 break;
863
864 case T_LONG: {
865 __ str(src->as_register_lo(), as_Address_lo(to_addr));
|
801 } else {
802 ShouldNotReachHere();
803 }
804
805 }
806
807
808 void LIR_Assembler::reg2mem(LIR_Opr src, LIR_Opr dest, BasicType type, LIR_PatchCode patch_code, CodeEmitInfo* info, bool pop_fpu_stack, bool wide, bool /* unaligned */) {
809 LIR_Address* to_addr = dest->as_address_ptr();
810 PatchingStub* patch = NULL;
811 Register compressed_src = rscratch1;
812
813 if (patch_code != lir_patch_none) {
814 deoptimize_trap(info);
815 return;
816 }
817
818 if (type == T_ARRAY || type == T_OBJECT) {
819 __ verify_oop(src->as_register());
820
821 __ shenandoah_store_check(as_Address(to_addr), src->as_register());
822
823 if (UseCompressedOops && !wide) {
824 __ encode_heap_oop(compressed_src, src->as_register());
825 } else {
826 compressed_src = src->as_register();
827 }
828 } else {
829 __ shenandoah_store_addr_check(to_addr->base()->as_pointer_register());
830 }
831
832 int null_check_here = code_offset();
833 switch (type) {
834 case T_FLOAT: {
835 __ strs(src->as_float_reg(), as_Address(to_addr));
836 break;
837 }
838
839 case T_DOUBLE: {
840 __ strd(src->as_double_reg(), as_Address(to_addr));
841 break;
842 }
843
844 case T_ARRAY: // fall through
845 case T_OBJECT: // fall through
846 if (UseCompressedOops && !wide) {
847 __ strw(compressed_src, as_Address(to_addr, rscratch2));
848 } else {
849 __ str(compressed_src, as_Address(to_addr));
850 }
851 break;
852 case T_METADATA:
853 // We get here to store a method pointer to the stack to pass to
854 // a dtrace runtime call. This can't work on 64 bit with
855 // compressed klass ptrs: T_METADATA can be a compressed klass
856 // ptr or a 64 bit method pointer.
857 ShouldNotReachHere();
858 __ str(src->as_register(), as_Address(to_addr));
859 break;
860 case T_ADDRESS:
861 __ str(src->as_register(), as_Address(to_addr));
862 break;
863 case T_INT:
864 __ strw(src->as_register(), as_Address(to_addr));
865 break;
866
867 case T_LONG: {
868 __ str(src->as_register_lo(), as_Address_lo(to_addr));
|