# HG changeset patch # User Stefan Anzinger # Date 1410906960 25200 # Node ID dced35fd40f7f9a5d2f1b51e5a55d1fcadd052de # Parent 9a0bf0c3b21e0e8db89676aaa7b26485885c22d7 [SPARC] fix the floatingpoint loading of constant +0.0 and -0.0, changed ArraysCompare more to the C2 implementation. diff -r 9a0bf0c3b21e -r dced35fd40f7 graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java --- 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); diff -r 9a0bf0c3b21e -r dced35fd40f7 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArrayEqualsOp.java --- 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); } diff -r 9a0bf0c3b21e -r dced35fd40f7 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java --- 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)) {