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

Side by Side Diff: src/hydrogen.cc

Issue 16818016: Remove manual representation annotations for constants. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Addressed comments Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/hydrogen-instructions.h » ('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 // 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 986 matching lines...) Expand 10 before | Expand all | Expand 10 after
997 HBoundsCheck* result = new(graph()->zone()) HBoundsCheck(index, length); 997 HBoundsCheck* result = new(graph()->zone()) HBoundsCheck(index, length);
998 AddInstruction(result); 998 AddInstruction(result);
999 return result; 999 return result;
1000 } 1000 }
1001 1001
1002 1002
1003 HReturn* HGraphBuilder::AddReturn(HValue* value) { 1003 HReturn* HGraphBuilder::AddReturn(HValue* value) {
1004 HValue* context = environment()->LookupContext(); 1004 HValue* context = environment()->LookupContext();
1005 int num_parameters = graph()->info()->num_parameters(); 1005 int num_parameters = graph()->info()->num_parameters();
1006 HValue* params = AddInstruction(new(graph()->zone()) 1006 HValue* params = AddInstruction(new(graph()->zone())
1007 HConstant(num_parameters, Representation::Integer32())); 1007 HConstant(num_parameters));
1008 HReturn* return_instruction = new(graph()->zone()) 1008 HReturn* return_instruction = new(graph()->zone())
1009 HReturn(value, context, params); 1009 HReturn(value, context, params);
1010 current_block()->FinishExit(return_instruction); 1010 current_block()->FinishExit(return_instruction);
1011 return return_instruction; 1011 return return_instruction;
1012 } 1012 }
1013 1013
1014 1014
1015 HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) { 1015 HBasicBlock* HGraphBuilder::CreateBasicBlock(HEnvironment* env) {
1016 HBasicBlock* b = graph()->CreateBasicBlock(); 1016 HBasicBlock* b = graph()->CreateBasicBlock();
1017 b->SetInitialEnvironment(env); 1017 b->SetInitialEnvironment(env);
(...skipping 317 matching lines...) Expand 10 before | Expand all | Expand 10 after
1335 } 1335 }
1336 1336
1337 1337
1338 HValue* HGraphBuilder::BuildAllocateElements(HValue* context, 1338 HValue* HGraphBuilder::BuildAllocateElements(HValue* context,
1339 ElementsKind kind, 1339 ElementsKind kind,
1340 HValue* capacity) { 1340 HValue* capacity) {
1341 Zone* zone = this->zone(); 1341 Zone* zone = this->zone();
1342 1342
1343 int elements_size = IsFastDoubleElementsKind(kind) 1343 int elements_size = IsFastDoubleElementsKind(kind)
1344 ? kDoubleSize : kPointerSize; 1344 ? kDoubleSize : kPointerSize;
1345 HConstant* elements_size_value = 1345 HConstant* elements_size_value = new(zone) HConstant(elements_size);
1346 new(zone) HConstant(elements_size, Representation::Integer32());
1347 AddInstruction(elements_size_value); 1346 AddInstruction(elements_size_value);
1348 HValue* mul = AddInstruction( 1347 HValue* mul = AddInstruction(
1349 HMul::New(zone, context, capacity, elements_size_value)); 1348 HMul::New(zone, context, capacity, elements_size_value));
1350 mul->AssumeRepresentation(Representation::Integer32()); 1349 mul->AssumeRepresentation(Representation::Integer32());
1351 mul->ClearFlag(HValue::kCanOverflow); 1350 mul->ClearFlag(HValue::kCanOverflow);
1352 1351
1353 HConstant* header_size = 1352 HConstant* header_size = new(zone) HConstant(FixedArray::kHeaderSize);
1354 new(zone) HConstant(FixedArray::kHeaderSize, Representation::Integer32());
1355 AddInstruction(header_size); 1353 AddInstruction(header_size);
1356 HValue* total_size = AddInstruction( 1354 HValue* total_size = AddInstruction(
1357 HAdd::New(zone, context, mul, header_size)); 1355 HAdd::New(zone, context, mul, header_size));
1358 total_size->AssumeRepresentation(Representation::Integer32()); 1356 total_size->AssumeRepresentation(Representation::Integer32());
1359 total_size->ClearFlag(HValue::kCanOverflow); 1357 total_size->ClearFlag(HValue::kCanOverflow);
1360 1358
1361 HAllocate::Flags flags = HAllocate::DefaultFlags(kind); 1359 HAllocate::Flags flags = HAllocate::DefaultFlags(kind);
1362 if (isolate()->heap()->ShouldGloballyPretenure()) { 1360 if (isolate()->heap()->ShouldGloballyPretenure()) {
1363 // TODO(hpayer): When pretenuring can be internalized, flags can become 1361 // TODO(hpayer): When pretenuring can be internalized, flags can become
1364 // private to HAllocate. 1362 // private to HAllocate.
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
1406 1404
1407 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, 1405 HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array,
1408 HValue* array_map, 1406 HValue* array_map,
1409 AllocationSiteMode mode, 1407 AllocationSiteMode mode,
1410 HValue* allocation_site_payload, 1408 HValue* allocation_site_payload,
1411 HValue* length_field) { 1409 HValue* length_field) {
1412 1410
1413 AddStore(array, HObjectAccess::ForMap(), array_map); 1411 AddStore(array, HObjectAccess::ForMap(), array_map);
1414 1412
1415 HConstant* empty_fixed_array = 1413 HConstant* empty_fixed_array =
1416 new(zone()) HConstant( 1414 new(zone()) HConstant(isolate()->factory()->empty_fixed_array());
1417 Handle<FixedArray>(isolate()->heap()->empty_fixed_array()),
1418 Representation::Tagged());
1419 AddInstruction(empty_fixed_array); 1415 AddInstruction(empty_fixed_array);
1420 1416
1421 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); 1417 HObjectAccess access = HObjectAccess::ForPropertiesPointer();
1422 AddStore(array, access, empty_fixed_array); 1418 AddStore(array, access, empty_fixed_array);
1423 AddStore(array, HObjectAccess::ForArrayLength(), length_field); 1419 AddStore(array, HObjectAccess::ForArrayLength(), length_field);
1424 1420
1425 if (mode == TRACK_ALLOCATION_SITE) { 1421 if (mode == TRACK_ALLOCATION_SITE) {
1426 BuildCreateAllocationSiteInfo(array, 1422 BuildCreateAllocationSiteInfo(array,
1427 JSArray::kSize, 1423 JSArray::kSize,
1428 allocation_site_payload); 1424 allocation_site_payload);
(...skipping 26 matching lines...) Expand all
1455 AddInstruction(HShr::New(zone, context, old_capacity, 1451 AddInstruction(HShr::New(zone, context, old_capacity,
1456 graph_->GetConstant1())); 1452 graph_->GetConstant1()));
1457 half_old_capacity->AssumeRepresentation(Representation::Integer32()); 1453 half_old_capacity->AssumeRepresentation(Representation::Integer32());
1458 half_old_capacity->ClearFlag(HValue::kCanOverflow); 1454 half_old_capacity->ClearFlag(HValue::kCanOverflow);
1459 1455
1460 HValue* new_capacity = AddInstruction( 1456 HValue* new_capacity = AddInstruction(
1461 HAdd::New(zone, context, half_old_capacity, old_capacity)); 1457 HAdd::New(zone, context, half_old_capacity, old_capacity));
1462 new_capacity->AssumeRepresentation(Representation::Integer32()); 1458 new_capacity->AssumeRepresentation(Representation::Integer32());
1463 new_capacity->ClearFlag(HValue::kCanOverflow); 1459 new_capacity->ClearFlag(HValue::kCanOverflow);
1464 1460
1465 HValue* min_growth = 1461 HValue* min_growth = AddInstruction(new(zone) HConstant(16));
1466 AddInstruction(new(zone) HConstant(16, Representation::Integer32()));
1467 1462
1468 new_capacity = AddInstruction( 1463 new_capacity = AddInstruction(
1469 HAdd::New(zone, context, new_capacity, min_growth)); 1464 HAdd::New(zone, context, new_capacity, min_growth));
1470 new_capacity->AssumeRepresentation(Representation::Integer32()); 1465 new_capacity->AssumeRepresentation(Representation::Integer32());
1471 new_capacity->ClearFlag(HValue::kCanOverflow); 1466 new_capacity->ClearFlag(HValue::kCanOverflow);
1472 1467
1473 return new_capacity; 1468 return new_capacity;
1474 } 1469 }
1475 1470
1476 1471
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
1516 ElementsKind elements_kind, 1511 ElementsKind elements_kind,
1517 HValue* from, 1512 HValue* from,
1518 HValue* to) { 1513 HValue* to) {
1519 // Fast elements kinds need to be initialized in case statements below cause 1514 // Fast elements kinds need to be initialized in case statements below cause
1520 // a garbage collection. 1515 // a garbage collection.
1521 Factory* factory = isolate()->factory(); 1516 Factory* factory = isolate()->factory();
1522 1517
1523 double nan_double = FixedDoubleArray::hole_nan_as_double(); 1518 double nan_double = FixedDoubleArray::hole_nan_as_double();
1524 Zone* zone = this->zone(); 1519 Zone* zone = this->zone();
1525 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind) 1520 HValue* hole = IsFastSmiOrObjectElementsKind(elements_kind)
1526 ? AddInstruction(new(zone) HConstant(factory->the_hole_value(), 1521 ? AddInstruction(new(zone) HConstant(factory->the_hole_value()))
1527 Representation::Tagged())) 1522 : AddInstruction(new(zone) HConstant(nan_double));
1528 : AddInstruction(new(zone) HConstant(nan_double,
1529 Representation::Double()));
1530 1523
1531 // Special loop unfolding case 1524 // Special loop unfolding case
1532 static const int kLoopUnfoldLimit = 4; 1525 static const int kLoopUnfoldLimit = 4;
1533 bool unfold_loop = false; 1526 bool unfold_loop = false;
1534 int initial_capacity = JSArray::kPreallocatedArrayElements; 1527 int initial_capacity = JSArray::kPreallocatedArrayElements;
1535 if (from->IsConstant() && to->IsConstant() && 1528 if (from->IsConstant() && to->IsConstant() &&
1536 initial_capacity <= kLoopUnfoldLimit) { 1529 initial_capacity <= kLoopUnfoldLimit) {
1537 HConstant* constant_from = HConstant::cast(from); 1530 HConstant* constant_from = HConstant::cast(from);
1538 HConstant* constant_to = HConstant::cast(to); 1531 HConstant* constant_to = HConstant::cast(to);
1539 1532
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
1632 int elems_offset = size; 1625 int elems_offset = size;
1633 if (length > 0) { 1626 if (length > 0) {
1634 size += IsFastDoubleElementsKind(kind) 1627 size += IsFastDoubleElementsKind(kind)
1635 ? FixedDoubleArray::SizeFor(length) 1628 ? FixedDoubleArray::SizeFor(length)
1636 : FixedArray::SizeFor(length); 1629 : FixedArray::SizeFor(length);
1637 } 1630 }
1638 1631
1639 HAllocate::Flags allocate_flags = HAllocate::DefaultFlags(kind); 1632 HAllocate::Flags allocate_flags = HAllocate::DefaultFlags(kind);
1640 // Allocate both the JS array and the elements array in one big 1633 // Allocate both the JS array and the elements array in one big
1641 // allocation. This avoids multiple limit checks. 1634 // allocation. This avoids multiple limit checks.
1642 HValue* size_in_bytes = 1635 HValue* size_in_bytes = AddInstruction(new(zone) HConstant(size));
1643 AddInstruction(new(zone) HConstant(size, Representation::Integer32()));
1644 HInstruction* object = 1636 HInstruction* object =
1645 AddInstruction(new(zone) HAllocate(context, 1637 AddInstruction(new(zone) HAllocate(context,
1646 size_in_bytes, 1638 size_in_bytes,
1647 HType::JSObject(), 1639 HType::JSObject(),
1648 allocate_flags)); 1640 allocate_flags));
1649 1641
1650 // Copy the JS array part. 1642 // Copy the JS array part.
1651 for (int i = 0; i < JSArray::kSize; i += kPointerSize) { 1643 for (int i = 0; i < JSArray::kSize; i += kPointerSize) {
1652 if ((i != JSArray::kElementsOffset) || (length == 0)) { 1644 if ((i != JSArray::kElementsOffset) || (length == 0)) {
1653 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); 1645 HObjectAccess access = HObjectAccess::ForJSArrayOffset(i);
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
1756 HGlobalObject(context)); 1748 HGlobalObject(context));
1757 HObjectAccess access = HObjectAccess::ForJSObjectOffset( 1749 HObjectAccess access = HObjectAccess::ForJSObjectOffset(
1758 GlobalObject::kNativeContextOffset); 1750 GlobalObject::kNativeContextOffset);
1759 return AddLoad(global_object, access); 1751 return AddLoad(global_object, access);
1760 } 1752 }
1761 1753
1762 1754
1763 HInstruction* HGraphBuilder::BuildGetArrayFunction(HValue* context) { 1755 HInstruction* HGraphBuilder::BuildGetArrayFunction(HValue* context) {
1764 HInstruction* native_context = BuildGetNativeContext(context); 1756 HInstruction* native_context = BuildGetNativeContext(context);
1765 HInstruction* index = AddInstruction(new(zone()) 1757 HInstruction* index = AddInstruction(new(zone())
1766 HConstant(Context::ARRAY_FUNCTION_INDEX, Representation::Integer32())); 1758 HConstant(Context::ARRAY_FUNCTION_INDEX));
1767 1759
1768 return AddInstruction(new (zone()) 1760 return AddInstruction(new (zone())
1769 HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS)); 1761 HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS));
1770 } 1762 }
1771 1763
1772 1764
1773 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder, 1765 HGraphBuilder::JSArrayBuilder::JSArrayBuilder(HGraphBuilder* builder,
1774 ElementsKind kind, 1766 ElementsKind kind,
1775 HValue* allocation_site_payload, 1767 HValue* allocation_site_payload,
1776 bool disable_allocation_sites) : 1768 bool disable_allocation_sites) :
(...skipping 15 matching lines...) Expand all
1792 mode_(DONT_TRACK_ALLOCATION_SITE), 1784 mode_(DONT_TRACK_ALLOCATION_SITE),
1793 allocation_site_payload_(NULL), 1785 allocation_site_payload_(NULL),
1794 constructor_function_(constructor_function) { 1786 constructor_function_(constructor_function) {
1795 } 1787 }
1796 1788
1797 1789
1798 HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode(HValue* context) { 1790 HValue* HGraphBuilder::JSArrayBuilder::EmitMapCode(HValue* context) {
1799 HInstruction* native_context = builder()->BuildGetNativeContext(context); 1791 HInstruction* native_context = builder()->BuildGetNativeContext(context);
1800 1792
1801 HInstruction* index = builder()->AddInstruction(new(zone()) 1793 HInstruction* index = builder()->AddInstruction(new(zone())
1802 HConstant(Context::JS_ARRAY_MAPS_INDEX, Representation::Integer32())); 1794 HConstant(Context::JS_ARRAY_MAPS_INDEX));
1803 1795
1804 HInstruction* map_array = builder()->AddInstruction(new(zone()) 1796 HInstruction* map_array = builder()->AddInstruction(new(zone())
1805 HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS)); 1797 HLoadKeyed(native_context, index, NULL, FAST_ELEMENTS));
1806 1798
1807 HInstruction* kind_index = builder()->AddInstruction(new(zone()) 1799 HInstruction* kind_index = builder()->AddInstruction(new(zone())
1808 HConstant(kind_, Representation::Integer32())); 1800 HConstant(kind_));
1809 1801
1810 return builder()->AddInstruction(new(zone()) 1802 return builder()->AddInstruction(new(zone())
1811 HLoadKeyed(map_array, kind_index, NULL, FAST_ELEMENTS)); 1803 HLoadKeyed(map_array, kind_index, NULL, FAST_ELEMENTS));
1812 } 1804 }
1813 1805
1814 1806
1815 HValue* HGraphBuilder::JSArrayBuilder::EmitInternalMapCode() { 1807 HValue* HGraphBuilder::JSArrayBuilder::EmitInternalMapCode() {
1816 // Find the map near the constructor function 1808 // Find the map near the constructor function
1817 HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap(); 1809 HObjectAccess access = HObjectAccess::ForPrototypeOrInitialMap();
1818 return AddInstruction( 1810 return AddInstruction(
(...skipping 12 matching lines...) Expand all
1831 if (mode_ == TRACK_ALLOCATION_SITE) { 1823 if (mode_ == TRACK_ALLOCATION_SITE) {
1832 base_size += AllocationSiteInfo::kSize; 1824 base_size += AllocationSiteInfo::kSize;
1833 } 1825 }
1834 1826
1835 if (IsFastDoubleElementsKind(kind_)) { 1827 if (IsFastDoubleElementsKind(kind_)) {
1836 base_size += FixedDoubleArray::kHeaderSize; 1828 base_size += FixedDoubleArray::kHeaderSize;
1837 } else { 1829 } else {
1838 base_size += FixedArray::kHeaderSize; 1830 base_size += FixedArray::kHeaderSize;
1839 } 1831 }
1840 1832
1841 HInstruction* elements_size_value = new(zone()) 1833 HInstruction* elements_size_value = new(zone()) HConstant(elements_size());
1842 HConstant(elements_size(), Representation::Integer32());
1843 AddInstruction(elements_size_value); 1834 AddInstruction(elements_size_value);
1844 HInstruction* mul = HMul::New(zone(), context, length_node, 1835 HInstruction* mul = HMul::New(zone(), context, length_node,
1845 elements_size_value); 1836 elements_size_value);
1846 mul->AssumeRepresentation(Representation::Integer32()); 1837 mul->AssumeRepresentation(Representation::Integer32());
1847 mul->ClearFlag(HValue::kCanOverflow); 1838 mul->ClearFlag(HValue::kCanOverflow);
1848 AddInstruction(mul); 1839 AddInstruction(mul);
1849 1840
1850 HInstruction* base = new(zone()) HConstant(base_size, 1841 HInstruction* base = new(zone()) HConstant(base_size);
1851 Representation::Integer32());
1852 AddInstruction(base); 1842 AddInstruction(base);
1853 HInstruction* total_size = HAdd::New(zone(), context, base, mul); 1843 HInstruction* total_size = HAdd::New(zone(), context, base, mul);
1854 total_size->AssumeRepresentation(Representation::Integer32()); 1844 total_size->AssumeRepresentation(Representation::Integer32());
1855 total_size->ClearFlag(HValue::kCanOverflow); 1845 total_size->ClearFlag(HValue::kCanOverflow);
1856 AddInstruction(total_size); 1846 AddInstruction(total_size);
1857 return total_size; 1847 return total_size;
1858 } 1848 }
1859 1849
1860 1850
1861 HValue* HGraphBuilder::JSArrayBuilder::EstablishEmptyArrayAllocationSize() { 1851 HValue* HGraphBuilder::JSArrayBuilder::EstablishEmptyArrayAllocationSize() {
1862 int base_size = JSArray::kSize; 1852 int base_size = JSArray::kSize;
1863 if (mode_ == TRACK_ALLOCATION_SITE) { 1853 if (mode_ == TRACK_ALLOCATION_SITE) {
1864 base_size += AllocationSiteInfo::kSize; 1854 base_size += AllocationSiteInfo::kSize;
1865 } 1855 }
1866 1856
1867 base_size += IsFastDoubleElementsKind(kind_) 1857 base_size += IsFastDoubleElementsKind(kind_)
1868 ? FixedDoubleArray::SizeFor(initial_capacity()) 1858 ? FixedDoubleArray::SizeFor(initial_capacity())
1869 : FixedArray::SizeFor(initial_capacity()); 1859 : FixedArray::SizeFor(initial_capacity());
1870 1860
1871 HConstant* array_size = 1861 HConstant* array_size = new(zone()) HConstant(base_size);
1872 new(zone()) HConstant(base_size, Representation::Integer32());
1873 AddInstruction(array_size); 1862 AddInstruction(array_size);
1874 return array_size; 1863 return array_size;
1875 } 1864 }
1876 1865
1877 1866
1878 HValue* HGraphBuilder::JSArrayBuilder::AllocateEmptyArray() { 1867 HValue* HGraphBuilder::JSArrayBuilder::AllocateEmptyArray() {
1879 HValue* size_in_bytes = EstablishEmptyArrayAllocationSize(); 1868 HValue* size_in_bytes = EstablishEmptyArrayAllocationSize();
1880 HConstant* capacity = 1869 HConstant* capacity = new(zone()) HConstant(initial_capacity());
1881 new(zone()) HConstant(initial_capacity(), Representation::Integer32());
1882 AddInstruction(capacity); 1870 AddInstruction(capacity);
1883 return AllocateArray(size_in_bytes, 1871 return AllocateArray(size_in_bytes,
1884 capacity, 1872 capacity,
1885 builder()->graph()->GetConstant0(), 1873 builder()->graph()->GetConstant0(),
1886 true); 1874 true);
1887 } 1875 }
1888 1876
1889 1877
1890 HValue* HGraphBuilder::JSArrayBuilder::AllocateArray(HValue* capacity, 1878 HValue* HGraphBuilder::JSArrayBuilder::AllocateArray(HValue* capacity,
1891 HValue* length_field, 1879 HValue* length_field,
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
1949 Representation representation) { 1937 Representation representation) {
1950 HLoadNamedField *instr = 1938 HLoadNamedField *instr =
1951 new(zone()) HLoadNamedField(object, access, typecheck, representation); 1939 new(zone()) HLoadNamedField(object, access, typecheck, representation);
1952 AddInstruction(instr); 1940 AddInstruction(instr);
1953 return instr; 1941 return instr;
1954 } 1942 }
1955 1943
1956 1944
1957 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, 1945 HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object,
1958 Handle<Map> map) { 1946 Handle<Map> map) {
1959 HValue* constant = 1947 HValue* constant = AddInstruction(new(zone()) HConstant(map));
1960 AddInstruction(new(zone()) HConstant(map, Representation::Tagged()));
1961 HStoreNamedField *instr = 1948 HStoreNamedField *instr =
1962 new(zone()) HStoreNamedField(object, HObjectAccess::ForMap(), constant); 1949 new(zone()) HStoreNamedField(object, HObjectAccess::ForMap(), constant);
1963 AddInstruction(instr); 1950 AddInstruction(instr);
1964 return instr; 1951 return instr;
1965 } 1952 }
1966 1953
1967 1954
1968 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info) 1955 HOptimizedGraphBuilder::HOptimizedGraphBuilder(CompilationInfo* info)
1969 : HGraphBuilder(info), 1956 : HGraphBuilder(info),
1970 function_state_(NULL), 1957 function_state_(NULL),
(...skipping 2716 matching lines...) Expand 10 before | Expand all | Expand 10 after
4687 4674
4688 while (!arguments.is_empty()) { 4675 while (!arguments.is_empty()) {
4689 AddInstruction(new(zone()) HPushArgument(arguments.RemoveLast())); 4676 AddInstruction(new(zone()) HPushArgument(arguments.RemoveLast()));
4690 } 4677 }
4691 return call; 4678 return call;
4692 } 4679 }
4693 4680
4694 4681
4695 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) { 4682 void HOptimizedGraphBuilder::SetUpScope(Scope* scope) {
4696 HConstant* undefined_constant = new(zone()) HConstant( 4683 HConstant* undefined_constant = new(zone()) HConstant(
4697 isolate()->factory()->undefined_value(), Representation::Tagged()); 4684 isolate()->factory()->undefined_value());
4698 AddInstruction(undefined_constant); 4685 AddInstruction(undefined_constant);
4699 graph()->set_undefined_constant(undefined_constant); 4686 graph()->set_undefined_constant(undefined_constant);
4700 4687
4701 // Create an arguments object containing the initial parameters. Set the 4688 // Create an arguments object containing the initial parameters. Set the
4702 // initial values of parameters including "this" having parameter index 0. 4689 // initial values of parameters including "this" having parameter index 0.
4703 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count()); 4690 ASSERT_EQ(scope->num_parameters() + 1, environment()->parameter_count());
4704 HArgumentsObject* arguments_object = 4691 HArgumentsObject* arguments_object =
4705 new(zone()) HArgumentsObject(environment()->parameter_count(), zone()); 4692 new(zone()) HArgumentsObject(environment()->parameter_count(), zone());
4706 for (int i = 0; i < environment()->parameter_count(); ++i) { 4693 for (int i = 0; i < environment()->parameter_count(); ++i) {
4707 HInstruction* parameter = AddInstruction(new(zone()) HParameter(i)); 4694 HInstruction* parameter = AddInstruction(new(zone()) HParameter(i));
(...skipping 905 matching lines...) Expand 10 before | Expand all | Expand 10 after
5613 case Variable::UNALLOCATED: { 5600 case Variable::UNALLOCATED: {
5614 if (IsLexicalVariableMode(variable->mode())) { 5601 if (IsLexicalVariableMode(variable->mode())) {
5615 // TODO(rossberg): should this be an ASSERT? 5602 // TODO(rossberg): should this be an ASSERT?
5616 return Bailout("reference to global lexical variable"); 5603 return Bailout("reference to global lexical variable");
5617 } 5604 }
5618 // Handle known global constants like 'undefined' specially to avoid a 5605 // Handle known global constants like 'undefined' specially to avoid a
5619 // load from a global cell for them. 5606 // load from a global cell for them.
5620 Handle<Object> constant_value = 5607 Handle<Object> constant_value =
5621 isolate()->factory()->GlobalConstantFor(variable->name()); 5608 isolate()->factory()->GlobalConstantFor(variable->name());
5622 if (!constant_value.is_null()) { 5609 if (!constant_value.is_null()) {
5623 HConstant* instr = 5610 HConstant* instr = new(zone()) HConstant(constant_value);
5624 new(zone()) HConstant(constant_value, Representation::Tagged());
5625 return ast_context()->ReturnInstruction(instr, expr->id()); 5611 return ast_context()->ReturnInstruction(instr, expr->id());
5626 } 5612 }
5627 5613
5628 LookupResult lookup(isolate()); 5614 LookupResult lookup(isolate());
5629 GlobalPropertyAccess type = 5615 GlobalPropertyAccess type =
5630 LookupGlobalProperty(variable, &lookup, false); 5616 LookupGlobalProperty(variable, &lookup, false);
5631 5617
5632 if (type == kUseCell && 5618 if (type == kUseCell &&
5633 current_info()->global_object()->IsAccessCheckNeeded()) { 5619 current_info()->global_object()->IsAccessCheckNeeded()) {
5634 type = kUseGeneric; 5620 type = kUseGeneric;
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
5674 case Variable::LOOKUP: 5660 case Variable::LOOKUP:
5675 return Bailout("reference to a variable which requires dynamic lookup"); 5661 return Bailout("reference to a variable which requires dynamic lookup");
5676 } 5662 }
5677 } 5663 }
5678 5664
5679 5665
5680 void HOptimizedGraphBuilder::VisitLiteral(Literal* expr) { 5666 void HOptimizedGraphBuilder::VisitLiteral(Literal* expr) {
5681 ASSERT(!HasStackOverflow()); 5667 ASSERT(!HasStackOverflow());
5682 ASSERT(current_block() != NULL); 5668 ASSERT(current_block() != NULL);
5683 ASSERT(current_block()->HasPredecessor()); 5669 ASSERT(current_block()->HasPredecessor());
5684 HConstant* instr = 5670 HConstant* instr = new(zone()) HConstant(expr->handle());
5685 new(zone()) HConstant(expr->handle(), Representation::None());
5686 return ast_context()->ReturnInstruction(instr, expr->id()); 5671 return ast_context()->ReturnInstruction(instr, expr->id());
5687 } 5672 }
5688 5673
5689 5674
5690 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) { 5675 void HOptimizedGraphBuilder::VisitRegExpLiteral(RegExpLiteral* expr) {
5691 ASSERT(!HasStackOverflow()); 5676 ASSERT(!HasStackOverflow());
5692 ASSERT(current_block() != NULL); 5677 ASSERT(current_block() != NULL);
5693 ASSERT(current_block()->HasPredecessor()); 5678 ASSERT(current_block()->HasPredecessor());
5694 Handle<JSFunction> closure = function_state()->compilation_info()->closure(); 5679 Handle<JSFunction> closure = function_state()->compilation_info()->closure();
5695 Handle<FixedArray> literals(closure->literals()); 5680 Handle<FixedArray> literals(closure->literals());
(...skipping 204 matching lines...) Expand 10 before | Expand all | Expand 10 after
5900 NoObservableSideEffectsScope no_effects(this); 5885 NoObservableSideEffectsScope no_effects(this);
5901 Handle<FixedArray> closure_literals(closure->literals(), isolate()); 5886 Handle<FixedArray> closure_literals(closure->literals(), isolate());
5902 Handle<FixedArray> constant_properties = expr->constant_properties(); 5887 Handle<FixedArray> constant_properties = expr->constant_properties();
5903 int literal_index = expr->literal_index(); 5888 int literal_index = expr->literal_index();
5904 int flags = expr->fast_elements() 5889 int flags = expr->fast_elements()
5905 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags; 5890 ? ObjectLiteral::kFastElements : ObjectLiteral::kNoFlags;
5906 flags |= expr->has_function() 5891 flags |= expr->has_function()
5907 ? ObjectLiteral::kHasFunction : ObjectLiteral::kNoFlags; 5892 ? ObjectLiteral::kHasFunction : ObjectLiteral::kNoFlags;
5908 5893
5909 AddInstruction(new(zone()) HPushArgument(AddInstruction( 5894 AddInstruction(new(zone()) HPushArgument(AddInstruction(
5910 new(zone()) HConstant(closure_literals, Representation::Tagged())))); 5895 new(zone()) HConstant(closure_literals))));
5911 AddInstruction(new(zone()) HPushArgument(AddInstruction( 5896 AddInstruction(new(zone()) HPushArgument(AddInstruction(
5912 new(zone()) HConstant(literal_index, Representation::Tagged())))); 5897 new(zone()) HConstant(literal_index))));
5913 AddInstruction(new(zone()) HPushArgument(AddInstruction( 5898 AddInstruction(new(zone()) HPushArgument(AddInstruction(
5914 new(zone()) HConstant(constant_properties, Representation::Tagged())))); 5899 new(zone()) HConstant(constant_properties))));
5915 AddInstruction(new(zone()) HPushArgument(AddInstruction( 5900 AddInstruction(new(zone()) HPushArgument(AddInstruction(
5916 new(zone()) HConstant(flags, Representation::Tagged())))); 5901 new(zone()) HConstant(flags))));
5917 5902
5918 Runtime::FunctionId function_id = 5903 Runtime::FunctionId function_id =
5919 (expr->depth() > 1 || expr->may_store_doubles()) 5904 (expr->depth() > 1 || expr->may_store_doubles())
5920 ? Runtime::kCreateObjectLiteral : Runtime::kCreateObjectLiteralShallow; 5905 ? Runtime::kCreateObjectLiteral : Runtime::kCreateObjectLiteralShallow;
5921 literal = AddInstruction( 5906 literal = AddInstruction(
5922 new(zone()) HCallRuntime(context, 5907 new(zone()) HCallRuntime(context,
5923 isolate()->factory()->empty_string(), 5908 isolate()->factory()->empty_string(),
5924 Runtime::FunctionForId(function_id), 5909 Runtime::FunctionForId(function_id),
5925 4)); 5910 4));
5926 } 5911 }
(...skipping 137 matching lines...) Expand 10 before | Expand all | Expand 10 after
6064 // TODO(mstarzinger): The following check and deopt is actually obsolete 6049 // TODO(mstarzinger): The following check and deopt is actually obsolete
6065 // but test cases for the tick processor fails because profile differs. 6050 // but test cases for the tick processor fails because profile differs.
6066 6051
6067 // Deopt if the array literal boilerplate ElementsKind is of a type 6052 // Deopt if the array literal boilerplate ElementsKind is of a type
6068 // different than the expected one. The check isn't necessary if the 6053 // different than the expected one. The check isn't necessary if the
6069 // boilerplate has already been converted to TERMINAL_FAST_ELEMENTS_KIND. 6054 // boilerplate has already been converted to TERMINAL_FAST_ELEMENTS_KIND.
6070 if (CanTransitionToMoreGeneralFastElementsKind( 6055 if (CanTransitionToMoreGeneralFastElementsKind(
6071 boilerplate_elements_kind, true)) { 6056 boilerplate_elements_kind, true)) {
6072 IfBuilder builder(this); 6057 IfBuilder builder(this);
6073 HValue* boilerplate = AddInstruction(new(zone()) 6058 HValue* boilerplate = AddInstruction(new(zone())
6074 HConstant(original_boilerplate_object, Representation::Tagged())); 6059 HConstant(original_boilerplate_object));
6075 HValue* elements_kind = AddInstruction(new(zone()) 6060 HValue* elements_kind = AddInstruction(new(zone())
6076 HElementsKind(boilerplate)); 6061 HElementsKind(boilerplate));
6077 HValue* expected_kind = AddInstruction(new(zone()) 6062 HValue* expected_kind = AddInstruction(new(zone())
6078 HConstant(boilerplate_elements_kind, Representation::Integer32())); 6063 HConstant(boilerplate_elements_kind));
6079 builder.IfCompare(elements_kind, expected_kind, Token::EQ); 6064 builder.IfCompare(elements_kind, expected_kind, Token::EQ);
6080 builder.Then(); 6065 builder.Then();
6081 builder.ElseDeopt(); 6066 builder.ElseDeopt();
6082 } 6067 }
6083 6068
6084 AddInstruction(new(zone()) HPushArgument(AddInstruction( 6069 AddInstruction(new(zone()) HPushArgument(AddInstruction(
6085 new(zone()) HConstant(literals, Representation::Tagged())))); 6070 new(zone()) HConstant(literals))));
6086 AddInstruction(new(zone()) HPushArgument(AddInstruction( 6071 AddInstruction(new(zone()) HPushArgument(AddInstruction(
6087 new(zone()) HConstant(literal_index, Representation::Tagged())))); 6072 new(zone()) HConstant(literal_index))));
6088 AddInstruction(new(zone()) HPushArgument(AddInstruction( 6073 AddInstruction(new(zone()) HPushArgument(AddInstruction(
6089 new(zone()) HConstant(constants, Representation::Tagged())))); 6074 new(zone()) HConstant(constants))));
6090 6075
6091 Runtime::FunctionId function_id = (expr->depth() > 1) 6076 Runtime::FunctionId function_id = (expr->depth() > 1)
6092 ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow; 6077 ? Runtime::kCreateArrayLiteral : Runtime::kCreateArrayLiteralShallow;
6093 literal = AddInstruction( 6078 literal = AddInstruction(
6094 new(zone()) HCallRuntime(context, 6079 new(zone()) HCallRuntime(context,
6095 isolate()->factory()->empty_string(), 6080 isolate()->factory()->empty_string(),
6096 Runtime::FunctionForId(function_id), 6081 Runtime::FunctionForId(function_id),
6097 3)); 6082 3));
6098 } 6083 }
6099 6084
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after
6233 HObjectAccess field_access = HObjectAccess::ForField(map, lookup, name); 6218 HObjectAccess field_access = HObjectAccess::ForField(map, lookup, name);
6234 Representation representation = ComputeLoadStoreRepresentation(map, lookup); 6219 Representation representation = ComputeLoadStoreRepresentation(map, lookup);
6235 bool transition_to_field = lookup->IsTransitionToField(*map); 6220 bool transition_to_field = lookup->IsTransitionToField(*map);
6236 6221
6237 HStoreNamedField *instr; 6222 HStoreNamedField *instr;
6238 if (FLAG_track_double_fields && representation.IsDouble()) { 6223 if (FLAG_track_double_fields && representation.IsDouble()) {
6239 if (transition_to_field) { 6224 if (transition_to_field) {
6240 // The store requires a mutable HeapNumber to be allocated. 6225 // The store requires a mutable HeapNumber to be allocated.
6241 NoObservableSideEffectsScope no_side_effects(this); 6226 NoObservableSideEffectsScope no_side_effects(this);
6242 HInstruction* heap_number_size = AddInstruction(new(zone()) HConstant( 6227 HInstruction* heap_number_size = AddInstruction(new(zone()) HConstant(
6243 HeapNumber::kSize, Representation::Integer32())); 6228 HeapNumber::kSize));
6244 HInstruction* double_box = AddInstruction(new(zone()) HAllocate( 6229 HInstruction* double_box = AddInstruction(new(zone()) HAllocate(
6245 environment()->LookupContext(), heap_number_size, 6230 environment()->LookupContext(), heap_number_size,
6246 HType::HeapNumber(), HAllocate::CAN_ALLOCATE_IN_NEW_SPACE)); 6231 HType::HeapNumber(), HAllocate::CAN_ALLOCATE_IN_NEW_SPACE));
6247 AddStoreMapConstant(double_box, isolate()->factory()->heap_number_map()); 6232 AddStoreMapConstant(double_box, isolate()->factory()->heap_number_map());
6248 AddStore(double_box, HObjectAccess::ForHeapNumberValue(), 6233 AddStore(double_box, HObjectAccess::ForHeapNumberValue(),
6249 value, Representation::Double()); 6234 value, Representation::Double());
6250 instr = new(zone()) HStoreNamedField(object, field_access, double_box); 6235 instr = new(zone()) HStoreNamedField(object, field_access, double_box);
6251 } else { 6236 } else {
6252 // Already holds a HeapNumber; load the box and write its value field. 6237 // Already holds a HeapNumber; load the box and write its value field.
6253 HInstruction* double_box = AddLoad(object, field_access); 6238 HInstruction* double_box = AddLoad(object, field_access);
(...skipping 740 matching lines...) Expand 10 before | Expand all | Expand 10 after
6994 AddCheckMap(object, map); 6979 AddCheckMap(object, map);
6995 return BuildLoadNamedField(object, 6980 return BuildLoadNamedField(object,
6996 HObjectAccess::ForField(map, &lookup, name), 6981 HObjectAccess::ForField(map, &lookup, name),
6997 ComputeLoadStoreRepresentation(map, &lookup)); 6982 ComputeLoadStoreRepresentation(map, &lookup));
6998 } 6983 }
6999 6984
7000 // Handle a load of a constant known function. 6985 // Handle a load of a constant known function.
7001 if (lookup.IsConstantFunction()) { 6986 if (lookup.IsConstantFunction()) {
7002 AddCheckMap(object, map); 6987 AddCheckMap(object, map);
7003 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map)); 6988 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*map));
7004 return new(zone()) HConstant(function, Representation::Tagged()); 6989 return new(zone()) HConstant(function);
7005 } 6990 }
7006 6991
7007 // Handle a load from a known field somewhere in the prototype chain. 6992 // Handle a load from a known field somewhere in the prototype chain.
7008 LookupInPrototypes(map, name, &lookup); 6993 LookupInPrototypes(map, name, &lookup);
7009 if (lookup.IsField()) { 6994 if (lookup.IsField()) {
7010 Handle<JSObject> prototype(JSObject::cast(map->prototype())); 6995 Handle<JSObject> prototype(JSObject::cast(map->prototype()));
7011 Handle<JSObject> holder(lookup.holder()); 6996 Handle<JSObject> holder(lookup.holder());
7012 Handle<Map> holder_map(holder->map()); 6997 Handle<Map> holder_map(holder->map());
7013 AddCheckMap(object, map); 6998 AddCheckMap(object, map);
7014 AddInstruction(new(zone()) HCheckPrototypeMaps( 6999 AddInstruction(new(zone()) HCheckPrototypeMaps(
7015 prototype, holder, zone(), top_info())); 7000 prototype, holder, zone(), top_info()));
7016 HValue* holder_value = AddInstruction(new(zone()) 7001 HValue* holder_value = AddInstruction(new(zone()) HConstant(holder));
7017 HConstant(holder, Representation::Tagged()));
7018 return BuildLoadNamedField(holder_value, 7002 return BuildLoadNamedField(holder_value,
7019 HObjectAccess::ForField(holder_map, &lookup, name), 7003 HObjectAccess::ForField(holder_map, &lookup, name),
7020 ComputeLoadStoreRepresentation(map, &lookup)); 7004 ComputeLoadStoreRepresentation(map, &lookup));
7021 } 7005 }
7022 7006
7023 // Handle a load of a constant function somewhere in the prototype chain. 7007 // Handle a load of a constant function somewhere in the prototype chain.
7024 if (lookup.IsConstantFunction()) { 7008 if (lookup.IsConstantFunction()) {
7025 Handle<JSObject> prototype(JSObject::cast(map->prototype())); 7009 Handle<JSObject> prototype(JSObject::cast(map->prototype()));
7026 Handle<JSObject> holder(lookup.holder()); 7010 Handle<JSObject> holder(lookup.holder());
7027 Handle<Map> holder_map(holder->map()); 7011 Handle<Map> holder_map(holder->map());
7028 AddCheckMap(object, map); 7012 AddCheckMap(object, map);
7029 AddInstruction(new(zone()) HCheckPrototypeMaps( 7013 AddInstruction(new(zone()) HCheckPrototypeMaps(
7030 prototype, holder, zone(), top_info())); 7014 prototype, holder, zone(), top_info()));
7031 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*holder_map)); 7015 Handle<JSFunction> function(lookup.GetConstantFunctionFromMap(*holder_map));
7032 return new(zone()) HConstant(function, Representation::Tagged()); 7016 return new(zone()) HConstant(function);
7033 } 7017 }
7034 7018
7035 // No luck, do a generic load. 7019 // No luck, do a generic load.
7036 return BuildLoadNamedGeneric(object, name, expr); 7020 return BuildLoadNamedGeneric(object, name, expr);
7037 } 7021 }
7038 7022
7039 7023
7040 HInstruction* HOptimizedGraphBuilder::BuildLoadKeyedGeneric(HValue* object, 7024 HInstruction* HOptimizedGraphBuilder::BuildLoadKeyedGeneric(HValue* object,
7041 HValue* key) { 7025 HValue* key) {
7042 HValue* context = environment()->LookupContext(); 7026 HValue* context = environment()->LookupContext();
(...skipping 960 matching lines...) Expand 10 before | Expand all | Expand 10 after
8003 undefined, 7987 undefined,
8004 function_state()->inlining_kind(), 7988 function_state()->inlining_kind(),
8005 undefined_receiver); 7989 undefined_receiver);
8006 #ifdef V8_TARGET_ARCH_IA32 7990 #ifdef V8_TARGET_ARCH_IA32
8007 // IA32 only, overwrite the caller's context in the deoptimization 7991 // IA32 only, overwrite the caller's context in the deoptimization
8008 // environment with the correct one. 7992 // environment with the correct one.
8009 // 7993 //
8010 // TODO(kmillikin): implement the same inlining on other platforms so we 7994 // TODO(kmillikin): implement the same inlining on other platforms so we
8011 // can remove the unsightly ifdefs in this function. 7995 // can remove the unsightly ifdefs in this function.
8012 HConstant* context = 7996 HConstant* context =
8013 new(zone()) HConstant(Handle<Context>(target->context()), 7997 new(zone()) HConstant(Handle<Context>(target->context()));
8014 Representation::Tagged());
8015 AddInstruction(context); 7998 AddInstruction(context);
8016 inner_env->BindContext(context); 7999 inner_env->BindContext(context);
8017 #endif 8000 #endif
8018 8001
8019 AddSimulate(return_id); 8002 AddSimulate(return_id);
8020 current_block()->UpdateEnvironment(inner_env); 8003 current_block()->UpdateEnvironment(inner_env);
8021 HArgumentsObject* arguments_object = NULL; 8004 HArgumentsObject* arguments_object = NULL;
8022 8005
8023 // If the function uses arguments object create and bind one, also copy 8006 // If the function uses arguments object create and bind one, also copy
8024 // current arguments values to use them for materialization. 8007 // current arguments values to use them for materialization.
(...skipping 319 matching lines...) Expand 10 before | Expand all | Expand 10 after
8344 Pop(); // Pop receiver. 8327 Pop(); // Pop receiver.
8345 HValue* context = environment()->LookupContext(); 8328 HValue* context = environment()->LookupContext();
8346 HInstruction* result = NULL; 8329 HInstruction* result = NULL;
8347 // Use sqrt() if exponent is 0.5 or -0.5. 8330 // Use sqrt() if exponent is 0.5 or -0.5.
8348 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) { 8331 if (right->IsConstant() && HConstant::cast(right)->HasDoubleValue()) {
8349 double exponent = HConstant::cast(right)->DoubleValue(); 8332 double exponent = HConstant::cast(right)->DoubleValue();
8350 if (exponent == 0.5) { 8333 if (exponent == 0.5) {
8351 result = 8334 result =
8352 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf); 8335 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf);
8353 } else if (exponent == -0.5) { 8336 } else if (exponent == -0.5) {
8354 HConstant* double_one = new(zone()) HConstant( 8337 HValue* one = graph()->GetConstant1();
8355 1, Representation::Double());
8356 AddInstruction(double_one);
8357 HInstruction* sqrt = 8338 HInstruction* sqrt =
8358 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf); 8339 HUnaryMathOperation::New(zone(), context, left, kMathPowHalf);
8359 AddInstruction(sqrt); 8340 AddInstruction(sqrt);
8360 // MathPowHalf doesn't have side effects so there's no need for 8341 // MathPowHalf doesn't have side effects so there's no need for
8361 // an environment simulation here. 8342 // an environment simulation here.
8362 ASSERT(!sqrt->HasObservableSideEffects()); 8343 ASSERT(!sqrt->HasObservableSideEffects());
8363 result = HDiv::New(zone(), context, double_one, sqrt); 8344 result = HDiv::New(zone(), context, one, sqrt);
8364 } else if (exponent == 2.0) { 8345 } else if (exponent == 2.0) {
8365 result = HMul::New(zone(), context, left, left); 8346 result = HMul::New(zone(), context, left, left);
8366 } 8347 }
8367 } else if (right->EqualsInteger32Constant(2)) { 8348 } else if (right->EqualsInteger32Constant(2)) {
8368 result = HMul::New(zone(), context, left, left); 8349 result = HMul::New(zone(), context, left, left);
8369 } 8350 }
8370 8351
8371 if (result == NULL) { 8352 if (result == NULL) {
8372 result = HPower::New(zone(), left, right); 8353 result = HPower::New(zone(), left, right);
8373 } 8354 }
(...skipping 445 matching lines...) Expand 10 before | Expand all | Expand 10 after
8819 } 8800 }
8820 8801
8821 // Calculate instance size from initial map of constructor. 8802 // Calculate instance size from initial map of constructor.
8822 ASSERT(constructor->has_initial_map()); 8803 ASSERT(constructor->has_initial_map());
8823 Handle<Map> initial_map(constructor->initial_map()); 8804 Handle<Map> initial_map(constructor->initial_map());
8824 int instance_size = initial_map->instance_size(); 8805 int instance_size = initial_map->instance_size();
8825 ASSERT(initial_map->InitialPropertiesLength() == 0); 8806 ASSERT(initial_map->InitialPropertiesLength() == 0);
8826 8807
8827 // Allocate an instance of the implicit receiver object. 8808 // Allocate an instance of the implicit receiver object.
8828 HValue* size_in_bytes = 8809 HValue* size_in_bytes =
8829 AddInstruction(new(zone()) HConstant(instance_size, 8810 AddInstruction(new(zone()) HConstant(instance_size));
8830 Representation::Integer32()));
8831 8811
8832 HAllocate::Flags flags = HAllocate::DefaultFlags(); 8812 HAllocate::Flags flags = HAllocate::DefaultFlags();
8833 if (FLAG_pretenuring_call_new && 8813 if (FLAG_pretenuring_call_new &&
8834 isolate()->heap()->ShouldGloballyPretenure()) { 8814 isolate()->heap()->ShouldGloballyPretenure()) {
8835 flags = static_cast<HAllocate::Flags>( 8815 flags = static_cast<HAllocate::Flags>(
8836 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); 8816 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE);
8837 } 8817 }
8838 8818
8839 HInstruction* receiver = 8819 HInstruction* receiver =
8840 AddInstruction(new(zone()) HAllocate(context, 8820 AddInstruction(new(zone()) HAllocate(context,
8841 size_in_bytes, 8821 size_in_bytes,
8842 HType::JSObject(), 8822 HType::JSObject(),
8843 flags)); 8823 flags));
8844 HAllocate::cast(receiver)->set_known_initial_map(initial_map); 8824 HAllocate::cast(receiver)->set_known_initial_map(initial_map);
8845 8825
8846 // Load the initial map from the constructor. 8826 // Load the initial map from the constructor.
8847 HValue* constructor_value = 8827 HValue* constructor_value =
8848 AddInstruction(new(zone()) HConstant(constructor, 8828 AddInstruction(new(zone()) HConstant(constructor));
8849 Representation::Tagged()));
8850 HValue* initial_map_value = 8829 HValue* initial_map_value =
8851 AddLoad(constructor_value, HObjectAccess::ForJSObjectOffset( 8830 AddLoad(constructor_value, HObjectAccess::ForJSObjectOffset(
8852 JSFunction::kPrototypeOrInitialMapOffset)); 8831 JSFunction::kPrototypeOrInitialMapOffset));
8853 8832
8854 // Initialize map and fields of the newly allocated object. 8833 // Initialize map and fields of the newly allocated object.
8855 { NoObservableSideEffectsScope no_effects(this); 8834 { NoObservableSideEffectsScope no_effects(this);
8856 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); 8835 ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE);
8857 AddStore(receiver, 8836 AddStore(receiver,
8858 HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset), 8837 HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset),
8859 initial_map_value); 8838 initial_map_value);
8860 HValue* empty_fixed_array = 8839 HValue* empty_fixed_array =
8861 AddInstruction(new(zone()) HConstant(factory->empty_fixed_array(), 8840 AddInstruction(new(zone()) HConstant(factory->empty_fixed_array()));
8862 Representation::Tagged()));
8863 AddStore(receiver, 8841 AddStore(receiver,
8864 HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset), 8842 HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset),
8865 empty_fixed_array); 8843 empty_fixed_array);
8866 AddStore(receiver, 8844 AddStore(receiver,
8867 HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset), 8845 HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset),
8868 empty_fixed_array); 8846 empty_fixed_array);
8869 if (initial_map->inobject_properties() != 0) { 8847 if (initial_map->inobject_properties() != 0) {
8870 HConstant* undefined = graph()->GetConstantUndefined(); 8848 HConstant* undefined = graph()->GetConstantUndefined();
8871 for (int i = 0; i < initial_map->inobject_properties(); i++) { 8849 for (int i = 0; i < initial_map->inobject_properties(); i++) {
8872 int property_offset = JSObject::kHeaderSize + i * kPointerSize; 8850 int property_offset = JSObject::kHeaderSize + i * kPointerSize;
(...skipping 481 matching lines...) Expand 10 before | Expand all | Expand 10 after
9354 HValue* context, 9332 HValue* context,
9355 HValue* string, 9333 HValue* string,
9356 HValue* index) { 9334 HValue* index) {
9357 if (string->IsConstant() && index->IsConstant()) { 9335 if (string->IsConstant() && index->IsConstant()) {
9358 HConstant* c_string = HConstant::cast(string); 9336 HConstant* c_string = HConstant::cast(string);
9359 HConstant* c_index = HConstant::cast(index); 9337 HConstant* c_index = HConstant::cast(index);
9360 if (c_string->HasStringValue() && c_index->HasNumberValue()) { 9338 if (c_string->HasStringValue() && c_index->HasNumberValue()) {
9361 int32_t i = c_index->NumberValueAsInteger32(); 9339 int32_t i = c_index->NumberValueAsInteger32();
9362 Handle<String> s = c_string->StringValue(); 9340 Handle<String> s = c_string->StringValue();
9363 if (i < 0 || i >= s->length()) { 9341 if (i < 0 || i >= s->length()) {
9364 return new(zone()) HConstant(OS::nan_value(), Representation::Double()); 9342 return new(zone()) HConstant(OS::nan_value());
9365 } 9343 }
9366 return new(zone()) HConstant(s->Get(i)); 9344 return new(zone()) HConstant(s->Get(i));
9367 } 9345 }
9368 } 9346 }
9369 BuildCheckNonSmi(string); 9347 BuildCheckNonSmi(string);
9370 AddInstruction(HCheckInstanceType::NewIsString(string, zone())); 9348 AddInstruction(HCheckInstanceType::NewIsString(string, zone()));
9371 HInstruction* length = HStringLength::New(zone(), string); 9349 HInstruction* length = HStringLength::New(zone(), string);
9372 AddInstruction(length); 9350 AddInstruction(length);
9373 HInstruction* checked_index = AddBoundsCheck(index, length); 9351 HInstruction* checked_index = AddBoundsCheck(index, length);
9374 return new(zone()) HStringCharCodeAt(context, string, checked_index); 9352 return new(zone()) HStringCharCodeAt(context, string, checked_index);
(...skipping 572 matching lines...) Expand 10 before | Expand all | Expand 10 after
9947 BuildCompareNil(value, type, expr->position(), &continuation); 9925 BuildCompareNil(value, type, expr->position(), &continuation);
9948 return ast_context()->ReturnContinuation(&continuation, expr->id()); 9926 return ast_context()->ReturnContinuation(&continuation, expr->id());
9949 } 9927 }
9950 9928
9951 9929
9952 HInstruction* HOptimizedGraphBuilder::BuildThisFunction() { 9930 HInstruction* HOptimizedGraphBuilder::BuildThisFunction() {
9953 // If we share optimized code between different closures, the 9931 // If we share optimized code between different closures, the
9954 // this-function is not a constant, except inside an inlined body. 9932 // this-function is not a constant, except inside an inlined body.
9955 if (function_state()->outer() != NULL) { 9933 if (function_state()->outer() != NULL) {
9956 return new(zone()) HConstant( 9934 return new(zone()) HConstant(
9957 function_state()->compilation_info()->closure(), 9935 function_state()->compilation_info()->closure());
9958 Representation::Tagged());
9959 } else { 9936 } else {
9960 return new(zone()) HThisFunction; 9937 return new(zone()) HThisFunction;
9961 } 9938 }
9962 } 9939 }
9963 9940
9964 9941
9965 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( 9942 HInstruction* HOptimizedGraphBuilder::BuildFastLiteral(
9966 HValue* context, 9943 HValue* context,
9967 Handle<JSObject> boilerplate_object, 9944 Handle<JSObject> boilerplate_object,
9968 Handle<JSObject> original_boilerplate_object, 9945 Handle<JSObject> original_boilerplate_object,
9969 int data_size, 9946 int data_size,
9970 int pointer_size, 9947 int pointer_size,
9971 AllocationSiteMode mode) { 9948 AllocationSiteMode mode) {
9972 Zone* zone = this->zone(); 9949 Zone* zone = this->zone();
9973 int total_size = data_size + pointer_size; 9950 int total_size = data_size + pointer_size;
9974 9951
9975 NoObservableSideEffectsScope no_effects(this); 9952 NoObservableSideEffectsScope no_effects(this);
9976 9953
9977 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE; 9954 HAllocate::Flags flags = HAllocate::CAN_ALLOCATE_IN_NEW_SPACE;
9978 // TODO(hpayer): add support for old data space 9955 // TODO(hpayer): add support for old data space
9979 if (isolate()->heap()->ShouldGloballyPretenure() && 9956 if (isolate()->heap()->ShouldGloballyPretenure() &&
9980 data_size == 0) { 9957 data_size == 0) {
9981 flags = static_cast<HAllocate::Flags>( 9958 flags = static_cast<HAllocate::Flags>(
9982 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE); 9959 flags | HAllocate::CAN_ALLOCATE_IN_OLD_POINTER_SPACE);
9983 } 9960 }
9984 9961
9985 HValue* size_in_bytes = 9962 HValue* size_in_bytes = AddInstruction(new(zone) HConstant(total_size));
9986 AddInstruction(new(zone) HConstant(total_size,
9987 Representation::Integer32()));
9988 HInstruction* result = 9963 HInstruction* result =
9989 AddInstruction(new(zone) HAllocate(context, 9964 AddInstruction(new(zone) HAllocate(context,
9990 size_in_bytes, 9965 size_in_bytes,
9991 HType::JSObject(), 9966 HType::JSObject(),
9992 flags)); 9967 flags));
9993 int offset = 0; 9968 int offset = 0;
9994 BuildEmitDeepCopy(boilerplate_object, original_boilerplate_object, result, 9969 BuildEmitDeepCopy(boilerplate_object, original_boilerplate_object, result,
9995 &offset, mode); 9970 &offset, mode);
9996 return result; 9971 return result;
9997 } 9972 }
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
10034 AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset)); 10009 AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset));
10035 BuildEmitInObjectProperties(boilerplate_object, original_boilerplate_object, 10010 BuildEmitInObjectProperties(boilerplate_object, original_boilerplate_object,
10036 object_properties, target, offset); 10011 object_properties, target, offset);
10037 10012
10038 // Create allocation site info. 10013 // Create allocation site info.
10039 if (mode == TRACK_ALLOCATION_SITE && 10014 if (mode == TRACK_ALLOCATION_SITE &&
10040 boilerplate_object->map()->CanTrackAllocationSite()) { 10015 boilerplate_object->map()->CanTrackAllocationSite()) {
10041 elements_offset += AllocationSiteInfo::kSize; 10016 elements_offset += AllocationSiteInfo::kSize;
10042 *offset += AllocationSiteInfo::kSize; 10017 *offset += AllocationSiteInfo::kSize;
10043 HInstruction* original_boilerplate = AddInstruction(new(zone) HConstant( 10018 HInstruction* original_boilerplate = AddInstruction(new(zone) HConstant(
10044 original_boilerplate_object, Representation::Tagged())); 10019 original_boilerplate_object));
10045 BuildCreateAllocationSiteInfo(target, JSArray::kSize, original_boilerplate); 10020 BuildCreateAllocationSiteInfo(target, JSArray::kSize, original_boilerplate);
10046 } 10021 }
10047 } 10022 }
10048 10023
10049 10024
10050 HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader( 10025 HValue* HOptimizedGraphBuilder::BuildEmitObjectHeader(
10051 Handle<JSObject> boilerplate_object, 10026 Handle<JSObject> boilerplate_object,
10052 HInstruction* target, 10027 HInstruction* target,
10053 int object_offset, 10028 int object_offset,
10054 int elements_offset, 10029 int elements_offset,
10055 int elements_size) { 10030 int elements_size) {
10056 ASSERT(boilerplate_object->properties()->length() == 0); 10031 ASSERT(boilerplate_object->properties()->length() == 0);
10057 Zone* zone = this->zone(); 10032 Zone* zone = this->zone();
10058 HValue* result = NULL; 10033 HValue* result = NULL;
10059 10034
10060 HValue* object_header = 10035 HValue* object_header =
10061 AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset)); 10036 AddInstruction(new(zone) HInnerAllocatedObject(target, object_offset));
10062 Handle<Map> boilerplate_object_map(boilerplate_object->map()); 10037 Handle<Map> boilerplate_object_map(boilerplate_object->map());
10063 AddStoreMapConstant(object_header, boilerplate_object_map); 10038 AddStoreMapConstant(object_header, boilerplate_object_map);
10064 10039
10065 HInstruction* elements; 10040 HInstruction* elements;
10066 if (elements_size == 0) { 10041 if (elements_size == 0) {
10067 Handle<Object> elements_field = 10042 Handle<Object> elements_field =
10068 Handle<Object>(boilerplate_object->elements(), isolate()); 10043 Handle<Object>(boilerplate_object->elements(), isolate());
10069 elements = AddInstruction(new(zone) HConstant( 10044 elements = AddInstruction(new(zone) HConstant(elements_field));
10070 elements_field, Representation::Tagged()));
10071 } else { 10045 } else {
10072 elements = AddInstruction(new(zone) HInnerAllocatedObject( 10046 elements = AddInstruction(new(zone) HInnerAllocatedObject(
10073 target, elements_offset)); 10047 target, elements_offset));
10074 result = elements; 10048 result = elements;
10075 } 10049 }
10076 AddStore(object_header, HObjectAccess::ForElementsPointer(), elements); 10050 AddStore(object_header, HObjectAccess::ForElementsPointer(), elements);
10077 10051
10078 Handle<Object> properties_field = 10052 Handle<Object> properties_field =
10079 Handle<Object>(boilerplate_object->properties(), isolate()); 10053 Handle<Object>(boilerplate_object->properties(), isolate());
10080 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); 10054 ASSERT(*properties_field == isolate()->heap()->empty_fixed_array());
10081 HInstruction* properties = AddInstruction(new(zone) HConstant( 10055 HInstruction* properties = AddInstruction(new(zone) HConstant(
10082 properties_field, Representation::None())); 10056 properties_field));
10083 HObjectAccess access = HObjectAccess::ForPropertiesPointer(); 10057 HObjectAccess access = HObjectAccess::ForPropertiesPointer();
10084 AddStore(object_header, access, properties); 10058 AddStore(object_header, access, properties);
10085 10059
10086 if (boilerplate_object->IsJSArray()) { 10060 if (boilerplate_object->IsJSArray()) {
10087 Handle<JSArray> boilerplate_array = 10061 Handle<JSArray> boilerplate_array =
10088 Handle<JSArray>::cast(boilerplate_object); 10062 Handle<JSArray>::cast(boilerplate_object);
10089 Handle<Object> length_field = 10063 Handle<Object> length_field =
10090 Handle<Object>(boilerplate_array->length(), isolate()); 10064 Handle<Object>(boilerplate_array->length(), isolate());
10091 HInstruction* length = AddInstruction(new(zone) HConstant( 10065 HInstruction* length = AddInstruction(new(zone) HConstant(length_field));
10092 length_field, Representation::None()));
10093 10066
10094 ASSERT(boilerplate_array->length()->IsSmi()); 10067 ASSERT(boilerplate_array->length()->IsSmi());
10095 Representation representation = 10068 Representation representation =
10096 IsFastElementsKind(boilerplate_array->GetElementsKind()) 10069 IsFastElementsKind(boilerplate_array->GetElementsKind())
10097 ? Representation::Smi() : Representation::Tagged(); 10070 ? Representation::Smi() : Representation::Tagged();
10098 AddStore(object_header, HObjectAccess::ForArrayLength(), 10071 AddStore(object_header, HObjectAccess::ForArrayLength(),
10099 length, representation); 10072 length, representation);
10100 } 10073 }
10101 10074
10102 return result; 10075 return result;
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after
10138 isolate())); 10111 isolate()));
10139 HInstruction* value_instruction = 10112 HInstruction* value_instruction =
10140 AddInstruction(new(zone) HInnerAllocatedObject(target, *offset)); 10113 AddInstruction(new(zone) HInnerAllocatedObject(target, *offset));
10141 10114
10142 AddStore(object_properties, access, value_instruction); 10115 AddStore(object_properties, access, value_instruction);
10143 10116
10144 BuildEmitDeepCopy(value_object, original_value_object, target, 10117 BuildEmitDeepCopy(value_object, original_value_object, target,
10145 offset, DONT_TRACK_ALLOCATION_SITE); 10118 offset, DONT_TRACK_ALLOCATION_SITE);
10146 } else { 10119 } else {
10147 Representation representation = details.representation(); 10120 Representation representation = details.representation();
10148 HInstruction* value_instruction = AddInstruction(new(zone) HConstant( 10121 HInstruction* value_instruction =
10149 value, Representation::Tagged())); 10122 AddInstruction(new(zone) HConstant(value));
10150 10123
10151 if (representation.IsDouble()) { 10124 if (representation.IsDouble()) {
10152 // Allocate a HeapNumber box and store the value into it. 10125 // Allocate a HeapNumber box and store the value into it.
10153 HInstruction* double_box = 10126 HInstruction* double_box =
10154 AddInstruction(new(zone) HInnerAllocatedObject(target, *offset)); 10127 AddInstruction(new(zone) HInnerAllocatedObject(target, *offset));
10155 AddStoreMapConstant(double_box, 10128 AddStoreMapConstant(double_box,
10156 isolate()->factory()->heap_number_map()); 10129 isolate()->factory()->heap_number_map());
10157 AddStore(double_box, HObjectAccess::ForHeapNumberValue(), 10130 AddStore(double_box, HObjectAccess::ForHeapNumberValue(),
10158 value_instruction, Representation::Double()); 10131 value_instruction, Representation::Double());
10159 value_instruction = double_box; 10132 value_instruction = double_box;
10160 *offset += HeapNumber::kSize; 10133 *offset += HeapNumber::kSize;
10161 } 10134 }
10162 10135
10163 AddStore(object_properties, access, value_instruction); 10136 AddStore(object_properties, access, value_instruction);
10164 } 10137 }
10165 } 10138 }
10166 10139
10167 int inobject_properties = boilerplate_object->map()->inobject_properties(); 10140 int inobject_properties = boilerplate_object->map()->inobject_properties();
10168 HInstruction* value_instruction = AddInstruction(new(zone) 10141 HInstruction* value_instruction = AddInstruction(new(zone)
10169 HConstant(isolate()->factory()->one_pointer_filler_map(), 10142 HConstant(isolate()->factory()->one_pointer_filler_map()));
10170 Representation::Tagged()));
10171 for (int i = copied_fields; i < inobject_properties; i++) { 10143 for (int i = copied_fields; i < inobject_properties; i++) {
10172 ASSERT(boilerplate_object->IsJSObject()); 10144 ASSERT(boilerplate_object->IsJSObject());
10173 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); 10145 int property_offset = boilerplate_object->GetInObjectPropertyOffset(i);
10174 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset); 10146 HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset);
10175 AddStore(object_properties, access, value_instruction); 10147 AddStore(object_properties, access, value_instruction);
10176 } 10148 }
10177 } 10149 }
10178 10150
10179 10151
10180 void HOptimizedGraphBuilder::BuildEmitElements( 10152 void HOptimizedGraphBuilder::BuildEmitElements(
(...skipping 21 matching lines...) Expand all
10202 UNREACHABLE(); 10174 UNREACHABLE();
10203 } 10175 }
10204 } 10176 }
10205 10177
10206 10178
10207 void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray( 10179 void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray(
10208 Handle<FixedArrayBase> elements, 10180 Handle<FixedArrayBase> elements,
10209 ElementsKind kind, 10181 ElementsKind kind,
10210 HValue* object_elements) { 10182 HValue* object_elements) {
10211 Zone* zone = this->zone(); 10183 Zone* zone = this->zone();
10212 HInstruction* boilerplate_elements = AddInstruction(new(zone) HConstant( 10184 HInstruction* boilerplate_elements =
10213 elements, Representation::Tagged())); 10185 AddInstruction(new(zone) HConstant(elements));
10214 int elements_length = elements->length(); 10186 int elements_length = elements->length();
10215 for (int i = 0; i < elements_length; i++) { 10187 for (int i = 0; i < elements_length; i++) {
10216 HValue* key_constant = AddInstruction(new(zone) HConstant(i)); 10188 HValue* key_constant = AddInstruction(new(zone) HConstant(i));
10217 HInstruction* value_instruction = 10189 HInstruction* value_instruction =
10218 AddInstruction(new(zone) HLoadKeyed( 10190 AddInstruction(new(zone) HLoadKeyed(
10219 boilerplate_elements, key_constant, NULL, kind, ALLOW_RETURN_HOLE)); 10191 boilerplate_elements, key_constant, NULL, kind, ALLOW_RETURN_HOLE));
10220 HInstruction* store = AddInstruction(new(zone) HStoreKeyed( 10192 HInstruction* store = AddInstruction(new(zone) HStoreKeyed(
10221 object_elements, key_constant, value_instruction, kind)); 10193 object_elements, key_constant, value_instruction, kind));
10222 store->SetFlag(HValue::kAllowUndefinedAsNaN); 10194 store->SetFlag(HValue::kAllowUndefinedAsNaN);
10223 } 10195 }
10224 } 10196 }
10225 10197
10226 10198
10227 void HOptimizedGraphBuilder::BuildEmitFixedArray( 10199 void HOptimizedGraphBuilder::BuildEmitFixedArray(
10228 Handle<FixedArrayBase> elements, 10200 Handle<FixedArrayBase> elements,
10229 Handle<FixedArrayBase> original_elements, 10201 Handle<FixedArrayBase> original_elements,
10230 ElementsKind kind, 10202 ElementsKind kind,
10231 HValue* object_elements, 10203 HValue* object_elements,
10232 HInstruction* target, 10204 HInstruction* target,
10233 int* offset) { 10205 int* offset) {
10234 Zone* zone = this->zone(); 10206 Zone* zone = this->zone();
10235 HInstruction* boilerplate_elements = AddInstruction(new(zone) HConstant( 10207 HInstruction* boilerplate_elements =
10236 elements, Representation::Tagged())); 10208 AddInstruction(new(zone) HConstant(elements));
10237 int elements_length = elements->length(); 10209 int elements_length = elements->length();
10238 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); 10210 Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements);
10239 Handle<FixedArray> original_fast_elements = 10211 Handle<FixedArray> original_fast_elements =
10240 Handle<FixedArray>::cast(original_elements); 10212 Handle<FixedArray>::cast(original_elements);
10241 for (int i = 0; i < elements_length; i++) { 10213 for (int i = 0; i < elements_length; i++) {
10242 Handle<Object> value(fast_elements->get(i), isolate()); 10214 Handle<Object> value(fast_elements->get(i), isolate());
10243 HValue* key_constant = AddInstruction(new(zone) HConstant(i)); 10215 HValue* key_constant = AddInstruction(new(zone) HConstant(i));
10244 if (value->IsJSObject()) { 10216 if (value->IsJSObject()) {
10245 Handle<JSObject> value_object = Handle<JSObject>::cast(value); 10217 Handle<JSObject> value_object = Handle<JSObject>::cast(value);
10246 Handle<JSObject> original_value_object = Handle<JSObject>::cast( 10218 Handle<JSObject> original_value_object = Handle<JSObject>::cast(
(...skipping 1364 matching lines...) Expand 10 before | Expand all | Expand 10 after
11611 } 11583 }
11612 } 11584 }
11613 11585
11614 #ifdef DEBUG 11586 #ifdef DEBUG
11615 if (graph_ != NULL) graph_->Verify(false); // No full verify. 11587 if (graph_ != NULL) graph_->Verify(false); // No full verify.
11616 if (allocator_ != NULL) allocator_->Verify(); 11588 if (allocator_ != NULL) allocator_->Verify();
11617 #endif 11589 #endif
11618 } 11590 }
11619 11591
11620 } } // namespace v8::internal 11592 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/code-stubs-hydrogen.cc ('k') | src/hydrogen-instructions.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698