Revert "MIPS:[turbofan] Improve unordered comparisons for boolean materialization."
authorpaul.lind <paul.lind@imgtec.com>
Wed, 4 Feb 2015 21:28:43 +0000 (13:28 -0800)
committerCommit bot <commit-bot@chromium.org>
Wed, 4 Feb 2015 21:28:55 +0000 (21:28 +0000)
Reason for revert:
Fails mjsunit/asm/embenchen/box2d

BUG=

Review URL: https://codereview.chromium.org/893993003

Cr-Commit-Position: refs/heads/master@{#26444}

src/compiler/mips/code-generator-mips.cc
src/compiler/mips64/code-generator-mips64.cc
src/mips64/assembler-mips64.h

index 67f49c6d6edcd9ba64e2a4ccf65908dcd2738ab4..39d1d4ad96c8efcdca8884fefc38dbc6d363f4e7 100644 (file)
@@ -262,33 +262,6 @@ Condition FlagsConditionToConditionOvf(FlagsCondition condition) {
   return kNoCondition;
 }
 
-FPUCondition FlagsConditionToConditionCmpD(bool& predicate,
-                                           FlagsCondition condition) {
-  switch (condition) {
-    case kEqual:
-      predicate = true;
-      return EQ;
-    case kNotEqual:
-      predicate = false;
-      return EQ;
-    case kUnsignedLessThan:
-      predicate = true;
-      return OLT;
-    case kUnsignedLessThanOrEqual:
-      predicate = true;
-      return OLE;
-    case kUnorderedEqual:
-    case kUnorderedNotEqual:
-      predicate = true;
-      break;
-    default:
-      predicate = true;
-      break;
-  }
-  UNREACHABLE();
-  return kNoFPUCondition;
-}
-
 }  // namespace
 
 
@@ -817,6 +790,8 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
   // in the false case, where we fall thru the branch, we reset the result
   // false.
 
+  // TODO(plind): Add CHECK() to ensure that test/cmp and this branch were
+  //    not separated by other instructions.
   if (instr->arch_opcode() == kMipsTst) {
     cc = FlagsConditionToConditionTst(condition);
     __ And(at, i.InputRegister(0), i.InputOperand(1));
@@ -830,6 +805,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
     __ Branch(USE_DELAY_SLOT, &done, cc, kCompareReg, Operand(zero_reg));
     __ li(result, Operand(1));  // In delay slot.
 
+
   } else if (instr->arch_opcode() == kMipsCmp) {
     Register left = i.InputRegister(0);
     Operand right = i.InputOperand(1);
@@ -840,33 +816,54 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
   } else if (instr->arch_opcode() == kMipsCmpD) {
     FPURegister left = i.InputDoubleRegister(0);
     FPURegister right = i.InputDoubleRegister(1);
-
-    bool predicate;
-    FPUCondition cc = FlagsConditionToConditionCmpD(predicate, condition);
-    if (!IsMipsArchVariant(kMips32r6)) {
-      __ li(result, Operand(1));
-      __ c(cc, D, left, right);
-      if (predicate) {
-        __ Movf(result, zero_reg);
-      } else {
-        __ Movt(result, zero_reg);
-      }
-    } else {
-      __ cmp(cc, L, kDoubleCompareReg, left, right);
-      __ mfc1(at, kDoubleCompareReg);
-      __ srl(result, at, 31);  // Cmp returns all 1s for true.
-      if (!predicate)          // Toggle result for not equal.
-        __ xori(result, result, 1);
+    // TODO(plind): Provide NaN-testing macro-asm function without need for
+    // BranchF.
+    FPURegister dummy1 = f0;
+    FPURegister dummy2 = f2;
+    switch (condition) {
+      case kEqual:
+        // TODO(plind):  improve the NaN testing throughout this function.
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = eq;
+        break;
+      case kNotEqual:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = ne;
+        break;
+      case kUnsignedLessThan:
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = lt;
+        break;
+      case kUnsignedGreaterThanOrEqual:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = ge;
+        break;
+      case kUnsignedLessThanOrEqual:
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = le;
+        break;
+      case kUnsignedGreaterThan:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = gt;
+        break;
+      default:
+        UNSUPPORTED_COND(kMipsCmp, condition);
+        break;
     }
-    return;
+    __ BranchF(USE_DELAY_SLOT, &done, NULL, cc, left, right);
+    __ li(result, Operand(1));  // In delay slot - branch taken returns 1.
+                                // Fall-thru (branch not taken) returns 0.
+
   } else {
     PrintF("AssembleArchBranch Unimplemented arch_opcode is : %d\n",
            instr->arch_opcode());
     TRACE_UNIMPL();
     UNIMPLEMENTED();
   }
-
-  // Fallthrough case is the false materialization.
+  // Fallthru case is the false materialization.
   __ bind(&false_value);
   __ li(result, Operand(0));
   __ bind(&done);
index 1ee4f2507606d1c1a78a41afc07ec97eafaedc5a..1c97d1a43630def89d27952b4d3cc766bfd2b451 100644 (file)
@@ -262,34 +262,6 @@ Condition FlagsConditionToConditionOvf(FlagsCondition condition) {
   return kNoCondition;
 }
 
-
-FPUCondition FlagsConditionToConditionCmpD(bool& predicate,
-                                           FlagsCondition condition) {
-  switch (condition) {
-    case kEqual:
-      predicate = true;
-      return EQ;
-    case kNotEqual:
-      predicate = false;
-      return EQ;
-    case kUnsignedLessThan:
-      predicate = true;
-      return OLT;
-    case kUnsignedLessThanOrEqual:
-      predicate = true;
-      return OLE;
-    case kUnorderedEqual:
-    case kUnorderedNotEqual:
-      predicate = true;
-      break;
-    default:
-      predicate = true;
-      break;
-  }
-  UNREACHABLE();
-  return kNoFPUCondition;
-}
-
 }  // namespace
 
 
@@ -996,25 +968,47 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
   } else if (instr->arch_opcode() == kMips64CmpD) {
     FPURegister left = i.InputDoubleRegister(0);
     FPURegister right = i.InputDoubleRegister(1);
-
-    bool predicate;
-    FPUCondition cc = FlagsConditionToConditionCmpD(predicate, condition);
-    if (kArchVariant != kMips64r6) {
-      __ li(result, Operand(1));
-      __ c(cc, D, left, right);
-      if (predicate) {
-        __ Movf(result, zero_reg);
-      } else {
-        __ Movt(result, zero_reg);
-      }
-    } else {
-      __ cmp(cc, L, kDoubleCompareReg, left, right);
-      __ dmfc1(at, kDoubleCompareReg);
-      __ dsrl32(result, at, 31);  // Cmp returns all 1s for true.
-      if (!predicate)             // Toggle result for not equal.
-        __ xori(result, result, 1);
+    // TODO(plind): Provide NaN-testing macro-asm function without need for
+    // BranchF.
+    FPURegister dummy1 = f0;
+    FPURegister dummy2 = f2;
+    switch (condition) {
+      case kEqual:
+        // TODO(plind):  improve the NaN testing throughout this function.
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = eq;
+        break;
+      case kNotEqual:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = ne;
+        break;
+      case kUnsignedLessThan:
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = lt;
+        break;
+      case kUnsignedGreaterThanOrEqual:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = ge;
+        break;
+      case kUnsignedLessThanOrEqual:
+        __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2);
+        cc = le;
+        break;
+      case kUnsignedGreaterThan:
+        __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2);
+        __ li(result, Operand(1));  // In delay slot - returns 1 on NaN.
+        cc = gt;
+        break;
+      default:
+        UNSUPPORTED_COND(kMips64Cmp, condition);
+        break;
     }
-    return;
+    __ BranchF(USE_DELAY_SLOT, &done, NULL, cc, left, right);
+    __ li(result, Operand(1));  // In delay slot - branch taken returns 1.
+                                // Fall-thru (branch not taken) returns 0.
+
   } else {
     PrintF("AssembleArchBranch Unimplemented arch_opcode is : %d\n",
            instr->arch_opcode());
index 969b31bb25cc59becdbc999631e6442bd741e2c3..5ca2f3ad0353b14620be03f65d8edfda3ed4bc8a 100644 (file)
@@ -323,8 +323,6 @@ const FPURegister f31 = { 31 };
 #define kLithiumScratchReg2 s4
 #define kLithiumScratchDouble f30
 #define kDoubleRegZero f28
-// Used on mips64r6 for compare operations.
-#define kDoubleCompareReg f31
 
 // FPU (coprocessor 1) control registers.
 // Currently only FCSR (#31) is implemented.