[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