< prev index next >

src/hotspot/cpu/s390/c1_Runtime1_s390.cpp

Print this page

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