changeset 17116:dced35fd40f7

[SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation.
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Tue, 16 Sep 2014 15:36:00 -0700
parents 9a0bf0c3b21e
children d980377abc6f
files graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java
diffstat 3 files changed, 72 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Tue Sep 16 11:49:23 2014 -0700
+++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java	Tue Sep 16 15:36:00 2014 -0700
@@ -1515,6 +1515,8 @@
         Fones(0x7F, "fones"),
         Fandd(0b0_0111_0000, "fandd"),
         Fands(0b0_0111_0001, "fands"),
+        Fxord(0b0_0110_1100, "fxord"),
+        Fxors(0b0_0110_1101, "fxord"),
         // end VIS1
 
         // start VIS2
@@ -2197,7 +2199,7 @@
             super(0, ConditionFlag.Equal, Op2s.Bp, cc, predictTaken ? 1 : 0, label);
         }
 
-        public Bpe(boolean annul, CC cc, Label label, boolean predictTaken) {
+        public Bpe(CC cc, boolean annul, boolean predictTaken, Label label) {
             super(annul ? 1 : 0, ConditionFlag.Equal, Op2s.Bp, cc, predictTaken ? 1 : 0, label);
         }
 
@@ -4135,6 +4137,18 @@
         }
     }
 
+    public static class Fxord extends Fmt3p {
+        public Fxord(Register src1, Register src2, Register dst) {
+            super(Ops.ArithOp, Op3s.Impdep1, Opfs.Fxord, src1, src2, dst);
+        }
+    }
+
+    public static class Fxors extends Fmt3p {
+        public Fxors(Register src1, Register src2, Register dst) {
+            super(Ops.ArithOp, Op3s.Impdep1, Opfs.Fxors, src1, src2, dst);
+        }
+    }
+
     public static class Fands extends Fmt3p {
         public Fands(Register src1, Register src2, Register dst) {
             super(Ops.ArithOp, Op3s.Impdep1, Opfs.Fands, src1, src2, dst);
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java	Tue Sep 16 11:49:23 2014 -0700
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java	Tue Sep 16 15:36:00 2014 -0700
@@ -129,7 +129,7 @@
     private void emit8ByteCompare(SPARCMacroAssembler masm, Register result, Register array1, Register array2, Register length, Label trueLabel, Label falseLabel) {
         Label loop = new Label();
         Label compareTail = new Label();
-
+        // new Ldx(new SPARCAddress(o6, 3), g0).emit(masm);
         Register tempReg1 = asRegister(temp4);
         Register tempReg2 = asRegister(temp5);
         new And(result, VECTOR_SIZE - 1, result).emit(masm); // tail count (in bytes)
@@ -137,27 +137,41 @@
         new Bpe(CC.Xcc, compareTail).emit(masm);
         new Nop().emit(masm);
 
+        Label compareTailCorrectVectorEnd = new Label();
+        new Sub(length, VECTOR_SIZE, length).emit(masm);
         new Add(array1, length, array1).emit(masm);
         new Add(array2, length, array2).emit(masm);
         new Sub(g0, length, length).emit(masm);
 
+        // Compare the last element first
+        new Ldx(new SPARCAddress(array1, 0), tempReg1).emit(masm);
+        new Ldx(new SPARCAddress(array2, 0), tempReg2).emit(masm);
+        new Cmp(tempReg1, tempReg2).emit(masm);
+        new Bpne(Xcc, true, false, falseLabel).emit(masm);
+        new Nop().emit(masm);
+        new Bpr(RCondition.Rc_z, false, false, length, compareTailCorrectVectorEnd).emit(masm);
+        new Nop().emit(masm);
+
         // Load the first value from array 1 (Later done in back branch delay-slot)
         new Ldx(new SPARCAddress(array1, length), tempReg1).emit(masm);
         masm.bind(loop);
         new Ldx(new SPARCAddress(array2, length), tempReg2).emit(masm);
-
         new Cmp(tempReg1, tempReg2).emit(masm);
         new Bpne(Xcc, false, false, falseLabel).emit(masm);
         // Delay slot, not annul, add for next iteration
-        new Add(length, VECTOR_SIZE, length).emit(masm);
-
-        new Bpr(RCondition.Rc_nz, true, true, length, loop).emit(masm);
+        new Addcc(length, VECTOR_SIZE, length).emit(masm);
+        new Bpne(Xcc, true, true, loop).emit(masm); // Annul, to prevent access past the array
         new Ldx(new SPARCAddress(array1, length), tempReg1).emit(masm); // Load in delay slot
 
         // Tail count zero, therefore we can go to the end
         new Bpr(RCondition.Rc_z, true, true, result, trueLabel).emit(masm);
         new Nop().emit(masm);
 
+        masm.bind(compareTailCorrectVectorEnd);
+        // Correct the array pointers
+        new Add(array1, VECTOR_SIZE, array1).emit(masm);
+        new Add(array2, VECTOR_SIZE, array2).emit(masm);
+
         masm.bind(compareTail);
     }
 
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 16 11:49:23 2014 -0700
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java	Tue Sep 16 15:36:00 2014 -0700
@@ -23,16 +23,46 @@
 package com.oracle.graal.lir.sparc;
 
 import static com.oracle.graal.api.code.ValueUtil.*;
+import static com.oracle.graal.api.meta.Kind.*;
+import static com.oracle.graal.asm.sparc.SPARCAssembler.*;
 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*;
 import static com.oracle.graal.sparc.SPARC.*;
-import static com.oracle.graal.asm.sparc.SPARCAssembler.*;
-import static com.oracle.graal.api.meta.Kind.*;
 
 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.SPARCMacroAssembler.*;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Add;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Fmovd;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Fmovs;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Fxord;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Fxors;
+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.Movdtox;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Movstosw;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Movstouw;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Movwtos;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Movxtod;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Or;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Rdpc;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stb;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stdf;
+import com.oracle.graal.asm.sparc.SPARCAssembler.Stf;
+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.Setx;
 import com.oracle.graal.compiler.common.*;
 import com.oracle.graal.lir.*;
 import com.oracle.graal.lir.StandardOp.ImplicitNullCheck;
@@ -40,6 +70,7 @@
 import com.oracle.graal.lir.StandardOp.NullCheck;
 import com.oracle.graal.lir.asm.*;
 import com.oracle.graal.sparc.*;
+import com.oracle.graal.sparc.SPARC.CPUFeature;
 
 public class SPARCMove {
 
@@ -734,8 +765,8 @@
                 case Float: {
                     float constant = input.asFloat();
                     int constantBits = java.lang.Float.floatToIntBits(constant);
-                    if (constant == 0.0) {
-                        new Fsubs(asFloatReg(result), asFloatReg(result), asFloatReg(result)).emit(masm);
+                    if (constantBits == 0) {
+                        new Fxors(asFloatReg(result), asFloatReg(result), asFloatReg(result)).emit(masm);
                     } else {
                         if (hasVIS3) {
                             if (isSimm13(constantBits)) {
@@ -758,8 +789,8 @@
                 case Double: {
                     double constant = input.asDouble();
                     long constantBits = java.lang.Double.doubleToLongBits(constant);
-                    if (constant == 0.0d) {
-                        new Fsubd(asDoubleReg(result), asDoubleReg(result), asDoubleReg(result)).emit(masm);
+                    if (constantBits == 0) {
+                        new Fxord(asDoubleReg(result), asDoubleReg(result), asDoubleReg(result)).emit(masm);
                     } else {
                         if (hasVIS3) {
                             if (isSimm13(constantBits)) {