396 // to stomp the real return address. |
396 // to stomp the real return address. |
397 __ save_frame(0); |
397 __ save_frame(0); |
398 |
398 |
399 if (id == fast_new_instance_init_check_id) { |
399 if (id == fast_new_instance_init_check_id) { |
400 // make sure the klass is initialized |
400 // make sure the klass is initialized |
401 __ ld(G5_klass, instanceKlass::init_state_offset_in_bytes() + sizeof(oopDesc), G3_t1); |
401 __ ld(G5_klass, in_bytes(instanceKlass::init_state_offset()), G3_t1); |
402 __ cmp_and_br_short(G3_t1, instanceKlass::fully_initialized, Assembler::notEqual, Assembler::pn, slow_path); |
402 __ cmp_and_br_short(G3_t1, instanceKlass::fully_initialized, Assembler::notEqual, Assembler::pn, slow_path); |
403 } |
403 } |
404 #ifdef ASSERT |
404 #ifdef ASSERT |
405 // assert object can be fast path allocated |
405 // assert object can be fast path allocated |
406 { |
406 { |
407 Label ok, not_ok; |
407 Label ok, not_ok; |
408 __ ld(G5_klass, Klass::layout_helper_offset_in_bytes() + sizeof(oopDesc), G1_obj_size); |
408 __ ld(G5_klass, in_bytes(Klass::layout_helper_offset()), G1_obj_size); |
409 // make sure it's an instance (LH > 0) |
409 // make sure it's an instance (LH > 0) |
410 __ cmp_and_br_short(G1_obj_size, 0, Assembler::lessEqual, Assembler::pn, not_ok); |
410 __ cmp_and_br_short(G1_obj_size, 0, Assembler::lessEqual, Assembler::pn, not_ok); |
411 __ btst(Klass::_lh_instance_slow_path_bit, G1_obj_size); |
411 __ btst(Klass::_lh_instance_slow_path_bit, G1_obj_size); |
412 __ br(Assembler::zero, false, Assembler::pn, ok); |
412 __ br(Assembler::zero, false, Assembler::pn, ok); |
413 __ delayed()->nop(); |
413 __ delayed()->nop(); |
423 __ tlab_refill(retry_tlab, try_eden, slow_path); // preserves G5_klass |
423 __ tlab_refill(retry_tlab, try_eden, slow_path); // preserves G5_klass |
424 |
424 |
425 __ bind(retry_tlab); |
425 __ bind(retry_tlab); |
426 |
426 |
427 // get the instance size |
427 // get the instance size |
428 __ ld(G5_klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), G1_obj_size); |
428 __ ld(G5_klass, in_bytes(Klass::layout_helper_offset()), G1_obj_size); |
429 |
429 |
430 __ tlab_allocate(O0_obj, G1_obj_size, 0, G3_t1, slow_path); |
430 __ tlab_allocate(O0_obj, G1_obj_size, 0, G3_t1, slow_path); |
431 |
431 |
432 __ initialize_object(O0_obj, G5_klass, G1_obj_size, 0, G3_t1, G4_t2); |
432 __ initialize_object(O0_obj, G5_klass, G1_obj_size, 0, G3_t1, G4_t2); |
433 __ verify_oop(O0_obj); |
433 __ verify_oop(O0_obj); |
435 __ ret(); |
435 __ ret(); |
436 __ delayed()->restore(); |
436 __ delayed()->restore(); |
437 |
437 |
438 __ bind(try_eden); |
438 __ bind(try_eden); |
439 // get the instance size |
439 // get the instance size |
440 __ ld(G5_klass, klassOopDesc::header_size() * HeapWordSize + Klass::layout_helper_offset_in_bytes(), G1_obj_size); |
440 __ ld(G5_klass, in_bytes(Klass::layout_helper_offset()), G1_obj_size); |
441 __ eden_allocate(O0_obj, G1_obj_size, 0, G3_t1, G4_t2, slow_path); |
441 __ eden_allocate(O0_obj, G1_obj_size, 0, G3_t1, G4_t2, slow_path); |
442 __ incr_allocated_bytes(G1_obj_size, G3_t1, G4_t2); |
442 __ incr_allocated_bytes(G1_obj_size, G3_t1, G4_t2); |
443 |
443 |
444 __ initialize_object(O0_obj, G5_klass, G1_obj_size, 0, G3_t1, G4_t2); |
444 __ initialize_object(O0_obj, G5_klass, G1_obj_size, 0, G3_t1, G4_t2); |
445 __ verify_oop(O0_obj); |
445 __ verify_oop(O0_obj); |
469 { |
469 { |
470 Register G5_klass = G5; // Incoming |
470 Register G5_klass = G5; // Incoming |
471 Register G4_length = G4; // Incoming |
471 Register G4_length = G4; // Incoming |
472 Register O0_obj = O0; // Outgoing |
472 Register O0_obj = O0; // Outgoing |
473 |
473 |
474 Address klass_lh(G5_klass, ((klassOopDesc::header_size() * HeapWordSize) |
474 Address klass_lh(G5_klass, Klass::layout_helper_offset()); |
475 + Klass::layout_helper_offset_in_bytes())); |
|
476 assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise"); |
475 assert(Klass::_lh_header_size_shift % BitsPerByte == 0, "bytewise"); |
477 assert(Klass::_lh_header_size_mask == 0xFF, "bytewise"); |
476 assert(Klass::_lh_header_size_mask == 0xFF, "bytewise"); |
478 // Use this offset to pick out an individual byte of the layout_helper: |
477 // Use this offset to pick out an individual byte of the layout_helper: |
479 const int klass_lh_header_size_offset = ((BytesPerInt - 1) // 3 - 2 selects byte {0,1,0,0} |
478 const int klass_lh_header_size_offset = ((BytesPerInt - 1) // 3 - 2 selects byte {0,1,0,0} |
480 - Klass::_lh_header_size_shift / BitsPerByte); |
479 - Klass::_lh_header_size_shift / BitsPerByte); |
590 |
589 |
591 // load the klass and check the has finalizer flag |
590 // load the klass and check the has finalizer flag |
592 Label register_finalizer; |
591 Label register_finalizer; |
593 Register t = O1; |
592 Register t = O1; |
594 __ load_klass(O0, t); |
593 __ load_klass(O0, t); |
595 __ ld(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), t); |
594 __ ld(t, in_bytes(Klass::access_flags_offset()), t); |
596 __ set(JVM_ACC_HAS_FINALIZER, G3); |
595 __ set(JVM_ACC_HAS_FINALIZER, G3); |
597 __ andcc(G3, t, G0); |
596 __ andcc(G3, t, G0); |
598 __ br(Assembler::notZero, false, Assembler::pt, register_finalizer); |
597 __ br(Assembler::notZero, false, Assembler::pt, register_finalizer); |
599 __ delayed()->nop(); |
598 __ delayed()->nop(); |
600 |
599 |