diff graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java @ 11832:97d6932a309b

CodeCacheProvider.encodeDeoptActionAndReason now returns a Constant
author Gilles Duboscq <duboscq@ssw.jku.at>
date Thu, 26 Sep 2013 14:41:12 +0200
parents 70f43f67cdcb
children 24ff15442a09
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu Sep 26 16:46:27 2013 +0200
+++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java	Thu Sep 26 14:41:12 2013 +0200
@@ -25,6 +25,7 @@
 import static com.oracle.graal.amd64.AMD64.*;
 import static com.oracle.graal.api.code.ValueUtil.*;
 import static com.oracle.graal.hotspot.HotSpotBackend.*;
+import static com.oracle.graal.hotspot.HotSpotGraalRuntime.*;
 
 import java.lang.reflect.*;
 import java.util.*;
@@ -362,14 +363,28 @@
         append(new AMD64HotSpotUnwindOp(exceptionParameter));
     }
 
+    private void moveDeoptimizationActionAndReasonToThread(DeoptimizationAction action, DeoptimizationReason reason) {
+        Constant encoded = runtime.encodeDeoptActionAndReason(action, reason);
+        int pendingDeoptimizationOffset = graalRuntime().getConfig().pendingDeoptimizationOffset;
+        RegisterValue thread = runtime().threadRegister().asValue(HotSpotGraalRuntime.wordKind());
+        AMD64AddressValue pendingDeoptAddress = new AMD64AddressValue(encoded.getKind(), thread, pendingDeoptimizationOffset);
+        if (runtime.needsDataPatch(encoded)) {
+            append(new StoreOp(encoded.getKind(), pendingDeoptAddress, emitMove(encoded), null));
+        } else {
+            append(new StoreConstantOp(encoded.getKind(), pendingDeoptAddress, encoded, null));
+        }
+    }
+
     @Override
     public void emitDeoptimize(DeoptimizationAction action, DeoptimizingNode deopting) {
-        append(new AMD64DeoptimizeOp(action, deopting.getDeoptimizationReason(), state(deopting)));
+        moveDeoptimizationActionAndReasonToThread(action, deopting.getDeoptimizationReason());
+        append(new AMD64DeoptimizeOp(state(deopting)));
     }
 
     @Override
     public void emitDeoptimizeCaller(DeoptimizationAction action, DeoptimizationReason reason) {
-        append(new AMD64HotSpotDeoptimizeCallerOp(action, reason));
+        moveDeoptimizationActionAndReasonToThread(action, reason);
+        append(new AMD64HotSpotDeoptimizeCallerOp());
     }
 
     @Override