| OLD | NEW |
| 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/v8.h" | 5 #include "src/v8.h" |
| 6 | 6 |
| 7 #include "src/hydrogen-osr.h" | 7 #include "src/hydrogen-osr.h" |
| 8 #include "src/lithium-allocator-inl.h" | 8 #include "src/lithium-allocator-inl.h" |
| 9 #include "src/mips/lithium-codegen-mips.h" | 9 #include "src/mips64/lithium-codegen-mips64.h" |
| 10 #include "src/mips/lithium-mips.h" | 10 #include "src/mips64/lithium-mips64.h" |
| 11 | 11 |
| 12 namespace v8 { | 12 namespace v8 { |
| 13 namespace internal { | 13 namespace internal { |
| 14 | 14 |
| 15 #define DEFINE_COMPILE(type) \ | 15 #define DEFINE_COMPILE(type) \ |
| 16 void L##type::CompileToNative(LCodeGen* generator) { \ | 16 void L##type::CompileToNative(LCodeGen* generator) { \ |
| 17 generator->Do##type(this); \ | 17 generator->Do##type(this); \ |
| 18 } | 18 } |
| 19 LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) | 19 LITHIUM_CONCRETE_INSTRUCTION_LIST(DEFINE_COMPILE) |
| 20 #undef DEFINE_COMPILE | 20 #undef DEFINE_COMPILE |
| (...skipping 969 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 990 return MarkAsCall(DefineFixed(result, v0), instr); | 990 return MarkAsCall(DefineFixed(result, v0), instr); |
| 991 } | 991 } |
| 992 | 992 |
| 993 | 993 |
| 994 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( | 994 LInstruction* LChunkBuilder::DoInstanceOfKnownGlobal( |
| 995 HInstanceOfKnownGlobal* instr) { | 995 HInstanceOfKnownGlobal* instr) { |
| 996 LInstanceOfKnownGlobal* result = | 996 LInstanceOfKnownGlobal* result = |
| 997 new(zone()) LInstanceOfKnownGlobal( | 997 new(zone()) LInstanceOfKnownGlobal( |
| 998 UseFixed(instr->context(), cp), | 998 UseFixed(instr->context(), cp), |
| 999 UseFixed(instr->left(), a0), | 999 UseFixed(instr->left(), a0), |
| 1000 FixedTemp(t0)); | 1000 FixedTemp(a4)); |
| 1001 return MarkAsCall(DefineFixed(result, v0), instr); | 1001 return MarkAsCall(DefineFixed(result, v0), instr); |
| 1002 } | 1002 } |
| 1003 | 1003 |
| 1004 | 1004 |
| 1005 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { | 1005 LInstruction* LChunkBuilder::DoWrapReceiver(HWrapReceiver* instr) { |
| 1006 LOperand* receiver = UseRegisterAtStart(instr->receiver()); | 1006 LOperand* receiver = UseRegisterAtStart(instr->receiver()); |
| 1007 LOperand* function = UseRegisterAtStart(instr->function()); | 1007 LOperand* function = UseRegisterAtStart(instr->function()); |
| 1008 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); | 1008 LWrapReceiver* result = new(zone()) LWrapReceiver(receiver, function); |
| 1009 return AssignEnvironment(DefineAsRegister(result)); | 1009 return AssignEnvironment(DefineAsRegister(result)); |
| 1010 } | 1010 } |
| (...skipping 259 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1270 ASSERT(instr->representation().IsSmiOrInteger32()); | 1270 ASSERT(instr->representation().IsSmiOrInteger32()); |
| 1271 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1271 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1272 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1272 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| 1273 LOperand* dividend = UseRegister(instr->left()); | 1273 LOperand* dividend = UseRegister(instr->left()); |
| 1274 int32_t divisor = instr->right()->GetInteger32Constant(); | 1274 int32_t divisor = instr->right()->GetInteger32Constant(); |
| 1275 LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( | 1275 LInstruction* result = DefineAsRegister(new(zone()) LDivByPowerOf2I( |
| 1276 dividend, divisor)); | 1276 dividend, divisor)); |
| 1277 if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || | 1277 if ((instr->CheckFlag(HValue::kBailoutOnMinusZero) && divisor < 0) || |
| 1278 (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || | 1278 (instr->CheckFlag(HValue::kCanOverflow) && divisor == -1) || |
| 1279 (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && | 1279 (!instr->CheckFlag(HInstruction::kAllUsesTruncatingToInt32) && |
| 1280 divisor != 1 && divisor != -1)) { | 1280 divisor != 1 && divisor != -1)) { |
| 1281 result = AssignEnvironment(result); | 1281 result = AssignEnvironment(result); |
| 1282 } | 1282 } |
| 1283 return result; | 1283 return result; |
| 1284 } | 1284 } |
| 1285 | 1285 |
| 1286 | 1286 |
| 1287 LInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { | 1287 LInstruction* LChunkBuilder::DoDivByConstI(HDiv* instr) { |
| 1288 ASSERT(instr->representation().IsInteger32()); | 1288 ASSERT(instr->representation().IsInteger32()); |
| 1289 ASSERT(instr->left()->representation().Equals(instr->representation())); | 1289 ASSERT(instr->left()->representation().Equals(instr->representation())); |
| 1290 ASSERT(instr->right()->representation().Equals(instr->representation())); | 1290 ASSERT(instr->right()->representation().Equals(instr->representation())); |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1485 } | 1485 } |
| 1486 right_op = UseRegister(right); | 1486 right_op = UseRegister(right); |
| 1487 } | 1487 } |
| 1488 LMulI* mul = new(zone()) LMulI(left_op, right_op); | 1488 LMulI* mul = new(zone()) LMulI(left_op, right_op); |
| 1489 if (can_overflow || bailout_on_minus_zero) { | 1489 if (can_overflow || bailout_on_minus_zero) { |
| 1490 AssignEnvironment(mul); | 1490 AssignEnvironment(mul); |
| 1491 } | 1491 } |
| 1492 return DefineAsRegister(mul); | 1492 return DefineAsRegister(mul); |
| 1493 | 1493 |
| 1494 } else if (instr->representation().IsDouble()) { | 1494 } else if (instr->representation().IsDouble()) { |
| 1495 if (kArchVariant == kMips32r2) { | 1495 if (kArchVariant == kMips64r2) { |
| 1496 if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { | 1496 if (instr->HasOneUse() && instr->uses().value()->IsAdd()) { |
| 1497 HAdd* add = HAdd::cast(instr->uses().value()); | 1497 HAdd* add = HAdd::cast(instr->uses().value()); |
| 1498 if (instr == add->left()) { | 1498 if (instr == add->left()) { |
| 1499 // This mul is the lhs of an add. The add and mul will be folded | 1499 // This mul is the lhs of an add. The add and mul will be folded |
| 1500 // into a multiply-add. | 1500 // into a multiply-add. |
| 1501 return NULL; | 1501 return NULL; |
| 1502 } | 1502 } |
| 1503 if (instr == add->right() && !add->left()->IsMul()) { | 1503 if (instr == add->right() && !add->left()->IsMul()) { |
| 1504 // This mul is the rhs of an add, where the lhs is not another mul. | 1504 // This mul is the rhs of an add, where the lhs is not another mul. |
| 1505 // The add and mul will be folded into a multiply-add. | 1505 // The add and mul will be folded into a multiply-add. |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1558 } else if (instr->representation().IsExternal()) { | 1558 } else if (instr->representation().IsExternal()) { |
| 1559 ASSERT(instr->left()->representation().IsExternal()); | 1559 ASSERT(instr->left()->representation().IsExternal()); |
| 1560 ASSERT(instr->right()->representation().IsInteger32()); | 1560 ASSERT(instr->right()->representation().IsInteger32()); |
| 1561 ASSERT(!instr->CheckFlag(HValue::kCanOverflow)); | 1561 ASSERT(!instr->CheckFlag(HValue::kCanOverflow)); |
| 1562 LOperand* left = UseRegisterAtStart(instr->left()); | 1562 LOperand* left = UseRegisterAtStart(instr->left()); |
| 1563 LOperand* right = UseOrConstantAtStart(instr->right()); | 1563 LOperand* right = UseOrConstantAtStart(instr->right()); |
| 1564 LAddI* add = new(zone()) LAddI(left, right); | 1564 LAddI* add = new(zone()) LAddI(left, right); |
| 1565 LInstruction* result = DefineAsRegister(add); | 1565 LInstruction* result = DefineAsRegister(add); |
| 1566 return result; | 1566 return result; |
| 1567 } else if (instr->representation().IsDouble()) { | 1567 } else if (instr->representation().IsDouble()) { |
| 1568 if (kArchVariant == kMips32r2) { | 1568 if (kArchVariant == kMips64r2) { |
| 1569 if (instr->left()->IsMul()) | 1569 if (instr->left()->IsMul()) |
| 1570 return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); | 1570 return DoMultiplyAdd(HMul::cast(instr->left()), instr->right()); |
| 1571 | 1571 |
| 1572 if (instr->right()->IsMul()) { | 1572 if (instr->right()->IsMul()) { |
| 1573 ASSERT(!instr->left()->IsMul()); | 1573 ASSERT(!instr->left()->IsMul()); |
| 1574 return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); | 1574 return DoMultiplyAdd(HMul::cast(instr->right()), instr->left()); |
| 1575 } | 1575 } |
| 1576 } | 1576 } |
| 1577 return DoArithmeticD(Token::ADD, instr); | 1577 return DoArithmeticD(Token::ADD, instr); |
| 1578 } else { | 1578 } else { |
| (...skipping 203 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1782 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { | 1782 LInstruction* LChunkBuilder::DoBoundsCheck(HBoundsCheck* instr) { |
| 1783 if (!FLAG_debug_code && instr->skip_check()) return NULL; | 1783 if (!FLAG_debug_code && instr->skip_check()) return NULL; |
| 1784 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); | 1784 LOperand* index = UseRegisterOrConstantAtStart(instr->index()); |
| 1785 LOperand* length = !index->IsConstantOperand() | 1785 LOperand* length = !index->IsConstantOperand() |
| 1786 ? UseRegisterOrConstantAtStart(instr->length()) | 1786 ? UseRegisterOrConstantAtStart(instr->length()) |
| 1787 : UseRegisterAtStart(instr->length()); | 1787 : UseRegisterAtStart(instr->length()); |
| 1788 LInstruction* result = new(zone()) LBoundsCheck(index, length); | 1788 LInstruction* result = new(zone()) LBoundsCheck(index, length); |
| 1789 if (!FLAG_debug_code || !instr->skip_check()) { | 1789 if (!FLAG_debug_code || !instr->skip_check()) { |
| 1790 result = AssignEnvironment(result); | 1790 result = AssignEnvironment(result); |
| 1791 } | 1791 } |
| 1792 return result; | 1792 return result; |
| 1793 } | 1793 } |
| 1794 | 1794 |
| 1795 | 1795 |
| 1796 LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( | 1796 LInstruction* LChunkBuilder::DoBoundsCheckBaseIndexInformation( |
| 1797 HBoundsCheckBaseIndexInformation* instr) { | 1797 HBoundsCheckBaseIndexInformation* instr) { |
| 1798 UNREACHABLE(); | 1798 UNREACHABLE(); |
| 1799 return NULL; | 1799 return NULL; |
| 1800 } | 1800 } |
| 1801 | 1801 |
| 1802 | 1802 |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1857 if (!val->representation().IsSmi()) result = AssignEnvironment(result); | 1857 if (!val->representation().IsSmi()) result = AssignEnvironment(result); |
| 1858 return result; | 1858 return result; |
| 1859 } | 1859 } |
| 1860 } | 1860 } |
| 1861 } else if (from.IsDouble()) { | 1861 } else if (from.IsDouble()) { |
| 1862 if (to.IsTagged()) { | 1862 if (to.IsTagged()) { |
| 1863 info()->MarkAsDeferredCalling(); | 1863 info()->MarkAsDeferredCalling(); |
| 1864 LOperand* value = UseRegister(val); | 1864 LOperand* value = UseRegister(val); |
| 1865 LOperand* temp1 = TempRegister(); | 1865 LOperand* temp1 = TempRegister(); |
| 1866 LOperand* temp2 = TempRegister(); | 1866 LOperand* temp2 = TempRegister(); |
| 1867 |
| 1867 LUnallocated* result_temp = TempRegister(); | 1868 LUnallocated* result_temp = TempRegister(); |
| 1868 LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); | 1869 LNumberTagD* result = new(zone()) LNumberTagD(value, temp1, temp2); |
| 1869 return AssignPointerMap(Define(result, result_temp)); | 1870 return AssignPointerMap(Define(result, result_temp)); |
| 1870 } else if (to.IsSmi()) { | 1871 } else if (to.IsSmi()) { |
| 1871 LOperand* value = UseRegister(val); | 1872 LOperand* value = UseRegister(val); |
| 1872 return AssignEnvironment( | 1873 return AssignEnvironment( |
| 1873 DefineAsRegister(new(zone()) LDoubleToSmi(value))); | 1874 DefineAsRegister(new(zone()) LDoubleToSmi(value))); |
| 1874 } else { | 1875 } else { |
| 1875 ASSERT(to.IsInteger32()); | 1876 ASSERT(to.IsInteger32()); |
| 1876 LOperand* value = UseRegister(val); | 1877 LOperand* value = UseRegister(val); |
| 1877 LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); | 1878 LInstruction* result = DefineAsRegister(new(zone()) LDoubleToI(value)); |
| 1878 if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); | 1879 if (!instr->CanTruncateToInt32()) result = AssignEnvironment(result); |
| 1879 return result; | 1880 return result; |
| 1880 } | 1881 } |
| 1881 } else if (from.IsInteger32()) { | 1882 } else if (from.IsInteger32()) { |
| 1882 info()->MarkAsDeferredCalling(); | 1883 info()->MarkAsDeferredCalling(); |
| 1883 if (to.IsTagged()) { | 1884 if (to.IsTagged()) { |
| 1884 if (!instr->CheckFlag(HValue::kCanOverflow)) { | 1885 if (val->CheckFlag(HInstruction::kUint32)) { |
| 1885 LOperand* value = UseRegisterAtStart(val); | |
| 1886 return DefineAsRegister(new(zone()) LSmiTag(value)); | |
| 1887 } else if (val->CheckFlag(HInstruction::kUint32)) { | |
| 1888 LOperand* value = UseRegisterAtStart(val); | 1886 LOperand* value = UseRegisterAtStart(val); |
| 1889 LOperand* temp1 = TempRegister(); | 1887 LOperand* temp1 = TempRegister(); |
| 1890 LOperand* temp2 = TempRegister(); | 1888 LOperand* temp2 = TempRegister(); |
| 1891 LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); | 1889 LNumberTagU* result = new(zone()) LNumberTagU(value, temp1, temp2); |
| 1892 return AssignPointerMap(DefineAsRegister(result)); | 1890 return AssignPointerMap(DefineAsRegister(result)); |
| 1893 } else { | 1891 } else { |
| 1892 STATIC_ASSERT((kMinInt == Smi::kMinValue) && |
| 1893 (kMaxInt == Smi::kMaxValue)); |
| 1894 LOperand* value = UseRegisterAtStart(val); | 1894 LOperand* value = UseRegisterAtStart(val); |
| 1895 LOperand* temp1 = TempRegister(); | 1895 return DefineAsRegister(new(zone()) LSmiTag(value)); |
| 1896 LOperand* temp2 = TempRegister(); | |
| 1897 LNumberTagI* result = new(zone()) LNumberTagI(value, temp1, temp2); | |
| 1898 return AssignPointerMap(DefineAsRegister(result)); | |
| 1899 } | 1896 } |
| 1900 } else if (to.IsSmi()) { | 1897 } else if (to.IsSmi()) { |
| 1901 LOperand* value = UseRegister(val); | 1898 LOperand* value = UseRegister(val); |
| 1902 LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); | 1899 LInstruction* result = DefineAsRegister(new(zone()) LSmiTag(value)); |
| 1903 if (instr->CheckFlag(HValue::kCanOverflow)) { | 1900 if (instr->CheckFlag(HValue::kCanOverflow)) { |
| 1904 result = AssignEnvironment(result); | 1901 result = AssignEnvironment(result); |
| 1905 } | 1902 } |
| 1906 return result; | 1903 return result; |
| 1907 } else { | 1904 } else { |
| 1908 ASSERT(to.IsDouble()); | 1905 ASSERT(to.IsDouble()); |
| (...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2109 ASSERT(instr->key()->representation().IsSmiOrInteger32()); | 2106 ASSERT(instr->key()->representation().IsSmiOrInteger32()); |
| 2110 ElementsKind elements_kind = instr->elements_kind(); | 2107 ElementsKind elements_kind = instr->elements_kind(); |
| 2111 LOperand* key = UseRegisterOrConstantAtStart(instr->key()); | 2108 LOperand* key = UseRegisterOrConstantAtStart(instr->key()); |
| 2112 LInstruction* result = NULL; | 2109 LInstruction* result = NULL; |
| 2113 | 2110 |
| 2114 if (!instr->is_typed_elements()) { | 2111 if (!instr->is_typed_elements()) { |
| 2115 LOperand* obj = NULL; | 2112 LOperand* obj = NULL; |
| 2116 if (instr->representation().IsDouble()) { | 2113 if (instr->representation().IsDouble()) { |
| 2117 obj = UseRegister(instr->elements()); | 2114 obj = UseRegister(instr->elements()); |
| 2118 } else { | 2115 } else { |
| 2119 ASSERT(instr->representation().IsSmiOrTagged()); | 2116 ASSERT(instr->representation().IsSmiOrTagged() || |
| 2117 instr->representation().IsInteger32()); |
| 2120 obj = UseRegisterAtStart(instr->elements()); | 2118 obj = UseRegisterAtStart(instr->elements()); |
| 2121 } | 2119 } |
| 2122 result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); | 2120 result = DefineAsRegister(new(zone()) LLoadKeyed(obj, key)); |
| 2123 } else { | 2121 } else { |
| 2124 ASSERT( | 2122 ASSERT( |
| 2125 (instr->representation().IsInteger32() && | 2123 (instr->representation().IsInteger32() && |
| 2126 !IsDoubleOrFloatElementsKind(elements_kind)) || | 2124 !IsDoubleOrFloatElementsKind(elements_kind)) || |
| 2127 (instr->representation().IsDouble() && | 2125 (instr->representation().IsDouble() && |
| 2128 IsDoubleOrFloatElementsKind(elements_kind))); | 2126 IsDoubleOrFloatElementsKind(elements_kind))); |
| 2129 LOperand* backing_store = UseRegister(instr->elements()); | 2127 LOperand* backing_store = UseRegister(instr->elements()); |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2161 bool needs_write_barrier = instr->NeedsWriteBarrier(); | 2159 bool needs_write_barrier = instr->NeedsWriteBarrier(); |
| 2162 LOperand* object = NULL; | 2160 LOperand* object = NULL; |
| 2163 LOperand* val = NULL; | 2161 LOperand* val = NULL; |
| 2164 LOperand* key = NULL; | 2162 LOperand* key = NULL; |
| 2165 | 2163 |
| 2166 if (instr->value()->representation().IsDouble()) { | 2164 if (instr->value()->representation().IsDouble()) { |
| 2167 object = UseRegisterAtStart(instr->elements()); | 2165 object = UseRegisterAtStart(instr->elements()); |
| 2168 key = UseRegisterOrConstantAtStart(instr->key()); | 2166 key = UseRegisterOrConstantAtStart(instr->key()); |
| 2169 val = UseRegister(instr->value()); | 2167 val = UseRegister(instr->value()); |
| 2170 } else { | 2168 } else { |
| 2171 ASSERT(instr->value()->representation().IsSmiOrTagged()); | 2169 ASSERT(instr->value()->representation().IsSmiOrTagged() || |
| 2170 instr->value()->representation().IsInteger32()); |
| 2172 if (needs_write_barrier) { | 2171 if (needs_write_barrier) { |
| 2173 object = UseTempRegister(instr->elements()); | 2172 object = UseTempRegister(instr->elements()); |
| 2174 val = UseTempRegister(instr->value()); | 2173 val = UseTempRegister(instr->value()); |
| 2175 key = UseTempRegister(instr->key()); | 2174 key = UseTempRegister(instr->key()); |
| 2176 } else { | 2175 } else { |
| 2177 object = UseRegisterAtStart(instr->elements()); | 2176 object = UseRegisterAtStart(instr->elements()); |
| 2178 val = UseRegisterAtStart(instr->value()); | 2177 val = UseRegisterAtStart(instr->value()); |
| 2179 key = UseRegisterOrConstantAtStart(instr->key()); | 2178 key = UseRegisterOrConstantAtStart(instr->key()); |
| 2180 } | 2179 } |
| 2181 } | 2180 } |
| (...skipping 337 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2519 | 2518 |
| 2520 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { | 2519 LInstruction* LChunkBuilder::DoLoadFieldByIndex(HLoadFieldByIndex* instr) { |
| 2521 LOperand* object = UseRegister(instr->object()); | 2520 LOperand* object = UseRegister(instr->object()); |
| 2522 LOperand* index = UseTempRegister(instr->index()); | 2521 LOperand* index = UseTempRegister(instr->index()); |
| 2523 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); | 2522 LLoadFieldByIndex* load = new(zone()) LLoadFieldByIndex(object, index); |
| 2524 LInstruction* result = DefineSameAsFirst(load); | 2523 LInstruction* result = DefineSameAsFirst(load); |
| 2525 return AssignPointerMap(result); | 2524 return AssignPointerMap(result); |
| 2526 } | 2525 } |
| 2527 | 2526 |
| 2528 | 2527 |
| 2529 | |
| 2530 LInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { | 2528 LInstruction* LChunkBuilder::DoStoreFrameContext(HStoreFrameContext* instr) { |
| 2531 LOperand* context = UseRegisterAtStart(instr->context()); | 2529 LOperand* context = UseRegisterAtStart(instr->context()); |
| 2532 return new(zone()) LStoreFrameContext(context); | 2530 return new(zone()) LStoreFrameContext(context); |
| 2533 } | 2531 } |
| 2534 | 2532 |
| 2535 | 2533 |
| 2536 LInstruction* LChunkBuilder::DoAllocateBlockContext( | 2534 LInstruction* LChunkBuilder::DoAllocateBlockContext( |
| 2537 HAllocateBlockContext* instr) { | 2535 HAllocateBlockContext* instr) { |
| 2538 LOperand* context = UseFixed(instr->context(), cp); | 2536 LOperand* context = UseFixed(instr->context(), cp); |
| 2539 LOperand* function = UseRegisterAtStart(instr->function()); | 2537 LOperand* function = UseRegisterAtStart(instr->function()); |
| 2540 LAllocateBlockContext* result = | 2538 LAllocateBlockContext* result = |
| 2541 new(zone()) LAllocateBlockContext(context, function); | 2539 new(zone()) LAllocateBlockContext(context, function); |
| 2542 return MarkAsCall(DefineFixed(result, cp), instr); | 2540 return MarkAsCall(DefineFixed(result, cp), instr); |
| 2543 } | 2541 } |
| 2544 | 2542 |
| 2543 |
| 2545 } } // namespace v8::internal | 2544 } } // namespace v8::internal |
| OLD | NEW |