changeset 14730:209cf6959421

added support for installing raw data with code
author Doug Simon <doug.simon@oracle.com>
date Tue, 25 Mar 2014 13:56:52 +0100
parents 8db730993642
children 0cb5c4d276d4
files graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RawDataValue.java graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java
diffstat 4 files changed, 122 insertions(+), 1 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/RawDataValue.java	Tue Mar 25 13:56:52 2014 +0100
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2011, 2012, Oracle and/or its affiliates. All rights reserved.
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ *
+ * This code is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 2 only, as
+ * published by the Free Software Foundation.
+ *
+ * This code is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+ * version 2 for more details (a copy is included in the LICENSE file that
+ * accompanied this code).
+ *
+ * You should have received a copy of the GNU General Public License version
+ * 2 along with this work; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
+ *
+ * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
+ * or visit www.oracle.com if you need additional information or have any
+ * questions.
+ */
+package com.oracle.graal.api.code;
+
+import java.util.*;
+
+import com.oracle.graal.api.meta.*;
+
+/**
+ * Represents some raw data.
+ */
+public final class RawDataValue extends Value {
+
+    private static final long serialVersionUID = 7947228462156566360L;
+
+    private final byte[] data;
+
+    public RawDataValue(PlatformKind kind, byte[] data) {
+        super(kind);
+        this.data = data;
+    }
+
+    public byte[] getData() {
+        return data;
+    }
+
+    @Override
+    public String toString() {
+        Formatter ret = new Formatter();
+        ret.format("data[");
+        boolean first = true;
+        for (byte b : data) {
+            ret.format(first ? "%02X" : " %02X", b);
+            first = false;
+        }
+        return ret.format("]").toString();
+    }
+
+    @Override
+    public int hashCode() {
+        return Arrays.hashCode(data);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj) {
+            return true;
+        }
+        if (obj instanceof RawDataValue) {
+            RawDataValue other = (RawDataValue) obj;
+            return Arrays.equals(data, other.data);
+        } else {
+            return false;
+        }
+    }
+}
--- a/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java	Tue Mar 25 13:55:55 2014 +0100
+++ b/graal/com.oracle.graal.api.code/src/com/oracle/graal/api/code/ValueUtil.java	Tue Mar 25 13:56:52 2014 +0100
@@ -90,6 +90,16 @@
         return ((RegisterValue) value).getRegister();
     }
 
+    public static boolean isRawData(Value value) {
+        assert value != null;
+        return value instanceof RawDataValue;
+    }
+
+    public static RawDataValue asRawData(Value value) {
+        assert value != null;
+        return (RawDataValue) value;
+    }
+
     public static Register asIntReg(Value value) {
         if (value.getKind() != Kind.Int) {
             throw new InternalError("needed Int got: " + value.getKind());
--- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Tue Mar 25 13:55:55 2014 +0100
+++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java	Tue Mar 25 13:56:52 2014 +0100
@@ -29,6 +29,7 @@
 
 import com.oracle.graal.amd64.*;
 import com.oracle.graal.api.code.*;
+import com.oracle.graal.api.code.CompilationResult.RawData;
 import com.oracle.graal.api.meta.*;
 import com.oracle.graal.asm.*;
 import com.oracle.graal.asm.amd64.*;
@@ -376,6 +377,13 @@
             } else {
                 throw GraalInternalError.shouldNotReachHere();
             }
+        } else if (isRawData(input)) {
+            if (isRegister(result)) {
+                RawData rawData = new RawData(asRawData(input).getData(), 16);
+                masm.leaq(asRegister(result), (AMD64Address) crb.recordDataReferenceInCode(rawData));
+            } else {
+                throw GraalInternalError.shouldNotReachHere();
+            }
         } else {
             throw GraalInternalError.shouldNotReachHere();
         }
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Mar 25 13:55:55 2014 +0100
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Mar 25 13:56:52 2014 +0100
@@ -23,13 +23,33 @@
 package com.oracle.graal.lir.sparc;
 
 import static com.oracle.graal.api.code.ValueUtil.*;
-import static com.oracle.graal.asm.sparc.SPARCMacroAssembler.*;
 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
 import static com.oracle.graal.sparc.SPARC.*;
 
+import com.oracle.graal.api.code.CompilationResult.RawData;
 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.Add;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Lddf;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Ldf;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Ldsb;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Ldsh;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Ldsw;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Lduh;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Ldx;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Membar;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Rdpc;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stb;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Sth;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stw;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stx;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Cas;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Casx;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Clr;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Mov;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Setuw;
+import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Setx;
 import com.oracle.graal.graph.*;
 import com.oracle.graal.lir.*;
 import com.oracle.graal.lir.StandardOp.ImplicitNullCheck;
@@ -370,6 +390,13 @@
             } else {
                 throw GraalInternalError.shouldNotReachHere();
             }
+        } else if (isRawData(input)) {
+            if (isRegister(result)) {
+                RawData rawData = new RawData(asRawData(input).getData(), 16);
+                throw GraalInternalError.unimplemented("Emitting raw data: " + rawData);
+            } else {
+                throw GraalInternalError.shouldNotReachHere();
+            }
         } else {
             throw GraalInternalError.shouldNotReachHere();
         }