379 case C1StubId::new_object_array_id:
380 {
381 Register length = Z_R13; // Incoming
382 Register klass = Z_R11; // Incoming
383 Register obj = Z_R2; // Result
384
385 if (id == C1StubId::new_type_array_id) {
386 __ set_info("new_type_array", dont_gc_arguments);
387 } else {
388 __ set_info("new_object_array", dont_gc_arguments);
389 }
390
391 #ifdef ASSERT
392 // Assert object type is really an array of the proper kind.
393 {
394 NearLabel ok;
395 Register t0 = obj;
396 __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
397 __ z_sra(t0, Klass::_lh_array_tag_shift);
398 int tag = ((id == C1StubId::new_type_array_id)
399 ? Klass::_lh_array_tag_type_value
400 : Klass::_lh_array_tag_obj_value);
401 __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
402 __ stop("assert(is an array klass)");
403 __ should_not_reach_here();
404 __ bind(ok);
405 }
406 #endif // ASSERT
407
408 OopMap* map = save_live_registers_except_r2(sasm);
409 int call_offset;
410 if (id == C1StubId::new_type_array_id) {
411 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
412 } else {
413 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
414 }
415
416 oop_maps = new OopMapSet();
417 oop_maps->add_gc_map(call_offset, map);
418 restore_live_registers_except_r2(sasm);
419
420 __ verify_oop(obj, FILE_AND_LINE);
|
379 case C1StubId::new_object_array_id:
380 {
381 Register length = Z_R13; // Incoming
382 Register klass = Z_R11; // Incoming
383 Register obj = Z_R2; // Result
384
385 if (id == C1StubId::new_type_array_id) {
386 __ set_info("new_type_array", dont_gc_arguments);
387 } else {
388 __ set_info("new_object_array", dont_gc_arguments);
389 }
390
391 #ifdef ASSERT
392 // Assert object type is really an array of the proper kind.
393 {
394 NearLabel ok;
395 Register t0 = obj;
396 __ mem2reg_opt(t0, Address(klass, Klass::layout_helper_offset()), false);
397 __ z_sra(t0, Klass::_lh_array_tag_shift);
398 int tag = ((id == C1StubId::new_type_array_id)
399 ? Klass::_lh_array_tag_type_value : Klass::_lh_array_tag_ref_value);
400 __ compare32_and_branch(t0, tag, Assembler::bcondEqual, ok);
401 __ stop("assert(is an array klass)");
402 __ should_not_reach_here();
403 __ bind(ok);
404 }
405 #endif // ASSERT
406
407 OopMap* map = save_live_registers_except_r2(sasm);
408 int call_offset;
409 if (id == C1StubId::new_type_array_id) {
410 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_type_array), klass, length);
411 } else {
412 call_offset = __ call_RT(obj, noreg, CAST_FROM_FN_PTR(address, new_object_array), klass, length);
413 }
414
415 oop_maps = new OopMapSet();
416 oop_maps->add_gc_map(call_offset, map);
417 restore_live_registers_except_r2(sasm);
418
419 __ verify_oop(obj, FILE_AND_LINE);
|