OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/ast/scopes.h" | 5 #include "src/ast/scopes.h" |
6 #include "src/compiler/code-generator.h" | 6 #include "src/compiler/code-generator.h" |
7 #include "src/compiler/code-generator-impl.h" | 7 #include "src/compiler/code-generator-impl.h" |
8 #include "src/compiler/gap-resolver.h" | 8 #include "src/compiler/gap-resolver.h" |
9 #include "src/compiler/node-matchers.h" | 9 #include "src/compiler/node-matchers.h" |
10 #include "src/compiler/osr.h" | 10 #include "src/compiler/osr.h" |
(...skipping 1776 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1787 // instructions that do the actual comparison. Essential that the input | 1787 // instructions that do the actual comparison. Essential that the input |
1788 // registers to compare pseudo-op are not modified before this branch op, as | 1788 // registers to compare pseudo-op are not modified before this branch op, as |
1789 // they are tested here. | 1789 // they are tested here. |
1790 | 1790 |
1791 if (instr->arch_opcode() == kMips64Tst) { | 1791 if (instr->arch_opcode() == kMips64Tst) { |
1792 cc = FlagsConditionToConditionTst(branch->condition); | 1792 cc = FlagsConditionToConditionTst(branch->condition); |
1793 __ And(at, i.InputRegister(0), i.InputOperand(1)); | 1793 __ And(at, i.InputRegister(0), i.InputOperand(1)); |
1794 __ Branch(tlabel, cc, at, Operand(zero_reg)); | 1794 __ Branch(tlabel, cc, at, Operand(zero_reg)); |
1795 } else if (instr->arch_opcode() == kMips64Dadd || | 1795 } else if (instr->arch_opcode() == kMips64Dadd || |
1796 instr->arch_opcode() == kMips64Dsub) { | 1796 instr->arch_opcode() == kMips64Dsub) { |
1797 Label done; | |
1798 cc = FlagsConditionToConditionOvf(branch->condition); | 1797 cc = FlagsConditionToConditionOvf(branch->condition); |
1799 __ dsra32(kScratchReg, i.OutputRegister(), 0); | 1798 __ dsra32(kScratchReg, i.OutputRegister(), 0); |
1800 __ sra(at, i.OutputRegister(), 31); | 1799 __ sra(at, i.OutputRegister(), 31); |
1801 __ Branch(&done, NegateCondition(cc), at, Operand(kScratchReg)); | 1800 __ Branch(tlabel, cc, at, Operand(kScratchReg)); |
1802 // If we deoptimize, check if output register is the same as input | |
1803 // registers, if yes input values are overwritten so fix them first. | |
1804 if (instr->InputAt(1)->IsRegister()) { | |
1805 if (i.InputRegister(0).is(i.OutputRegister()) && | |
1806 i.InputRegister(1).is(i.OutputRegister())) { | |
1807 __ dsra(i.OutputRegister(), i.OutputRegister(), 1); | |
1808 } | |
1809 } | |
1810 __ Branch(tlabel); | |
1811 __ bind(&done); | |
1812 } else if (instr->arch_opcode() == kMips64DaddOvf) { | 1801 } else if (instr->arch_opcode() == kMips64DaddOvf) { |
1813 switch (branch->condition) { | 1802 switch (branch->condition) { |
1814 case kOverflow: | 1803 case kOverflow: |
1815 __ DaddBranchOvf(i.OutputRegister(), i.InputRegister(0), | 1804 __ DaddBranchOvf(i.OutputRegister(), i.InputRegister(0), |
1816 i.InputOperand(1), tlabel, flabel); | 1805 i.InputOperand(1), tlabel, flabel); |
1817 break; | 1806 break; |
1818 case kNotOverflow: | 1807 case kNotOverflow: |
1819 __ DaddBranchOvf(i.OutputRegister(), i.InputRegister(0), | 1808 __ DaddBranchOvf(i.OutputRegister(), i.InputRegister(0), |
1820 i.InputOperand(1), flabel, tlabel); | 1809 i.InputOperand(1), flabel, tlabel); |
1821 break; | 1810 break; |
(...skipping 561 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2383 padding_size -= v8::internal::Assembler::kInstrSize; | 2372 padding_size -= v8::internal::Assembler::kInstrSize; |
2384 } | 2373 } |
2385 } | 2374 } |
2386 } | 2375 } |
2387 | 2376 |
2388 #undef __ | 2377 #undef __ |
2389 | 2378 |
2390 } // namespace compiler | 2379 } // namespace compiler |
2391 } // namespace internal | 2380 } // namespace internal |
2392 } // namespace v8 | 2381 } // namespace v8 |
OLD | NEW |