Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: src/crankshaft/mips64/lithium-codegen-mips64.cc

Issue 1784353003: MIPS64: Use BOVC/BNVC for overflow checking on r6. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | src/full-codegen/mips64/full-codegen-mips64.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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/crankshaft/mips64/lithium-codegen-mips64.h" 5 #include "src/crankshaft/mips64/lithium-codegen-mips64.h"
6 6
7 #include "src/code-factory.h" 7 #include "src/code-factory.h"
8 #include "src/code-stubs.h" 8 #include "src/code-stubs.h"
9 #include "src/crankshaft/hydrogen-osr.h" 9 #include "src/crankshaft/hydrogen-osr.h"
10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h" 10 #include "src/crankshaft/mips64/lithium-gap-resolver-mips64.h"
(...skipping 1320 matching lines...) Expand 10 before | Expand all | Expand 10 after
1331 1331
1332 if (bailout_on_minus_zero && (constant < 0)) { 1332 if (bailout_on_minus_zero && (constant < 0)) {
1333 // The case of a null constant will be handled separately. 1333 // The case of a null constant will be handled separately.
1334 // If constant is negative and left is null, the result should be -0. 1334 // If constant is negative and left is null, the result should be -0.
1335 DeoptimizeIf(eq, instr, Deoptimizer::kMinusZero, left, Operand(zero_reg)); 1335 DeoptimizeIf(eq, instr, Deoptimizer::kMinusZero, left, Operand(zero_reg));
1336 } 1336 }
1337 1337
1338 switch (constant) { 1338 switch (constant) {
1339 case -1: 1339 case -1:
1340 if (overflow) { 1340 if (overflow) {
1341 __ DsubuAndCheckForOverflow(result, zero_reg, left, scratch); 1341 Label no_overflow;
1342 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, scratch, 1342 __ DsubBranchNoOvf(result, zero_reg, Operand(left), &no_overflow);
1343 Operand(zero_reg)); 1343 DeoptimizeIf(al, instr);
1344 __ bind(&no_overflow);
1344 } else { 1345 } else {
1345 __ Dsubu(result, zero_reg, left); 1346 __ Dsubu(result, zero_reg, left);
1346 } 1347 }
1347 break; 1348 break;
1348 case 0: 1349 case 0:
1349 if (bailout_on_minus_zero) { 1350 if (bailout_on_minus_zero) {
1350 // If left is strictly negative and the constant is null, the 1351 // If left is strictly negative and the constant is null, the
1351 // result is -0. Deoptimize if required, otherwise return 0. 1352 // result is -0. Deoptimize if required, otherwise return 0.
1352 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero, left, 1353 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero, left,
1353 Operand(zero_reg)); 1354 Operand(zero_reg));
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
1432 1433
1433 if (bailout_on_minus_zero && (constant < 0)) { 1434 if (bailout_on_minus_zero && (constant < 0)) {
1434 // The case of a null constant will be handled separately. 1435 // The case of a null constant will be handled separately.
1435 // If constant is negative and left is null, the result should be -0. 1436 // If constant is negative and left is null, the result should be -0.
1436 DeoptimizeIf(eq, instr, Deoptimizer::kMinusZero, left, Operand(zero_reg)); 1437 DeoptimizeIf(eq, instr, Deoptimizer::kMinusZero, left, Operand(zero_reg));
1437 } 1438 }
1438 1439
1439 switch (constant) { 1440 switch (constant) {
1440 case -1: 1441 case -1:
1441 if (overflow) { 1442 if (overflow) {
1442 __ SubuAndCheckForOverflow(result, zero_reg, left, scratch); 1443 Label no_overflow;
1443 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, scratch, 1444 __ SubBranchNoOvf(result, zero_reg, Operand(left), &no_overflow);
1444 Operand(zero_reg)); 1445 DeoptimizeIf(al, instr);
1446 __ bind(&no_overflow);
1445 } else { 1447 } else {
1446 __ Subu(result, zero_reg, left); 1448 __ Subu(result, zero_reg, left);
1447 } 1449 }
1448 break; 1450 break;
1449 case 0: 1451 case 0:
1450 if (bailout_on_minus_zero) { 1452 if (bailout_on_minus_zero) {
1451 // If left is strictly negative and the constant is null, the 1453 // If left is strictly negative and the constant is null, the
1452 // result is -0. Deoptimize if required, otherwise return 0. 1454 // result is -0. Deoptimize if required, otherwise return 0.
1453 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero, left, 1455 DeoptimizeIf(lt, instr, Deoptimizer::kMinusZero, left,
1454 Operand(zero_reg)); 1456 Operand(zero_reg));
(...skipping 185 matching lines...) Expand 10 before | Expand all | Expand 10 after
1640 void LCodeGen::DoSubS(LSubS* instr) { 1642 void LCodeGen::DoSubS(LSubS* instr) {
1641 LOperand* left = instr->left(); 1643 LOperand* left = instr->left();
1642 LOperand* right = instr->right(); 1644 LOperand* right = instr->right();
1643 LOperand* result = instr->result(); 1645 LOperand* result = instr->result();
1644 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1646 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1645 1647
1646 if (!can_overflow) { 1648 if (!can_overflow) {
1647 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1649 DCHECK(right->IsRegister() || right->IsConstantOperand());
1648 __ Dsubu(ToRegister(result), ToRegister(left), ToOperand(right)); 1650 __ Dsubu(ToRegister(result), ToRegister(left), ToOperand(right));
1649 } else { // can_overflow. 1651 } else { // can_overflow.
1650 Register overflow = scratch0(); 1652 Register scratch = scratch0();
1651 Register scratch = scratch1(); 1653 Label no_overflow_label;
1652 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1654 DCHECK(right->IsRegister() || right->IsConstantOperand());
1653 __ DsubuAndCheckForOverflow(ToRegister(result), ToRegister(left), 1655 __ DsubBranchNoOvf(ToRegister(result), ToRegister(left), ToOperand(right),
1654 ToOperand(right), overflow, scratch); 1656 &no_overflow_label, scratch);
1655 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, overflow, 1657 DeoptimizeIf(al, instr);
1656 Operand(zero_reg)); 1658 __ bind(&no_overflow_label);
1657 } 1659 }
1658 } 1660 }
1659 1661
1660 1662
1661 void LCodeGen::DoSubI(LSubI* instr) { 1663 void LCodeGen::DoSubI(LSubI* instr) {
1662 LOperand* left = instr->left(); 1664 LOperand* left = instr->left();
1663 LOperand* right = instr->right(); 1665 LOperand* right = instr->right();
1664 LOperand* result = instr->result(); 1666 LOperand* result = instr->result();
1665 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1667 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1666 1668
1667 if (!can_overflow) { 1669 if (!can_overflow) {
1668 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1670 DCHECK(right->IsRegister() || right->IsConstantOperand());
1669 __ Subu(ToRegister(result), ToRegister(left), ToOperand(right)); 1671 __ Subu(ToRegister(result), ToRegister(left), ToOperand(right));
1670 } else { // can_overflow. 1672 } else { // can_overflow.
1671 Register overflow = scratch0(); 1673 Register scratch = scratch0();
1672 Register scratch = scratch1(); 1674 Label no_overflow_label;
1673 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1675 DCHECK(right->IsRegister() || right->IsConstantOperand());
1674 __ SubuAndCheckForOverflow(ToRegister(result), ToRegister(left), 1676 __ SubBranchNoOvf(ToRegister(result), ToRegister(left), ToOperand(right),
1675 ToOperand(right), overflow, scratch); 1677 &no_overflow_label, scratch);
1676 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, overflow, 1678 DeoptimizeIf(al, instr);
1677 Operand(zero_reg)); 1679 __ bind(&no_overflow_label);
1678 } 1680 }
1679 } 1681 }
1680 1682
1681 1683
1682 void LCodeGen::DoConstantI(LConstantI* instr) { 1684 void LCodeGen::DoConstantI(LConstantI* instr) {
1683 __ li(ToRegister(instr->result()), Operand(instr->value())); 1685 __ li(ToRegister(instr->result()), Operand(instr->value()));
1684 } 1686 }
1685 1687
1686 1688
1687 void LCodeGen::DoConstantS(LConstantS* instr) { 1689 void LCodeGen::DoConstantS(LConstantS* instr) {
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after
1801 void LCodeGen::DoAddS(LAddS* instr) { 1803 void LCodeGen::DoAddS(LAddS* instr) {
1802 LOperand* left = instr->left(); 1804 LOperand* left = instr->left();
1803 LOperand* right = instr->right(); 1805 LOperand* right = instr->right();
1804 LOperand* result = instr->result(); 1806 LOperand* result = instr->result();
1805 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1807 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1806 1808
1807 if (!can_overflow) { 1809 if (!can_overflow) {
1808 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1810 DCHECK(right->IsRegister() || right->IsConstantOperand());
1809 __ Daddu(ToRegister(result), ToRegister(left), ToOperand(right)); 1811 __ Daddu(ToRegister(result), ToRegister(left), ToOperand(right));
1810 } else { // can_overflow. 1812 } else { // can_overflow.
1811 Register overflow = scratch0(); 1813 Label no_overflow_label;
1812 Register scratch = scratch1(); 1814 Register scratch = scratch1();
1813 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1815 DCHECK(right->IsRegister() || right->IsConstantOperand());
1814 __ DadduAndCheckForOverflow(ToRegister(result), ToRegister(left), 1816 __ DaddBranchNoOvf(ToRegister(result), ToRegister(left), ToOperand(right),
1815 ToOperand(right), overflow, scratch); 1817 &no_overflow_label, scratch);
1816 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, overflow, 1818 DeoptimizeIf(al, instr);
1817 Operand(zero_reg)); 1819 __ bind(&no_overflow_label);
1818 } 1820 }
1819 } 1821 }
1820 1822
1821 1823
1822 void LCodeGen::DoAddI(LAddI* instr) { 1824 void LCodeGen::DoAddI(LAddI* instr) {
1823 LOperand* left = instr->left(); 1825 LOperand* left = instr->left();
1824 LOperand* right = instr->right(); 1826 LOperand* right = instr->right();
1825 LOperand* result = instr->result(); 1827 LOperand* result = instr->result();
1826 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow); 1828 bool can_overflow = instr->hydrogen()->CheckFlag(HValue::kCanOverflow);
1827 1829
1828 if (!can_overflow) { 1830 if (!can_overflow) {
1829 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1831 DCHECK(right->IsRegister() || right->IsConstantOperand());
1830 __ Addu(ToRegister(result), ToRegister(left), ToOperand(right)); 1832 __ Addu(ToRegister(result), ToRegister(left), ToOperand(right));
1831 } else { // can_overflow. 1833 } else { // can_overflow.
1832 Register overflow = scratch0(); 1834 Label no_overflow_label;
1833 Register scratch = scratch1(); 1835 Register scratch = scratch1();
1834 DCHECK(right->IsRegister() || right->IsConstantOperand()); 1836 DCHECK(right->IsRegister() || right->IsConstantOperand());
1835 __ AdduAndCheckForOverflow(ToRegister(result), ToRegister(left), 1837 __ AddBranchNoOvf(ToRegister(result), ToRegister(left), ToOperand(right),
1836 ToOperand(right), overflow, scratch); 1838 &no_overflow_label, scratch);
1837 DeoptimizeIf(lt, instr, Deoptimizer::kOverflow, overflow, 1839 DeoptimizeIf(al, instr);
1838 Operand(zero_reg)); 1840 __ bind(&no_overflow_label);
1839 } 1841 }
1840 } 1842 }
1841 1843
1842 1844
1843 void LCodeGen::DoMathMinMax(LMathMinMax* instr) { 1845 void LCodeGen::DoMathMinMax(LMathMinMax* instr) {
1844 LOperand* left = instr->left(); 1846 LOperand* left = instr->left();
1845 LOperand* right = instr->right(); 1847 LOperand* right = instr->right();
1846 HMathMinMax::Operation operation = instr->hydrogen()->operation(); 1848 HMathMinMax::Operation operation = instr->hydrogen()->operation();
1847 Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge; 1849 Condition condition = (operation == HMathMinMax::kMathMin) ? le : ge;
1848 if (instr->hydrogen()->representation().IsSmiOrInteger32()) { 1850 if (instr->hydrogen()->representation().IsSmiOrInteger32()) {
(...skipping 3911 matching lines...) Expand 10 before | Expand all | Expand 10 after
5760 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) { 5762 void LCodeGen::DoStoreFrameContext(LStoreFrameContext* instr) {
5761 Register context = ToRegister(instr->context()); 5763 Register context = ToRegister(instr->context());
5762 __ sd(context, MemOperand(fp, StandardFrameConstants::kContextOffset)); 5764 __ sd(context, MemOperand(fp, StandardFrameConstants::kContextOffset));
5763 } 5765 }
5764 5766
5765 5767
5766 #undef __ 5768 #undef __
5767 5769
5768 } // namespace internal 5770 } // namespace internal
5769 } // namespace v8 5771 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | src/full-codegen/mips64/full-codegen-mips64.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698