Chromium Code Reviews| Index: src/compiler/mips/code-generator-mips.cc |
| diff --git a/src/compiler/mips/code-generator-mips.cc b/src/compiler/mips/code-generator-mips.cc |
| index 792abef24f40777d65de5c93e2dac1ca7de7c3f9..2edf8814a11b57e673fb131142ca27741b39020c 100644 |
| --- a/src/compiler/mips/code-generator-mips.cc |
| +++ b/src/compiler/mips/code-generator-mips.cc |
| @@ -203,6 +203,78 @@ class OutOfLineCeil FINAL : public OutOfLineRound { |
| : OutOfLineRound(gen, result) {} |
| }; |
| + |
| +Condition FlagsConditionToConditionCmp(FlagsCondition condition) { |
| + switch (condition) { |
| + case kEqual: |
| + return eq; |
| + break; |
|
paul.l...
2015/01/13 17:34:57
Please remove the unnecessary break's after the re
balazs.kilvady
2015/01/13 18:23:40
Done.
|
| + case kNotEqual: |
| + return ne; |
| + break; |
| + case kSignedLessThan: |
| + return lt; |
| + break; |
| + case kSignedGreaterThanOrEqual: |
| + return ge; |
| + break; |
| + case kSignedLessThanOrEqual: |
| + return le; |
| + break; |
| + case kSignedGreaterThan: |
| + return gt; |
| + break; |
| + case kUnsignedLessThan: |
| + return lo; |
| + break; |
| + case kUnsignedGreaterThanOrEqual: |
| + return hs; |
| + break; |
| + case kUnsignedLessThanOrEqual: |
| + return ls; |
| + break; |
| + case kUnsignedGreaterThan: |
| + return hi; |
| + break; |
| + default: |
| + break; |
| + } |
| + UNREACHABLE(); |
| + return kNoCondition; |
| +} |
| + |
| + |
| +Condition FlagsConditionToConditionTst(FlagsCondition condition) { |
| + switch (condition) { |
| + case kNotEqual: |
| + return ne; |
| + break; |
| + case kEqual: |
| + return eq; |
| + break; |
| + default: |
| + break; |
| + } |
| + UNREACHABLE(); |
| + return kNoCondition; |
| +} |
| + |
| + |
| +Condition FlagsConditionToConditionOvf(FlagsCondition condition) { |
| + switch (condition) { |
| + case kOverflow: |
| + return lt; |
| + break; |
| + case kNotOverflow: |
| + return ge; |
| + break; |
| + default: |
| + break; |
| + } |
| + UNREACHABLE(); |
| + return kNoCondition; |
| +} |
| + |
| } // namespace |
| @@ -646,73 +718,19 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { |
| // not separated by other instructions. |
| if (instr->arch_opcode() == kMipsTst) { |
| - switch (branch->condition) { |
| - case kNotEqual: |
| - cc = ne; |
| - break; |
| - case kEqual: |
| - cc = eq; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsTst, branch->condition); |
| - break; |
| - } |
| + cc = FlagsConditionToConditionTst(branch->condition); |
| __ And(at, i.InputRegister(0), i.InputOperand(1)); |
| __ Branch(tlabel, cc, at, Operand(zero_reg)); |
| } else if (instr->arch_opcode() == kMipsAddOvf || |
| instr->arch_opcode() == kMipsSubOvf) { |
| // kMipsAddOvf, SubOvf emit negative result to 'kCompareReg' on overflow. |
| - switch (branch->condition) { |
| - case kOverflow: |
| - cc = lt; |
| - break; |
| - case kNotOverflow: |
| - cc = ge; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsAddOvf, branch->condition); |
| - break; |
| - } |
| + cc = FlagsConditionToConditionOvf(branch->condition); |
| __ Branch(tlabel, cc, kCompareReg, Operand(zero_reg)); |
| } else if (instr->arch_opcode() == kMipsCmp) { |
| - switch (branch->condition) { |
| - case kEqual: |
| - cc = eq; |
| - break; |
| - case kNotEqual: |
| - cc = ne; |
| - break; |
| - case kSignedLessThan: |
| - cc = lt; |
| - break; |
| - case kSignedGreaterThanOrEqual: |
| - cc = ge; |
| - break; |
| - case kSignedLessThanOrEqual: |
| - cc = le; |
| - break; |
| - case kSignedGreaterThan: |
| - cc = gt; |
| - break; |
| - case kUnsignedLessThan: |
| - cc = lo; |
| - break; |
| - case kUnsignedGreaterThanOrEqual: |
| - cc = hs; |
| - break; |
| - case kUnsignedLessThanOrEqual: |
| - cc = ls; |
| - break; |
| - case kUnsignedGreaterThan: |
| - cc = hi; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsCmp, branch->condition); |
| - break; |
| - } |
| - __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1)); |
| + cc = FlagsConditionToConditionCmp(branch->condition); |
| + __ Branch(tlabel, cc, i.InputRegister(0), i.InputOperand(1)); |
| if (!branch->fallthru) __ Branch(flabel); // no fallthru to flabel. |
| @@ -721,24 +739,24 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) { |
| // even if we have to unfold BranchF macro. |
| Label* nan = flabel; |
| switch (branch->condition) { |
| - case kUnorderedEqual: |
| + case kEqual: |
| cc = eq; |
| break; |
| - case kUnorderedNotEqual: |
| + case kNotEqual: |
| cc = ne; |
| nan = tlabel; |
| break; |
| - case kUnorderedLessThan: |
| + case kUnsignedLessThan: |
| cc = lt; |
| break; |
| - case kUnorderedGreaterThanOrEqual: |
| + case kUnsignedGreaterThanOrEqual: |
| cc = ge; |
| nan = tlabel; |
| break; |
| - case kUnorderedLessThanOrEqual: |
| + case kUnsignedLessThanOrEqual: |
| cc = le; |
| break; |
| - case kUnorderedGreaterThan: |
| + case kUnsignedGreaterThan: |
| cc = gt; |
| nan = tlabel; |
| break; |
| @@ -788,17 +806,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| // TODO(plind): Add CHECK() to ensure that test/cmp and this branch were |
| // not separated by other instructions. |
| if (instr->arch_opcode() == kMipsTst) { |
| - switch (condition) { |
| - case kNotEqual: |
| - cc = ne; |
| - break; |
| - case kEqual: |
| - cc = eq; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsTst, condition); |
| - break; |
| - } |
| + cc = FlagsConditionToConditionTst(condition); |
| __ And(at, i.InputRegister(0), i.InputOperand(1)); |
| __ Branch(USE_DELAY_SLOT, &done, cc, at, Operand(zero_reg)); |
| __ li(result, Operand(1)); // In delay slot. |
| @@ -806,17 +814,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| } else if (instr->arch_opcode() == kMipsAddOvf || |
| instr->arch_opcode() == kMipsSubOvf) { |
| // kMipsAddOvf, SubOvf emits negative result to 'kCompareReg' on overflow. |
| - switch (condition) { |
| - case kOverflow: |
| - cc = lt; |
| - break; |
| - case kNotOverflow: |
| - cc = ge; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsAddOvf, condition); |
| - break; |
| - } |
| + cc = FlagsConditionToConditionOvf(condition); |
| __ Branch(USE_DELAY_SLOT, &done, cc, kCompareReg, Operand(zero_reg)); |
| __ li(result, Operand(1)); // In delay slot. |
| @@ -824,41 +822,7 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| } else if (instr->arch_opcode() == kMipsCmp) { |
| Register left = i.InputRegister(0); |
| Operand right = i.InputOperand(1); |
| - switch (condition) { |
| - case kEqual: |
| - cc = eq; |
| - break; |
| - case kNotEqual: |
| - cc = ne; |
| - break; |
| - case kSignedLessThan: |
| - cc = lt; |
| - break; |
| - case kSignedGreaterThanOrEqual: |
| - cc = ge; |
| - break; |
| - case kSignedLessThanOrEqual: |
| - cc = le; |
| - break; |
| - case kSignedGreaterThan: |
| - cc = gt; |
| - break; |
| - case kUnsignedLessThan: |
| - cc = lo; |
| - break; |
| - case kUnsignedGreaterThanOrEqual: |
| - cc = hs; |
| - break; |
| - case kUnsignedLessThanOrEqual: |
| - cc = ls; |
| - break; |
| - case kUnsignedGreaterThan: |
| - cc = hi; |
| - break; |
| - default: |
| - UNSUPPORTED_COND(kMipsCmp, condition); |
| - break; |
| - } |
| + cc = FlagsConditionToConditionCmp(condition); |
| __ Branch(USE_DELAY_SLOT, &done, cc, left, right); |
| __ li(result, Operand(1)); // In delay slot. |
| @@ -870,30 +834,30 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr, |
| FPURegister dummy1 = f0; |
| FPURegister dummy2 = f2; |
| switch (condition) { |
| - case kUnorderedEqual: |
| + case kEqual: |
| // TODO(plind): improve the NaN testing throughout this function. |
| __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2); |
| cc = eq; |
| break; |
| - case kUnorderedNotEqual: |
| + 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 kUnorderedLessThan: |
| + case kUnsignedLessThan: |
| __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2); |
| cc = lt; |
| break; |
| - case kUnorderedGreaterThanOrEqual: |
| + 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 kUnorderedLessThanOrEqual: |
| + case kUnsignedLessThanOrEqual: |
| __ BranchF(NULL, &false_value, kNoCondition, dummy1, dummy2); |
| cc = le; |
| break; |
| - case kUnorderedGreaterThan: |
| + case kUnsignedGreaterThan: |
| __ BranchF(USE_DELAY_SLOT, NULL, &done, kNoCondition, dummy1, dummy2); |
| __ li(result, Operand(1)); // In delay slot - returns 1 on NaN. |
| cc = gt; |