| 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 d6d5ac5b2097b9142c9196bc578402bb85c9c75a..adfa4f4ea71f26e7feb7f3c704877358186824a2 100644
|
| --- a/src/compiler/mips/code-generator-mips.cc
|
| +++ b/src/compiler/mips/code-generator-mips.cc
|
| @@ -54,6 +54,18 @@ class MipsOperandConverter final : public InstructionOperandConverter {
|
| return ToDoubleRegister(op);
|
| }
|
|
|
| + DoubleRegister InputOrZeroDoubleRegister(size_t index) {
|
| + if (instr_->InputAt(index)->IsImmediate()) return kDoubleRegZero;
|
| +
|
| + return InputDoubleRegister(index);
|
| + }
|
| +
|
| + DoubleRegister InputOrZeroSingleRegister(size_t index) {
|
| + if (instr_->InputAt(index)->IsImmediate()) return kDoubleRegZero;
|
| +
|
| + return InputSingleRegister(index);
|
| + }
|
| +
|
| Operand InputImmediate(size_t index) {
|
| Constant constant = ToConstant(instr_->InputAt(index));
|
| switch (constant.type()) {
|
| @@ -927,14 +939,24 @@ void CodeGenerator::AssembleArchBranch(Instruction* instr, BranchInfo* branch) {
|
| if (!convertCondition(branch->condition, cc)) {
|
| UNSUPPORTED_COND(kMips64CmpS, branch->condition);
|
| }
|
| - __ BranchF32(tlabel, NULL, cc, i.InputSingleRegister(0),
|
| - i.InputSingleRegister(1));
|
| + FPURegister left = i.InputOrZeroSingleRegister(0);
|
| + FPURegister right = i.InputOrZeroSingleRegister(1);
|
| + if ((left.is(kDoubleRegZero) || right.is(kDoubleRegZero)) &&
|
| + !__ IsDoubleZeroRegSet()) {
|
| + __ Move(kDoubleRegZero, 0.0);
|
| + }
|
| + __ BranchF32(tlabel, NULL, cc, left, right);
|
| } else if (instr->arch_opcode() == kMipsCmpD) {
|
| if (!convertCondition(branch->condition, cc)) {
|
| UNSUPPORTED_COND(kMips64CmpD, branch->condition);
|
| }
|
| - __ BranchF64(tlabel, NULL, cc, i.InputDoubleRegister(0),
|
| - i.InputDoubleRegister(1));
|
| + FPURegister left = i.InputOrZeroDoubleRegister(0);
|
| + FPURegister right = i.InputOrZeroDoubleRegister(1);
|
| + if ((left.is(kDoubleRegZero) || right.is(kDoubleRegZero)) &&
|
| + !__ IsDoubleZeroRegSet()) {
|
| + __ Move(kDoubleRegZero, 0.0);
|
| + }
|
| + __ BranchF64(tlabel, NULL, cc, left, right);
|
| } else {
|
| PrintF("AssembleArchBranch Unimplemented arch_opcode: %d\n",
|
| instr->arch_opcode());
|
| @@ -1046,8 +1068,12 @@ void CodeGenerator::AssembleArchBoolean(Instruction* instr,
|
| return;
|
| } else if (instr->arch_opcode() == kMipsCmpD ||
|
| instr->arch_opcode() == kMipsCmpS) {
|
| - FPURegister left = i.InputDoubleRegister(0);
|
| - FPURegister right = i.InputDoubleRegister(1);
|
| + FPURegister left = i.InputOrZeroDoubleRegister(0);
|
| + FPURegister right = i.InputOrZeroDoubleRegister(1);
|
| + if ((left.is(kDoubleRegZero) || right.is(kDoubleRegZero)) &&
|
| + !__ IsDoubleZeroRegSet()) {
|
| + __ Move(kDoubleRegZero, 0.0);
|
| + }
|
| bool predicate;
|
| FPUCondition cc = FlagsConditionToConditionCmpFPU(predicate, condition);
|
| if (!IsMipsArchVariant(kMips32r6)) {
|
|
|