< prev index next >

src/hotspot/cpu/aarch64/c1_Runtime1_aarch64.cpp

Print this page
rev 50637 : [mq]: JDK-8205336.patch
rev 50638 : [mq]: JDK-8205336-01.patch


 704 
 705 #ifdef ASSERT
 706           // assert object can be fast path allocated
 707           {
 708             Label ok, not_ok;
 709             __ ldrw(obj_size, Address(klass, Klass::layout_helper_offset()));
 710             __ cmp(obj_size, 0u);
 711             __ br(Assembler::LE, not_ok);  // make sure it's an instance (LH > 0)
 712             __ tstw(obj_size, Klass::_lh_instance_slow_path_bit);
 713             __ br(Assembler::EQ, ok);
 714             __ bind(not_ok);
 715             __ stop("assert(can be fast path allocated)");
 716             __ should_not_reach_here();
 717             __ bind(ok);
 718           }
 719 #endif // ASSERT
 720 
 721           // get the instance size (size is postive so movl is fine for 64bit)
 722           __ ldrw(obj_size, Address(klass, Klass::layout_helper_offset()));
 723 
 724           __ eden_allocate(rthread, obj, obj_size, 0, t1, slow_path);
 725 
 726           __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ false);
 727           __ verify_oop(obj);
 728           __ ldp(r19, zr, Address(__ post(sp, 2 * wordSize)));
 729           __ ret(lr);
 730 
 731           __ bind(slow_path);
 732           __ ldp(r19, zr, Address(__ post(sp, 2 * wordSize)));
 733         }
 734 
 735         __ enter();
 736         OopMap* map = save_live_registers(sasm);
 737         int call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_instance), klass);
 738         oop_maps = new OopMapSet();
 739         oop_maps->add_gc_map(call_offset, map);
 740         restore_live_registers_except_r0(sasm);
 741         __ verify_oop(obj);
 742         __ leave();
 743         __ ret(lr);
 744 


 804           Label slow_path;
 805           assert_different_registers(length, klass, obj, arr_size, t1, t2);
 806 
 807           // check that array length is small enough for fast path.
 808           __ mov(rscratch1, C1_MacroAssembler::max_array_allocation_length);
 809           __ cmpw(length, rscratch1);
 810           __ br(Assembler::HI, slow_path);
 811 
 812           // get the allocation size: round_up(hdr + length << (layout_helper & 0x1F))
 813           // since size is positive ldrw does right thing on 64bit
 814           __ ldrw(t1, Address(klass, Klass::layout_helper_offset()));
 815           // since size is positive movw does right thing on 64bit
 816           __ movw(arr_size, length);
 817           __ lslvw(arr_size, length, t1);
 818           __ ubfx(t1, t1, Klass::_lh_header_size_shift,
 819                   exact_log2(Klass::_lh_header_size_mask + 1));
 820           __ add(arr_size, arr_size, t1);
 821           __ add(arr_size, arr_size, MinObjAlignmentInBytesMask); // align up
 822           __ andr(arr_size, arr_size, ~MinObjAlignmentInBytesMask);
 823 
 824           __ eden_allocate(rthread, obj, arr_size, 0, t1, slow_path);  // preserves arr_size
 825 
 826           __ initialize_header(obj, klass, length, t1, t2);
 827           __ ldrb(t1, Address(klass, in_bytes(Klass::layout_helper_offset()) + (Klass::_lh_header_size_shift / BitsPerByte)));
 828           assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
 829           assert(Klass::_lh_header_size_mask <= 0xFF, "bytewise");
 830           __ andr(t1, t1, Klass::_lh_header_size_mask);
 831           __ sub(arr_size, arr_size, t1);  // body length
 832           __ add(t1, t1, obj);       // body start
 833           __ initialize_body(t1, arr_size, 0, t2);
 834           __ verify_oop(obj);
 835 
 836           __ ret(lr);
 837 
 838           __ bind(slow_path);
 839         }
 840 
 841         __ enter();
 842         OopMap* map = save_live_registers(sasm);
 843         int call_offset;
 844         if (id == new_type_array_id) {




 704 
 705 #ifdef ASSERT
 706           // assert object can be fast path allocated
 707           {
 708             Label ok, not_ok;
 709             __ ldrw(obj_size, Address(klass, Klass::layout_helper_offset()));
 710             __ cmp(obj_size, 0u);
 711             __ br(Assembler::LE, not_ok);  // make sure it's an instance (LH > 0)
 712             __ tstw(obj_size, Klass::_lh_instance_slow_path_bit);
 713             __ br(Assembler::EQ, ok);
 714             __ bind(not_ok);
 715             __ stop("assert(can be fast path allocated)");
 716             __ should_not_reach_here();
 717             __ bind(ok);
 718           }
 719 #endif // ASSERT
 720 
 721           // get the instance size (size is postive so movl is fine for 64bit)
 722           __ ldrw(obj_size, Address(klass, Klass::layout_helper_offset()));
 723 
 724           __ eden_allocate(obj, obj_size, 0, t1, slow_path);
 725 
 726           __ initialize_object(obj, klass, obj_size, 0, t1, t2, /* is_tlab_allocated */ false);
 727           __ verify_oop(obj);
 728           __ ldp(r19, zr, Address(__ post(sp, 2 * wordSize)));
 729           __ ret(lr);
 730 
 731           __ bind(slow_path);
 732           __ ldp(r19, zr, Address(__ post(sp, 2 * wordSize)));
 733         }
 734 
 735         __ enter();
 736         OopMap* map = save_live_registers(sasm);
 737         int call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_instance), klass);
 738         oop_maps = new OopMapSet();
 739         oop_maps->add_gc_map(call_offset, map);
 740         restore_live_registers_except_r0(sasm);
 741         __ verify_oop(obj);
 742         __ leave();
 743         __ ret(lr);
 744 


 804           Label slow_path;
 805           assert_different_registers(length, klass, obj, arr_size, t1, t2);
 806 
 807           // check that array length is small enough for fast path.
 808           __ mov(rscratch1, C1_MacroAssembler::max_array_allocation_length);
 809           __ cmpw(length, rscratch1);
 810           __ br(Assembler::HI, slow_path);
 811 
 812           // get the allocation size: round_up(hdr + length << (layout_helper & 0x1F))
 813           // since size is positive ldrw does right thing on 64bit
 814           __ ldrw(t1, Address(klass, Klass::layout_helper_offset()));
 815           // since size is positive movw does right thing on 64bit
 816           __ movw(arr_size, length);
 817           __ lslvw(arr_size, length, t1);
 818           __ ubfx(t1, t1, Klass::_lh_header_size_shift,
 819                   exact_log2(Klass::_lh_header_size_mask + 1));
 820           __ add(arr_size, arr_size, t1);
 821           __ add(arr_size, arr_size, MinObjAlignmentInBytesMask); // align up
 822           __ andr(arr_size, arr_size, ~MinObjAlignmentInBytesMask);
 823 
 824           __ eden_allocate(obj, arr_size, 0, t1, slow_path);  // preserves arr_size
 825 
 826           __ initialize_header(obj, klass, length, t1, t2);
 827           __ ldrb(t1, Address(klass, in_bytes(Klass::layout_helper_offset()) + (Klass::_lh_header_size_shift / BitsPerByte)));
 828           assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise");
 829           assert(Klass::_lh_header_size_mask <= 0xFF, "bytewise");
 830           __ andr(t1, t1, Klass::_lh_header_size_mask);
 831           __ sub(arr_size, arr_size, t1);  // body length
 832           __ add(t1, t1, obj);       // body start
 833           __ initialize_body(t1, arr_size, 0, t2);
 834           __ verify_oop(obj);
 835 
 836           __ ret(lr);
 837 
 838           __ bind(slow_path);
 839         }
 840 
 841         __ enter();
 842         OopMap* map = save_live_registers(sasm);
 843         int call_offset;
 844         if (id == new_type_array_id) {


< prev index next >