595 }
596 break;
597
598 case new_multi_array_id:
599 { // O0: klass
600 // O1: rank
601 // O2: address of 1st dimension
602 __ set_info("new_multi_array", dont_gc_arguments);
603 oop_maps = generate_stub_call(sasm, I0, CAST_FROM_FN_PTR(address, new_multi_array), I0, I1, I2);
604 // I0 -> O0: new multi array
605 }
606 break;
607
608 case register_finalizer_id:
609 {
610 __ set_info("register_finalizer", dont_gc_arguments);
611
612 // load the klass and check the has finalizer flag
613 Label register_finalizer;
614 Register t = O1;
615 __ ld_ptr(O0, oopDesc::klass_offset_in_bytes(), t);
616 __ ld(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), t);
617 __ set(JVM_ACC_HAS_FINALIZER, G3);
618 __ andcc(G3, t, G0);
619 __ br(Assembler::notZero, false, Assembler::pt, register_finalizer);
620 __ delayed()->nop();
621
622 // do a leaf return
623 __ retl();
624 __ delayed()->nop();
625
626 __ bind(register_finalizer);
627 OopMap* oop_map = save_live_registers(sasm);
628 int call_offset = __ call_RT(noreg, noreg,
629 CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), I0);
630 oop_maps = new OopMapSet();
631 oop_maps->add_gc_map(call_offset, oop_map);
632
633 // Now restore all the live registers
634 restore_live_registers(sasm);
635
|
595 }
596 break;
597
598 case new_multi_array_id:
599 { // O0: klass
600 // O1: rank
601 // O2: address of 1st dimension
602 __ set_info("new_multi_array", dont_gc_arguments);
603 oop_maps = generate_stub_call(sasm, I0, CAST_FROM_FN_PTR(address, new_multi_array), I0, I1, I2);
604 // I0 -> O0: new multi array
605 }
606 break;
607
608 case register_finalizer_id:
609 {
610 __ set_info("register_finalizer", dont_gc_arguments);
611
612 // load the klass and check the has finalizer flag
613 Label register_finalizer;
614 Register t = O1;
615 __ load_klass(O0, t);
616 __ ld(t, Klass::access_flags_offset_in_bytes() + sizeof(oopDesc), t);
617 __ set(JVM_ACC_HAS_FINALIZER, G3);
618 __ andcc(G3, t, G0);
619 __ br(Assembler::notZero, false, Assembler::pt, register_finalizer);
620 __ delayed()->nop();
621
622 // do a leaf return
623 __ retl();
624 __ delayed()->nop();
625
626 __ bind(register_finalizer);
627 OopMap* oop_map = save_live_registers(sasm);
628 int call_offset = __ call_RT(noreg, noreg,
629 CAST_FROM_FN_PTR(address, SharedRuntime::register_finalizer), I0);
630 oop_maps = new OopMapSet();
631 oop_maps->add_gc_map(call_offset, oop_map);
632
633 // Now restore all the live registers
634 restore_live_registers(sasm);
635
|