Skip to content

Commit 26a41cd

Browse files
author
Andrew Haley
committed
8219006: AArch64: Register corruption in slow subtype check
Reviewed-by: phh, shade Backport-of: 4ac927853957fe691692137a6cabbd1b141b95d4
1 parent 9a4bc2d commit 26a41cd

File tree

1 file changed

+14
-10
lines changed

1 file changed

+14
-10
lines changed

hotspot/src/cpu/aarch64/vm/stubGenerator_aarch64.cpp

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)