changeset 5273:7689999f0ea6

improved disassembly comments for out-of-line stubs
author Doug Simon <doug.simon@oracle.com>
date Mon, 23 Apr 2012 11:10:36 +0200
parents a44b5ebb28a0
children e72dd6533eb9
files graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64XirOp.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/TargetMethodAssembler.java
diffstat 7 files changed, 46 insertions(+), 29 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64DeoptimizationStub.java	Mon Apr 23 11:10:36 2012 +0200
@@ -68,4 +68,9 @@
         AMD64Call.directCall(tasm, masm, CiRuntimeCall.Deoptimize, info);
         AMD64Call.shouldNotReachHere(tasm, masm);
     }
+
+    @Override
+    public String description() {
+        return "deopt stub[reason=" + reason + ", action=" + action + "]";
+    }
 }
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64LIRGenerator.java	Mon Apr 23 11:10:36 2012 +0200
@@ -553,7 +553,7 @@
     protected LabelRef createDeoptStub(RiDeoptAction action, RiDeoptReason reason, LIRDebugInfo info, Object deoptInfo) {
         assert info.topFrame.bci >= 0 : "invalid bci for deopt framestate";
         AMD64DeoptimizationStub stub = new AMD64DeoptimizationStub(action, reason, info, deoptInfo);
-        lir.deoptimizationStubs.add(stub);
+        lir.stubs.add(stub);
         return LabelRef.forLabel(stub.label);
     }
 
--- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64XirOp.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/target/amd64/AMD64XirOp.java	Mon Apr 23 11:10:36 2012 +0200
@@ -81,7 +81,7 @@
         }
 
         if (snippet.template.slowPath != null) {
-            tasm.slowPaths.add(new SlowPath(labels));
+            tasm.stubs.add(new SlowPath(labels));
         }
     }
 
@@ -97,6 +97,11 @@
             emitXirInstructions(tasm, masm, snippet.template.slowPath, labels, getOperands(), snippet.marks);
             masm.nop();
         }
+
+        @Override
+        public String description() {
+            return "slow path for " + snippet.template.name;
+        }
     }
 
 
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/target/amd64/HotSpotAMD64Backend.java	Mon Apr 23 11:10:36 2012 +0200
@@ -161,7 +161,7 @@
 
         AbstractAssembler masm = new AMD64MacroAssembler(target, frameMap.registerConfig);
         HotSpotFrameContext frameContext = canOmitFrame ? null : new HotSpotFrameContext();
-        TargetMethodAssembler tasm = new TargetMethodAssembler(target, runtime, frameMap, masm, frameContext);
+        TargetMethodAssembler tasm = new TargetMethodAssembler(target, runtime, frameMap, masm, frameContext, lir.stubs);
         tasm.setFrameSize(frameMap.frameSize());
         tasm.targetMethod.setCustomStackAreaOffset(frameMap.offsetToCustomArea());
         return tasm;
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Arithmetic.java	Mon Apr 23 11:10:36 2012 +0200
@@ -500,7 +500,7 @@
 
     private static void emitConvertFixup(TargetMethodAssembler tasm, AMD64MacroAssembler masm, CiValue result, CiValue x) {
         ConvertSlowPath slowPath = new ConvertSlowPath(result, x);
-        tasm.slowPaths.add(slowPath);
+        tasm.stubs.add(slowPath);
         switch (result.kind) {
             case Int:  masm.cmpl(asIntReg(result),  Integer.MIN_VALUE); break;
             case Long: masm.cmpq(asLongReg(result), tasm.asLongConstRef(CiConstant.forLong(java.lang.Long.MIN_VALUE))); break;
@@ -547,6 +547,11 @@
             masm.xorptr(asRegister(result), asRegister(result));
             masm.jmp(continuation);
         }
+
+        @Override
+        public String description() {
+            return "convert " + x + " to " + result;
+        }
     }
 
 
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/LIR.java	Mon Apr 23 11:10:36 2012 +0200
@@ -54,9 +54,11 @@
      */
     private final List<Block> codeEmittingOrder;
 
-    public final List<Code> slowPaths;
-
-    public final List<Code> deoptimizationStubs;
+    /**
+     * Various out-of-line stubs to be emitted near the end of the method
+     * after all other LIR code has been emitted.
+     */
+    public final List<Code> stubs;
 
     private int numVariables;
 
@@ -74,6 +76,10 @@
      */
     public interface Code {
         void emitCode(TargetMethodAssembler tasm);
+        /**
+         * A description of this code stub useful for commenting the code in a disassembly.
+         */
+        String description();
     }
 
     /**
@@ -87,8 +93,7 @@
         this.codeEmittingOrder = codeEmittingOrder;
         this.linearScanOrder = linearScanOrder;
 
-        slowPaths = new ArrayList<>();
-        deoptimizationStubs = new ArrayList<>();
+        stubs = new ArrayList<>();
     }
 
     /**
@@ -141,16 +146,9 @@
             emitBlock(tasm, b);
         }
 
-        // generate code for slow cases
-        for (Code sp : slowPaths) {
-            emitSlowPath(tasm, sp);
-        }
-        for (Code sp : tasm.slowPaths) {
-            emitSlowPath(tasm, sp);
-        }
-        // generate deoptimization stubs
-        for (Code sp : deoptimizationStubs) {
-            emitSlowPath(tasm, sp);
+        // generate code stubs
+        for (Code c : stubs) {
+            emitCodeStub(tasm, c);
         }
     }
 
@@ -182,11 +180,11 @@
         }
     }
 
-    private static void emitSlowPath(TargetMethodAssembler tasm, Code sp) {
+    private static void emitCodeStub(TargetMethodAssembler tasm, Code code) {
         if (Debug.isDumpEnabled()) {
-            tasm.blockComment(String.format("slow case %s", sp.getClass().getName()));
+            tasm.blockComment(String.format("code stub: %s", code.description()));
         }
-        sp.emitCode(tasm);
+        code.emitCode(tasm);
     }
 
     public void setHasArgInCallerFrame() {
--- a/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/TargetMethodAssembler.java	Mon Apr 23 10:27:17 2012 +0200
+++ b/graal/com.oracle.graal.lir/src/com/oracle/graal/lir/asm/TargetMethodAssembler.java	Mon Apr 23 11:10:36 2012 +0200
@@ -26,13 +26,13 @@
 
 import java.util.*;
 
+import com.oracle.graal.debug.*;
+import com.oracle.graal.graph.*;
+import com.oracle.graal.lir.*;
+import com.oracle.graal.lir.LIR.Code;
 import com.oracle.max.asm.*;
 import com.oracle.max.cri.ci.*;
 import com.oracle.max.cri.ri.*;
-import com.oracle.graal.debug.*;
-import com.oracle.graal.graph.*;
-import com.oracle.graal.lir.*;
-import com.oracle.graal.lir.LIR.*;
 
 public class TargetMethodAssembler {
 
@@ -51,7 +51,11 @@
     public final CiTarget target;
     public final RiRuntime runtime;
     public final FrameMap frameMap;
-    public final List<Code> slowPaths;
+
+    /**
+     * Out-of-line stubs to be emitted.
+     */
+    public final List<Code> stubs;
 
     /**
      * The object that emits code for managing a method's frame.
@@ -62,11 +66,11 @@
     private List<ExceptionInfo> exceptionInfoList;
     private int lastSafepointPos;
 
-    public TargetMethodAssembler(CiTarget target, RiRuntime runtime, FrameMap frameMap, AbstractAssembler asm, FrameContext frameContext) {
+    public TargetMethodAssembler(CiTarget target, RiRuntime runtime, FrameMap frameMap, AbstractAssembler asm, FrameContext frameContext, List<Code> stubs) {
         this.target = target;
         this.runtime = runtime;
         this.frameMap = frameMap;
-        this.slowPaths = new ArrayList<>();
+        this.stubs = stubs;
         this.asm = asm;
         this.targetMethod = new CiTargetMethod();
         this.frameContext = frameContext;