[aarch64-port-dev ] Fix register corrption caused by check_klass_subtype_slow_path.
Andrew Haley
aph at redhat.com
Tue Oct 1 06:56:44 PDT 2013
This is a silly bug from some time ago. We weren't saving registers
correctly.
Andrew.
# HG changeset patch
# User aph
# Date 1380561206 -3600
# Node ID d020dd3e1d3f71328688dfa1635366c3dabc8ee4
# Parent 4cf0e7f0e764565125537b99cbb10018209aecfd
Fix register corrption caused by check_klass_subtype_slow_path.
diff -r 4cf0e7f0e764 -r d020dd3e1d3f src/cpu/aarch64/vm/macroAssembler_aarch64.cpp
--- a/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Mon Sep 30 16:16:13 2013 +0100
+++ b/src/cpu/aarch64/vm/macroAssembler_aarch64.cpp Mon Sep 30 18:13:26 2013 +0100
@@ -800,14 +800,14 @@
assert(sub_klass != r2, "killed reg"); // killed by lea(r2, &pst_counter)
// Get super_klass value into r0 (even if it was in r5 or r2).
- bool pushed_r0 = false, pushed_r2 = IS_A_TEMP(r2), pushed_r5 = IS_A_TEMP(r5);
+ bool pushed_r0 = false, pushed_r2 = !IS_A_TEMP(r2), pushed_r5 = !IS_A_TEMP(r5);
if (super_klass != r0 || UseCompressedOops) {
if (!IS_A_TEMP(r0))
pushed_r0 = true;
}
- push(r0->bit(pushed_r0) | r2->bit(pushed_r2) | r2->bit(pushed_r5), sp);
+ push(r0->bit(pushed_r0) | r2->bit(pushed_r2) | r5->bit(pushed_r5), sp);
#ifndef PRODUCT
mov(rscratch2, (address)&SharedRuntime::_partial_subtype_ctr);
@@ -830,7 +830,7 @@
repne_scan(r5, r0, r2, rscratch1);
// Unspill the temp. registers:
- pop(r0->bit(pushed_r0) | r2->bit(pushed_r2) | r2->bit(pushed_r5), sp);
+ pop(r0->bit(pushed_r0) | r2->bit(pushed_r2) | r5->bit(pushed_r5), sp);
br(Assembler::NE, *L_failure);
More information about the aarch64-port-dev
mailing list