406 case StubId::c1_new_object_array_id:
407 {
408 Register length = Z_R13; // Incoming
409 Register klass = Z_R11; // Incoming
410 Register obj = Z_R2; // Result
411
412 if (id == StubId::c1_new_type_array_id) {
413 __ set_info("new_type_array", dont_gc_arguments);
414 } else {
415 __ set_info("new_object_array", dont_gc_arguments);
416 }
417
418 #ifdef ASSERT
419 // Assert object type is really an array of the proper kind.
420 {
421 NearLabel ok;
422 Register t0 = obj;
423 __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
424 __ z_sra(t0, Klass::_lh_array_tag_shift);
425 int tag = ((id == StubId::c1_new_type_array_id)
426 ? Klass::_lh_array_tag_type_value
427 : Klass::_lh_array_tag_obj_value);
428 __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
429 __ stop("assert(is an array klass)");
430 __ should_not_reach_here();
431 __ bind(ok);
432 }
433 #endif // ASSERT
434
435 OopMap* map = save_live_registers_except_r2(sasm);
436 int call_offset;
437 if (id == StubId::c1_new_type_array_id) {
438 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
439 } else {
440 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
441 }
442
443 oop_maps = new OopMapSet();
444 oop_maps->add_gc_map(call_offset, map);
445 restore_live_registers_except_r2(sasm);
446
447 __ verify_oop(obj, FILE_AND_LINE);
|
406 case StubId::c1_new_object_array_id:
407 {
408 Register length = Z_R13; // Incoming
409 Register klass = Z_R11; // Incoming
410 Register obj = Z_R2; // Result
411
412 if (id == StubId::c1_new_type_array_id) {
413 __ set_info("new_type_array", dont_gc_arguments);
414 } else {
415 __ set_info("new_object_array", dont_gc_arguments);
416 }
417
418 #ifdef ASSERT
419 // Assert object type is really an array of the proper kind.
420 {
421 NearLabel ok;
422 Register t0 = obj;
423 __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
424 __ z_sra(t0, Klass::_lh_array_tag_shift);
425 int tag = ((id == StubId::c1_new_type_array_id)
426 ? Klass::_lh_array_tag_type_value : Klass::_lh_array_tag_ref_value);
427 __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
428 __ stop("assert(is an array klass)");
429 __ should_not_reach_here();
430 __ bind(ok);
431 }
432 #endif // ASSERT
433
434 OopMap* map = save_live_registers_except_r2(sasm);
435 int call_offset;
436 if (id == StubId::c1_new_type_array_id) {
437 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
438 } else {
439 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
440 }
441
442 oop_maps = new OopMapSet();
443 oop_maps->add_gc_map(call_offset, map);
444 restore_live_registers_except_r2(sasm);
445
446 __ verify_oop(obj, FILE_AND_LINE);
|