| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1356 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1367 return AssignEnvironment(new(zone()) LDeoptimize); | 1367 return AssignEnvironment(new(zone()) LDeoptimize); |
| 1368 } | 1368 } |
| 1369 | 1369 |
| 1370 | 1370 |
| 1371 LInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { | 1371 LInstruction* LChunkBuilder::DoDivByPowerOf2I(HDiv* instr) { |
| 1372 ASSERT(instr->representation().IsInteger32()); | 1372 ASSERT(instr->representation().IsInteger32()); |
| 1373 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1373 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1374 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1374 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1375 LOperand* dividend = UseRegister(instr->left()); | 1375 LOperand* dividend = UseRegister(instr->left()); |
| 1376 int32_t divisor = instr->right()->GetInteger32Constant(); | 1376 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1377 LInstruction* result = | 1377 LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( |
| 1378 DefineAsRegister(new(zone()) LDivByPowerOf2I(dividend, divisor)); | 1378 dividend, divisor)); |
| 1379 bool can_deopt = | 1379 if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || |
| 1380 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1380 (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || |
| 1381 instr->left()->RangeCanInclude(0) && divisor < 0) || | |
| 1382 (instr->CheckFlag(HValue::kCanOverflow) && | |
| 1383 instr->left()->RangeCanInclude(kMinInt) && divisor == -1) || | |
| 1384 (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && | 1381 (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && |
| 1385 divisor != 1 && divisor != -1); | 1382 divisor != 1 && divisor != -1)) { |
| 1386 return can_deopt ? AssignEnvironment(result) : result; | 1383 result = AssignEnvironment(result); |
| 1384 } |
| 1385 return result; |
| 1387 } | 1386 } |
| 1388 | 1387 |
| 1389 | 1388 |
| 1390 LInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { | 1389 LInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { |
| 1391 ASSERT(instr->representation().IsInteger32()); | 1390 ASSERT(instr->representation().IsInteger32()); |
| 1392 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1391 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1393 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1392 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1394 LOperand* dividend = UseRegister(instr->left()); | 1393 LOperand* dividend = UseRegister(instr->left()); |
| 1395 int32_t divisor = instr->right()->GetInteger32Constant(); | 1394 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1396 bool truncating = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32); | 1395 LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) |
| 1397 LOperand* temp = truncating ? NULL : TempRegister(); | 1396 ? NULL : TempRegister(); |
| 1398 LInstruction* result = | 1397 LInstruction* result = DefineAsRegister(new(zone()) LDivByConstI( |
| 1399 DefineAsRegister(new(zone()) LDivByConstI(dividend, divisor, temp)); | 1398 dividend, divisor, temp)); |
| 1400 bool can_deopt = | 1399 if (divisor == 0 || |
| 1401 divisor == 0 || | 1400 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || |
| 1402 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1401 !instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32)) { |
| 1403 instr->left()->RangeCanInclude(0) && divisor < 0) || | 1402 result = AssignEnvironment(result); |
| 1404 !truncating; | 1403 } |
| 1405 return can_deopt ? AssignEnvironment(result) : result; | 1404 return result; |
| 1406 } | 1405 } |
| 1407 | 1406 |
| 1408 | 1407 |
| 1409 LInstruction* LChunkBuilder::DoDivI(HBinaryOperation* instr) { | 1408 LInstruction* LChunkBuilder::DoDivI(HBinaryOperation* instr) { |
| 1410 ASSERT(instr->representation().IsSmiOrInteger32()); | 1409 ASSERT(instr->representation().IsSmiOrInteger32()); |
| 1411 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1410 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1412 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1411 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1413 LOperand* dividend = UseRegister(instr->left()); | 1412 LOperand* dividend = UseRegister(instr->left()); |
| 1414 LOperand* divisor = UseRegister(instr->right()); | 1413 LOperand* divisor = UseRegister(instr->right()); |
| 1415 LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) | 1414 LOperand* temp = instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1753 LInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { | 1752 LInstruction* LChunkBuilder::DoFlooringDivByConstI(HMathFloorOfDiv* instr) { |
| 1754 ASSERT(instr->representation().IsInteger32()); | 1753 ASSERT(instr->representation().IsInteger32()); |
| 1755 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1754 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1756 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1755 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1757 LOperand* dividend = UseRegister(instr->left()); | 1756 LOperand* dividend = UseRegister(instr->left()); |
| 1758 int32_t divisor = instr->right()->GetInteger32Constant(); | 1757 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1759 LInstruction* result = | 1758 LInstruction* result = |
| 1760 DefineAsRegister(new(zone()) LFlooringDivByConstI(dividend, divisor)); | 1759 DefineAsRegister(new(zone()) LFlooringDivByConstI(dividend, divisor)); |
| 1761 bool can_deopt = | 1760 bool can_deopt = |
| 1762 divisor == 0 || | 1761 divisor == 0 || |
| 1763 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1762 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0); |
| 1764 instr->left()->RangeCanInclude(0) && divisor < 0); | |
| 1765 return can_deopt ? AssignEnvironment(result) : result; | 1763 return can_deopt ? AssignEnvironment(result) : result; |
| 1766 } | 1764 } |
| 1767 | 1765 |
| 1768 | 1766 |
| 1769 LInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { | 1767 LInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) { |
| 1770 LOperand* dividend = UseRegister(instr->left()); | 1768 LOperand* dividend = UseRegister(instr->left()); |
| 1771 LOperand* divisor = UseRegister(instr->right()); | 1769 LOperand* divisor = UseRegister(instr->right()); |
| 1772 LOperand* remainder = TempRegister(); | 1770 LOperand* remainder = TempRegister(); |
| 1773 LInstruction* result = | 1771 LInstruction* result = |
| 1774 DefineAsRegister(new(zone()) LFlooringDivI(dividend, divisor, remainder)); | 1772 DefineAsRegister(new(zone()) LFlooringDivI(dividend, divisor, remainder)); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 1805 return DefineAsRegister(new(zone()) LMathMinMax(left, right)); | 1803 return DefineAsRegister(new(zone()) LMathMinMax(left, right)); |
| 1806 } | 1804 } |
| 1807 | 1805 |
| 1808 | 1806 |
| 1809 LInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { | 1807 LInstruction* LChunkBuilder::DoModByPowerOf2I(HMod* instr) { |
| 1810 ASSERT(instr->representation().IsInteger32()); | 1808 ASSERT(instr->representation().IsInteger32()); |
| 1811 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1809 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1812 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1810 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1813 LOperand* dividend = UseRegisterAtStart(instr->left()); | 1811 LOperand* dividend = UseRegisterAtStart(instr->left()); |
| 1814 int32_t divisor = instr->right()->GetInteger32Constant(); | 1812 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1815 LInstruction* result = | 1813 LInstruction* result = DefineSameAsFirst(new(zone()) LModByPowerOf2I( |
| 1816 DefineSameAsFirst(new(zone()) LModByPowerOf2I(dividend, divisor)); | 1814 dividend, divisor)); |
| 1817 bool can_deopt = | 1815 if (instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
| 1818 instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1816 result = AssignEnvironment(result); |
| 1819 instr->left()->CanBeNegative(); | 1817 } |
| 1820 return can_deopt ? AssignEnvironment(result) : result; | 1818 return result; |
| 1821 } | 1819 } |
| 1822 | 1820 |
| 1823 | 1821 |
| 1824 LInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { | 1822 LInstruction* LChunkBuilder::DoModByConstI(HMod* instr) { |
| 1825 ASSERT(instr->representation().IsInteger32()); | 1823 ASSERT(instr->representation().IsInteger32()); |
| 1826 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1824 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1827 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1825 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1828 LOperand* dividend = UseRegister(instr->left()); | 1826 LOperand* dividend = UseRegister(instr->left()); |
| 1829 int32_t divisor = instr->right()->GetInteger32Constant(); | 1827 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1830 LOperand* temp = TempRegister(); | 1828 LOperand* temp = TempRegister(); |
| 1831 LInstruction* result = | 1829 LInstruction* result = DefineAsRegister(new(zone()) LModByConstI( |
| 1832 DefineAsRegister(new(zone()) LModByConstI(dividend, divisor, temp)); | 1830 dividend, divisor, temp)); |
| 1833 bool can_deopt = | 1831 if (divisor == 0 || instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
| 1834 divisor == 0 || | 1832 result = AssignEnvironment(result); |
| 1835 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1833 } |
| 1836 instr->left()->CanBeNegative()); | 1834 return result; |
| 1837 return can_deopt ? AssignEnvironment(result) : result; | |
| 1838 } | 1835 } |
| 1839 | 1836 |
| 1840 | 1837 |
| 1841 LInstruction* LChunkBuilder::DoModI(HMod* instr) { | 1838 LInstruction* LChunkBuilder::DoModI(HMod* instr) { |
| 1842 ASSERT(instr->representation().IsSmiOrInteger32()); | 1839 ASSERT(instr->representation().IsSmiOrInteger32()); |
| 1843 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1840 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1844 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1841 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1845 LOperand* dividend = UseRegister(instr->left()); | 1842 LOperand* dividend = UseRegister(instr->left()); |
| 1846 LOperand* divisor = UseRegister(instr->right()); | 1843 LOperand* divisor = UseRegister(instr->right()); |
| 1847 LInstruction* result = | 1844 LInstruction* result = DefineAsRegister(new(zone()) LModI(dividend, divisor)); |
| 1848 DefineAsRegister(new(zone()) LModI(dividend, divisor)); | 1845 if (instr->CheckFlag(HValue::kCanBeDivByZero) || |
| 1849 bool can_deopt = (instr->right()->CanBeZero() || | 1846 instr->CheckFlag(HValue::kBailoutOnMinusZero)) { |
| 1850 (instr->CheckFlag(HValue::kBailoutOnMinusZero) && | 1847 result = AssignEnvironment(result); |
| 1851 instr->left()->CanBeNegative() && instr->CanBeZero())); | 1848 } |
| 1852 return can_deopt ? AssignEnvironment(result) : result; | 1849 return result; |
| 1853 } | 1850 } |
| 1854 | 1851 |
| 1855 | 1852 |
| 1856 LInstruction* LChunkBuilder::DoMod(HMod* instr) { | 1853 LInstruction* LChunkBuilder::DoMod(HMod* instr) { |
| 1857 if (instr->representation().IsSmiOrInteger32()) { | 1854 if (instr->representation().IsSmiOrInteger32()) { |
| 1858 if (instr->RightIsPowerOf2()) { | 1855 if (instr->RightIsPowerOf2()) { |
| 1859 return DoModByPowerOf2I(instr); | 1856 return DoModByPowerOf2I(instr); |
| 1860 } else if (instr->right()->IsConstant()) { | 1857 } else if (instr->right()->IsConstant()) { |
| 1861 return DoModByConstI(instr); | 1858 return DoModByConstI(instr); |
| 1862 } else { | 1859 } else { |
| (...skipping 697 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2560 | 2557 |
| 2561 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 2558 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
| 2562 LOperand* receiver = UseRegister(instr->receiver()); | 2559 LOperand* receiver = UseRegister(instr->receiver()); |
| 2563 LOperand* function = UseRegister(instr->function()); | 2560 LOperand* function = UseRegister(instr->function()); |
| 2564 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); | 2561 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); |
| 2565 return AssignEnvironment(DefineAsRegister(result)); | 2562 return AssignEnvironment(DefineAsRegister(result)); |
| 2566 } | 2563 } |
| 2567 | 2564 |
| 2568 | 2565 |
| 2569 } } // namespace v8::internal | 2566 } } // namespace v8::internal |
| OLD | NEW |