OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/bootstrapper.h" | 5 #include "src/bootstrapper.h" |
6 #include "src/compiler/graph-inl.h" | 6 #include "src/compiler/graph-inl.h" |
7 #include "src/compiler/graph-reducer.h" | 7 #include "src/compiler/graph-reducer.h" |
8 #include "src/compiler/js-operator.h" | 8 #include "src/compiler/js-operator.h" |
9 #include "src/compiler/node.h" | 9 #include "src/compiler/node.h" |
10 #include "src/compiler/node-properties-inl.h" | 10 #include "src/compiler/node-properties-inl.h" |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
52 int index = static_cast<int>(type); | 52 int index = static_cast<int>(type); |
53 DCHECK(index < kNumLazyCachedTypes); | 53 DCHECK(index < kNumLazyCachedTypes); |
54 if (cache_[index] == NULL) cache_[index] = Create(type); | 54 if (cache_[index] == NULL) cache_[index] = Create(type); |
55 return cache_[index]; | 55 return cache_[index]; |
56 } | 56 } |
57 | 57 |
58 private: | 58 private: |
59 Type* Create(LazyCachedType type) { | 59 Type* Create(LazyCachedType type) { |
60 switch (type) { | 60 switch (type) { |
61 case kInt8: | 61 case kInt8: |
62 return CreateNative(CreateRange<int8_t>(), Type::UntaggedInt8()); | 62 return CreateNative(CreateRange<int8_t>(), Type::UntaggedSigned8()); |
63 case kUint8: | 63 case kUint8: |
64 return CreateNative(CreateRange<uint8_t>(), Type::UntaggedInt8()); | 64 return CreateNative(CreateRange<uint8_t>(), Type::UntaggedUnsigned8()); |
65 case kInt16: | 65 case kInt16: |
66 return CreateNative(CreateRange<int16_t>(), Type::UntaggedInt16()); | 66 return CreateNative(CreateRange<int16_t>(), Type::UntaggedSigned16()); |
67 case kUint16: | 67 case kUint16: |
68 return CreateNative(CreateRange<uint16_t>(), Type::UntaggedInt16()); | 68 return CreateNative(CreateRange<uint16_t>(), |
| 69 Type::UntaggedUnsigned16()); |
69 case kInt32: | 70 case kInt32: |
70 return CreateNative(Type::Signed32(), Type::UntaggedInt32()); | 71 return CreateNative(Type::Signed32(), Type::UntaggedSigned32()); |
71 case kUint32: | 72 case kUint32: |
72 return CreateNative(Type::Unsigned32(), Type::UntaggedInt32()); | 73 return CreateNative(Type::Unsigned32(), Type::UntaggedUnsigned32()); |
73 case kFloat32: | 74 case kFloat32: |
74 return CreateNative(Type::Number(), Type::UntaggedFloat32()); | 75 return CreateNative(Type::Number(), Type::UntaggedFloat32()); |
75 case kFloat64: | 76 case kFloat64: |
76 return CreateNative(Type::Number(), Type::UntaggedFloat64()); | 77 return CreateNative(Type::Number(), Type::UntaggedFloat64()); |
77 case kNumberFunc0: | 78 case kNumberFunc0: |
78 return Type::Function(Type::Number(), zone()); | 79 return Type::Function(Type::Number(), zone()); |
79 case kNumberFunc1: | 80 case kNumberFunc1: |
80 return Type::Function(Type::Number(), Type::Number(), zone()); | 81 return Type::Function(Type::Number(), Type::Number(), zone()); |
81 case kNumberFunc2: | 82 case kNumberFunc2: |
82 return Type::Function(Type::Number(), Type::Number(), Type::Number(), | 83 return Type::Function(Type::Number(), Type::Number(), Type::Number(), |
83 zone()); | 84 zone()); |
84 case kImulFunc: | 85 case kImulFunc: |
85 return Type::Function(Type::Signed32(), Type::Integral32(), | 86 return Type::Function(Type::Signed32(), Type::Integral32(), |
86 Type::Integral32(), zone()); | 87 Type::Integral32(), zone()); |
87 case kClz32Func: | 88 case kClz32Func: |
88 return Type::Function(CreateRange(0, 32), Type::Number(), zone()); | 89 return Type::Function(CreateRange(0, 32), Type::Number(), zone()); |
89 case kArrayBufferFunc: | 90 case kArrayBufferFunc: |
90 return Type::Function(Type::Buffer(zone()), Type::Unsigned32(), zone()); | 91 return Type::Function(Type::Object(zone()), Type::Unsigned32(), zone()); |
91 #define NATIVE_TYPE_CASE(Type) \ | 92 #define NATIVE_TYPE_CASE(Type) \ |
92 case k##Type##Array: \ | 93 case k##Type##Array: \ |
93 return CreateArray(Get(k##Type)); \ | 94 return CreateArray(Get(k##Type)); \ |
94 case k##Type##ArrayFunc: \ | 95 case k##Type##ArrayFunc: \ |
95 return CreateArrayFunction(Get(k##Type##Array)); | 96 return CreateArrayFunction(Get(k##Type##Array)); |
96 NATIVE_TYPES(NATIVE_TYPE_CASE) | 97 NATIVE_TYPES(NATIVE_TYPE_CASE) |
97 #undef NATIVE_TYPE_CASE | 98 #undef NATIVE_TYPE_CASE |
98 case kNumLazyCachedTypes: | 99 case kNumLazyCachedTypes: |
99 break; | 100 break; |
100 } | 101 } |
(...skipping 490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
591 | 592 |
592 Bounds Typer::Visitor::TypeParameter(Node* node) { | 593 Bounds Typer::Visitor::TypeParameter(Node* node) { |
593 return Bounds::Unbounded(zone()); | 594 return Bounds::Unbounded(zone()); |
594 } | 595 } |
595 | 596 |
596 | 597 |
597 Bounds Typer::Visitor::TypeInt32Constant(Node* node) { | 598 Bounds Typer::Visitor::TypeInt32Constant(Node* node) { |
598 Factory* f = isolate()->factory(); | 599 Factory* f = isolate()->factory(); |
599 Handle<Object> number = f->NewNumber(OpParameter<int32_t>(node)); | 600 Handle<Object> number = f->NewNumber(OpParameter<int32_t>(node)); |
600 return Bounds(Type::Intersect( | 601 return Bounds(Type::Intersect( |
601 Type::Range(number, number, zone()), Type::UntaggedInt32(), zone())); | 602 Type::Range(number, number, zone()), Type::UntaggedSigned32(), zone())); |
602 } | 603 } |
603 | 604 |
604 | 605 |
605 Bounds Typer::Visitor::TypeInt64Constant(Node* node) { | 606 Bounds Typer::Visitor::TypeInt64Constant(Node* node) { |
| 607 // TODO(rossberg): This actually seems to be a PointerConstant so far... |
606 return Bounds(Type::Internal()); // TODO(rossberg): Add int64 bitset type? | 608 return Bounds(Type::Internal()); // TODO(rossberg): Add int64 bitset type? |
607 } | 609 } |
608 | 610 |
609 | 611 |
610 Bounds Typer::Visitor::TypeFloat32Constant(Node* node) { | 612 Bounds Typer::Visitor::TypeFloat32Constant(Node* node) { |
611 return Bounds(Type::Intersect( | 613 return Bounds(Type::Intersect( |
612 Type::Of(OpParameter<float>(node), zone()), | 614 Type::Of(OpParameter<float>(node), zone()), |
613 Type::UntaggedFloat32(), zone())); | 615 Type::UntaggedFloat32(), zone())); |
614 } | 616 } |
615 | 617 |
(...skipping 912 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1528 Type::Intersect(rep, Type::Representation(), zone), zone); | 1530 Type::Intersect(rep, Type::Representation(), zone), zone); |
1529 */ | 1531 */ |
1530 return type; | 1532 return type; |
1531 } | 1533 } |
1532 | 1534 |
1533 | 1535 |
1534 Bounds Typer::Visitor::TypeChangeTaggedToInt32(Node* node) { | 1536 Bounds Typer::Visitor::TypeChangeTaggedToInt32(Node* node) { |
1535 Bounds arg = Operand(node, 0); | 1537 Bounds arg = Operand(node, 0); |
1536 // TODO(neis): DCHECK(arg.upper->Is(Type::Signed32())); | 1538 // TODO(neis): DCHECK(arg.upper->Is(Type::Signed32())); |
1537 return Bounds( | 1539 return Bounds( |
1538 ChangeRepresentation(arg.lower, Type::UntaggedInt32(), zone()), | 1540 ChangeRepresentation(arg.lower, Type::UntaggedSigned32(), zone()), |
1539 ChangeRepresentation(arg.upper, Type::UntaggedInt32(), zone())); | 1541 ChangeRepresentation(arg.upper, Type::UntaggedSigned32(), zone())); |
1540 } | 1542 } |
1541 | 1543 |
1542 | 1544 |
1543 Bounds Typer::Visitor::TypeChangeTaggedToUint32(Node* node) { | 1545 Bounds Typer::Visitor::TypeChangeTaggedToUint32(Node* node) { |
1544 Bounds arg = Operand(node, 0); | 1546 Bounds arg = Operand(node, 0); |
1545 // TODO(neis): DCHECK(arg.upper->Is(Type::Unsigned32())); | 1547 // TODO(neis): DCHECK(arg.upper->Is(Type::Unsigned32())); |
1546 return Bounds( | 1548 return Bounds( |
1547 ChangeRepresentation(arg.lower, Type::UntaggedInt32(), zone()), | 1549 ChangeRepresentation(arg.lower, Type::UntaggedUnsigned32(), zone()), |
1548 ChangeRepresentation(arg.upper, Type::UntaggedInt32(), zone())); | 1550 ChangeRepresentation(arg.upper, Type::UntaggedUnsigned32(), zone())); |
1549 } | 1551 } |
1550 | 1552 |
1551 | 1553 |
1552 Bounds Typer::Visitor::TypeChangeTaggedToFloat64(Node* node) { | 1554 Bounds Typer::Visitor::TypeChangeTaggedToFloat64(Node* node) { |
1553 Bounds arg = Operand(node, 0); | 1555 Bounds arg = Operand(node, 0); |
1554 // TODO(neis): DCHECK(arg.upper->Is(Type::Number())); | 1556 // TODO(neis): DCHECK(arg.upper->Is(Type::Number())); |
1555 return Bounds( | 1557 return Bounds( |
1556 ChangeRepresentation(arg.lower, Type::UntaggedFloat64(), zone()), | 1558 ChangeRepresentation(arg.lower, Type::UntaggedFloat64(), zone()), |
1557 ChangeRepresentation(arg.upper, Type::UntaggedFloat64(), zone())); | 1559 ChangeRepresentation(arg.upper, Type::UntaggedFloat64(), zone())); |
1558 } | 1560 } |
(...skipping 23 matching lines...) Expand all Loading... |
1582 return Bounds( | 1584 return Bounds( |
1583 ChangeRepresentation(arg.lower, Type::Tagged(), zone()), | 1585 ChangeRepresentation(arg.lower, Type::Tagged(), zone()), |
1584 ChangeRepresentation(arg.upper, Type::Tagged(), zone())); | 1586 ChangeRepresentation(arg.upper, Type::Tagged(), zone())); |
1585 } | 1587 } |
1586 | 1588 |
1587 | 1589 |
1588 Bounds Typer::Visitor::TypeChangeBoolToBit(Node* node) { | 1590 Bounds Typer::Visitor::TypeChangeBoolToBit(Node* node) { |
1589 Bounds arg = Operand(node, 0); | 1591 Bounds arg = Operand(node, 0); |
1590 // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean())); | 1592 // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean())); |
1591 return Bounds( | 1593 return Bounds( |
1592 ChangeRepresentation(arg.lower, Type::UntaggedInt1(), zone()), | 1594 ChangeRepresentation(arg.lower, Type::UntaggedBit(), zone()), |
1593 ChangeRepresentation(arg.upper, Type::UntaggedInt1(), zone())); | 1595 ChangeRepresentation(arg.upper, Type::UntaggedBit(), zone())); |
1594 } | 1596 } |
1595 | 1597 |
1596 | 1598 |
1597 Bounds Typer::Visitor::TypeChangeBitToBool(Node* node) { | 1599 Bounds Typer::Visitor::TypeChangeBitToBool(Node* node) { |
1598 Bounds arg = Operand(node, 0); | 1600 Bounds arg = Operand(node, 0); |
1599 // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean())); | 1601 // TODO(neis): DCHECK(arg.upper->Is(Type::Boolean())); |
1600 return Bounds( | 1602 return Bounds( |
1601 ChangeRepresentation(arg.lower, Type::TaggedPtr(), zone()), | 1603 ChangeRepresentation(arg.lower, Type::TaggedPointer(), zone()), |
1602 ChangeRepresentation(arg.upper, Type::TaggedPtr(), zone())); | 1604 ChangeRepresentation(arg.upper, Type::TaggedPointer(), zone())); |
1603 } | 1605 } |
1604 | 1606 |
1605 | 1607 |
1606 Bounds Typer::Visitor::TypeLoadField(Node* node) { | 1608 Bounds Typer::Visitor::TypeLoadField(Node* node) { |
1607 return Bounds(FieldAccessOf(node->op()).type); | 1609 return Bounds(FieldAccessOf(node->op()).type); |
1608 } | 1610 } |
1609 | 1611 |
1610 | 1612 |
1611 Bounds Typer::Visitor::TypeLoadBuffer(Node* node) { | 1613 Bounds Typer::Visitor::TypeLoadBuffer(Node* node) { |
1612 // TODO(bmeurer): This typing is not yet correct. Since we can still access | 1614 // TODO(bmeurer): This typing is not yet correct. Since we can still access |
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1877 | 1879 |
1878 | 1880 |
1879 Bounds Typer::Visitor::TypeChangeFloat32ToFloat64(Node* node) { | 1881 Bounds Typer::Visitor::TypeChangeFloat32ToFloat64(Node* node) { |
1880 return Bounds(Type::Intersect( | 1882 return Bounds(Type::Intersect( |
1881 Type::Number(), Type::UntaggedFloat64(), zone())); | 1883 Type::Number(), Type::UntaggedFloat64(), zone())); |
1882 } | 1884 } |
1883 | 1885 |
1884 | 1886 |
1885 Bounds Typer::Visitor::TypeChangeFloat64ToInt32(Node* node) { | 1887 Bounds Typer::Visitor::TypeChangeFloat64ToInt32(Node* node) { |
1886 return Bounds(Type::Intersect( | 1888 return Bounds(Type::Intersect( |
1887 Type::Signed32(), Type::UntaggedInt32(), zone())); | 1889 Type::Signed32(), Type::UntaggedSigned32(), zone())); |
1888 } | 1890 } |
1889 | 1891 |
1890 | 1892 |
1891 Bounds Typer::Visitor::TypeChangeFloat64ToUint32(Node* node) { | 1893 Bounds Typer::Visitor::TypeChangeFloat64ToUint32(Node* node) { |
1892 return Bounds(Type::Intersect( | 1894 return Bounds(Type::Intersect( |
1893 Type::Unsigned32(), Type::UntaggedInt32(), zone())); | 1895 Type::Unsigned32(), Type::UntaggedUnsigned32(), zone())); |
1894 } | 1896 } |
1895 | 1897 |
1896 | 1898 |
1897 Bounds Typer::Visitor::TypeChangeInt32ToFloat64(Node* node) { | 1899 Bounds Typer::Visitor::TypeChangeInt32ToFloat64(Node* node) { |
1898 return Bounds(Type::Intersect( | 1900 return Bounds(Type::Intersect( |
1899 Type::Signed32(), Type::UntaggedFloat64(), zone())); | 1901 Type::Signed32(), Type::UntaggedFloat64(), zone())); |
1900 } | 1902 } |
1901 | 1903 |
1902 | 1904 |
1903 Bounds Typer::Visitor::TypeChangeInt32ToInt64(Node* node) { | 1905 Bounds Typer::Visitor::TypeChangeInt32ToInt64(Node* node) { |
(...skipping 13 matching lines...) Expand all Loading... |
1917 | 1919 |
1918 | 1920 |
1919 Bounds Typer::Visitor::TypeTruncateFloat64ToFloat32(Node* node) { | 1921 Bounds Typer::Visitor::TypeTruncateFloat64ToFloat32(Node* node) { |
1920 return Bounds(Type::Intersect( | 1922 return Bounds(Type::Intersect( |
1921 Type::Number(), Type::UntaggedFloat32(), zone())); | 1923 Type::Number(), Type::UntaggedFloat32(), zone())); |
1922 } | 1924 } |
1923 | 1925 |
1924 | 1926 |
1925 Bounds Typer::Visitor::TypeTruncateFloat64ToInt32(Node* node) { | 1927 Bounds Typer::Visitor::TypeTruncateFloat64ToInt32(Node* node) { |
1926 return Bounds(Type::Intersect( | 1928 return Bounds(Type::Intersect( |
1927 Type::Signed32(), Type::UntaggedInt32(), zone())); | 1929 Type::Signed32(), Type::UntaggedSigned32(), zone())); |
1928 } | 1930 } |
1929 | 1931 |
1930 | 1932 |
1931 Bounds Typer::Visitor::TypeTruncateInt64ToInt32(Node* node) { | 1933 Bounds Typer::Visitor::TypeTruncateInt64ToInt32(Node* node) { |
1932 return Bounds(Type::Intersect( | 1934 return Bounds(Type::Intersect( |
1933 Type::Signed32(), Type::UntaggedInt32(), zone())); | 1935 Type::Signed32(), Type::UntaggedSigned32(), zone())); |
1934 } | 1936 } |
1935 | 1937 |
1936 | 1938 |
1937 Bounds Typer::Visitor::TypeFloat64Add(Node* node) { | 1939 Bounds Typer::Visitor::TypeFloat64Add(Node* node) { |
1938 return Bounds(Type::Number()); | 1940 return Bounds(Type::Number()); |
1939 } | 1941 } |
1940 | 1942 |
1941 | 1943 |
1942 Bounds Typer::Visitor::TypeFloat64Sub(Node* node) { | 1944 Bounds Typer::Visitor::TypeFloat64Sub(Node* node) { |
1943 return Bounds(Type::Number()); | 1945 return Bounds(Type::Number()); |
(...skipping 150 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2094 // TODO(rossberg): Do we want some ClampedArray type to express this? | 2096 // TODO(rossberg): Do we want some ClampedArray type to express this? |
2095 break; | 2097 break; |
2096 } | 2098 } |
2097 } | 2099 } |
2098 return Type::Constant(value, zone()); | 2100 return Type::Constant(value, zone()); |
2099 } | 2101 } |
2100 | 2102 |
2101 } // namespace compiler | 2103 } // namespace compiler |
2102 } // namespace internal | 2104 } // namespace internal |
2103 } // namespace v8 | 2105 } // namespace v8 |
OLD | NEW |