< prev index next >

src/hotspot/cpu/s390/c1_Runtime1_s390.cpp

Print this page

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);
< prev index next >