changeset 8491:9cf5e381df05

-More Porting
author Christos Kotselidis <christos.kotselidis@oracle.com>
date Wed, 20 Feb 2013 17:29:40 +0100
parents 1567c6cc6561
children 286a49d423c9
files graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java
diffstat 4 files changed, 40 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Feb 20 16:15:43 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/meta/HotSpotRuntime.java	Wed Feb 20 17:29:40 2013 +0100
@@ -614,8 +614,8 @@
                     graph.addAfterFixed(memoryWrite, writeBarrier);
                     last = writeBarrier;
                 } else {
-                    WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(memoryWrite.object()));
-                    WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(memoryWrite.object()));
+                    WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(memoryWrite.object(), null, true));
+                    WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(memoryWrite.object(), memoryWrite.value()));
                     graph.addBeforeFixed(memoryWrite, writeBarrierPre);
                     graph.addAfterFixed(memoryWrite, writeBarrierPost);
                     last = writeBarrierPost;
@@ -640,8 +640,8 @@
                         FieldWriteBarrier writeBarrier = graph.add(new FieldWriteBarrier(cas.object()));
                         graph.addAfterFixed(cas, writeBarrier);
                     } else {
-                        WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(cas.object()));
-                        WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(cas.object()));
+                        WriteBarrierPre writeBarrierPre = graph.add(new WriteBarrierPre(cas.object(), cas.expected(), false));
+                        WriteBarrierPost writeBarrierPost = graph.add(new WriteBarrierPost(cas.object(), cas.newValue()));
                         graph.addAfterFixed(cas, writeBarrierPre);
                         graph.addAfterFixed(cas, writeBarrierPost);
                     }
@@ -651,8 +651,8 @@
                         LocationNode location = IndexedLocationNode.create(LocationNode.ANY_LOCATION, cas.expected().kind(), cas.displacement(), cas.offset(), graph, false);
                         graph.addAfterFixed(cas, graph.add(new ArrayWriteBarrier(cas.object(), location)));
                     } else {
-                        graph.addBeforeFixed(cas, graph.add(new WriteBarrierPre(cas.object())));
-                        graph.addAfterFixed(cas, graph.add(new WriteBarrierPost(cas.object())));
+                        graph.addBeforeFixed(cas, graph.add(new WriteBarrierPre(cas.object(), cas.expected(), false)));
+                        graph.addAfterFixed(cas, graph.add(new WriteBarrierPost(cas.object(), cas.newValue())));
                     }
                 }
             }
@@ -702,8 +702,8 @@
                 if (!config.useG1GC) {
                     graph.addAfterFixed(memoryWrite, graph.add(new ArrayWriteBarrier(array, arrayLocation)));
                 } else {
-                    graph.addBeforeFixed(memoryWrite, graph.add(new WriteBarrierPre(array)));
-                    graph.addAfterFixed(memoryWrite, graph.add(new WriteBarrierPost(array)));
+                    graph.addBeforeFixed(memoryWrite, graph.add(new WriteBarrierPre(array, null, true)));
+                    graph.addAfterFixed(memoryWrite, graph.add(new WriteBarrierPost(array, value)));
                 }
             }
         } else if (n instanceof UnsafeLoadNode) {
@@ -731,8 +731,8 @@
                         FieldWriteBarrier writeBarrier = graph.add(new FieldWriteBarrier(object));
                         graph.addAfterFixed(write, writeBarrier);
                     } else {
-                        graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object)));
-                        graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object)));
+                        graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object, null, true)));
+                        graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object, write.value())));
                     }
                 } else {
                     // This may be an array store so use an array write barrier
@@ -740,8 +740,8 @@
                         ArrayWriteBarrier writeBarrier = graph.add(new ArrayWriteBarrier(object, location));
                         graph.addAfterFixed(write, writeBarrier);
                     } else {
-                        graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object)));
-                        graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object)));
+                        graph.addBeforeFixed(write, graph.add(new WriteBarrierPre(object, null, true)));
+                        graph.addAfterFixed(write, graph.add(new WriteBarrierPost(object, store.value())));
                     }
                 }
             }
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java	Wed Feb 20 16:15:43 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPost.java	Wed Feb 20 17:29:40 2013 +0100
@@ -28,13 +28,19 @@
 public final class WriteBarrierPost extends WriteBarrier implements Lowerable {
 
     @Input private ValueNode object;
+    @Input private ValueNode value;
 
     public ValueNode object() {
         return object;
     }
 
-    public WriteBarrierPost(ValueNode object) {
+    public ValueNode value() {
+        return value;
+    }
+
+    public WriteBarrierPost(ValueNode object, ValueNode value) {
         this.object = object;
+        this.value = value;
     }
 
     public void lower(LoweringTool generator) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java	Wed Feb 20 16:15:43 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/nodes/WriteBarrierPre.java	Wed Feb 20 17:29:40 2013 +0100
@@ -28,13 +28,25 @@
 public final class WriteBarrierPre extends WriteBarrier implements Lowerable {
 
     @Input private ValueNode object;
+    @Input private ValueNode previousValue;
+    private boolean doLoad;
 
     public ValueNode object() {
         return object;
     }
 
-    public WriteBarrierPre(ValueNode object) {
+    public ValueNode previousValue() {
+        return previousValue;
+    }
+
+    public boolean doLoad() {
+        return doLoad;
+    }
+
+    public WriteBarrierPre(ValueNode object, ValueNode previousValue, boolean doLoad) {
         this.object = object;
+        this.previousValue = previousValue;
+        this.doLoad = doLoad;
     }
 
     public void lower(LoweringTool generator) {
--- a/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java	Wed Feb 20 16:15:43 2013 +0100
+++ b/graal/com.oracle.graal.hotspot/src/com/oracle/graal/hotspot/snippets/WriteBarrierSnippets.java	Wed Feb 20 17:29:40 2013 +0100
@@ -27,7 +27,6 @@
 
 import com.oracle.graal.api.code.*;
 import com.oracle.graal.api.meta.*;
-import com.oracle.graal.hotspot.*;
 import com.oracle.graal.hotspot.nodes.*;
 import com.oracle.graal.nodes.spi.*;
 import com.oracle.graal.snippets.*;
@@ -40,7 +39,7 @@
 public class WriteBarrierSnippets implements SnippetsInterface {
 
     @Snippet
-    public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("previousValue") Word previousValue, @Parameter("load") boolean doLoad) {
+    public static void g1PreWriteBarrier(@Parameter("object") Object object, @Parameter("previousValue") Word previousValue, @Parameter("doLoad") boolean doLoad) {
         Word thread = thread();
         Pointer oop = Word.fromObject(object);
         Word markingAddress = thread.add(HotSpotSnippetUtils.g1SATBQueueMarkingOffset());
@@ -86,7 +85,8 @@
             base = base.add(Word.unsigned(cardTableStart()));
         }
 
-        if (value != null) {
+        // if (value != null) {
+        if (true) {
             Word xorResult = (((Word) oop.xor(value)).unsignedShiftRight(HotSpotSnippetUtils.logOfHRGrainBytes()));
             if (xorResult.notEqual(Word.zero())) {
                 if (value.notEqual(Word.zero())) {
@@ -157,8 +157,8 @@
             super(runtime, assumptions, target, WriteBarrierSnippets.class);
             serialFieldWriteBarrier = snippet("serialFieldWriteBarrier", Object.class);
             serialArrayWriteBarrier = snippet("serialArrayWriteBarrier", Object.class);
-            g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class);
-            g1PostWriteBarrier = snippet("g1PostWriteBarrier", Object.class);
+            g1PreWriteBarrier = snippet("g1PreWriteBarrier", Object.class, Word.class, boolean.class);
+            g1PostWriteBarrier = snippet("g1PostWriteBarrier", Object.class, Word.class);
             this.useG1GC = useG1GC;
         }
 
@@ -185,6 +185,8 @@
             Key key = new Key(method);
             Arguments arguments = new Arguments();
             arguments.add("object", writeBarrierPre.object());
+            arguments.add("previousValue", writeBarrierPre.previousValue());
+            arguments.add("doLoad", writeBarrierPre.doLoad());
             SnippetTemplate template = cache.get(key, assumptions);
             template.instantiate(runtime, writeBarrierPre, DEFAULT_REPLACER, arguments);
         }
@@ -194,6 +196,7 @@
             Key key = new Key(method);
             Arguments arguments = new Arguments();
             arguments.add("object", writeBarrierPost.object());
+            arguments.add("value", writeBarrierPost.value());
             SnippetTemplate template = cache.get(key, assumptions);
             template.instantiate(runtime, writeBarrierPost, DEFAULT_REPLACER, arguments);
         }