changeset 17101:a3fa16378eaa

Merge
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Thu, 11 Sep 2014 11:26:23 -0700
parents dbc4d605eb8f (diff) fc94fd8a28dc (current diff)
children 8c9ab783e814
files
diffstat 3 files changed, 71 insertions(+), 45 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Wed Sep 10 23:14:58 2014 +0200
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Sep 11 11:26:23 2014 -0700
@@ -865,7 +865,7 @@
     }
 
     private void moveBetweenFpGp(AllocatableValue dst, AllocatableValue src) {
-        StackSlot tempSlot = getTempSlot(LIRKind.derive(dst));
+        StackSlot tempSlot = getTempSlot(LIRKind.value(Kind.Long));
         append(new MoveFpGp(dst, src, tempSlot));
     }
 
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Wed Sep 10 23:14:58 2014 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java	Thu Sep 11 11:26:23 2014 -0700
@@ -346,7 +346,7 @@
                     SPARCAddress addr = (SPARCAddress) crb.recordDataReferenceInCode(asConstant(src2), 4);
                     try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
                         Register scratch = sc.getRegister();
-                        addr = SPARCMove.guaranueeLoadable(addr, masm, scratch);
+                        addr = SPARCMove.generateSimm13OffsetLoad(addr, masm, scratch);
                         new Lddf(addr, asDoubleReg(dst)).emit(masm);
                     }
                     new Fandd(asDoubleReg(src1), asDoubleReg(dst), asDoubleReg(dst)).emit(masm);
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Wed Sep 10 23:14:58 2014 +0200
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Thu Sep 11 11:26:23 2014 -0700
@@ -111,6 +111,7 @@
             this.result = result;
             this.input = input;
             this.temp = temp;
+            assert this.temp.getPlatformKind() == Kind.Long;
         }
 
         public Value getInput() {
@@ -123,42 +124,66 @@
 
         @Override
         public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) {
-            PlatformKind inputKind = input.getPlatformKind();
-            PlatformKind resultKind = result.getPlatformKind();
+            Kind inputKind = (Kind) input.getPlatformKind();
+            Kind resultKind = (Kind) result.getPlatformKind();
+            int resultKindSize = crb.target.getSizeInBytes(resultKind);
             try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
                 Register scratch = sc.getRegister();
-                SPARCAddress tempAddress = guaranueeLoadable((SPARCAddress) crb.asAddress(temp), masm, scratch);
-                if (inputKind == Kind.Float) {
-                    new Stf(asFloatReg(input), tempAddress).emit(masm);
-                } else if (inputKind == Kind.Double) {
-                    new Stdf(asDoubleReg(input), tempAddress).emit(masm);
-                } else if (inputKind == Kind.Int) {
-                    new Stw(asIntReg(input), tempAddress).emit(masm);
-                } else if (inputKind == Kind.Short || inputKind == Kind.Char) {
-                    new Sth(asIntReg(input), tempAddress).emit(masm);
-                } else if (inputKind == Kind.Byte) {
-                    new Stb(asIntReg(input), tempAddress).emit(masm);
-                } else if (inputKind == Kind.Long) {
-                    new Stx(asLongReg(input), tempAddress).emit(masm);
-                } else {
-                    GraalInternalError.shouldNotReachHere();
+                SPARCAddress tempAddress = generateSimm13OffsetLoad((SPARCAddress) crb.asAddress(temp), masm, scratch);
+                switch (inputKind) {
+                    case Float:
+                        assert resultKindSize == 4;
+                        new Stf(asFloatReg(input), tempAddress).emit(masm);
+                        break;
+                    case Double:
+                        assert resultKindSize == 8;
+                        new Stdf(asDoubleReg(input), tempAddress).emit(masm);
+                        break;
+                    case Long:
+                    case Int:
+                    case Short:
+                    case Char:
+                    case Byte:
+                        if (resultKindSize == 8) {
+                            new Stx(asLongReg(input), tempAddress).emit(masm);
+                        } else if (resultKindSize == 4) {
+                            new Stw(asIntReg(input), tempAddress).emit(masm);
+                        } else if (resultKindSize == 2) {
+                            new Sth(asIntReg(input), tempAddress).emit(masm);
+                        } else if (resultKindSize == 1) {
+                            new Stb(asIntReg(input), tempAddress).emit(masm);
+                        } else {
+                            throw GraalInternalError.shouldNotReachHere();
+                        }
+                        break;
+                    default:
+                        GraalInternalError.shouldNotReachHere();
                 }
-                if (resultKind == Kind.Int) {
-                    new Ldsw(tempAddress, asIntReg(result)).emit(masm);
-                } else if (inputKind == Kind.Short) {
-                    new Ldsh(tempAddress, asIntReg(input)).emit(masm);
-                } else if (inputKind == Kind.Char) {
-                    new Lduh(tempAddress, asIntReg(input)).emit(masm);
-                } else if (inputKind == Kind.Byte) {
-                    new Ldsb(tempAddress, asIntReg(input)).emit(masm);
-                } else if (resultKind == Kind.Float) {
-                    new Ldf(tempAddress, asFloatReg(result)).emit(masm);
-                } else if (resultKind == Kind.Long) {
-                    new Ldx(tempAddress, asLongReg(result)).emit(masm);
-                } else if (resultKind == Kind.Double) {
-                    new Lddf(tempAddress, asDoubleReg(result)).emit(masm);
-                } else {
-                    GraalInternalError.shouldNotReachHere();
+                switch (resultKind) {
+                    case Long:
+                        new Ldx(tempAddress, asLongReg(result)).emit(masm);
+                        break;
+                    case Int:
+                        new Ldsw(tempAddress, asIntReg(result)).emit(masm);
+                        break;
+                    case Short:
+                        new Ldsh(tempAddress, asIntReg(input)).emit(masm);
+                        break;
+                    case Char:
+                        new Lduh(tempAddress, asIntReg(input)).emit(masm);
+                        break;
+                    case Byte:
+                        new Ldsb(tempAddress, asIntReg(input)).emit(masm);
+                        break;
+                    case Float:
+                        new Ldf(tempAddress, asFloatReg(result)).emit(masm);
+                        break;
+                    case Double:
+                        new Lddf(tempAddress, asDoubleReg(result)).emit(masm);
+                        break;
+                    default:
+                        GraalInternalError.shouldNotReachHere();
+                        break;
                 }
             }
         }
@@ -208,7 +233,7 @@
         public void emitMemAccess(SPARCMacroAssembler masm) {
             try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
                 Register scratch = sc.getRegister();
-                final SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch);
+                final SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch);
                 final Register dst = asRegister(result);
                 switch (kind) {
                     case Boolean:
@@ -385,7 +410,7 @@
             assert isRegister(input);
             try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
                 Register scratch = sc.getRegister();
-                SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch);
+                SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch);
                 switch (kind) {
                     case Boolean:
                     case Byte:
@@ -433,7 +458,7 @@
         public void emitMemAccess(SPARCMacroAssembler masm) {
             try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
                 Register scratch = sc.getRegister();
-                SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch);
+                SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch);
                 switch (kind) {
                     case Boolean:
                     case Byte:
@@ -538,15 +563,16 @@
     }
 
     /**
-     * Guarantees that the given SPARCAddress given before is loadable by subsequent call. If the
-     * displacement exceeds the imm13 value, the value is put into a scratch register o7, which must
-     * be used as soon as possible.
+     * Guarantees that the given SPARCAddress given before is loadable by subsequent load/store
+     * instruction. If the displacement exceeds the simm13 value range, the value is put into a
+     * scratch register.
      *
      * @param addr Address to modify
-     * @param masm assembler to output the prior stx command
+     * @param masm assembler to output the potential code to store the value in the scratch register
+     * @param scratch The register as scratch to use
      * @return a loadable SPARCAddress
      */
-    public static SPARCAddress guaranueeLoadable(SPARCAddress addr, SPARCMacroAssembler masm, Register scratch) {
+    public static SPARCAddress generateSimm13OffsetLoad(SPARCAddress addr, SPARCMacroAssembler masm, Register scratch) {
         boolean displacementOutOfBound = addr.getIndex().equals(Register.None) && !SPARCAssembler.isSimm13(addr.getDisplacement());
         if (displacementOutOfBound) {
             new Setx(addr.getDisplacement(), scratch, false).emit(masm);
@@ -560,7 +586,7 @@
         SPARCAddress dst = (SPARCAddress) crb.asAddress(result);
         try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
             Register scratch = sc.getRegister();
-            dst = guaranueeLoadable(dst, masm, scratch);
+            dst = generateSimm13OffsetLoad(dst, masm, scratch);
             Register src = asRegister(input);
             switch (input.getKind()) {
                 case Byte:
@@ -594,7 +620,7 @@
         SPARCAddress src = (SPARCAddress) crb.asAddress(input);
         try (SPARCScratchRegister sc = SPARCScratchRegister.get()) {
             Register scratch = sc.getRegister();
-            src = guaranueeLoadable(src, masm, scratch);
+            src = generateSimm13OffsetLoad(src, masm, scratch);
             Register dst = asRegister(result);
             switch (input.getKind()) {
                 case Boolean: