# HG changeset patch # User Stefan Anzinger # Date 1401974905 -7200 # Node ID f96d9c455da50bed03409387afaab40b55d3db6f # Parent fac4af29aeb888baa0b68eaab47ab68fe579b775 Fixing dcmp diff -r fac4af29aeb8 -r f96d9c455da5 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Thu Jun 05 11:28:16 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCCompare.java Thu Jun 05 15:28:25 2014 +0200 @@ -79,11 +79,11 @@ new Cmp(asObjectReg(x), asObjectReg(y)).emit(masm); break; case FCMP: - // masm.ucomiss(asFloatReg(x), asFloatReg(y)); - // break; + new Fcmp(CC.Fcc0, Opfs.Fcmps, asFloatReg(x), asFloatReg(y)).emit(masm); + break; case DCMP: - // masm.ucomisd(asDoubleReg(x), asDoubleReg(y)); - // break; + new Fcmp(CC.Fcc0, Opfs.Fcmpd, asDoubleReg(x), asDoubleReg(y)).emit(masm); + break; default: throw GraalInternalError.shouldNotReachHere(); } diff -r fac4af29aeb8 -r f96d9c455da5 graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Thu Jun 05 11:28:16 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java Thu Jun 05 15:28:25 2014 +0200 @@ -40,6 +40,8 @@ import com.oracle.graal.asm.sparc.SPARCAssembler.Bpne; import com.oracle.graal.asm.sparc.SPARCAssembler.CC; import com.oracle.graal.asm.sparc.SPARCAssembler.ConditionFlag; +import com.oracle.graal.asm.sparc.SPARCAssembler.FCond; +import com.oracle.graal.asm.sparc.SPARCAssembler.Fbfcc; import com.oracle.graal.asm.sparc.SPARCAssembler.Movcc; import com.oracle.graal.asm.sparc.SPARCAssembler.Sub; import com.oracle.graal.asm.sparc.SPARCMacroAssembler.Bpgeu; @@ -322,15 +324,12 @@ // check that we don't overwrite an input operand before it is used. assert !result.equals(trueValue); - SPARCMove.move(crb, masm, result, falseValue); - cmove(crb, masm, kind, result, condition, trueValue); - - if (unorderedIsTrue && !trueOnUnordered(condition)) { - // cmove(crb, masm, result, ConditionFlag.Parity, trueValue); - throw GraalInternalError.unimplemented(); - } else if (!unorderedIsTrue && trueOnUnordered(condition)) { - // cmove(crb, masm, result, ConditionFlag.Parity, falseValue); - throw GraalInternalError.unimplemented(); + SPARCMove.move(crb, masm, result, trueValue); + cmove(crb, masm, kind, result, condition, falseValue); + // TODO: This may be omitted, when doing the right check beforehand (There are + // instructions which control the unordered behavior as well) + if (!unorderedIsTrue) { + cmove(crb, masm, kind, result, ConditionFlag.F_Unordered, falseValue); } } } @@ -349,6 +348,34 @@ case Object: new Movcc(cond, CC.Xcc, asRegister(other), asRegister(result)).emit(masm); break; + case Double: + FCond fc = null; + switch (cond) { + case Equal: + fc = FCond.Fbne; + break; + case Greater: + fc = FCond.Fble; + break; + case GreaterEqual: + fc = FCond.Fbl; + break; + case Less: + fc = FCond.Fbge; + break; + case LessEqual: + fc = FCond.Fbg; + break; + case F_Ordered: + fc = FCond.Fbo; + break; + case F_Unordered: + fc = FCond.Fbu; + break; + } + new Fbfcc(masm, fc, true, 2).equals(masm); + SPARCMove.move(crb, masm, result, other); + break; default: throw GraalInternalError.shouldNotReachHere(); } @@ -384,24 +411,15 @@ case NE: return ConditionFlag.NotEqual; case LT: + return ConditionFlag.Less; case LE: + return ConditionFlag.LessEqual; case GE: + return ConditionFlag.GreaterEqual; case GT: + return ConditionFlag.Greater; default: - throw GraalInternalError.shouldNotReachHere(); - } - } - - private static boolean trueOnUnordered(ConditionFlag condition) { - switch (condition) { - case NotEqual: - case Less: - return false; - case Equal: - case GreaterEqual: - return true; - default: - throw GraalInternalError.shouldNotReachHere(); + throw GraalInternalError.shouldNotReachHere("Unimplemented for " + cond); } } } diff -r fac4af29aeb8 -r f96d9c455da5 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 Thu Jun 05 11:28:16 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Thu Jun 05 15:28:25 2014 +0200 @@ -36,7 +36,6 @@ import com.oracle.graal.lir.*; import com.oracle.graal.lir.StandardOp.*; import com.oracle.graal.lir.asm.*; -import com.sun.org.apache.bcel.internal.generic.*; public class SPARCMove {