changeset 22408:fe430002c001

[SPARC] Assembler: ld/st with size parameter
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Wed, 05 Aug 2015 11:54:04 +0200
parents 92ead19b1c4a
children 9f4aa375fd5b
files graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java
diffstat 1 files changed, 58 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Wed Aug 05 01:03:28 2015 +0200
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Wed Aug 05 11:54:04 2015 +0200
@@ -1513,7 +1513,7 @@
     }
 
     protected void op3(Op3s op3, Register rs1, int simm13, Register rd) {
-        assert isSimm13(simm13);
+        assert isSimm13(simm13) : simm13;
         int i = 1 << 13;
         int simm13WithX = simm13 | getXBit(op3);
         fmt(op3.op.value, rd.encoding, op3.value, rs1.encoding, i | simm13WithX & ((1 << 13) - 1));
@@ -2301,40 +2301,75 @@
     }
 
     public void ld(SPARCAddress src, Register dst, int bytes, boolean signed) {
-        if (signed) {
+        if (SPARC.isCPURegister(dst)) {
+            if (signed) {
+                switch (bytes) {
+                    case 1:
+                        ldub(src, dst);
+                        break;
+                    case 2:
+                        lduh(src, dst);
+                        break;
+                    case 4:
+                        lduw(src, dst);
+                        break;
+                    case 8:
+                        ldx(src, dst);
+                        break;
+                    default:
+                        throw new InternalError();
+                }
+            } else {
+                switch (bytes) {
+                    case 1:
+                        ldsb(src, dst);
+                        break;
+                    case 2:
+                        ldsh(src, dst);
+                        break;
+                    case 4:
+                        ldsw(src, dst);
+                        break;
+                    case 8:
+                        ldx(src, dst);
+                        break;
+                    default:
+                        throw new InternalError();
+                }
+            }
+        } else if (SPARC.isDoubleFloatRegister(dst) && bytes == 8) {
+            lddf(src, dst);
+        } else if (SPARC.isSingleFloatRegister(dst) && bytes == 4) {
+            ldf(src, dst);
+        } else {
+            throw new InternalError();
+        }
+    }
+
+    public void st(Register src, SPARCAddress dst, int bytes) {
+        if (SPARC.isCPURegister(src)) {
             switch (bytes) {
                 case 1:
-                    ldub(src, dst);
+                    stb(src, dst);
                     break;
                 case 2:
-                    lduh(src, dst);
+                    sth(src, dst);
                     break;
                 case 4:
-                    lduw(src, dst);
+                    stw(src, dst);
                     break;
                 case 8:
-                    ldx(src, dst);
+                    stx(src, dst);
                     break;
                 default:
-                    throw new InternalError();
+                    throw new InternalError(Integer.toString(bytes));
             }
+        } else if (SPARC.isDoubleFloatRegister(src) && bytes == 8) {
+            stdf(src, dst);
+        } else if (SPARC.isSingleFloatRegister(src) && bytes == 4) {
+            stf(src, dst);
         } else {
-            switch (bytes) {
-                case 1:
-                    ldsb(src, dst);
-                    break;
-                case 2:
-                    ldsh(src, dst);
-                    break;
-                case 4:
-                    ldsw(src, dst);
-                    break;
-                case 8:
-                    ldx(src, dst);
-                    break;
-                default:
-                    throw new InternalError();
-            }
+            throw new InternalError();
         }
     }