OLD | NEW |
1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 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 #include "src/code-stub-assembler.h" | 4 #include "src/code-stub-assembler.h" |
5 #include "src/code-factory.h" | 5 #include "src/code-factory.h" |
6 #include "src/frames-inl.h" | 6 #include "src/frames-inl.h" |
7 #include "src/frames.h" | 7 #include "src/frames.h" |
8 #include "src/ic/handler-configuration.h" | 8 #include "src/ic/handler-configuration.h" |
9 #include "src/ic/stub-cache.h" | 9 #include "src/ic/stub-cache.h" |
10 | 10 |
11 namespace v8 { | 11 namespace v8 { |
12 namespace internal { | 12 namespace internal { |
13 | 13 |
14 using compiler::Node; | 14 using compiler::Node; |
15 | 15 |
16 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, | 16 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, |
17 const CallInterfaceDescriptor& descriptor, | 17 const CallInterfaceDescriptor& descriptor, |
18 Code::Flags flags, const char* name, | 18 Code::Flags flags, const char* name, |
19 size_t result_size) | 19 size_t result_size) |
20 : compiler::CodeAssembler(isolate, zone, descriptor, flags, name, | 20 : compiler::CodeAssembler(isolate, zone, descriptor, flags, name, |
21 result_size) {} | 21 result_size) {} |
22 | 22 |
23 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, | 23 CodeStubAssembler::CodeStubAssembler(Isolate* isolate, Zone* zone, |
24 int parameter_count, Code::Flags flags, | 24 int parameter_count, Code::Flags flags, |
25 const char* name) | 25 const char* name) |
26 : compiler::CodeAssembler(isolate, zone, parameter_count, flags, name) {} | 26 : compiler::CodeAssembler(isolate, zone, parameter_count, flags, name) {} |
27 | 27 |
28 void CodeStubAssembler::Assert(Node* condition, const char* message, | 28 void CodeStubAssembler::Assert(ConditionBody codition_body, const char* message, |
29 const char* file, int line) { | 29 const char* file, int line) { |
30 #if defined(DEBUG) | 30 #if defined(DEBUG) |
31 Label ok(this); | 31 Label ok(this); |
32 Label not_ok(this, Label::kDeferred); | 32 Label not_ok(this, Label::kDeferred); |
33 if (message != nullptr && FLAG_code_comments) { | 33 if (message != nullptr && FLAG_code_comments) { |
34 Comment("[ Assert: %s", message); | 34 Comment("[ Assert: %s", message); |
35 } else { | 35 } else { |
36 Comment("[ Assert "); | 36 Comment("[ Assert"); |
37 } | 37 } |
38 | 38 Node* condition = codition_body(); |
| 39 DCHECK_NOT_NULL(condition); |
39 Branch(condition, &ok, ¬_ok); | 40 Branch(condition, &ok, ¬_ok); |
40 Bind(¬_ok); | 41 Bind(¬_ok); |
41 if (message != nullptr) { | 42 if (message != nullptr) { |
42 char chars[1024]; | 43 char chars[1024]; |
43 Vector<char> buffer(chars); | 44 Vector<char> buffer(chars); |
44 if (file != nullptr) { | 45 if (file != nullptr) { |
45 SNPrintF(buffer, "CSA_ASSERT failed: %s [%s:%d]\n", message, file, line); | 46 SNPrintF(buffer, "CSA_ASSERT failed: %s [%s:%d]\n", message, file, line); |
46 } else { | 47 } else { |
47 SNPrintF(buffer, "CSA_ASSERT failed: %s\n", message); | 48 SNPrintF(buffer, "CSA_ASSERT failed: %s\n", message); |
48 } | 49 } |
(...skipping 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 } else if (is_right_constant) { | 123 } else if (is_right_constant) { |
123 if (right_constant == 0) { | 124 if (right_constant == 0) { |
124 return left; | 125 return left; |
125 } | 126 } |
126 } | 127 } |
127 return IntPtrSub(left, right); | 128 return IntPtrSub(left, right); |
128 } | 129 } |
129 | 130 |
130 Node* CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32(Node* value) { | 131 Node* CodeStubAssembler::IntPtrRoundUpToPowerOfTwo32(Node* value) { |
131 Comment("IntPtrRoundUpToPowerOfTwo32"); | 132 Comment("IntPtrRoundUpToPowerOfTwo32"); |
132 CSA_ASSERT(UintPtrLessThanOrEqual(value, IntPtrConstant(0x80000000u))); | 133 CSA_ASSERT(this, UintPtrLessThanOrEqual(value, IntPtrConstant(0x80000000u))); |
133 value = IntPtrSub(value, IntPtrConstant(1)); | 134 value = IntPtrSub(value, IntPtrConstant(1)); |
134 for (int i = 1; i <= 16; i *= 2) { | 135 for (int i = 1; i <= 16; i *= 2) { |
135 value = WordOr(value, WordShr(value, IntPtrConstant(i))); | 136 value = WordOr(value, WordShr(value, IntPtrConstant(i))); |
136 } | 137 } |
137 return IntPtrAdd(value, IntPtrConstant(1)); | 138 return IntPtrAdd(value, IntPtrConstant(1)); |
138 } | 139 } |
139 | 140 |
140 Node* CodeStubAssembler::WordIsPowerOfTwo(Node* value) { | 141 Node* CodeStubAssembler::WordIsPowerOfTwo(Node* value) { |
141 // value && !(value & (value - 1)) | 142 // value && !(value & (value - 1)) |
142 return WordEqual( | 143 return WordEqual( |
(...skipping 859 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1002 | 1003 |
1003 Node* CodeStubAssembler::LoadProperties(Node* object) { | 1004 Node* CodeStubAssembler::LoadProperties(Node* object) { |
1004 return LoadObjectField(object, JSObject::kPropertiesOffset); | 1005 return LoadObjectField(object, JSObject::kPropertiesOffset); |
1005 } | 1006 } |
1006 | 1007 |
1007 Node* CodeStubAssembler::LoadElements(Node* object) { | 1008 Node* CodeStubAssembler::LoadElements(Node* object) { |
1008 return LoadObjectField(object, JSObject::kElementsOffset); | 1009 return LoadObjectField(object, JSObject::kElementsOffset); |
1009 } | 1010 } |
1010 | 1011 |
1011 Node* CodeStubAssembler::LoadJSArrayLength(Node* array) { | 1012 Node* CodeStubAssembler::LoadJSArrayLength(Node* array) { |
1012 CSA_ASSERT(IsJSArray(array)); | 1013 CSA_ASSERT(this, IsJSArray(array)); |
1013 return LoadObjectField(array, JSArray::kLengthOffset); | 1014 return LoadObjectField(array, JSArray::kLengthOffset); |
1014 } | 1015 } |
1015 | 1016 |
1016 Node* CodeStubAssembler::LoadFixedArrayBaseLength(Node* array) { | 1017 Node* CodeStubAssembler::LoadFixedArrayBaseLength(Node* array) { |
1017 return LoadObjectField(array, FixedArrayBase::kLengthOffset); | 1018 return LoadObjectField(array, FixedArrayBase::kLengthOffset); |
1018 } | 1019 } |
1019 | 1020 |
1020 Node* CodeStubAssembler::LoadAndUntagFixedArrayBaseLength(Node* array) { | 1021 Node* CodeStubAssembler::LoadAndUntagFixedArrayBaseLength(Node* array) { |
1021 return LoadAndUntagObjectField(array, FixedArrayBase::kLengthOffset); | 1022 return LoadAndUntagObjectField(array, FixedArrayBase::kLengthOffset); |
1022 } | 1023 } |
1023 | 1024 |
1024 Node* CodeStubAssembler::LoadMapBitField(Node* map) { | 1025 Node* CodeStubAssembler::LoadMapBitField(Node* map) { |
1025 CSA_SLOW_ASSERT(IsMap(map)); | 1026 CSA_SLOW_ASSERT(this, IsMap(map)); |
1026 return LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8()); | 1027 return LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8()); |
1027 } | 1028 } |
1028 | 1029 |
1029 Node* CodeStubAssembler::LoadMapBitField2(Node* map) { | 1030 Node* CodeStubAssembler::LoadMapBitField2(Node* map) { |
1030 CSA_SLOW_ASSERT(IsMap(map)); | 1031 CSA_SLOW_ASSERT(this, IsMap(map)); |
1031 return LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8()); | 1032 return LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8()); |
1032 } | 1033 } |
1033 | 1034 |
1034 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { | 1035 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { |
1035 CSA_SLOW_ASSERT(IsMap(map)); | 1036 CSA_SLOW_ASSERT(this, IsMap(map)); |
1036 return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); | 1037 return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); |
1037 } | 1038 } |
1038 | 1039 |
1039 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { | 1040 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { |
1040 return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); | 1041 return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); |
1041 } | 1042 } |
1042 | 1043 |
1043 Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { | 1044 Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { |
1044 CSA_SLOW_ASSERT(IsMap(map)); | 1045 CSA_SLOW_ASSERT(this, IsMap(map)); |
1045 Node* bit_field2 = LoadMapBitField2(map); | 1046 Node* bit_field2 = LoadMapBitField2(map); |
1046 return DecodeWord32<Map::ElementsKindBits>(bit_field2); | 1047 return DecodeWord32<Map::ElementsKindBits>(bit_field2); |
1047 } | 1048 } |
1048 | 1049 |
1049 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { | 1050 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { |
1050 CSA_SLOW_ASSERT(IsMap(map)); | 1051 CSA_SLOW_ASSERT(this, IsMap(map)); |
1051 return LoadObjectField(map, Map::kDescriptorsOffset); | 1052 return LoadObjectField(map, Map::kDescriptorsOffset); |
1052 } | 1053 } |
1053 | 1054 |
1054 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { | 1055 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { |
1055 CSA_SLOW_ASSERT(IsMap(map)); | 1056 CSA_SLOW_ASSERT(this, IsMap(map)); |
1056 return LoadObjectField(map, Map::kPrototypeOffset); | 1057 return LoadObjectField(map, Map::kPrototypeOffset); |
1057 } | 1058 } |
1058 | 1059 |
1059 Node* CodeStubAssembler::LoadMapPrototypeInfo(Node* map, | 1060 Node* CodeStubAssembler::LoadMapPrototypeInfo(Node* map, |
1060 Label* if_no_proto_info) { | 1061 Label* if_no_proto_info) { |
1061 CSA_ASSERT(IsMap(map)); | 1062 CSA_ASSERT(this, IsMap(map)); |
1062 Node* prototype_info = | 1063 Node* prototype_info = |
1063 LoadObjectField(map, Map::kTransitionsOrPrototypeInfoOffset); | 1064 LoadObjectField(map, Map::kTransitionsOrPrototypeInfoOffset); |
1064 GotoIf(TaggedIsSmi(prototype_info), if_no_proto_info); | 1065 GotoIf(TaggedIsSmi(prototype_info), if_no_proto_info); |
1065 GotoUnless(WordEqual(LoadMap(prototype_info), | 1066 GotoUnless(WordEqual(LoadMap(prototype_info), |
1066 LoadRoot(Heap::kPrototypeInfoMapRootIndex)), | 1067 LoadRoot(Heap::kPrototypeInfoMapRootIndex)), |
1067 if_no_proto_info); | 1068 if_no_proto_info); |
1068 return prototype_info; | 1069 return prototype_info; |
1069 } | 1070 } |
1070 | 1071 |
1071 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { | 1072 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { |
1072 CSA_SLOW_ASSERT(IsMap(map)); | 1073 CSA_SLOW_ASSERT(this, IsMap(map)); |
1073 return ChangeUint32ToWord( | 1074 return ChangeUint32ToWord( |
1074 LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8())); | 1075 LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8())); |
1075 } | 1076 } |
1076 | 1077 |
1077 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { | 1078 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { |
1078 CSA_SLOW_ASSERT(IsMap(map)); | 1079 CSA_SLOW_ASSERT(this, IsMap(map)); |
1079 // See Map::GetInObjectProperties() for details. | 1080 // See Map::GetInObjectProperties() for details. |
1080 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 1081 STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); |
1081 CSA_ASSERT(Int32GreaterThanOrEqual(LoadMapInstanceType(map), | 1082 CSA_ASSERT(this, |
| 1083 Int32GreaterThanOrEqual(LoadMapInstanceType(map), |
1082 Int32Constant(FIRST_JS_OBJECT_TYPE))); | 1084 Int32Constant(FIRST_JS_OBJECT_TYPE))); |
1083 return ChangeUint32ToWord(LoadObjectField( | 1085 return ChangeUint32ToWord(LoadObjectField( |
1084 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 1086 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, |
1085 MachineType::Uint8())); | 1087 MachineType::Uint8())); |
1086 } | 1088 } |
1087 | 1089 |
1088 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) { | 1090 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) { |
1089 CSA_SLOW_ASSERT(IsMap(map)); | 1091 CSA_SLOW_ASSERT(this, IsMap(map)); |
1090 // See Map::GetConstructorFunctionIndex() for details. | 1092 // See Map::GetConstructorFunctionIndex() for details. |
1091 STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE); | 1093 STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE); |
1092 CSA_ASSERT(Int32LessThanOrEqual(LoadMapInstanceType(map), | 1094 CSA_ASSERT(this, Int32LessThanOrEqual(LoadMapInstanceType(map), |
1093 Int32Constant(LAST_PRIMITIVE_TYPE))); | 1095 Int32Constant(LAST_PRIMITIVE_TYPE))); |
1094 return ChangeUint32ToWord(LoadObjectField( | 1096 return ChangeUint32ToWord(LoadObjectField( |
1095 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 1097 map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, |
1096 MachineType::Uint8())); | 1098 MachineType::Uint8())); |
1097 } | 1099 } |
1098 | 1100 |
1099 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { | 1101 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { |
1100 CSA_SLOW_ASSERT(IsMap(map)); | 1102 CSA_SLOW_ASSERT(this, IsMap(map)); |
1101 Variable result(this, MachineRepresentation::kTagged); | 1103 Variable result(this, MachineRepresentation::kTagged); |
1102 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); | 1104 result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); |
1103 | 1105 |
1104 Label done(this), loop(this, &result); | 1106 Label done(this), loop(this, &result); |
1105 Goto(&loop); | 1107 Goto(&loop); |
1106 Bind(&loop); | 1108 Bind(&loop); |
1107 { | 1109 { |
1108 GotoIf(TaggedIsSmi(result.value()), &done); | 1110 GotoIf(TaggedIsSmi(result.value()), &done); |
1109 Node* is_map_type = | 1111 Node* is_map_type = |
1110 Word32Equal(LoadInstanceType(result.value()), Int32Constant(MAP_TYPE)); | 1112 Word32Equal(LoadInstanceType(result.value()), Int32Constant(MAP_TYPE)); |
1111 GotoUnless(is_map_type, &done); | 1113 GotoUnless(is_map_type, &done); |
1112 result.Bind( | 1114 result.Bind( |
1113 LoadObjectField(result.value(), Map::kConstructorOrBackPointerOffset)); | 1115 LoadObjectField(result.value(), Map::kConstructorOrBackPointerOffset)); |
1114 Goto(&loop); | 1116 Goto(&loop); |
1115 } | 1117 } |
1116 Bind(&done); | 1118 Bind(&done); |
1117 return result.value(); | 1119 return result.value(); |
1118 } | 1120 } |
1119 | 1121 |
1120 Node* CodeStubAssembler::LoadNameHashField(Node* name) { | 1122 Node* CodeStubAssembler::LoadNameHashField(Node* name) { |
1121 CSA_ASSERT(IsName(name)); | 1123 CSA_ASSERT(this, IsName(name)); |
1122 return LoadObjectField(name, Name::kHashFieldOffset, MachineType::Uint32()); | 1124 return LoadObjectField(name, Name::kHashFieldOffset, MachineType::Uint32()); |
1123 } | 1125 } |
1124 | 1126 |
1125 Node* CodeStubAssembler::LoadNameHash(Node* name, Label* if_hash_not_computed) { | 1127 Node* CodeStubAssembler::LoadNameHash(Node* name, Label* if_hash_not_computed) { |
1126 Node* hash_field = LoadNameHashField(name); | 1128 Node* hash_field = LoadNameHashField(name); |
1127 if (if_hash_not_computed != nullptr) { | 1129 if (if_hash_not_computed != nullptr) { |
1128 GotoIf(Word32Equal( | 1130 GotoIf(Word32Equal( |
1129 Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)), | 1131 Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)), |
1130 Int32Constant(0)), | 1132 Int32Constant(0)), |
1131 if_hash_not_computed); | 1133 if_hash_not_computed); |
1132 } | 1134 } |
1133 return Word32Shr(hash_field, Int32Constant(Name::kHashShift)); | 1135 return Word32Shr(hash_field, Int32Constant(Name::kHashShift)); |
1134 } | 1136 } |
1135 | 1137 |
1136 Node* CodeStubAssembler::LoadStringLength(Node* object) { | 1138 Node* CodeStubAssembler::LoadStringLength(Node* object) { |
1137 CSA_ASSERT(IsString(object)); | 1139 CSA_ASSERT(this, IsString(object)); |
1138 return LoadObjectField(object, String::kLengthOffset); | 1140 return LoadObjectField(object, String::kLengthOffset); |
1139 } | 1141 } |
1140 | 1142 |
1141 Node* CodeStubAssembler::LoadJSValueValue(Node* object) { | 1143 Node* CodeStubAssembler::LoadJSValueValue(Node* object) { |
1142 CSA_ASSERT(IsJSValue(object)); | 1144 CSA_ASSERT(this, IsJSValue(object)); |
1143 return LoadObjectField(object, JSValue::kValueOffset); | 1145 return LoadObjectField(object, JSValue::kValueOffset); |
1144 } | 1146 } |
1145 | 1147 |
1146 Node* CodeStubAssembler::LoadWeakCellValueUnchecked(Node* weak_cell) { | 1148 Node* CodeStubAssembler::LoadWeakCellValueUnchecked(Node* weak_cell) { |
1147 // TODO(ishell): fix callers. | 1149 // TODO(ishell): fix callers. |
1148 return LoadObjectField(weak_cell, WeakCell::kValueOffset); | 1150 return LoadObjectField(weak_cell, WeakCell::kValueOffset); |
1149 } | 1151 } |
1150 | 1152 |
1151 Node* CodeStubAssembler::LoadWeakCellValue(Node* weak_cell, Label* if_cleared) { | 1153 Node* CodeStubAssembler::LoadWeakCellValue(Node* weak_cell, Label* if_cleared) { |
1152 CSA_ASSERT(IsWeakCell(weak_cell)); | 1154 CSA_ASSERT(this, IsWeakCell(weak_cell)); |
1153 Node* value = LoadWeakCellValueUnchecked(weak_cell); | 1155 Node* value = LoadWeakCellValueUnchecked(weak_cell); |
1154 if (if_cleared != nullptr) { | 1156 if (if_cleared != nullptr) { |
1155 GotoIf(WordEqual(value, IntPtrConstant(0)), if_cleared); | 1157 GotoIf(WordEqual(value, IntPtrConstant(0)), if_cleared); |
1156 } | 1158 } |
1157 return value; | 1159 return value; |
1158 } | 1160 } |
1159 | 1161 |
1160 Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, | 1162 Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, |
1161 int additional_offset, | 1163 int additional_offset, |
1162 ParameterMode parameter_mode) { | 1164 ParameterMode parameter_mode) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 if (Is64()) { | 1222 if (Is64()) { |
1221 return Load(MachineType::Int32(), object, offset); | 1223 return Load(MachineType::Int32(), object, offset); |
1222 } else { | 1224 } else { |
1223 return SmiToWord32(Load(MachineType::AnyTagged(), object, offset)); | 1225 return SmiToWord32(Load(MachineType::AnyTagged(), object, offset)); |
1224 } | 1226 } |
1225 } | 1227 } |
1226 | 1228 |
1227 Node* CodeStubAssembler::LoadFixedDoubleArrayElement( | 1229 Node* CodeStubAssembler::LoadFixedDoubleArrayElement( |
1228 Node* object, Node* index_node, MachineType machine_type, | 1230 Node* object, Node* index_node, MachineType machine_type, |
1229 int additional_offset, ParameterMode parameter_mode, Label* if_hole) { | 1231 int additional_offset, ParameterMode parameter_mode, Label* if_hole) { |
1230 CSA_ASSERT(IsFixedDoubleArray(object)); | 1232 CSA_ASSERT(this, IsFixedDoubleArray(object)); |
1231 int32_t header_size = | 1233 int32_t header_size = |
1232 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; | 1234 FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; |
1233 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, | 1235 Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, |
1234 parameter_mode, header_size); | 1236 parameter_mode, header_size); |
1235 return LoadDoubleWithHoleCheck(object, offset, if_hole, machine_type); | 1237 return LoadDoubleWithHoleCheck(object, offset, if_hole, machine_type); |
1236 } | 1238 } |
1237 | 1239 |
1238 Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset, | 1240 Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset, |
1239 Label* if_hole, | 1241 Label* if_hole, |
1240 MachineType machine_type) { | 1242 MachineType machine_type) { |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1286 IntPtrConstant(Context::kHeaderSize - kHeapObjectTag)); | 1288 IntPtrConstant(Context::kHeaderSize - kHeapObjectTag)); |
1287 return Store(MachineRepresentation::kTagged, context, offset, value); | 1289 return Store(MachineRepresentation::kTagged, context, offset, value); |
1288 } | 1290 } |
1289 | 1291 |
1290 Node* CodeStubAssembler::LoadNativeContext(Node* context) { | 1292 Node* CodeStubAssembler::LoadNativeContext(Node* context) { |
1291 return LoadContextElement(context, Context::NATIVE_CONTEXT_INDEX); | 1293 return LoadContextElement(context, Context::NATIVE_CONTEXT_INDEX); |
1292 } | 1294 } |
1293 | 1295 |
1294 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, | 1296 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, |
1295 Node* native_context) { | 1297 Node* native_context) { |
1296 CSA_ASSERT(IsNativeContext(native_context)); | 1298 CSA_ASSERT(this, IsNativeContext(native_context)); |
1297 return LoadFixedArrayElement(native_context, | 1299 return LoadFixedArrayElement(native_context, |
1298 IntPtrConstant(Context::ArrayMapIndex(kind))); | 1300 IntPtrConstant(Context::ArrayMapIndex(kind))); |
1299 } | 1301 } |
1300 | 1302 |
1301 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { | 1303 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { |
1302 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, | 1304 return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, |
1303 MachineRepresentation::kFloat64); | 1305 MachineRepresentation::kFloat64); |
1304 } | 1306 } |
1305 | 1307 |
1306 Node* CodeStubAssembler::StoreObjectField( | 1308 Node* CodeStubAssembler::StoreObjectField( |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1362 MachineRepresentation rep = MachineRepresentation::kTagged; | 1364 MachineRepresentation rep = MachineRepresentation::kTagged; |
1363 if (barrier_mode == SKIP_WRITE_BARRIER) { | 1365 if (barrier_mode == SKIP_WRITE_BARRIER) { |
1364 return StoreNoWriteBarrier(rep, object, offset, value); | 1366 return StoreNoWriteBarrier(rep, object, offset, value); |
1365 } else { | 1367 } else { |
1366 return Store(rep, object, offset, value); | 1368 return Store(rep, object, offset, value); |
1367 } | 1369 } |
1368 } | 1370 } |
1369 | 1371 |
1370 Node* CodeStubAssembler::StoreFixedDoubleArrayElement( | 1372 Node* CodeStubAssembler::StoreFixedDoubleArrayElement( |
1371 Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { | 1373 Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { |
1372 CSA_ASSERT(IsFixedDoubleArray(object)); | 1374 CSA_ASSERT(this, IsFixedDoubleArray(object)); |
1373 Node* offset = | 1375 Node* offset = |
1374 ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, | 1376 ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, |
1375 FixedArray::kHeaderSize - kHeapObjectTag); | 1377 FixedArray::kHeaderSize - kHeapObjectTag); |
1376 MachineRepresentation rep = MachineRepresentation::kFloat64; | 1378 MachineRepresentation rep = MachineRepresentation::kFloat64; |
1377 return StoreNoWriteBarrier(rep, object, offset, value); | 1379 return StoreNoWriteBarrier(rep, object, offset, value); |
1378 } | 1380 } |
1379 | 1381 |
1380 Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) { | 1382 Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) { |
1381 Node* result = Allocate(HeapNumber::kSize, kNone); | 1383 Node* result = Allocate(HeapNumber::kSize, kNone); |
1382 Heap::RootListIndex heap_map_index = | 1384 Heap::RootListIndex heap_map_index = |
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1510 Goto(&if_join); | 1512 Goto(&if_join); |
1511 } | 1513 } |
1512 | 1514 |
1513 Bind(&if_join); | 1515 Bind(&if_join); |
1514 return var_result.value(); | 1516 return var_result.value(); |
1515 } | 1517 } |
1516 | 1518 |
1517 Node* CodeStubAssembler::AllocateSlicedString( | 1519 Node* CodeStubAssembler::AllocateSlicedString( |
1518 Heap::RootListIndex map_root_index, Node* length, Node* parent, | 1520 Heap::RootListIndex map_root_index, Node* length, Node* parent, |
1519 Node* offset) { | 1521 Node* offset) { |
1520 CSA_ASSERT(TaggedIsSmi(length)); | 1522 CSA_ASSERT(this, TaggedIsSmi(length)); |
1521 Node* result = Allocate(SlicedString::kSize); | 1523 Node* result = Allocate(SlicedString::kSize); |
1522 Node* map = LoadRoot(map_root_index); | 1524 Node* map = LoadRoot(map_root_index); |
1523 DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); | 1525 DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); |
1524 StoreMapNoWriteBarrier(result, map); | 1526 StoreMapNoWriteBarrier(result, map); |
1525 StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length, | 1527 StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length, |
1526 MachineRepresentation::kTagged); | 1528 MachineRepresentation::kTagged); |
1527 StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset, | 1529 StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset, |
1528 Int32Constant(String::kEmptyHashField), | 1530 Int32Constant(String::kEmptyHashField), |
1529 MachineRepresentation::kWord32); | 1531 MachineRepresentation::kWord32); |
1530 StoreObjectFieldNoWriteBarrier(result, SlicedString::kParentOffset, parent, | 1532 StoreObjectFieldNoWriteBarrier(result, SlicedString::kParentOffset, parent, |
(...skipping 12 matching lines...) Expand all Loading... |
1543 Node* CodeStubAssembler::AllocateSlicedTwoByteString(Node* length, Node* parent, | 1545 Node* CodeStubAssembler::AllocateSlicedTwoByteString(Node* length, Node* parent, |
1544 Node* offset) { | 1546 Node* offset) { |
1545 return AllocateSlicedString(Heap::kSlicedStringMapRootIndex, length, parent, | 1547 return AllocateSlicedString(Heap::kSlicedStringMapRootIndex, length, parent, |
1546 offset); | 1548 offset); |
1547 } | 1549 } |
1548 | 1550 |
1549 Node* CodeStubAssembler::AllocateConsString(Heap::RootListIndex map_root_index, | 1551 Node* CodeStubAssembler::AllocateConsString(Heap::RootListIndex map_root_index, |
1550 Node* length, Node* first, | 1552 Node* length, Node* first, |
1551 Node* second, | 1553 Node* second, |
1552 AllocationFlags flags) { | 1554 AllocationFlags flags) { |
1553 CSA_ASSERT(TaggedIsSmi(length)); | 1555 CSA_ASSERT(this, TaggedIsSmi(length)); |
1554 Node* result = Allocate(ConsString::kSize, flags); | 1556 Node* result = Allocate(ConsString::kSize, flags); |
1555 Node* map = LoadRoot(map_root_index); | 1557 Node* map = LoadRoot(map_root_index); |
1556 DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); | 1558 DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); |
1557 StoreMapNoWriteBarrier(result, map); | 1559 StoreMapNoWriteBarrier(result, map); |
1558 StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length, | 1560 StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length, |
1559 MachineRepresentation::kTagged); | 1561 MachineRepresentation::kTagged); |
1560 StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset, | 1562 StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset, |
1561 Int32Constant(String::kEmptyHashField), | 1563 Int32Constant(String::kEmptyHashField), |
1562 MachineRepresentation::kWord32); | 1564 MachineRepresentation::kWord32); |
1563 bool const new_space = !(flags & kPretenured); | 1565 bool const new_space = !(flags & kPretenured); |
(...skipping 18 matching lines...) Expand all Loading... |
1582 | 1584 |
1583 Node* CodeStubAssembler::AllocateTwoByteConsString(Node* length, Node* first, | 1585 Node* CodeStubAssembler::AllocateTwoByteConsString(Node* length, Node* first, |
1584 Node* second, | 1586 Node* second, |
1585 AllocationFlags flags) { | 1587 AllocationFlags flags) { |
1586 return AllocateConsString(Heap::kConsStringMapRootIndex, length, first, | 1588 return AllocateConsString(Heap::kConsStringMapRootIndex, length, first, |
1587 second, flags); | 1589 second, flags); |
1588 } | 1590 } |
1589 | 1591 |
1590 Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, | 1592 Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, |
1591 Node* right, AllocationFlags flags) { | 1593 Node* right, AllocationFlags flags) { |
1592 CSA_ASSERT(TaggedIsSmi(length)); | 1594 CSA_ASSERT(this, TaggedIsSmi(length)); |
1593 // Added string can be a cons string. | 1595 // Added string can be a cons string. |
1594 Comment("Allocating ConsString"); | 1596 Comment("Allocating ConsString"); |
1595 Node* left_instance_type = LoadInstanceType(left); | 1597 Node* left_instance_type = LoadInstanceType(left); |
1596 Node* right_instance_type = LoadInstanceType(right); | 1598 Node* right_instance_type = LoadInstanceType(right); |
1597 | 1599 |
1598 // Compute intersection and difference of instance types. | 1600 // Compute intersection and difference of instance types. |
1599 Node* anded_instance_types = WordAnd(left_instance_type, right_instance_type); | 1601 Node* anded_instance_types = WordAnd(left_instance_type, right_instance_type); |
1600 Node* xored_instance_types = WordXor(left_instance_type, right_instance_type); | 1602 Node* xored_instance_types = WordXor(left_instance_type, right_instance_type); |
1601 | 1603 |
1602 // We create a one-byte cons string if | 1604 // We create a one-byte cons string if |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1637 | 1639 |
1638 Bind(&done); | 1640 Bind(&done); |
1639 | 1641 |
1640 return result.value(); | 1642 return result.value(); |
1641 } | 1643 } |
1642 | 1644 |
1643 Node* CodeStubAssembler::AllocateRegExpResult(Node* context, Node* length, | 1645 Node* CodeStubAssembler::AllocateRegExpResult(Node* context, Node* length, |
1644 Node* index, Node* input) { | 1646 Node* index, Node* input) { |
1645 Node* const max_length = | 1647 Node* const max_length = |
1646 SmiConstant(Smi::FromInt(JSArray::kInitialMaxFastElementArray)); | 1648 SmiConstant(Smi::FromInt(JSArray::kInitialMaxFastElementArray)); |
1647 CSA_ASSERT(SmiLessThanOrEqual(length, max_length)); | 1649 CSA_ASSERT(this, SmiLessThanOrEqual(length, max_length)); |
| 1650 USE(max_length); |
1648 | 1651 |
1649 // Allocate the JSRegExpResult. | 1652 // Allocate the JSRegExpResult. |
1650 // TODO(jgruber): Fold JSArray and FixedArray allocations, then remove | 1653 // TODO(jgruber): Fold JSArray and FixedArray allocations, then remove |
1651 // unneeded store of elements. | 1654 // unneeded store of elements. |
1652 Node* const result = Allocate(JSRegExpResult::kSize); | 1655 Node* const result = Allocate(JSRegExpResult::kSize); |
1653 | 1656 |
1654 // TODO(jgruber): Store map as Heap constant? | 1657 // TODO(jgruber): Store map as Heap constant? |
1655 Node* const native_context = LoadNativeContext(context); | 1658 Node* const native_context = LoadNativeContext(context); |
1656 Node* const map = | 1659 Node* const map = |
1657 LoadContextElement(native_context, Context::REGEXP_RESULT_MAP_INDEX); | 1660 LoadContextElement(native_context, Context::REGEXP_RESULT_MAP_INDEX); |
(...skipping 24 matching lines...) Expand all Loading... |
1682 Heap::kUndefinedValueRootIndex, parameter_mode); | 1685 Heap::kUndefinedValueRootIndex, parameter_mode); |
1683 | 1686 |
1684 return result; | 1687 return result; |
1685 } | 1688 } |
1686 | 1689 |
1687 Node* CodeStubAssembler::AllocateNameDictionary(int at_least_space_for) { | 1690 Node* CodeStubAssembler::AllocateNameDictionary(int at_least_space_for) { |
1688 return AllocateNameDictionary(IntPtrConstant(at_least_space_for)); | 1691 return AllocateNameDictionary(IntPtrConstant(at_least_space_for)); |
1689 } | 1692 } |
1690 | 1693 |
1691 Node* CodeStubAssembler::AllocateNameDictionary(Node* at_least_space_for) { | 1694 Node* CodeStubAssembler::AllocateNameDictionary(Node* at_least_space_for) { |
1692 CSA_ASSERT(UintPtrLessThanOrEqual( | 1695 CSA_ASSERT(this, UintPtrLessThanOrEqual( |
1693 at_least_space_for, IntPtrConstant(NameDictionary::kMaxCapacity))); | 1696 at_least_space_for, |
| 1697 IntPtrConstant(NameDictionary::kMaxCapacity))); |
1694 | 1698 |
1695 Node* capacity = HashTableComputeCapacity(at_least_space_for); | 1699 Node* capacity = HashTableComputeCapacity(at_least_space_for); |
1696 CSA_ASSERT(WordIsPowerOfTwo(capacity)); | 1700 CSA_ASSERT(this, WordIsPowerOfTwo(capacity)); |
1697 | 1701 |
1698 Node* length = EntryToIndex<NameDictionary>(capacity); | 1702 Node* length = EntryToIndex<NameDictionary>(capacity); |
1699 Node* store_size = | 1703 Node* store_size = |
1700 IntPtrAddFoldConstants(WordShl(length, IntPtrConstant(kPointerSizeLog2)), | 1704 IntPtrAddFoldConstants(WordShl(length, IntPtrConstant(kPointerSizeLog2)), |
1701 IntPtrConstant(NameDictionary::kHeaderSize)); | 1705 IntPtrConstant(NameDictionary::kHeaderSize)); |
1702 | 1706 |
1703 Node* result = Allocate(store_size); | 1707 Node* result = Allocate(store_size); |
1704 Comment("Initialize NameDictionary"); | 1708 Comment("Initialize NameDictionary"); |
1705 // Initialize FixedArray fields. | 1709 // Initialize FixedArray fields. |
1706 StoreObjectFieldRoot(result, FixedArray::kMapOffset, | 1710 StoreObjectFieldRoot(result, FixedArray::kMapOffset, |
(...skipping 24 matching lines...) Expand all Loading... |
1731 kHeapObjectTag)); | 1735 kHeapObjectTag)); |
1732 Node* end_address = IntPtrAdd( | 1736 Node* end_address = IntPtrAdd( |
1733 result, | 1737 result, |
1734 IntPtrSubFoldConstants(store_size, IntPtrConstant(kHeapObjectTag))); | 1738 IntPtrSubFoldConstants(store_size, IntPtrConstant(kHeapObjectTag))); |
1735 StoreFieldsNoWriteBarrier(start_address, end_address, filler); | 1739 StoreFieldsNoWriteBarrier(start_address, end_address, filler); |
1736 return result; | 1740 return result; |
1737 } | 1741 } |
1738 | 1742 |
1739 Node* CodeStubAssembler::AllocateJSObjectFromMap(Node* map, Node* properties, | 1743 Node* CodeStubAssembler::AllocateJSObjectFromMap(Node* map, Node* properties, |
1740 Node* elements) { | 1744 Node* elements) { |
1741 CSA_ASSERT(IsMap(map)); | 1745 CSA_ASSERT(this, IsMap(map)); |
1742 Node* size = | 1746 Node* size = |
1743 IntPtrMul(LoadMapInstanceSize(map), IntPtrConstant(kPointerSize)); | 1747 IntPtrMul(LoadMapInstanceSize(map), IntPtrConstant(kPointerSize)); |
1744 CSA_ASSERT(IsRegularHeapObjectSize(size)); | 1748 CSA_ASSERT(this, IsRegularHeapObjectSize(size)); |
1745 Node* object = Allocate(size); | 1749 Node* object = Allocate(size); |
1746 StoreMapNoWriteBarrier(object, map); | 1750 StoreMapNoWriteBarrier(object, map); |
1747 InitializeJSObjectFromMap(object, map, size, properties, elements); | 1751 InitializeJSObjectFromMap(object, map, size, properties, elements); |
1748 return object; | 1752 return object; |
1749 } | 1753 } |
1750 | 1754 |
1751 void CodeStubAssembler::InitializeJSObjectFromMap(Node* object, Node* map, | 1755 void CodeStubAssembler::InitializeJSObjectFromMap(Node* object, Node* map, |
1752 Node* size, Node* properties, | 1756 Node* size, Node* properties, |
1753 Node* elements) { | 1757 Node* elements) { |
1754 // This helper assumes that the object is in new-space, as guarded by the | 1758 // This helper assumes that the object is in new-space, as guarded by the |
1755 // check in AllocatedJSObjectFromMap. | 1759 // check in AllocatedJSObjectFromMap. |
1756 if (properties == nullptr) { | 1760 if (properties == nullptr) { |
1757 CSA_ASSERT(Word32BinaryNot(IsDictionaryMap((map)))); | 1761 CSA_ASSERT(this, Word32BinaryNot(IsDictionaryMap((map)))); |
1758 StoreObjectFieldRoot(object, JSObject::kPropertiesOffset, | 1762 StoreObjectFieldRoot(object, JSObject::kPropertiesOffset, |
1759 Heap::kEmptyFixedArrayRootIndex); | 1763 Heap::kEmptyFixedArrayRootIndex); |
1760 } else { | 1764 } else { |
1761 StoreObjectFieldNoWriteBarrier(object, JSObject::kPropertiesOffset, | 1765 StoreObjectFieldNoWriteBarrier(object, JSObject::kPropertiesOffset, |
1762 properties); | 1766 properties); |
1763 } | 1767 } |
1764 if (elements == nullptr) { | 1768 if (elements == nullptr) { |
1765 StoreObjectFieldRoot(object, JSObject::kElementsOffset, | 1769 StoreObjectFieldRoot(object, JSObject::kElementsOffset, |
1766 Heap::kEmptyFixedArrayRootIndex); | 1770 Heap::kEmptyFixedArrayRootIndex); |
1767 } else { | 1771 } else { |
(...skipping 12 matching lines...) Expand all Loading... |
1780 IntPtrAdd(object, IntPtrConstant(start_offset - kHeapObjectTag)); | 1784 IntPtrAdd(object, IntPtrConstant(start_offset - kHeapObjectTag)); |
1781 Node* end_address = | 1785 Node* end_address = |
1782 IntPtrSub(IntPtrAdd(object, size), IntPtrConstant(kHeapObjectTag)); | 1786 IntPtrSub(IntPtrAdd(object, size), IntPtrConstant(kHeapObjectTag)); |
1783 StoreFieldsNoWriteBarrier(start_address, end_address, filler); | 1787 StoreFieldsNoWriteBarrier(start_address, end_address, filler); |
1784 } | 1788 } |
1785 | 1789 |
1786 void CodeStubAssembler::StoreFieldsNoWriteBarrier(Node* start_address, | 1790 void CodeStubAssembler::StoreFieldsNoWriteBarrier(Node* start_address, |
1787 Node* end_address, | 1791 Node* end_address, |
1788 Node* value) { | 1792 Node* value) { |
1789 Comment("StoreFieldsNoWriteBarrier"); | 1793 Comment("StoreFieldsNoWriteBarrier"); |
1790 CSA_ASSERT(WordIsWordAligned(start_address)); | 1794 CSA_ASSERT(this, WordIsWordAligned(start_address)); |
1791 CSA_ASSERT(WordIsWordAligned(end_address)); | 1795 CSA_ASSERT(this, WordIsWordAligned(end_address)); |
1792 BuildFastLoop( | 1796 BuildFastLoop( |
1793 MachineType::PointerRepresentation(), start_address, end_address, | 1797 MachineType::PointerRepresentation(), start_address, end_address, |
1794 [value](CodeStubAssembler* a, Node* current) { | 1798 [value](CodeStubAssembler* a, Node* current) { |
1795 a->StoreNoWriteBarrier(MachineRepresentation::kTagged, current, value); | 1799 a->StoreNoWriteBarrier(MachineRepresentation::kTagged, current, value); |
1796 }, | 1800 }, |
1797 kPointerSize, IndexAdvanceMode::kPost); | 1801 kPointerSize, IndexAdvanceMode::kPost); |
1798 } | 1802 } |
1799 | 1803 |
1800 Node* CodeStubAssembler::AllocateUninitializedJSArrayWithoutElements( | 1804 Node* CodeStubAssembler::AllocateUninitializedJSArrayWithoutElements( |
1801 ElementsKind kind, Node* array_map, Node* length, Node* allocation_site) { | 1805 ElementsKind kind, Node* array_map, Node* length, Node* allocation_site) { |
(...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1883 : IntPtrConstant(0), | 1887 : IntPtrConstant(0), |
1884 capacity, Heap::kTheHoleValueRootIndex, capacity_mode); | 1888 capacity, Heap::kTheHoleValueRootIndex, capacity_mode); |
1885 | 1889 |
1886 return array; | 1890 return array; |
1887 } | 1891 } |
1888 | 1892 |
1889 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, | 1893 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, |
1890 Node* capacity_node, | 1894 Node* capacity_node, |
1891 ParameterMode mode, | 1895 ParameterMode mode, |
1892 AllocationFlags flags) { | 1896 AllocationFlags flags) { |
1893 CSA_ASSERT(IntPtrGreaterThan(capacity_node, IntPtrOrSmiConstant(0, mode))); | 1897 CSA_ASSERT(this, |
| 1898 IntPtrGreaterThan(capacity_node, IntPtrOrSmiConstant(0, mode))); |
1894 Node* total_size = GetFixedArrayAllocationSize(capacity_node, kind, mode); | 1899 Node* total_size = GetFixedArrayAllocationSize(capacity_node, kind, mode); |
1895 | 1900 |
1896 // Allocate both array and elements object, and initialize the JSArray. | 1901 // Allocate both array and elements object, and initialize the JSArray. |
1897 Node* array = Allocate(total_size, flags); | 1902 Node* array = Allocate(total_size, flags); |
1898 Heap* heap = isolate()->heap(); | 1903 Heap* heap = isolate()->heap(); |
1899 Handle<Map> map(IsFastDoubleElementsKind(kind) | 1904 Handle<Map> map(IsFastDoubleElementsKind(kind) |
1900 ? heap->fixed_double_array_map() | 1905 ? heap->fixed_double_array_map() |
1901 : heap->fixed_array_map()); | 1906 : heap->fixed_array_map()); |
1902 if (flags & kPretenured) { | 1907 if (flags & kPretenured) { |
1903 StoreObjectField(array, JSObject::kMapOffset, HeapConstant(map)); | 1908 StoreObjectField(array, JSObject::kMapOffset, HeapConstant(map)); |
(...skipping 747 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2651 value); | 2656 value); |
2652 var_value_map.Bind(UndefinedConstant()); | 2657 var_value_map.Bind(UndefinedConstant()); |
2653 Goto(&out); // Never reached. | 2658 Goto(&out); // Never reached. |
2654 | 2659 |
2655 Bind(&out); | 2660 Bind(&out); |
2656 return var_value_map.value(); | 2661 return var_value_map.value(); |
2657 } | 2662 } |
2658 | 2663 |
2659 Node* CodeStubAssembler::IsSpecialReceiverMap(Node* map) { | 2664 Node* CodeStubAssembler::IsSpecialReceiverMap(Node* map) { |
2660 Node* is_special = IsSpecialReceiverInstanceType(LoadMapInstanceType(map)); | 2665 Node* is_special = IsSpecialReceiverInstanceType(LoadMapInstanceType(map)); |
2661 Node* bit_field = LoadMapBitField(map); | |
2662 uint32_t mask = | 2666 uint32_t mask = |
2663 1 << Map::kHasNamedInterceptor | 1 << Map::kIsAccessCheckNeeded; | 2667 1 << Map::kHasNamedInterceptor | 1 << Map::kIsAccessCheckNeeded; |
| 2668 USE(mask); |
2664 // Interceptors or access checks imply special receiver. | 2669 // Interceptors or access checks imply special receiver. |
2665 CSA_ASSERT( | 2670 CSA_ASSERT(this, Select(IsSetWord32(LoadMapBitField(map), mask), is_special, |
2666 Select(IsSetWord32(bit_field, mask), is_special, Int32Constant(1))); | 2671 Int32Constant(1), MachineRepresentation::kWord32)); |
2667 return is_special; | 2672 return is_special; |
2668 } | 2673 } |
2669 | 2674 |
2670 Node* CodeStubAssembler::IsDictionaryMap(Node* map) { | 2675 Node* CodeStubAssembler::IsDictionaryMap(Node* map) { |
2671 CSA_SLOW_ASSERT(IsMap(map)); | 2676 CSA_SLOW_ASSERT(this, IsMap(map)); |
2672 Node* bit_field3 = LoadMapBitField3(map); | 2677 Node* bit_field3 = LoadMapBitField3(map); |
2673 return Word32NotEqual(IsSetWord32<Map::DictionaryMap>(bit_field3), | 2678 return Word32NotEqual(IsSetWord32<Map::DictionaryMap>(bit_field3), |
2674 Int32Constant(0)); | 2679 Int32Constant(0)); |
2675 } | 2680 } |
2676 | 2681 |
2677 Node* CodeStubAssembler::IsCallableMap(Node* map) { | 2682 Node* CodeStubAssembler::IsCallableMap(Node* map) { |
2678 CSA_ASSERT(IsMap(map)); | 2683 CSA_ASSERT(this, IsMap(map)); |
2679 return Word32NotEqual( | 2684 return Word32NotEqual( |
2680 Word32And(LoadMapBitField(map), Int32Constant(1 << Map::kIsCallable)), | 2685 Word32And(LoadMapBitField(map), Int32Constant(1 << Map::kIsCallable)), |
2681 Int32Constant(0)); | 2686 Int32Constant(0)); |
2682 } | 2687 } |
2683 | 2688 |
2684 Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) { | 2689 Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) { |
2685 STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); | 2690 STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); |
2686 return Int32LessThanOrEqual(instance_type, | 2691 return Int32LessThanOrEqual(instance_type, |
2687 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)); | 2692 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)); |
2688 } | 2693 } |
(...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2755 Node* CodeStubAssembler::IsDictionary(Node* object) { | 2760 Node* CodeStubAssembler::IsDictionary(Node* object) { |
2756 return WordOr(IsHashTable(object), IsUnseededNumberDictionary(object)); | 2761 return WordOr(IsHashTable(object), IsUnseededNumberDictionary(object)); |
2757 } | 2762 } |
2758 | 2763 |
2759 Node* CodeStubAssembler::IsUnseededNumberDictionary(Node* object) { | 2764 Node* CodeStubAssembler::IsUnseededNumberDictionary(Node* object) { |
2760 return WordEqual(LoadMap(object), | 2765 return WordEqual(LoadMap(object), |
2761 LoadRoot(Heap::kUnseededNumberDictionaryMapRootIndex)); | 2766 LoadRoot(Heap::kUnseededNumberDictionaryMapRootIndex)); |
2762 } | 2767 } |
2763 | 2768 |
2764 Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { | 2769 Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { |
2765 CSA_ASSERT(IsString(string)); | 2770 CSA_ASSERT(this, IsString(string)); |
2766 // Translate the {index} into a Word. | 2771 // Translate the {index} into a Word. |
2767 index = SmiToWord(index); | 2772 index = SmiToWord(index); |
2768 | 2773 |
2769 // We may need to loop in case of cons or sliced strings. | 2774 // We may need to loop in case of cons or sliced strings. |
2770 Variable var_index(this, MachineType::PointerRepresentation()); | 2775 Variable var_index(this, MachineType::PointerRepresentation()); |
2771 Variable var_result(this, MachineRepresentation::kWord32); | 2776 Variable var_result(this, MachineRepresentation::kWord32); |
2772 Variable var_string(this, MachineRepresentation::kTagged); | 2777 Variable var_string(this, MachineRepresentation::kTagged); |
2773 Variable* loop_vars[] = {&var_index, &var_string}; | 2778 Variable* loop_vars[] = {&var_index, &var_string}; |
2774 Label done_loop(this, &var_result), loop(this, 2, loop_vars); | 2779 Label done_loop(this, &var_result), loop(this, 2, loop_vars); |
2775 var_string.Bind(string); | 2780 var_string.Bind(string); |
(...skipping 511 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3287 result.Bind(right); | 3292 result.Bind(right); |
3288 Goto(&done_native); | 3293 Goto(&done_native); |
3289 | 3294 |
3290 Bind(&check_right); | 3295 Bind(&check_right); |
3291 Node* right_length = LoadStringLength(right); | 3296 Node* right_length = LoadStringLength(right); |
3292 GotoIf(WordNotEqual(IntPtrConstant(0), right_length), &cons); | 3297 GotoIf(WordNotEqual(IntPtrConstant(0), right_length), &cons); |
3293 result.Bind(left); | 3298 result.Bind(left); |
3294 Goto(&done_native); | 3299 Goto(&done_native); |
3295 | 3300 |
3296 Bind(&cons); | 3301 Bind(&cons); |
3297 CSA_ASSERT(TaggedIsSmi(left_length)); | 3302 CSA_ASSERT(this, TaggedIsSmi(left_length)); |
3298 CSA_ASSERT(TaggedIsSmi(right_length)); | 3303 CSA_ASSERT(this, TaggedIsSmi(right_length)); |
3299 Node* new_length = SmiAdd(left_length, right_length); | 3304 Node* new_length = SmiAdd(left_length, right_length); |
3300 GotoIf(UintPtrGreaterThanOrEqual( | 3305 GotoIf(UintPtrGreaterThanOrEqual( |
3301 new_length, SmiConstant(Smi::FromInt(String::kMaxLength))), | 3306 new_length, SmiConstant(Smi::FromInt(String::kMaxLength))), |
3302 &runtime); | 3307 &runtime); |
3303 | 3308 |
3304 GotoIf(IntPtrLessThan(new_length, | 3309 GotoIf(IntPtrLessThan(new_length, |
3305 SmiConstant(Smi::FromInt(ConsString::kMinLength))), | 3310 SmiConstant(Smi::FromInt(ConsString::kMinLength))), |
3306 &non_cons); | 3311 &non_cons); |
3307 | 3312 |
3308 result.Bind(NewConsString(context, new_length, left, right, flags)); | 3313 result.Bind(NewConsString(context, new_length, left, right, flags)); |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3372 IncrementCounter(counters->string_add_native(), 1); | 3377 IncrementCounter(counters->string_add_native(), 1); |
3373 Goto(&done); | 3378 Goto(&done); |
3374 } | 3379 } |
3375 | 3380 |
3376 Bind(&done); | 3381 Bind(&done); |
3377 return result.value(); | 3382 return result.value(); |
3378 } | 3383 } |
3379 | 3384 |
3380 Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string, | 3385 Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string, |
3381 Node* needle_char, Node* from) { | 3386 Node* needle_char, Node* from) { |
3382 CSA_ASSERT(IsString(string)); | 3387 CSA_ASSERT(this, IsString(string)); |
3383 Variable var_result(this, MachineRepresentation::kTagged); | 3388 Variable var_result(this, MachineRepresentation::kTagged); |
3384 | 3389 |
3385 Label out(this), runtime(this, Label::kDeferred); | 3390 Label out(this), runtime(this, Label::kDeferred); |
3386 | 3391 |
3387 // Let runtime handle non-one-byte {needle_char}. | 3392 // Let runtime handle non-one-byte {needle_char}. |
3388 | 3393 |
3389 Node* const one_byte_char_mask = IntPtrConstant(0xFF); | 3394 Node* const one_byte_char_mask = IntPtrConstant(0xFF); |
3390 GotoUnless(WordEqual(WordAnd(needle_char, one_byte_char_mask), needle_char), | 3395 GotoUnless(WordEqual(WordAnd(needle_char, one_byte_char_mask), needle_char), |
3391 &runtime); | 3396 &runtime); |
3392 | 3397 |
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3644 Goto(&end); | 3649 Goto(&end); |
3645 } | 3650 } |
3646 } | 3651 } |
3647 | 3652 |
3648 Bind(&end); | 3653 Bind(&end); |
3649 return var_result.value(); | 3654 return var_result.value(); |
3650 } | 3655 } |
3651 | 3656 |
3652 Node* CodeStubAssembler::NonNumberToNumber(Node* context, Node* input) { | 3657 Node* CodeStubAssembler::NonNumberToNumber(Node* context, Node* input) { |
3653 // Assert input is a HeapObject (not smi or heap number) | 3658 // Assert input is a HeapObject (not smi or heap number) |
3654 CSA_ASSERT(Word32BinaryNot(TaggedIsSmi(input))); | 3659 CSA_ASSERT(this, Word32BinaryNot(TaggedIsSmi(input))); |
3655 CSA_ASSERT(Word32NotEqual(LoadMap(input), HeapNumberMapConstant())); | 3660 CSA_ASSERT(this, Word32NotEqual(LoadMap(input), HeapNumberMapConstant())); |
3656 | 3661 |
3657 // We might need to loop once here due to ToPrimitive conversions. | 3662 // We might need to loop once here due to ToPrimitive conversions. |
3658 Variable var_input(this, MachineRepresentation::kTagged); | 3663 Variable var_input(this, MachineRepresentation::kTagged); |
3659 Variable var_result(this, MachineRepresentation::kTagged); | 3664 Variable var_result(this, MachineRepresentation::kTagged); |
3660 Label loop(this, &var_input); | 3665 Label loop(this, &var_input); |
3661 Label end(this); | 3666 Label end(this); |
3662 var_input.Bind(input); | 3667 var_input.Bind(input); |
3663 Goto(&loop); | 3668 Goto(&loop); |
3664 Bind(&loop); | 3669 Bind(&loop); |
3665 { | 3670 { |
(...skipping 136 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3802 { | 3807 { |
3803 result.Bind(CallRuntime(Runtime::kToString, context, input)); | 3808 result.Bind(CallRuntime(Runtime::kToString, context, input)); |
3804 Goto(&done); | 3809 Goto(&done); |
3805 } | 3810 } |
3806 | 3811 |
3807 Bind(&done); | 3812 Bind(&done); |
3808 return result.value(); | 3813 return result.value(); |
3809 } | 3814 } |
3810 | 3815 |
3811 Node* CodeStubAssembler::FlattenString(Node* string) { | 3816 Node* CodeStubAssembler::FlattenString(Node* string) { |
3812 CSA_ASSERT(IsString(string)); | 3817 CSA_ASSERT(this, IsString(string)); |
3813 Variable var_result(this, MachineRepresentation::kTagged); | 3818 Variable var_result(this, MachineRepresentation::kTagged); |
3814 var_result.Bind(string); | 3819 var_result.Bind(string); |
3815 | 3820 |
3816 Node* instance_type = LoadInstanceType(string); | 3821 Node* instance_type = LoadInstanceType(string); |
3817 | 3822 |
3818 // Check if the {string} is not a ConsString (i.e. already flat). | 3823 // Check if the {string} is not a ConsString (i.e. already flat). |
3819 Label is_cons(this, Label::kDeferred), is_flat_in_cons(this), end(this); | 3824 Label is_cons(this, Label::kDeferred), is_flat_in_cons(this), end(this); |
3820 { | 3825 { |
3821 GotoUnless(Word32Equal(Word32And(instance_type, | 3826 GotoUnless(Word32Equal(Word32And(instance_type, |
3822 Int32Constant(kStringRepresentationMask)), | 3827 Int32Constant(kStringRepresentationMask)), |
(...skipping 213 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4036 return Select(IntPtrGreaterThanOrEqual(left, right), left, right, | 4041 return Select(IntPtrGreaterThanOrEqual(left, right), left, right, |
4037 MachineType::PointerRepresentation()); | 4042 MachineType::PointerRepresentation()); |
4038 } | 4043 } |
4039 | 4044 |
4040 template <typename Dictionary> | 4045 template <typename Dictionary> |
4041 void CodeStubAssembler::NameDictionaryLookup(Node* dictionary, | 4046 void CodeStubAssembler::NameDictionaryLookup(Node* dictionary, |
4042 Node* unique_name, Label* if_found, | 4047 Node* unique_name, Label* if_found, |
4043 Variable* var_name_index, | 4048 Variable* var_name_index, |
4044 Label* if_not_found, | 4049 Label* if_not_found, |
4045 int inlined_probes) { | 4050 int inlined_probes) { |
4046 CSA_ASSERT(IsDictionary(dictionary)); | 4051 CSA_ASSERT(this, IsDictionary(dictionary)); |
4047 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); | 4052 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); |
4048 Comment("NameDictionaryLookup"); | 4053 Comment("NameDictionaryLookup"); |
4049 | 4054 |
4050 Node* capacity = SmiUntag(LoadFixedArrayElement( | 4055 Node* capacity = SmiUntag(LoadFixedArrayElement( |
4051 dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 4056 dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, |
4052 INTPTR_PARAMETERS)); | 4057 INTPTR_PARAMETERS)); |
4053 Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 4058 Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); |
4054 Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name)); | 4059 Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name)); |
4055 | 4060 |
4056 // See Dictionary::FirstProbe(). | 4061 // See Dictionary::FirstProbe(). |
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4121 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16))); | 4126 hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16))); |
4122 return Word32And(hash, Int32Constant(0x3fffffff)); | 4127 return Word32And(hash, Int32Constant(0x3fffffff)); |
4123 } | 4128 } |
4124 | 4129 |
4125 template <typename Dictionary> | 4130 template <typename Dictionary> |
4126 void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary, | 4131 void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary, |
4127 Node* intptr_index, | 4132 Node* intptr_index, |
4128 Label* if_found, | 4133 Label* if_found, |
4129 Variable* var_entry, | 4134 Variable* var_entry, |
4130 Label* if_not_found) { | 4135 Label* if_not_found) { |
4131 CSA_ASSERT(IsDictionary(dictionary)); | 4136 CSA_ASSERT(this, IsDictionary(dictionary)); |
4132 DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep()); | 4137 DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep()); |
4133 Comment("NumberDictionaryLookup"); | 4138 Comment("NumberDictionaryLookup"); |
4134 | 4139 |
4135 Node* capacity = SmiUntag(LoadFixedArrayElement( | 4140 Node* capacity = SmiUntag(LoadFixedArrayElement( |
4136 dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 4141 dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, |
4137 INTPTR_PARAMETERS)); | 4142 INTPTR_PARAMETERS)); |
4138 Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 4143 Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); |
4139 | 4144 |
4140 Node* int32_seed; | 4145 Node* int32_seed; |
4141 if (Dictionary::ShapeT::UsesSeed) { | 4146 if (Dictionary::ShapeT::UsesSeed) { |
(...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4228 Label* if_bailout) { | 4233 Label* if_bailout) { |
4229 DCHECK_EQ(MachineRepresentation::kTagged, var_meta_storage->rep()); | 4234 DCHECK_EQ(MachineRepresentation::kTagged, var_meta_storage->rep()); |
4230 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); | 4235 DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); |
4231 | 4236 |
4232 Label if_objectisspecial(this); | 4237 Label if_objectisspecial(this); |
4233 STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); | 4238 STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); |
4234 GotoIf(Int32LessThanOrEqual(instance_type, | 4239 GotoIf(Int32LessThanOrEqual(instance_type, |
4235 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), | 4240 Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)), |
4236 &if_objectisspecial); | 4241 &if_objectisspecial); |
4237 | 4242 |
4238 Node* bit_field = LoadMapBitField(map); | 4243 uint32_t mask = |
4239 Node* mask = Int32Constant(1 << Map::kHasNamedInterceptor | | 4244 1 << Map::kHasNamedInterceptor | 1 << Map::kIsAccessCheckNeeded; |
4240 1 << Map::kIsAccessCheckNeeded); | 4245 CSA_ASSERT(this, Word32BinaryNot(IsSetWord32(LoadMapBitField(map), mask))); |
4241 CSA_ASSERT(Word32Equal(Word32And(bit_field, mask), Int32Constant(0))); | 4246 USE(mask); |
4242 | 4247 |
4243 Node* bit_field3 = LoadMapBitField3(map); | 4248 Node* bit_field3 = LoadMapBitField3(map); |
4244 Label if_isfastmap(this), if_isslowmap(this); | 4249 Label if_isfastmap(this), if_isslowmap(this); |
4245 Branch(IsSetWord32<Map::DictionaryMap>(bit_field3), &if_isslowmap, | 4250 Branch(IsSetWord32<Map::DictionaryMap>(bit_field3), &if_isslowmap, |
4246 &if_isfastmap); | 4251 &if_isfastmap); |
4247 Bind(&if_isfastmap); | 4252 Bind(&if_isfastmap); |
4248 { | 4253 { |
4249 Comment("DescriptorArrayLookup"); | 4254 Comment("DescriptorArrayLookup"); |
4250 Node* nof = | 4255 Node* nof = |
4251 DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bit_field3); | 4256 DecodeWordFromWord32<Map::NumberOfOwnDescriptorsBits>(bit_field3); |
(...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4424 Bind(&done); | 4429 Bind(&done); |
4425 | 4430 |
4426 Comment("] LoadPropertyFromFastObject"); | 4431 Comment("] LoadPropertyFromFastObject"); |
4427 } | 4432 } |
4428 | 4433 |
4429 void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary, | 4434 void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary, |
4430 Node* name_index, | 4435 Node* name_index, |
4431 Variable* var_details, | 4436 Variable* var_details, |
4432 Variable* var_value) { | 4437 Variable* var_value) { |
4433 Comment("LoadPropertyFromNameDictionary"); | 4438 Comment("LoadPropertyFromNameDictionary"); |
4434 CSA_ASSERT(IsDictionary(dictionary)); | 4439 CSA_ASSERT(this, IsDictionary(dictionary)); |
4435 const int name_to_details_offset = | 4440 const int name_to_details_offset = |
4436 (NameDictionary::kEntryDetailsIndex - NameDictionary::kEntryKeyIndex) * | 4441 (NameDictionary::kEntryDetailsIndex - NameDictionary::kEntryKeyIndex) * |
4437 kPointerSize; | 4442 kPointerSize; |
4438 const int name_to_value_offset = | 4443 const int name_to_value_offset = |
4439 (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 4444 (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * |
4440 kPointerSize; | 4445 kPointerSize; |
4441 | 4446 |
4442 Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index, | 4447 Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index, |
4443 name_to_details_offset); | 4448 name_to_details_offset); |
4444 | 4449 |
4445 var_details->Bind(details); | 4450 var_details->Bind(details); |
4446 var_value->Bind( | 4451 var_value->Bind( |
4447 LoadFixedArrayElement(dictionary, name_index, name_to_value_offset)); | 4452 LoadFixedArrayElement(dictionary, name_index, name_to_value_offset)); |
4448 | 4453 |
4449 Comment("] LoadPropertyFromNameDictionary"); | 4454 Comment("] LoadPropertyFromNameDictionary"); |
4450 } | 4455 } |
4451 | 4456 |
4452 void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary, | 4457 void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary, |
4453 Node* name_index, | 4458 Node* name_index, |
4454 Variable* var_details, | 4459 Variable* var_details, |
4455 Variable* var_value, | 4460 Variable* var_value, |
4456 Label* if_deleted) { | 4461 Label* if_deleted) { |
4457 Comment("[ LoadPropertyFromGlobalDictionary"); | 4462 Comment("[ LoadPropertyFromGlobalDictionary"); |
4458 CSA_ASSERT(IsDictionary(dictionary)); | 4463 CSA_ASSERT(this, IsDictionary(dictionary)); |
4459 | 4464 |
4460 const int name_to_value_offset = | 4465 const int name_to_value_offset = |
4461 (GlobalDictionary::kEntryValueIndex - GlobalDictionary::kEntryKeyIndex) * | 4466 (GlobalDictionary::kEntryValueIndex - GlobalDictionary::kEntryKeyIndex) * |
4462 kPointerSize; | 4467 kPointerSize; |
4463 | 4468 |
4464 Node* property_cell = | 4469 Node* property_cell = |
4465 LoadFixedArrayElement(dictionary, name_index, name_to_value_offset); | 4470 LoadFixedArrayElement(dictionary, name_index, name_to_value_offset); |
4466 | 4471 |
4467 Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); | 4472 Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); |
4468 GotoIf(WordEqual(value, TheHoleConstant()), if_deleted); | 4473 GotoIf(WordEqual(value, TheHoleConstant()), if_deleted); |
(...skipping 19 matching lines...) Expand all Loading... |
4488 | 4493 |
4489 Node* kind = DecodeWord32<PropertyDetails::KindField>(details); | 4494 Node* kind = DecodeWord32<PropertyDetails::KindField>(details); |
4490 GotoIf(Word32Equal(kind, Int32Constant(kData)), &done); | 4495 GotoIf(Word32Equal(kind, Int32Constant(kData)), &done); |
4491 | 4496 |
4492 // Accessor case. | 4497 // Accessor case. |
4493 { | 4498 { |
4494 Node* accessor_pair = value; | 4499 Node* accessor_pair = value; |
4495 GotoIf(Word32Equal(LoadInstanceType(accessor_pair), | 4500 GotoIf(Word32Equal(LoadInstanceType(accessor_pair), |
4496 Int32Constant(ACCESSOR_INFO_TYPE)), | 4501 Int32Constant(ACCESSOR_INFO_TYPE)), |
4497 if_bailout); | 4502 if_bailout); |
4498 CSA_ASSERT(HasInstanceType(accessor_pair, ACCESSOR_PAIR_TYPE)); | 4503 CSA_ASSERT(this, HasInstanceType(accessor_pair, ACCESSOR_PAIR_TYPE)); |
4499 Node* getter = LoadObjectField(accessor_pair, AccessorPair::kGetterOffset); | 4504 Node* getter = LoadObjectField(accessor_pair, AccessorPair::kGetterOffset); |
4500 Node* getter_map = LoadMap(getter); | 4505 Node* getter_map = LoadMap(getter); |
4501 Node* instance_type = LoadMapInstanceType(getter_map); | 4506 Node* instance_type = LoadMapInstanceType(getter_map); |
4502 // FunctionTemplateInfo getters are not supported yet. | 4507 // FunctionTemplateInfo getters are not supported yet. |
4503 GotoIf( | 4508 GotoIf( |
4504 Word32Equal(instance_type, Int32Constant(FUNCTION_TEMPLATE_INFO_TYPE)), | 4509 Word32Equal(instance_type, Int32Constant(FUNCTION_TEMPLATE_INFO_TYPE)), |
4505 if_bailout); | 4510 if_bailout); |
4506 | 4511 |
4507 // Return undefined if the {getter} is not callable. | 4512 // Return undefined if the {getter} is not callable. |
4508 var_value.Bind(UndefinedConstant()); | 4513 var_value.Bind(UndefinedConstant()); |
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4643 } | 4648 } |
4644 Bind(&if_isdictionary); | 4649 Bind(&if_isdictionary); |
4645 { | 4650 { |
4646 Variable var_entry(this, MachineType::PointerRepresentation()); | 4651 Variable var_entry(this, MachineType::PointerRepresentation()); |
4647 Node* elements = LoadElements(object); | 4652 Node* elements = LoadElements(object); |
4648 NumberDictionaryLookup<SeededNumberDictionary>( | 4653 NumberDictionaryLookup<SeededNumberDictionary>( |
4649 elements, intptr_index, if_found, &var_entry, if_not_found); | 4654 elements, intptr_index, if_found, &var_entry, if_not_found); |
4650 } | 4655 } |
4651 Bind(&if_isfaststringwrapper); | 4656 Bind(&if_isfaststringwrapper); |
4652 { | 4657 { |
4653 CSA_ASSERT(HasInstanceType(object, JS_VALUE_TYPE)); | 4658 CSA_ASSERT(this, HasInstanceType(object, JS_VALUE_TYPE)); |
4654 Node* string = LoadJSValueValue(object); | 4659 Node* string = LoadJSValueValue(object); |
4655 CSA_ASSERT(IsStringInstanceType(LoadInstanceType(string))); | 4660 CSA_ASSERT(this, IsStringInstanceType(LoadInstanceType(string))); |
4656 Node* length = LoadStringLength(string); | 4661 Node* length = LoadStringLength(string); |
4657 GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); | 4662 GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); |
4658 Goto(&if_isobjectorsmi); | 4663 Goto(&if_isobjectorsmi); |
4659 } | 4664 } |
4660 Bind(&if_isslowstringwrapper); | 4665 Bind(&if_isslowstringwrapper); |
4661 { | 4666 { |
4662 CSA_ASSERT(HasInstanceType(object, JS_VALUE_TYPE)); | 4667 CSA_ASSERT(this, HasInstanceType(object, JS_VALUE_TYPE)); |
4663 Node* string = LoadJSValueValue(object); | 4668 Node* string = LoadJSValueValue(object); |
4664 CSA_ASSERT(IsStringInstanceType(LoadInstanceType(string))); | 4669 CSA_ASSERT(this, IsStringInstanceType(LoadInstanceType(string))); |
4665 Node* length = LoadStringLength(string); | 4670 Node* length = LoadStringLength(string); |
4666 GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); | 4671 GotoIf(UintPtrLessThan(intptr_index, SmiUntag(length)), if_found); |
4667 Goto(&if_isdictionary); | 4672 Goto(&if_isdictionary); |
4668 } | 4673 } |
4669 Bind(&if_oob); | 4674 Bind(&if_oob); |
4670 { | 4675 { |
4671 // Positive OOB indices mean "not found", negative indices must be | 4676 // Positive OOB indices mean "not found", negative indices must be |
4672 // converted to property names. | 4677 // converted to property names. |
4673 GotoIf(IntPtrLessThan(intptr_index, IntPtrConstant(0)), if_bailout); | 4678 GotoIf(IntPtrLessThan(intptr_index, IntPtrConstant(0)), if_bailout); |
4674 Goto(if_not_found); | 4679 Goto(if_not_found); |
(...skipping 452 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5127 // The loop falls through if no handler was found. | 5132 // The loop falls through if no handler was found. |
5128 Goto(if_miss); | 5133 Goto(if_miss); |
5129 } | 5134 } |
5130 | 5135 |
5131 compiler::Node* CodeStubAssembler::StubCachePrimaryOffset(compiler::Node* name, | 5136 compiler::Node* CodeStubAssembler::StubCachePrimaryOffset(compiler::Node* name, |
5132 compiler::Node* map) { | 5137 compiler::Node* map) { |
5133 // See v8::internal::StubCache::PrimaryOffset(). | 5138 // See v8::internal::StubCache::PrimaryOffset(). |
5134 STATIC_ASSERT(StubCache::kCacheIndexShift == Name::kHashShift); | 5139 STATIC_ASSERT(StubCache::kCacheIndexShift == Name::kHashShift); |
5135 // Compute the hash of the name (use entire hash field). | 5140 // Compute the hash of the name (use entire hash field). |
5136 Node* hash_field = LoadNameHashField(name); | 5141 Node* hash_field = LoadNameHashField(name); |
5137 CSA_ASSERT(Word32Equal( | 5142 CSA_ASSERT(this, |
5138 Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)), | 5143 Word32Equal(Word32And(hash_field, |
5139 Int32Constant(0))); | 5144 Int32Constant(Name::kHashNotComputedMask)), |
| 5145 Int32Constant(0))); |
5140 | 5146 |
5141 // Using only the low bits in 64-bit mode is unlikely to increase the | 5147 // Using only the low bits in 64-bit mode is unlikely to increase the |
5142 // risk of collision even if the heap is spread over an area larger than | 5148 // risk of collision even if the heap is spread over an area larger than |
5143 // 4Gb (and not at all if it isn't). | 5149 // 4Gb (and not at all if it isn't). |
5144 Node* hash = Int32Add(hash_field, map); | 5150 Node* hash = Int32Add(hash_field, map); |
5145 // Base the offset on a simple combination of name and map. | 5151 // Base the offset on a simple combination of name and map. |
5146 hash = Word32Xor(hash, Int32Constant(StubCache::kPrimaryMagic)); | 5152 hash = Word32Xor(hash, Int32Constant(StubCache::kPrimaryMagic)); |
5147 uint32_t mask = (StubCache::kPrimaryTableSize - 1) | 5153 uint32_t mask = (StubCache::kPrimaryTableSize - 1) |
5148 << StubCache::kCacheIndexShift; | 5154 << StubCache::kCacheIndexShift; |
5149 return ChangeUint32ToWord(Word32And(hash, Int32Constant(mask))); | 5155 return ChangeUint32ToWord(Word32And(hash, Int32Constant(mask))); |
(...skipping 455 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5605 Return(AllocateHeapNumberWithValue(var_double_value.value())); | 5611 Return(AllocateHeapNumberWithValue(var_double_value.value())); |
5606 } | 5612 } |
5607 | 5613 |
5608 Bind(&constant); | 5614 Bind(&constant); |
5609 { | 5615 { |
5610 Comment("constant_load"); | 5616 Comment("constant_load"); |
5611 Node* descriptors = LoadMapDescriptors(LoadMap(holder)); | 5617 Node* descriptors = LoadMapDescriptors(LoadMap(holder)); |
5612 Node* descriptor = | 5618 Node* descriptor = |
5613 DecodeWord<LoadHandler::DescriptorValueIndexBits>(handler_word); | 5619 DecodeWord<LoadHandler::DescriptorValueIndexBits>(handler_word); |
5614 #if defined(DEBUG) | 5620 #if defined(DEBUG) |
5615 CSA_ASSERT(UintPtrLessThan( | 5621 CSA_ASSERT( |
5616 descriptor, LoadAndUntagFixedArrayBaseLength(descriptors))); | 5622 this, UintPtrLessThan(descriptor, |
| 5623 LoadAndUntagFixedArrayBaseLength(descriptors))); |
5617 #endif | 5624 #endif |
5618 Node* value = | 5625 Node* value = |
5619 LoadFixedArrayElement(descriptors, descriptor, 0, INTPTR_PARAMETERS); | 5626 LoadFixedArrayElement(descriptors, descriptor, 0, INTPTR_PARAMETERS); |
5620 | 5627 |
5621 Label if_accessor_info(this); | 5628 Label if_accessor_info(this); |
5622 GotoIf(IsSetWord<LoadHandler::IsAccessorInfoBits>(handler_word), | 5629 GotoIf(IsSetWord<LoadHandler::IsAccessorInfoBits>(handler_word), |
5623 &if_accessor_info); | 5630 &if_accessor_info); |
5624 Return(value); | 5631 Return(value); |
5625 | 5632 |
5626 Bind(&if_accessor_info); | 5633 Bind(&if_accessor_info); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5668 GotoIf(WordEqual(validity_cell, IntPtrConstant(0)), | 5675 GotoIf(WordEqual(validity_cell, IntPtrConstant(0)), |
5669 &validity_cell_check_done); | 5676 &validity_cell_check_done); |
5670 Node* cell_value = LoadObjectField(validity_cell, Cell::kValueOffset); | 5677 Node* cell_value = LoadObjectField(validity_cell, Cell::kValueOffset); |
5671 GotoIf(WordNotEqual(cell_value, | 5678 GotoIf(WordNotEqual(cell_value, |
5672 SmiConstant(Smi::FromInt(Map::kPrototypeChainValid))), | 5679 SmiConstant(Smi::FromInt(Map::kPrototypeChainValid))), |
5673 miss); | 5680 miss); |
5674 Goto(&validity_cell_check_done); | 5681 Goto(&validity_cell_check_done); |
5675 | 5682 |
5676 Bind(&validity_cell_check_done); | 5683 Bind(&validity_cell_check_done); |
5677 Node* smi_handler = LoadObjectField(handler, LoadHandler::kSmiHandlerOffset); | 5684 Node* smi_handler = LoadObjectField(handler, LoadHandler::kSmiHandlerOffset); |
5678 CSA_ASSERT(TaggedIsSmi(smi_handler)); | 5685 CSA_ASSERT(this, TaggedIsSmi(smi_handler)); |
5679 Node* handler_flags = SmiUntag(smi_handler); | 5686 Node* handler_flags = SmiUntag(smi_handler); |
5680 | 5687 |
5681 Label check_prototypes(this); | 5688 Label check_prototypes(this); |
5682 GotoUnless( | 5689 GotoUnless( |
5683 IsSetWord<LoadHandler::DoNegativeLookupOnReceiverBits>(handler_flags), | 5690 IsSetWord<LoadHandler::DoNegativeLookupOnReceiverBits>(handler_flags), |
5684 &check_prototypes); | 5691 &check_prototypes); |
5685 { | 5692 { |
5686 // We have a dictionary receiver, do a negative lookup check. | 5693 // We have a dictionary receiver, do a negative lookup check. |
5687 NameDictionaryNegativeLookup(p->receiver, p->name, miss); | 5694 NameDictionaryNegativeLookup(p->receiver, p->name, miss); |
5688 Goto(&check_prototypes); | 5695 Goto(&check_prototypes); |
5689 } | 5696 } |
5690 | 5697 |
5691 Bind(&check_prototypes); | 5698 Bind(&check_prototypes); |
5692 Node* maybe_holder_cell = | 5699 Node* maybe_holder_cell = |
5693 LoadObjectField(handler, LoadHandler::kHolderCellOffset); | 5700 LoadObjectField(handler, LoadHandler::kHolderCellOffset); |
5694 Label array_handler(this), tuple_handler(this); | 5701 Label array_handler(this), tuple_handler(this); |
5695 Branch(TaggedIsSmi(maybe_holder_cell), &array_handler, &tuple_handler); | 5702 Branch(TaggedIsSmi(maybe_holder_cell), &array_handler, &tuple_handler); |
5696 | 5703 |
5697 Bind(&tuple_handler); | 5704 Bind(&tuple_handler); |
5698 { | 5705 { |
5699 Label load_existent(this); | 5706 Label load_existent(this); |
5700 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); | 5707 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); |
5701 // This is a handler for a load of a non-existent value. | 5708 // This is a handler for a load of a non-existent value. |
5702 Return(UndefinedConstant()); | 5709 Return(UndefinedConstant()); |
5703 | 5710 |
5704 Bind(&load_existent); | 5711 Bind(&load_existent); |
5705 Node* holder = LoadWeakCellValue(maybe_holder_cell); | 5712 Node* holder = LoadWeakCellValue(maybe_holder_cell); |
5706 // The |holder| is guaranteed to be alive at this point since we passed | 5713 // The |holder| is guaranteed to be alive at this point since we passed |
5707 // both the receiver map check and the validity cell check. | 5714 // both the receiver map check and the validity cell check. |
5708 CSA_ASSERT(WordNotEqual(holder, IntPtrConstant(0))); | 5715 CSA_ASSERT(this, WordNotEqual(holder, IntPtrConstant(0))); |
5709 | 5716 |
5710 var_holder->Bind(holder); | 5717 var_holder->Bind(holder); |
5711 var_smi_handler->Bind(smi_handler); | 5718 var_smi_handler->Bind(smi_handler); |
5712 Goto(if_smi_handler); | 5719 Goto(if_smi_handler); |
5713 } | 5720 } |
5714 | 5721 |
5715 Bind(&array_handler); | 5722 Bind(&array_handler); |
5716 { | 5723 { |
5717 Node* length = SmiUntag(maybe_holder_cell); | 5724 Node* length = SmiUntag(maybe_holder_cell); |
5718 | 5725 |
5719 Variable start_index(this, MachineType::PointerRepresentation()); | 5726 Variable start_index(this, MachineType::PointerRepresentation()); |
5720 start_index.Bind(IntPtrConstant(LoadHandler::kFirstPrototypeIndex)); | 5727 start_index.Bind(IntPtrConstant(LoadHandler::kFirstPrototypeIndex)); |
5721 | 5728 |
5722 Label can_access(this); | 5729 Label can_access(this); |
5723 GotoUnless( | 5730 GotoUnless( |
5724 IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_flags), | 5731 IsSetWord<LoadHandler::DoAccessCheckOnReceiverBits>(handler_flags), |
5725 &can_access); | 5732 &can_access); |
5726 { | 5733 { |
5727 // Skip this entry of a handler. | 5734 // Skip this entry of a handler. |
5728 start_index.Bind(IntPtrConstant(LoadHandler::kFirstPrototypeIndex + 1)); | 5735 start_index.Bind(IntPtrConstant(LoadHandler::kFirstPrototypeIndex + 1)); |
5729 | 5736 |
5730 int offset = | 5737 int offset = |
5731 FixedArray::OffsetOfElementAt(LoadHandler::kFirstPrototypeIndex); | 5738 FixedArray::OffsetOfElementAt(LoadHandler::kFirstPrototypeIndex); |
5732 Node* expected_native_context = | 5739 Node* expected_native_context = |
5733 LoadWeakCellValue(LoadObjectField(handler, offset), miss); | 5740 LoadWeakCellValue(LoadObjectField(handler, offset), miss); |
5734 CSA_ASSERT(IsNativeContext(expected_native_context)); | 5741 CSA_ASSERT(this, IsNativeContext(expected_native_context)); |
5735 | 5742 |
5736 Node* native_context = LoadNativeContext(p->context); | 5743 Node* native_context = LoadNativeContext(p->context); |
5737 GotoIf(WordEqual(expected_native_context, native_context), &can_access); | 5744 GotoIf(WordEqual(expected_native_context, native_context), &can_access); |
5738 // If the receiver is not a JSGlobalProxy then we miss. | 5745 // If the receiver is not a JSGlobalProxy then we miss. |
5739 GotoUnless(IsJSGlobalProxy(p->receiver), miss); | 5746 GotoUnless(IsJSGlobalProxy(p->receiver), miss); |
5740 // For JSGlobalProxy receiver try to compare security tokens of current | 5747 // For JSGlobalProxy receiver try to compare security tokens of current |
5741 // and expected native contexts. | 5748 // and expected native contexts. |
5742 Node* expected_token = LoadContextElement(expected_native_context, | 5749 Node* expected_token = LoadContextElement(expected_native_context, |
5743 Context::SECURITY_TOKEN_INDEX); | 5750 Context::SECURITY_TOKEN_INDEX); |
5744 Node* current_token = | 5751 Node* current_token = |
(...skipping 17 matching lines...) Expand all Loading... |
5762 Label load_existent(this); | 5769 Label load_existent(this); |
5763 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); | 5770 GotoIf(WordNotEqual(maybe_holder_cell, NullConstant()), &load_existent); |
5764 // This is a handler for a load of a non-existent value. | 5771 // This is a handler for a load of a non-existent value. |
5765 Return(UndefinedConstant()); | 5772 Return(UndefinedConstant()); |
5766 | 5773 |
5767 Bind(&load_existent); | 5774 Bind(&load_existent); |
5768 Node* holder = LoadWeakCellValue(maybe_holder_cell); | 5775 Node* holder = LoadWeakCellValue(maybe_holder_cell); |
5769 // The |holder| is guaranteed to be alive at this point since we passed | 5776 // The |holder| is guaranteed to be alive at this point since we passed |
5770 // the receiver map check, the validity cell check and the prototype chain | 5777 // the receiver map check, the validity cell check and the prototype chain |
5771 // check. | 5778 // check. |
5772 CSA_ASSERT(WordNotEqual(holder, IntPtrConstant(0))); | 5779 CSA_ASSERT(this, WordNotEqual(holder, IntPtrConstant(0))); |
5773 | 5780 |
5774 var_holder->Bind(holder); | 5781 var_holder->Bind(holder); |
5775 var_smi_handler->Bind(smi_handler); | 5782 var_smi_handler->Bind(smi_handler); |
5776 Goto(if_smi_handler); | 5783 Goto(if_smi_handler); |
5777 } | 5784 } |
5778 } | 5785 } |
5779 | 5786 |
5780 void CodeStubAssembler::CheckPrototype(Node* prototype_cell, Node* name, | 5787 void CodeStubAssembler::CheckPrototype(Node* prototype_cell, Node* name, |
5781 Label* miss) { | 5788 Label* miss) { |
5782 Node* maybe_prototype = LoadWeakCellValue(prototype_cell, miss); | 5789 Node* maybe_prototype = LoadWeakCellValue(prototype_cell, miss); |
5783 | 5790 |
5784 Label done(this); | 5791 Label done(this); |
5785 Label if_property_cell(this), if_dictionary_object(this); | 5792 Label if_property_cell(this), if_dictionary_object(this); |
5786 | 5793 |
5787 // |maybe_prototype| is either a PropertyCell or a slow-mode prototype. | 5794 // |maybe_prototype| is either a PropertyCell or a slow-mode prototype. |
5788 Branch(WordEqual(LoadMap(maybe_prototype), | 5795 Branch(WordEqual(LoadMap(maybe_prototype), |
5789 LoadRoot(Heap::kGlobalPropertyCellMapRootIndex)), | 5796 LoadRoot(Heap::kGlobalPropertyCellMapRootIndex)), |
5790 &if_property_cell, &if_dictionary_object); | 5797 &if_property_cell, &if_dictionary_object); |
5791 | 5798 |
5792 Bind(&if_dictionary_object); | 5799 Bind(&if_dictionary_object); |
5793 { | 5800 { |
5794 CSA_ASSERT(IsDictionaryMap(LoadMap(maybe_prototype))); | 5801 CSA_ASSERT(this, IsDictionaryMap(LoadMap(maybe_prototype))); |
5795 NameDictionaryNegativeLookup(maybe_prototype, name, miss); | 5802 NameDictionaryNegativeLookup(maybe_prototype, name, miss); |
5796 Goto(&done); | 5803 Goto(&done); |
5797 } | 5804 } |
5798 | 5805 |
5799 Bind(&if_property_cell); | 5806 Bind(&if_property_cell); |
5800 { | 5807 { |
5801 // Ensure the property cell still contains the hole. | 5808 // Ensure the property cell still contains the hole. |
5802 Node* value = LoadObjectField(maybe_prototype, PropertyCell::kValueOffset); | 5809 Node* value = LoadObjectField(maybe_prototype, PropertyCell::kValueOffset); |
5803 GotoIf(WordNotEqual(value, LoadRoot(Heap::kTheHoleValueRootIndex)), miss); | 5810 GotoIf(WordNotEqual(value, LoadRoot(Heap::kTheHoleValueRootIndex)), miss); |
5804 Goto(&done); | 5811 Goto(&done); |
5805 } | 5812 } |
5806 | 5813 |
5807 Bind(&done); | 5814 Bind(&done); |
5808 } | 5815 } |
5809 | 5816 |
5810 void CodeStubAssembler::NameDictionaryNegativeLookup(Node* object, Node* name, | 5817 void CodeStubAssembler::NameDictionaryNegativeLookup(Node* object, Node* name, |
5811 Label* miss) { | 5818 Label* miss) { |
5812 CSA_ASSERT(IsDictionaryMap(LoadMap(object))); | 5819 CSA_ASSERT(this, IsDictionaryMap(LoadMap(object))); |
5813 Node* properties = LoadProperties(object); | 5820 Node* properties = LoadProperties(object); |
5814 // Ensure the property does not exist in a dictionary-mode object. | 5821 // Ensure the property does not exist in a dictionary-mode object. |
5815 Variable var_name_index(this, MachineType::PointerRepresentation()); | 5822 Variable var_name_index(this, MachineType::PointerRepresentation()); |
5816 Label done(this); | 5823 Label done(this); |
5817 NameDictionaryLookup<NameDictionary>(properties, name, miss, &var_name_index, | 5824 NameDictionaryLookup<NameDictionary>(properties, name, miss, &var_name_index, |
5818 &done); | 5825 &done); |
5819 Bind(&done); | 5826 Bind(&done); |
5820 } | 5827 } |
5821 | 5828 |
5822 void CodeStubAssembler::LoadIC(const LoadICParameters* p) { | 5829 void CodeStubAssembler::LoadIC(const LoadICParameters* p) { |
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6119 Label if_smi_field(this), if_double_field(this), if_heap_object_field(this), | 6126 Label if_smi_field(this), if_double_field(this), if_heap_object_field(this), |
6120 if_tagged_field(this); | 6127 if_tagged_field(this); |
6121 | 6128 |
6122 GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kTagged)), | 6129 GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kTagged)), |
6123 &if_tagged_field); | 6130 &if_tagged_field); |
6124 GotoIf(WordEqual(field_representation, | 6131 GotoIf(WordEqual(field_representation, |
6125 IntPtrConstant(StoreHandler::kHeapObject)), | 6132 IntPtrConstant(StoreHandler::kHeapObject)), |
6126 &if_heap_object_field); | 6133 &if_heap_object_field); |
6127 GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kDouble)), | 6134 GotoIf(WordEqual(field_representation, IntPtrConstant(StoreHandler::kDouble)), |
6128 &if_double_field); | 6135 &if_double_field); |
6129 CSA_ASSERT( | 6136 CSA_ASSERT(this, WordEqual(field_representation, |
6130 WordEqual(field_representation, IntPtrConstant(StoreHandler::kSmi))); | 6137 IntPtrConstant(StoreHandler::kSmi))); |
6131 Goto(&if_smi_field); | 6138 Goto(&if_smi_field); |
6132 | 6139 |
6133 Bind(&if_tagged_field); | 6140 Bind(&if_tagged_field); |
6134 { | 6141 { |
6135 Comment("store tagged field"); | 6142 Comment("store tagged field"); |
6136 HandleStoreFieldAndReturn(handler_word, holder, Representation::Tagged(), | 6143 HandleStoreFieldAndReturn(handler_word, holder, Representation::Tagged(), |
6137 value, transition_to_field, miss); | 6144 value, transition_to_field, miss); |
6138 } | 6145 } |
6139 | 6146 |
6140 Bind(&if_double_field); | 6147 Bind(&if_double_field); |
(...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6325 Comment("KeyedStoreIC_miss"); | 6332 Comment("KeyedStoreIC_miss"); |
6326 TailCallRuntime(Runtime::kKeyedStoreIC_Miss, p->context, p->value, p->slot, | 6333 TailCallRuntime(Runtime::kKeyedStoreIC_Miss, p->context, p->value, p->slot, |
6327 p->vector, p->receiver, p->name); | 6334 p->vector, p->receiver, p->name); |
6328 } | 6335 } |
6329 } | 6336 } |
6330 | 6337 |
6331 void CodeStubAssembler::LoadGlobalIC(const LoadICParameters* p) { | 6338 void CodeStubAssembler::LoadGlobalIC(const LoadICParameters* p) { |
6332 Label try_handler(this), miss(this); | 6339 Label try_handler(this), miss(this); |
6333 Node* weak_cell = | 6340 Node* weak_cell = |
6334 LoadFixedArrayElement(p->vector, p->slot, 0, SMI_PARAMETERS); | 6341 LoadFixedArrayElement(p->vector, p->slot, 0, SMI_PARAMETERS); |
6335 CSA_ASSERT(HasInstanceType(weak_cell, WEAK_CELL_TYPE)); | 6342 CSA_ASSERT(this, HasInstanceType(weak_cell, WEAK_CELL_TYPE)); |
6336 | 6343 |
6337 // Load value or try handler case if the {weak_cell} is cleared. | 6344 // Load value or try handler case if the {weak_cell} is cleared. |
6338 Node* property_cell = LoadWeakCellValue(weak_cell, &try_handler); | 6345 Node* property_cell = LoadWeakCellValue(weak_cell, &try_handler); |
6339 CSA_ASSERT(HasInstanceType(property_cell, PROPERTY_CELL_TYPE)); | 6346 CSA_ASSERT(this, HasInstanceType(property_cell, PROPERTY_CELL_TYPE)); |
6340 | 6347 |
6341 Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); | 6348 Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); |
6342 GotoIf(WordEqual(value, TheHoleConstant()), &miss); | 6349 GotoIf(WordEqual(value, TheHoleConstant()), &miss); |
6343 Return(value); | 6350 Return(value); |
6344 | 6351 |
6345 Bind(&try_handler); | 6352 Bind(&try_handler); |
6346 { | 6353 { |
6347 Node* handler = | 6354 Node* handler = |
6348 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS); | 6355 LoadFixedArrayElement(p->vector, p->slot, kPointerSize, SMI_PARAMETERS); |
6349 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)), | 6356 GotoIf(WordEqual(handler, LoadRoot(Heap::kuninitialized_symbolRootIndex)), |
6350 &miss); | 6357 &miss); |
6351 | 6358 |
6352 // In this case {handler} must be a Code object. | 6359 // In this case {handler} must be a Code object. |
6353 CSA_ASSERT(HasInstanceType(handler, CODE_TYPE)); | 6360 CSA_ASSERT(this, HasInstanceType(handler, CODE_TYPE)); |
6354 LoadWithVectorDescriptor descriptor(isolate()); | 6361 LoadWithVectorDescriptor descriptor(isolate()); |
6355 Node* native_context = LoadNativeContext(p->context); | 6362 Node* native_context = LoadNativeContext(p->context); |
6356 Node* receiver = | 6363 Node* receiver = |
6357 LoadContextElement(native_context, Context::EXTENSION_INDEX); | 6364 LoadContextElement(native_context, Context::EXTENSION_INDEX); |
6358 Node* fake_name = IntPtrConstant(0); | 6365 Node* fake_name = IntPtrConstant(0); |
6359 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, | 6366 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, |
6360 p->vector); | 6367 p->vector); |
6361 } | 6368 } |
6362 Bind(&miss); | 6369 Bind(&miss); |
6363 { | 6370 { |
(...skipping 11 matching lines...) Expand all Loading... |
6375 | 6382 |
6376 Node* delta = IntPtrOrSmiConstant(JSObject::kFieldsAdded, mode); | 6383 Node* delta = IntPtrOrSmiConstant(JSObject::kFieldsAdded, mode); |
6377 Node* new_capacity = IntPtrAdd(length, delta); | 6384 Node* new_capacity = IntPtrAdd(length, delta); |
6378 | 6385 |
6379 // Grow properties array. | 6386 // Grow properties array. |
6380 ElementsKind kind = FAST_ELEMENTS; | 6387 ElementsKind kind = FAST_ELEMENTS; |
6381 DCHECK(kMaxNumberOfDescriptors + JSObject::kFieldsAdded < | 6388 DCHECK(kMaxNumberOfDescriptors + JSObject::kFieldsAdded < |
6382 FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind)); | 6389 FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind)); |
6383 // The size of a new properties backing store is guaranteed to be small | 6390 // The size of a new properties backing store is guaranteed to be small |
6384 // enough that the new backing store will be allocated in new space. | 6391 // enough that the new backing store will be allocated in new space. |
6385 CSA_ASSERT(UintPtrLessThan( | 6392 CSA_ASSERT(this, UintPtrLessThan(new_capacity, |
6386 new_capacity, | 6393 IntPtrConstant(kMaxNumberOfDescriptors + |
6387 IntPtrConstant(kMaxNumberOfDescriptors + JSObject::kFieldsAdded))); | 6394 JSObject::kFieldsAdded))); |
6388 | 6395 |
6389 Node* new_properties = AllocateFixedArray(kind, new_capacity, mode); | 6396 Node* new_properties = AllocateFixedArray(kind, new_capacity, mode); |
6390 | 6397 |
6391 FillFixedArrayWithValue(kind, new_properties, length, new_capacity, | 6398 FillFixedArrayWithValue(kind, new_properties, length, new_capacity, |
6392 Heap::kUndefinedValueRootIndex, mode); | 6399 Heap::kUndefinedValueRootIndex, mode); |
6393 | 6400 |
6394 // |new_properties| is guaranteed to be in new space, so we can skip | 6401 // |new_properties| is guaranteed to be in new space, so we can skip |
6395 // the write barrier. | 6402 // the write barrier. |
6396 CopyFixedArrayElements(kind, properties, new_properties, length, | 6403 CopyFixedArrayElements(kind, properties, new_properties, length, |
6397 SKIP_WRITE_BARRIER, mode); | 6404 SKIP_WRITE_BARRIER, mode); |
(...skipping 126 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6524 Node* adjusted_length = IntPtrSub(elements_length, intptr_two); | 6531 Node* adjusted_length = IntPtrSub(elements_length, intptr_two); |
6525 | 6532 |
6526 GotoIf(UintPtrGreaterThanOrEqual(key, adjusted_length), &if_unmapped); | 6533 GotoIf(UintPtrGreaterThanOrEqual(key, adjusted_length), &if_unmapped); |
6527 | 6534 |
6528 Node* mapped_index = LoadFixedArrayElement( | 6535 Node* mapped_index = LoadFixedArrayElement( |
6529 elements, IntPtrAdd(key, intptr_two), 0, INTPTR_PARAMETERS); | 6536 elements, IntPtrAdd(key, intptr_two), 0, INTPTR_PARAMETERS); |
6530 Branch(WordEqual(mapped_index, TheHoleConstant()), &if_unmapped, &if_mapped); | 6537 Branch(WordEqual(mapped_index, TheHoleConstant()), &if_unmapped, &if_mapped); |
6531 | 6538 |
6532 Bind(&if_mapped); | 6539 Bind(&if_mapped); |
6533 { | 6540 { |
6534 CSA_ASSERT(TaggedIsSmi(mapped_index)); | 6541 CSA_ASSERT(this, TaggedIsSmi(mapped_index)); |
6535 mapped_index = SmiUntag(mapped_index); | 6542 mapped_index = SmiUntag(mapped_index); |
6536 Node* the_context = LoadFixedArrayElement(elements, IntPtrConstant(0), 0, | 6543 Node* the_context = LoadFixedArrayElement(elements, IntPtrConstant(0), 0, |
6537 INTPTR_PARAMETERS); | 6544 INTPTR_PARAMETERS); |
6538 // Assert that we can use LoadFixedArrayElement/StoreFixedArrayElement | 6545 // Assert that we can use LoadFixedArrayElement/StoreFixedArrayElement |
6539 // methods for accessing Context. | 6546 // methods for accessing Context. |
6540 STATIC_ASSERT(Context::kHeaderSize == FixedArray::kHeaderSize); | 6547 STATIC_ASSERT(Context::kHeaderSize == FixedArray::kHeaderSize); |
6541 DCHECK_EQ(Context::SlotOffset(0) + kHeapObjectTag, | 6548 DCHECK_EQ(Context::SlotOffset(0) + kHeapObjectTag, |
6542 FixedArray::OffsetOfElementAt(0)); | 6549 FixedArray::OffsetOfElementAt(0)); |
6543 if (is_load) { | 6550 if (is_load) { |
6544 Node* result = LoadFixedArrayElement(the_context, mapped_index, 0, | 6551 Node* result = LoadFixedArrayElement(the_context, mapped_index, 0, |
6545 INTPTR_PARAMETERS); | 6552 INTPTR_PARAMETERS); |
6546 CSA_ASSERT(WordNotEqual(result, TheHoleConstant())); | 6553 CSA_ASSERT(this, WordNotEqual(result, TheHoleConstant())); |
6547 var_result.Bind(result); | 6554 var_result.Bind(result); |
6548 } else { | 6555 } else { |
6549 StoreFixedArrayElement(the_context, mapped_index, value, | 6556 StoreFixedArrayElement(the_context, mapped_index, value, |
6550 UPDATE_WRITE_BARRIER, INTPTR_PARAMETERS); | 6557 UPDATE_WRITE_BARRIER, INTPTR_PARAMETERS); |
6551 } | 6558 } |
6552 Goto(&end); | 6559 Goto(&end); |
6553 } | 6560 } |
6554 | 6561 |
6555 Bind(&if_unmapped); | 6562 Bind(&if_unmapped); |
6556 { | 6563 { |
(...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6930 } | 6937 } |
6931 Bind(&no_memento_found); | 6938 Bind(&no_memento_found); |
6932 Comment("] TrapAllocationMemento"); | 6939 Comment("] TrapAllocationMemento"); |
6933 } | 6940 } |
6934 | 6941 |
6935 Node* CodeStubAssembler::PageFromAddress(Node* address) { | 6942 Node* CodeStubAssembler::PageFromAddress(Node* address) { |
6936 return WordAnd(address, IntPtrConstant(~Page::kPageAlignmentMask)); | 6943 return WordAnd(address, IntPtrConstant(~Page::kPageAlignmentMask)); |
6937 } | 6944 } |
6938 | 6945 |
6939 Node* CodeStubAssembler::EnumLength(Node* map) { | 6946 Node* CodeStubAssembler::EnumLength(Node* map) { |
6940 CSA_ASSERT(IsMap(map)); | 6947 CSA_ASSERT(this, IsMap(map)); |
6941 Node* bitfield_3 = LoadMapBitField3(map); | 6948 Node* bitfield_3 = LoadMapBitField3(map); |
6942 Node* enum_length = DecodeWordFromWord32<Map::EnumLengthBits>(bitfield_3); | 6949 Node* enum_length = DecodeWordFromWord32<Map::EnumLengthBits>(bitfield_3); |
6943 return SmiTag(enum_length); | 6950 return SmiTag(enum_length); |
6944 } | 6951 } |
6945 | 6952 |
6946 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache, | 6953 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache, |
6947 Label* use_runtime) { | 6954 Label* use_runtime) { |
6948 Variable current_js_object(this, MachineRepresentation::kTagged); | 6955 Variable current_js_object(this, MachineRepresentation::kTagged); |
6949 current_js_object.Bind(receiver); | 6956 current_js_object.Bind(receiver); |
6950 | 6957 |
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7195 BranchIfSmiLessThan(rhs, lhs, if_true, if_false); | 7202 BranchIfSmiLessThan(rhs, lhs, if_true, if_false); |
7196 break; | 7203 break; |
7197 case kGreaterThanOrEqual: | 7204 case kGreaterThanOrEqual: |
7198 BranchIfSmiLessThanOrEqual(rhs, lhs, if_true, if_false); | 7205 BranchIfSmiLessThanOrEqual(rhs, lhs, if_true, if_false); |
7199 break; | 7206 break; |
7200 } | 7207 } |
7201 } | 7208 } |
7202 | 7209 |
7203 Bind(&if_rhsisnotsmi); | 7210 Bind(&if_rhsisnotsmi); |
7204 { | 7211 { |
7205 CSA_ASSERT(WordEqual(LoadMap(rhs), HeapNumberMapConstant())); | 7212 CSA_ASSERT(this, WordEqual(LoadMap(rhs), HeapNumberMapConstant())); |
7206 // Convert the {lhs} and {rhs} to floating point values, and | 7213 // Convert the {lhs} and {rhs} to floating point values, and |
7207 // perform a floating point comparison. | 7214 // perform a floating point comparison. |
7208 var_fcmp_lhs.Bind(SmiToFloat64(lhs)); | 7215 var_fcmp_lhs.Bind(SmiToFloat64(lhs)); |
7209 var_fcmp_rhs.Bind(LoadHeapNumberValue(rhs)); | 7216 var_fcmp_rhs.Bind(LoadHeapNumberValue(rhs)); |
7210 Goto(&do_fcmp); | 7217 Goto(&do_fcmp); |
7211 } | 7218 } |
7212 } | 7219 } |
7213 | 7220 |
7214 Bind(&if_lhsisnotsmi); | 7221 Bind(&if_lhsisnotsmi); |
7215 { | 7222 { |
7216 CSA_ASSERT(WordEqual(LoadMap(lhs), HeapNumberMapConstant())); | 7223 CSA_ASSERT(this, WordEqual(LoadMap(lhs), HeapNumberMapConstant())); |
7217 | 7224 |
7218 // Check if {rhs} is a Smi or a HeapObject. | 7225 // Check if {rhs} is a Smi or a HeapObject. |
7219 Label if_rhsissmi(this), if_rhsisnotsmi(this); | 7226 Label if_rhsissmi(this), if_rhsisnotsmi(this); |
7220 Branch(TaggedIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); | 7227 Branch(TaggedIsSmi(rhs), &if_rhsissmi, &if_rhsisnotsmi); |
7221 | 7228 |
7222 Bind(&if_rhsissmi); | 7229 Bind(&if_rhsissmi); |
7223 { | 7230 { |
7224 // Convert the {lhs} and {rhs} to floating point values, and | 7231 // Convert the {lhs} and {rhs} to floating point values, and |
7225 // perform a floating point comparison. | 7232 // perform a floating point comparison. |
7226 var_fcmp_lhs.Bind(LoadHeapNumberValue(lhs)); | 7233 var_fcmp_lhs.Bind(LoadHeapNumberValue(lhs)); |
7227 var_fcmp_rhs.Bind(SmiToFloat64(rhs)); | 7234 var_fcmp_rhs.Bind(SmiToFloat64(rhs)); |
7228 Goto(&do_fcmp); | 7235 Goto(&do_fcmp); |
7229 } | 7236 } |
7230 | 7237 |
7231 Bind(&if_rhsisnotsmi); | 7238 Bind(&if_rhsisnotsmi); |
7232 { | 7239 { |
7233 CSA_ASSERT(WordEqual(LoadMap(rhs), HeapNumberMapConstant())); | 7240 CSA_ASSERT(this, WordEqual(LoadMap(rhs), HeapNumberMapConstant())); |
7234 | 7241 |
7235 // Convert the {lhs} and {rhs} to floating point values, and | 7242 // Convert the {lhs} and {rhs} to floating point values, and |
7236 // perform a floating point comparison. | 7243 // perform a floating point comparison. |
7237 var_fcmp_lhs.Bind(LoadHeapNumberValue(lhs)); | 7244 var_fcmp_lhs.Bind(LoadHeapNumberValue(lhs)); |
7238 var_fcmp_rhs.Bind(LoadHeapNumberValue(rhs)); | 7245 var_fcmp_rhs.Bind(LoadHeapNumberValue(rhs)); |
7239 Goto(&do_fcmp); | 7246 Goto(&do_fcmp); |
7240 } | 7247 } |
7241 } | 7248 } |
7242 | 7249 |
7243 Bind(&do_fcmp); | 7250 Bind(&do_fcmp); |
(...skipping 1278 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8522 | 8529 |
8523 GotoIf(IsStringInstanceType(instance_type), &return_string); | 8530 GotoIf(IsStringInstanceType(instance_type), &return_string); |
8524 | 8531 |
8525 #define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \ | 8532 #define SIMD128_BRANCH(TYPE, Type, type, lane_count, lane_type) \ |
8526 Label return_##type(this); \ | 8533 Label return_##type(this); \ |
8527 Node* type##_map = HeapConstant(factory()->type##_map()); \ | 8534 Node* type##_map = HeapConstant(factory()->type##_map()); \ |
8528 GotoIf(WordEqual(map, type##_map), &return_##type); | 8535 GotoIf(WordEqual(map, type##_map), &return_##type); |
8529 SIMD128_TYPES(SIMD128_BRANCH) | 8536 SIMD128_TYPES(SIMD128_BRANCH) |
8530 #undef SIMD128_BRANCH | 8537 #undef SIMD128_BRANCH |
8531 | 8538 |
8532 CSA_ASSERT(Word32Equal(instance_type, Int32Constant(SYMBOL_TYPE))); | 8539 CSA_ASSERT(this, Word32Equal(instance_type, Int32Constant(SYMBOL_TYPE))); |
8533 result_var.Bind(HeapConstant(isolate()->factory()->symbol_string())); | 8540 result_var.Bind(HeapConstant(isolate()->factory()->symbol_string())); |
8534 Goto(&return_result); | 8541 Goto(&return_result); |
8535 | 8542 |
8536 Bind(&return_number); | 8543 Bind(&return_number); |
8537 { | 8544 { |
8538 result_var.Bind(HeapConstant(isolate()->factory()->number_string())); | 8545 result_var.Bind(HeapConstant(isolate()->factory()->number_string())); |
8539 Goto(&return_result); | 8546 Goto(&return_result); |
8540 } | 8547 } |
8541 | 8548 |
8542 Bind(&if_oddball); | 8549 Bind(&if_oddball); |
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8640 Bind(&if_overflow); | 8647 Bind(&if_overflow); |
8641 { | 8648 { |
8642 var_finc_value.Bind(SmiToFloat64(value)); | 8649 var_finc_value.Bind(SmiToFloat64(value)); |
8643 Goto(&do_finc); | 8650 Goto(&do_finc); |
8644 } | 8651 } |
8645 } | 8652 } |
8646 | 8653 |
8647 Bind(&if_isnotsmi); | 8654 Bind(&if_isnotsmi); |
8648 { | 8655 { |
8649 // Check if the value is a HeapNumber. | 8656 // Check if the value is a HeapNumber. |
8650 CSA_ASSERT(IsHeapNumberMap(LoadMap(value))); | 8657 CSA_ASSERT(this, IsHeapNumberMap(LoadMap(value))); |
8651 | 8658 |
8652 // Load the HeapNumber value. | 8659 // Load the HeapNumber value. |
8653 var_finc_value.Bind(LoadHeapNumberValue(value)); | 8660 var_finc_value.Bind(LoadHeapNumberValue(value)); |
8654 Goto(&do_finc); | 8661 Goto(&do_finc); |
8655 } | 8662 } |
8656 | 8663 |
8657 Bind(&do_finc); | 8664 Bind(&do_finc); |
8658 { | 8665 { |
8659 Node* finc_value = var_finc_value.value(); | 8666 Node* finc_value = var_finc_value.value(); |
8660 Node* one = Float64Constant(1.0); | 8667 Node* one = Float64Constant(1.0); |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8695 | 8702 |
8696 // Slow Array iterator map index: (kBaseIndex + kSlowIteratorOffset) | 8703 // Slow Array iterator map index: (kBaseIndex + kSlowIteratorOffset) |
8697 const int kSlowIteratorOffset = | 8704 const int kSlowIteratorOffset = |
8698 Context::GENERIC_ARRAY_VALUE_ITERATOR_MAP_INDEX - | 8705 Context::GENERIC_ARRAY_VALUE_ITERATOR_MAP_INDEX - |
8699 Context::UINT8_ARRAY_VALUE_ITERATOR_MAP_INDEX; | 8706 Context::UINT8_ARRAY_VALUE_ITERATOR_MAP_INDEX; |
8700 STATIC_ASSERT(kSlowIteratorOffset == | 8707 STATIC_ASSERT(kSlowIteratorOffset == |
8701 (Context::GENERIC_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX - | 8708 (Context::GENERIC_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX - |
8702 Context::UINT8_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX)); | 8709 Context::UINT8_ARRAY_KEY_VALUE_ITERATOR_MAP_INDEX)); |
8703 | 8710 |
8704 // Assert: Type(array) is Object | 8711 // Assert: Type(array) is Object |
8705 CSA_ASSERT(IsJSReceiverInstanceType(array_type)); | 8712 CSA_ASSERT(this, IsJSReceiverInstanceType(array_type)); |
8706 | 8713 |
8707 Variable var_result(this, MachineRepresentation::kTagged); | 8714 Variable var_result(this, MachineRepresentation::kTagged); |
8708 Variable var_map_index(this, MachineType::PointerRepresentation()); | 8715 Variable var_map_index(this, MachineType::PointerRepresentation()); |
8709 Variable var_array_map(this, MachineRepresentation::kTagged); | 8716 Variable var_array_map(this, MachineRepresentation::kTagged); |
8710 | 8717 |
8711 Label return_result(this); | 8718 Label return_result(this); |
8712 Label allocate_iterator(this); | 8719 Label allocate_iterator(this); |
8713 | 8720 |
8714 if (mode == IterationKind::kKeys) { | 8721 if (mode == IterationKind::kKeys) { |
8715 // There are only two key iterator maps, branch depending on whether or not | 8722 // There are only two key iterator maps, branch depending on whether or not |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8754 Bind(&if_isgeneric); | 8761 Bind(&if_isgeneric); |
8755 { | 8762 { |
8756 Label if_isfast(this), if_isslow(this); | 8763 Label if_isfast(this), if_isslow(this); |
8757 BranchIfFastJSArray(array, context, &if_isfast, &if_isslow); | 8764 BranchIfFastJSArray(array, context, &if_isfast, &if_isslow); |
8758 | 8765 |
8759 Bind(&if_isfast); | 8766 Bind(&if_isfast); |
8760 { | 8767 { |
8761 Node* map_index = | 8768 Node* map_index = |
8762 IntPtrAdd(IntPtrConstant(kBaseMapIndex + kFastIteratorOffset), | 8769 IntPtrAdd(IntPtrConstant(kBaseMapIndex + kFastIteratorOffset), |
8763 LoadMapElementsKind(array_map)); | 8770 LoadMapElementsKind(array_map)); |
8764 CSA_ASSERT(IntPtrGreaterThanOrEqual( | 8771 CSA_ASSERT(this, IntPtrGreaterThanOrEqual( |
8765 map_index, IntPtrConstant(kBaseMapIndex + kFastIteratorOffset))); | 8772 map_index, IntPtrConstant(kBaseMapIndex + |
8766 CSA_ASSERT(IntPtrLessThan( | 8773 kFastIteratorOffset))); |
8767 map_index, IntPtrConstant(kBaseMapIndex + kSlowIteratorOffset))); | 8774 CSA_ASSERT(this, IntPtrLessThan(map_index, |
| 8775 IntPtrConstant(kBaseMapIndex + |
| 8776 kSlowIteratorOffset))); |
8768 | 8777 |
8769 var_map_index.Bind(map_index); | 8778 var_map_index.Bind(map_index); |
8770 var_array_map.Bind(array_map); | 8779 var_array_map.Bind(array_map); |
8771 Goto(&allocate_iterator); | 8780 Goto(&allocate_iterator); |
8772 } | 8781 } |
8773 | 8782 |
8774 Bind(&if_isslow); | 8783 Bind(&if_isslow); |
8775 { | 8784 { |
8776 Node* map_index = IntPtrAdd(IntPtrConstant(kBaseMapIndex), | 8785 Node* map_index = IntPtrAdd(IntPtrConstant(kBaseMapIndex), |
8777 IntPtrConstant(kSlowIteratorOffset)); | 8786 IntPtrConstant(kSlowIteratorOffset)); |
8778 var_map_index.Bind(map_index); | 8787 var_map_index.Bind(map_index); |
8779 var_array_map.Bind(UndefinedConstant()); | 8788 var_array_map.Bind(UndefinedConstant()); |
8780 Goto(&allocate_iterator); | 8789 Goto(&allocate_iterator); |
8781 } | 8790 } |
8782 } | 8791 } |
8783 | 8792 |
8784 Bind(&if_istypedarray); | 8793 Bind(&if_istypedarray); |
8785 { | 8794 { |
8786 Node* map_index = | 8795 Node* map_index = |
8787 IntPtrAdd(IntPtrConstant(kBaseMapIndex - UINT8_ELEMENTS), | 8796 IntPtrAdd(IntPtrConstant(kBaseMapIndex - UINT8_ELEMENTS), |
8788 LoadMapElementsKind(array_map)); | 8797 LoadMapElementsKind(array_map)); |
8789 CSA_ASSERT(IntPtrLessThan( | |
8790 map_index, IntPtrConstant(kBaseMapIndex + kFastIteratorOffset))); | |
8791 CSA_ASSERT( | 8798 CSA_ASSERT( |
8792 IntPtrGreaterThanOrEqual(map_index, IntPtrConstant(kBaseMapIndex))); | 8799 this, IntPtrLessThan(map_index, IntPtrConstant(kBaseMapIndex + |
| 8800 kFastIteratorOffset))); |
| 8801 CSA_ASSERT(this, IntPtrGreaterThanOrEqual(map_index, |
| 8802 IntPtrConstant(kBaseMapIndex))); |
8793 var_map_index.Bind(map_index); | 8803 var_map_index.Bind(map_index); |
8794 var_array_map.Bind(UndefinedConstant()); | 8804 var_array_map.Bind(UndefinedConstant()); |
8795 Goto(&allocate_iterator); | 8805 Goto(&allocate_iterator); |
8796 } | 8806 } |
8797 } | 8807 } |
8798 | 8808 |
8799 Bind(&allocate_iterator); | 8809 Bind(&allocate_iterator); |
8800 { | 8810 { |
8801 Node* map = | 8811 Node* map = |
8802 LoadFixedArrayElement(LoadNativeContext(context), var_map_index.value(), | 8812 LoadFixedArrayElement(LoadNativeContext(context), var_map_index.value(), |
(...skipping 17 matching lines...) Expand all Loading... |
8820 StoreObjectFieldNoWriteBarrier(iterator, | 8830 StoreObjectFieldNoWriteBarrier(iterator, |
8821 JSArrayIterator::kIteratedObjectOffset, array); | 8831 JSArrayIterator::kIteratedObjectOffset, array); |
8822 StoreObjectFieldNoWriteBarrier(iterator, JSArrayIterator::kNextIndexOffset, | 8832 StoreObjectFieldNoWriteBarrier(iterator, JSArrayIterator::kNextIndexOffset, |
8823 SmiConstant(Smi::FromInt(0))); | 8833 SmiConstant(Smi::FromInt(0))); |
8824 StoreObjectFieldNoWriteBarrier( | 8834 StoreObjectFieldNoWriteBarrier( |
8825 iterator, JSArrayIterator::kIteratedObjectMapOffset, array_map); | 8835 iterator, JSArrayIterator::kIteratedObjectMapOffset, array_map); |
8826 return iterator; | 8836 return iterator; |
8827 } | 8837 } |
8828 | 8838 |
8829 compiler::Node* CodeStubAssembler::IsDetachedBuffer(compiler::Node* buffer) { | 8839 compiler::Node* CodeStubAssembler::IsDetachedBuffer(compiler::Node* buffer) { |
8830 CSA_ASSERT(HasInstanceType(buffer, JS_ARRAY_BUFFER_TYPE)); | 8840 CSA_ASSERT(this, HasInstanceType(buffer, JS_ARRAY_BUFFER_TYPE)); |
8831 | 8841 |
8832 Node* buffer_bit_field = LoadObjectField( | 8842 Node* buffer_bit_field = LoadObjectField( |
8833 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); | 8843 buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); |
8834 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); | 8844 Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); |
8835 | 8845 |
8836 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), | 8846 return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), |
8837 Int32Constant(0)); | 8847 Int32Constant(0)); |
8838 } | 8848 } |
8839 | 8849 |
8840 CodeStubArguments::CodeStubArguments(CodeStubAssembler* assembler, | 8850 CodeStubArguments::CodeStubArguments(CodeStubAssembler* assembler, |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8903 } | 8913 } |
8904 | 8914 |
8905 void CodeStubArguments::PopAndReturn(compiler::Node* value) { | 8915 void CodeStubArguments::PopAndReturn(compiler::Node* value) { |
8906 assembler_->PopAndReturn( | 8916 assembler_->PopAndReturn( |
8907 assembler_->IntPtrAddFoldConstants(argc_, assembler_->IntPtrConstant(1)), | 8917 assembler_->IntPtrAddFoldConstants(argc_, assembler_->IntPtrConstant(1)), |
8908 value); | 8918 value); |
8909 } | 8919 } |
8910 | 8920 |
8911 } // namespace internal | 8921 } // namespace internal |
8912 } // namespace v8 | 8922 } // namespace v8 |
OLD | NEW |