changeset 17018:e91533b86166

[SPARC] Fix dacapo sunflow test (Unordered branching is now implemented right)
author Stefan Anzinger <stefan.anzinger@oracle.com>
date Thu, 28 Aug 2014 19:24:52 -0700
parents e4cfc9ea2bd3
children 1013a8444746
files graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java
diffstat 2 files changed, 27 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Aug 28 17:49:37 2014 -0700
+++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java	Thu Aug 28 19:24:52 2014 -0700
@@ -224,7 +224,6 @@
                     double trueDestinationProbability) {
         boolean mirrored = emitCompare(cmpKind, left, right);
         Condition finalCondition = mirrored ? cond.mirror() : cond;
-        boolean finalUnorderedIsTrue = mirrored ? !unorderedIsTrue : unorderedIsTrue;
 
         Kind kind = left.getKind().getStackKind();
         switch (kind) {
@@ -235,7 +234,7 @@
                 break;
             case Float:
             case Double:
-                append(new BranchOp(finalCondition, trueDestination, falseDestination, kind, finalUnorderedIsTrue));
+                append(new BranchOp(finalCondition, trueDestination, falseDestination, kind, unorderedIsTrue));
                 break;
             default:
                 throw GraalInternalError.shouldNotReachHere("" + left.getKind());
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Thu Aug 28 17:49:37 2014 -0700
+++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCControlFlow.java	Thu Aug 28 19:24:52 2014 -0700
@@ -139,28 +139,44 @@
     }
 
     private static void emitFloatCompare(SPARCMacroAssembler masm, Label target, Condition actualCondition, boolean branchOnUnordered) {
-        if (branchOnUnordered) {
-            // new Fbu(false, target).emit(masm);
-            // new Nop().emit(masm);
-        }
         switch (actualCondition) {
             case EQ:
-                new Fbe(false, target).emit(masm);
+                if (branchOnUnordered) {
+                    new Fbue(false, target).emit(masm);
+                } else {
+                    new Fbe(false, target).emit(masm);
+                }
                 break;
             case NE:
-                new Fbne(false, target).emit(masm);
+                new Fbne(false, target).emit(masm); // Is also unordered
                 break;
             case LT:
-                new Fbl(false, target).emit(masm);
+                if (branchOnUnordered) {
+                    new Fbul(false, target).emit(masm);
+                } else {
+                    new Fbl(false, target).emit(masm);
+                }
                 break;
             case LE:
-                new Fble(false, target).emit(masm);
+                if (branchOnUnordered) {
+                    new Fbule(false, target).emit(masm);
+                } else {
+                    new Fble(false, target).emit(masm);
+                }
                 break;
             case GT:
-                new Fbg(false, target).emit(masm);
+                if (branchOnUnordered) {
+                    new Fbug(false, target).emit(masm);
+                } else {
+                    new Fbg(false, target).emit(masm);
+                }
                 break;
             case GE:
-                new Fbge(false, target).emit(masm);
+                if (branchOnUnordered) {
+                    new Fbuge(false, target).emit(masm);
+                } else {
+                    new Fbge(false, target).emit(masm);
+                }
                 break;
             case AE:
             case AT: