@@ -1707,7 +1707,7 @@ class StubGenerator: public StubCodeGenerator {
17071707
17081708
17091709 // Helper for generating a dynamic type check.
1710- // Smashes rscratch1.
1710+ // Smashes rscratch1, rscratch2 .
17111711 void generate_type_check (Register sub_klass,
17121712 Register super_check_offset,
17131713 Register super_klass,
@@ -2137,6 +2137,10 @@ class StubGenerator: public StubCodeGenerator {
21372137 const Register dst_pos = c_rarg3; // destination position
21382138 const Register length = c_rarg4;
21392139
2140+
2141+ // Registers used as temps
2142+ const Register dst_klass = c_rarg5;
2143+
21402144 __ align (CodeEntryAlignment);
21412145
21422146 StubCodeMark mark (this , " StubRoutines" , name);
@@ -2342,8 +2346,7 @@ class StubGenerator: public StubCodeGenerator {
23422346 arraycopy_range_checks (src, src_pos, dst, dst_pos, scratch_length,
23432347 r18, L_failed);
23442348
2345- const Register rscratch2_dst_klass = rscratch2;
2346- __ load_klass (rscratch2_dst_klass, dst); // reload
2349+ __ load_klass (dst_klass, dst); // reload
23472350
23482351 // Marshal the base address arguments now, freeing registers.
23492352 __ lea (from, Address (src, src_pos, Address::lsl (LogBytesPerHeapOop)));
@@ -2353,24 +2356,25 @@ class StubGenerator: public StubCodeGenerator {
23532356 __ movw (count, length); // length (reloaded)
23542357 Register sco_temp = c_rarg3; // this register is free now
23552358 assert_different_registers (from, to, count, sco_temp,
2356- rscratch2_dst_klass , scratch_src_klass);
2359+ dst_klass , scratch_src_klass);
23572360 // assert_clean_int(count, sco_temp);
23582361
23592362 // Generate the type check.
23602363 const int sco_offset = in_bytes (Klass::super_check_offset_offset ());
2361- __ ldrw (sco_temp, Address (rscratch2_dst_klass, sco_offset));
2362- // assert_clean_int(sco_temp, r18);
2363- generate_type_check (scratch_src_klass, sco_temp, rscratch2_dst_klass, L_plain_copy);
2364+ __ ldrw (sco_temp, Address (dst_klass, sco_offset));
2365+
2366+ // Smashes rscratch1, rscratch2
2367+ generate_type_check (scratch_src_klass, sco_temp, dst_klass, L_plain_copy);
23642368
23652369 // Fetch destination element klass from the ObjArrayKlass header.
23662370 int ek_offset = in_bytes (ObjArrayKlass::element_klass_offset ());
2367- __ ldr (rscratch2_dst_klass , Address (rscratch2_dst_klass , ek_offset));
2368- __ ldrw (sco_temp, Address (rscratch2_dst_klass , sco_offset));
2371+ __ ldr (dst_klass , Address (dst_klass , ek_offset));
2372+ __ ldrw (sco_temp, Address (dst_klass , sco_offset));
23692373
23702374 // the checkcast_copy loop needs two extra arguments:
23712375 assert (c_rarg3 == sco_temp, " #3 already in place" );
23722376 // Set up arguments for checkcast_copy_entry.
2373- __ mov (c_rarg4, rscratch2_dst_klass ); // dst.klass.element_klass
2377+ __ mov (c_rarg4, dst_klass ); // dst.klass.element_klass
23742378 __ b (RuntimeAddress (checkcast_copy_entry));
23752379 }
23762380
0 commit comments