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