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 15 matching lines...) Expand all Loading... |
26 V(Float32) \ | 26 V(Float32) \ |
27 V(Float64) | 27 V(Float64) |
28 | 28 |
29 enum LazyCachedType { | 29 enum LazyCachedType { |
30 kNumberFunc0, | 30 kNumberFunc0, |
31 kNumberFunc1, | 31 kNumberFunc1, |
32 kNumberFunc2, | 32 kNumberFunc2, |
33 kImulFunc, | 33 kImulFunc, |
34 kClz32Func, | 34 kClz32Func, |
35 kArrayBufferFunc, | 35 kArrayBufferFunc, |
36 #define NATIVE_TYPE_CASE(Type) k##Type, k##Type##Array, k##Type##ArrayFunc, | 36 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
37 NATIVE_TYPES(NATIVE_TYPE_CASE) | 37 k##Type, k##Type##Array, k##Type##ArrayFunc, |
38 #undef NATIVE_TYPE_CASE | 38 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
39 kNumLazyCachedTypes | 39 #undef TYPED_ARRAY_CASE |
| 40 kNumLazyCachedTypes |
40 }; | 41 }; |
41 | 42 |
42 | 43 |
43 // Constructs and caches types lazily. | 44 // Constructs and caches types lazily. |
44 // TODO(turbofan): these types could be globally cached or cached per isolate. | 45 // TODO(turbofan): these types could be globally cached or cached per isolate. |
45 class LazyTypeCache FINAL : public ZoneObject { | 46 class LazyTypeCache FINAL : public ZoneObject { |
46 public: | 47 public: |
47 explicit LazyTypeCache(Zone* zone) : zone_(zone) { | 48 explicit LazyTypeCache(Zone* zone) : zone_(zone) { |
48 memset(cache_, 0, sizeof(cache_)); | 49 memset(cache_, 0, sizeof(cache_)); |
49 } | 50 } |
(...skipping 18 matching lines...) Expand all Loading... |
68 return CreateNative(CreateRange<uint16_t>(), | 69 return CreateNative(CreateRange<uint16_t>(), |
69 Type::UntaggedUnsigned16()); | 70 Type::UntaggedUnsigned16()); |
70 case kInt32: | 71 case kInt32: |
71 return CreateNative(Type::Signed32(), Type::UntaggedSigned32()); | 72 return CreateNative(Type::Signed32(), Type::UntaggedSigned32()); |
72 case kUint32: | 73 case kUint32: |
73 return CreateNative(Type::Unsigned32(), Type::UntaggedUnsigned32()); | 74 return CreateNative(Type::Unsigned32(), Type::UntaggedUnsigned32()); |
74 case kFloat32: | 75 case kFloat32: |
75 return CreateNative(Type::Number(), Type::UntaggedFloat32()); | 76 return CreateNative(Type::Number(), Type::UntaggedFloat32()); |
76 case kFloat64: | 77 case kFloat64: |
77 return CreateNative(Type::Number(), Type::UntaggedFloat64()); | 78 return CreateNative(Type::Number(), Type::UntaggedFloat64()); |
| 79 case kUint8Clamped: |
| 80 return Get(kUint8); |
78 case kNumberFunc0: | 81 case kNumberFunc0: |
79 return Type::Function(Type::Number(), zone()); | 82 return Type::Function(Type::Number(), zone()); |
80 case kNumberFunc1: | 83 case kNumberFunc1: |
81 return Type::Function(Type::Number(), Type::Number(), zone()); | 84 return Type::Function(Type::Number(), Type::Number(), zone()); |
82 case kNumberFunc2: | 85 case kNumberFunc2: |
83 return Type::Function(Type::Number(), Type::Number(), Type::Number(), | 86 return Type::Function(Type::Number(), Type::Number(), Type::Number(), |
84 zone()); | 87 zone()); |
85 case kImulFunc: | 88 case kImulFunc: |
86 return Type::Function(Type::Signed32(), Type::Integral32(), | 89 return Type::Function(Type::Signed32(), Type::Integral32(), |
87 Type::Integral32(), zone()); | 90 Type::Integral32(), zone()); |
88 case kClz32Func: | 91 case kClz32Func: |
89 return Type::Function(CreateRange(0, 32), Type::Number(), zone()); | 92 return Type::Function(CreateRange(0, 32), Type::Number(), zone()); |
90 case kArrayBufferFunc: | 93 case kArrayBufferFunc: |
91 return Type::Function(Type::Object(zone()), Type::Unsigned32(), zone()); | 94 return Type::Function(Type::Object(zone()), Type::Unsigned32(), zone()); |
92 #define NATIVE_TYPE_CASE(Type) \ | 95 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
93 case k##Type##Array: \ | 96 case k##Type##Array: \ |
94 return CreateArray(Get(k##Type)); \ | 97 return CreateArray(Get(k##Type)); \ |
95 case k##Type##ArrayFunc: \ | 98 case k##Type##ArrayFunc: \ |
96 return CreateArrayFunction(Get(k##Type##Array)); | 99 return CreateArrayFunction(Get(k##Type##Array)); |
97 NATIVE_TYPES(NATIVE_TYPE_CASE) | 100 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
98 #undef NATIVE_TYPE_CASE | 101 #undef TYPED_ARRAY_CASE |
99 case kNumLazyCachedTypes: | 102 case kNumLazyCachedTypes: |
100 break; | 103 break; |
101 } | 104 } |
102 UNREACHABLE(); | 105 UNREACHABLE(); |
103 return NULL; | 106 return NULL; |
104 } | 107 } |
105 | 108 |
106 Type* CreateArray(Type* element) const { | 109 Type* CreateArray(Type* element) const { |
107 return Type::Array(element, zone()); | 110 return Type::Array(element, zone()); |
108 } | 111 } |
(...skipping 1499 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1608 | 1611 |
1609 Bounds Typer::Visitor::TypeLoadField(Node* node) { | 1612 Bounds Typer::Visitor::TypeLoadField(Node* node) { |
1610 return Bounds(FieldAccessOf(node->op()).type); | 1613 return Bounds(FieldAccessOf(node->op()).type); |
1611 } | 1614 } |
1612 | 1615 |
1613 | 1616 |
1614 Bounds Typer::Visitor::TypeLoadBuffer(Node* node) { | 1617 Bounds Typer::Visitor::TypeLoadBuffer(Node* node) { |
1615 // TODO(bmeurer): This typing is not yet correct. Since we can still access | 1618 // TODO(bmeurer): This typing is not yet correct. Since we can still access |
1616 // out of bounds, the type in the general case has to include Undefined. | 1619 // out of bounds, the type in the general case has to include Undefined. |
1617 switch (BufferAccessOf(node->op()).external_array_type()) { | 1620 switch (BufferAccessOf(node->op()).external_array_type()) { |
1618 #define NATIVE_TYPE_CASE(Type) \ | 1621 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
1619 case kExternal##Type##Array: \ | 1622 case kExternal##Type##Array: \ |
1620 return Bounds(typer_->cache_->Get(k##Type)); | 1623 return Bounds(typer_->cache_->Get(k##Type)); |
1621 NATIVE_TYPES(NATIVE_TYPE_CASE) | 1624 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
1622 #undef NATIVE_TYPE_CASE | 1625 #undef TYPED_ARRAY_CASE |
1623 case kExternalUint8ClampedArray: | |
1624 break; | |
1625 } | 1626 } |
1626 UNREACHABLE(); | 1627 UNREACHABLE(); |
1627 return Bounds(); | 1628 return Bounds(); |
1628 } | 1629 } |
1629 | 1630 |
1630 | 1631 |
1631 Bounds Typer::Visitor::TypeLoadElement(Node* node) { | 1632 Bounds Typer::Visitor::TypeLoadElement(Node* node) { |
1632 return Bounds(ElementAccessOf(node->op()).type); | 1633 return Bounds(ElementAccessOf(node->op()).type); |
1633 } | 1634 } |
1634 | 1635 |
(...skipping 446 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2081 } else if (*value == native->uint32_array_fun()) { | 2082 } else if (*value == native->uint32_array_fun()) { |
2082 return typer_->cache_->Get(kUint32ArrayFunc); | 2083 return typer_->cache_->Get(kUint32ArrayFunc); |
2083 } else if (*value == native->float32_array_fun()) { | 2084 } else if (*value == native->float32_array_fun()) { |
2084 return typer_->cache_->Get(kFloat32ArrayFunc); | 2085 return typer_->cache_->Get(kFloat32ArrayFunc); |
2085 } else if (*value == native->float64_array_fun()) { | 2086 } else if (*value == native->float64_array_fun()) { |
2086 return typer_->cache_->Get(kFloat64ArrayFunc); | 2087 return typer_->cache_->Get(kFloat64ArrayFunc); |
2087 } | 2088 } |
2088 } | 2089 } |
2089 } else if (value->IsJSTypedArray()) { | 2090 } else if (value->IsJSTypedArray()) { |
2090 switch (JSTypedArray::cast(*value)->type()) { | 2091 switch (JSTypedArray::cast(*value)->type()) { |
2091 #define NATIVE_TYPE_CASE(Type) \ | 2092 #define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ |
2092 case kExternal##Type##Array: \ | 2093 case kExternal##Type##Array: \ |
2093 return typer_->cache_->Get(k##Type##Array); | 2094 return typer_->cache_->Get(k##Type##Array); |
2094 NATIVE_TYPES(NATIVE_TYPE_CASE) | 2095 TYPED_ARRAYS(TYPED_ARRAY_CASE) |
2095 #undef NATIVE_TYPE_CASE | 2096 #undef TYPED_ARRAY_CASE |
2096 case kExternalUint8ClampedArray: | |
2097 // TODO(rossberg): Do we want some ClampedArray type to express this? | |
2098 break; | |
2099 } | 2097 } |
2100 } | 2098 } |
2101 return Type::Constant(value, zone()); | 2099 return Type::Constant(value, zone()); |
2102 } | 2100 } |
2103 | 2101 |
2104 } // namespace compiler | 2102 } // namespace compiler |
2105 } // namespace internal | 2103 } // namespace internal |
2106 } // namespace v8 | 2104 } // namespace v8 |
OLD | NEW |