< prev index next >

src/cpu/aarch64/vm/c1_LIRAssembler_aarch64.cpp

Print this page
rev 12152 : [mq]: verification.patch


 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));


< prev index next >