changeset 18705:5dcb9fdea75a

[SPARC] use now a dedicated scratch register for isMethodHandleReturnOffset value, as o7 may contain valuable information
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Wed, 17 Dec 2014 08:04:57 +0100
parents 0ce6ee3d7a98
children b6e98df9ba7d 2206dae9a802
files graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java
diffstat 1 files changed, 14 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java	Tue Dec 16 19:26:38 2014 -0800
+++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotJumpToExceptionHandlerInCallerOp.java	Wed Dec 17 08:04:57 2014 +0100
@@ -29,10 +29,16 @@
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.asm.sparc.*;
-import com.oracle.graal.asm.sparc.SPARCAssembler.*;
-import com.oracle.graal.asm.sparc.SPARCMacroAssembler.*;
+import com.oracle.graal.asm.sparc.SPARCAssembler.CC;
+import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Jmpl;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Lduw;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Movcc;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Cmp;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Nop;
 import com.oracle.graal.lir.*;
 import com.oracle.graal.lir.asm.*;
+import com.oracle.graal.sparc.*;
 
 /**
  * Sets up the arguments for an exception handler in the callers frame, removes the current frame
@@ -65,11 +71,13 @@
 
         // Restore SP from L7 if the exception PC is a method handle call site.
         SPARCAddress dst = new SPARCAddress(thread, isMethodHandleReturnOffset);
-        new Lduw(dst, o7).emit(masm);
-        new Cmp(o7, o7).emit(masm);
-        new Movcc(ConditionFlag.NotZero, CC.Icc, l7, sp).emit(masm);
+        try (SPARCScratchRegister scratch = SPARCScratchRegister.get()) {
+            Register scratchReg = scratch.getRegister();
+            new Lduw(dst, scratchReg).emit(masm);
+            new Cmp(scratchReg, scratchReg).emit(masm);
+            new Movcc(ConditionFlag.NotZero, CC.Icc, l7, sp).emit(masm);
+        }
 
-        new Mov(i7, o7).emit(masm);
         new Jmpl(asRegister(handlerInCallerPc), 0, g0).emit(masm);
         new Nop().emit(masm);
     }