| 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 | 
|  | 29 void CodeStubAssembler::SlowAssert(Node* condition, const char* message, | 
|  | 30                                const char* file, int line) { | 
|  | 31   if (FLAG_enable_slow_asserts) { | 
|  | 32     Assert(condition, message, file, line); | 
|  | 33   } | 
|  | 34 } | 
|  | 35 | 
| 28 void CodeStubAssembler::Assert(Node* condition, const char* message, | 36 void CodeStubAssembler::Assert(Node* condition, const char* message, | 
| 29                                const char* file, int line) { | 37                                const char* file, int line) { | 
| 30 #if defined(DEBUG) | 38 #if defined(DEBUG) | 
| 31   Label ok(this); | 39   Label ok(this); | 
| 32   Label not_ok(this, Label::kDeferred); | 40   Label not_ok(this, Label::kDeferred); | 
| 33   if (message != nullptr && FLAG_code_comments) { | 41   if (message != nullptr && FLAG_code_comments) { | 
| 34     Comment("[ Assert: %s", message); | 42     Comment("[ Assert: %s", message); | 
| 35   } else { | 43   } else { | 
| 36     Comment("[ Assert "); | 44     Comment("[ Assert "); | 
| 37   } | 45   } | 
| (...skipping 968 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1006 } | 1014 } | 
| 1007 | 1015 | 
| 1008 Node* CodeStubAssembler::LoadProperties(Node* object) { | 1016 Node* CodeStubAssembler::LoadProperties(Node* object) { | 
| 1009   return LoadObjectField(object, JSObject::kPropertiesOffset); | 1017   return LoadObjectField(object, JSObject::kPropertiesOffset); | 
| 1010 } | 1018 } | 
| 1011 | 1019 | 
| 1012 Node* CodeStubAssembler::LoadElements(Node* object) { | 1020 Node* CodeStubAssembler::LoadElements(Node* object) { | 
| 1013   return LoadObjectField(object, JSObject::kElementsOffset); | 1021   return LoadObjectField(object, JSObject::kElementsOffset); | 
| 1014 } | 1022 } | 
| 1015 | 1023 | 
| 1016 Node* CodeStubAssembler::LoadJSArrayLength(compiler::Node* array) { | 1024 Node* CodeStubAssembler::LoadJSArrayLength(Node* array) { | 
|  | 1025   CSA_ASSERT(IsJSArray(array)); | 
| 1017   return LoadObjectField(array, JSArray::kLengthOffset); | 1026   return LoadObjectField(array, JSArray::kLengthOffset); | 
| 1018 } | 1027 } | 
| 1019 | 1028 | 
| 1020 Node* CodeStubAssembler::LoadFixedArrayBaseLength(compiler::Node* array) { | 1029 Node* CodeStubAssembler::LoadFixedArrayBaseLength(Node* array) { | 
| 1021   return LoadObjectField(array, FixedArrayBase::kLengthOffset); | 1030   return LoadObjectField(array, FixedArrayBase::kLengthOffset); | 
| 1022 } | 1031 } | 
| 1023 | 1032 | 
| 1024 Node* CodeStubAssembler::LoadAndUntagFixedArrayBaseLength(Node* array) { | 1033 Node* CodeStubAssembler::LoadAndUntagFixedArrayBaseLength(Node* array) { | 
| 1025   return LoadAndUntagObjectField(array, FixedArrayBase::kLengthOffset); | 1034   return LoadAndUntagObjectField(array, FixedArrayBase::kLengthOffset); | 
| 1026 } | 1035 } | 
| 1027 | 1036 | 
| 1028 Node* CodeStubAssembler::LoadMapBitField(Node* map) { | 1037 Node* CodeStubAssembler::LoadMapBitField(Node* map) { | 
|  | 1038   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1029   return LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8()); | 1039   return LoadObjectField(map, Map::kBitFieldOffset, MachineType::Uint8()); | 
| 1030 } | 1040 } | 
| 1031 | 1041 | 
| 1032 Node* CodeStubAssembler::LoadMapBitField2(Node* map) { | 1042 Node* CodeStubAssembler::LoadMapBitField2(Node* map) { | 
|  | 1043   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1033   return LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8()); | 1044   return LoadObjectField(map, Map::kBitField2Offset, MachineType::Uint8()); | 
| 1034 } | 1045 } | 
| 1035 | 1046 | 
| 1036 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { | 1047 Node* CodeStubAssembler::LoadMapBitField3(Node* map) { | 
|  | 1048   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1037   return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); | 1049   return LoadObjectField(map, Map::kBitField3Offset, MachineType::Uint32()); | 
| 1038 } | 1050 } | 
| 1039 | 1051 | 
| 1040 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { | 1052 Node* CodeStubAssembler::LoadMapInstanceType(Node* map) { | 
| 1041   return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); | 1053   return LoadObjectField(map, Map::kInstanceTypeOffset, MachineType::Uint8()); | 
| 1042 } | 1054 } | 
| 1043 | 1055 | 
| 1044 Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { | 1056 Node* CodeStubAssembler::LoadMapElementsKind(Node* map) { | 
|  | 1057   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1045   Node* bit_field2 = LoadMapBitField2(map); | 1058   Node* bit_field2 = LoadMapBitField2(map); | 
| 1046   return DecodeWord32<Map::ElementsKindBits>(bit_field2); | 1059   return DecodeWord32<Map::ElementsKindBits>(bit_field2); | 
| 1047 } | 1060 } | 
| 1048 | 1061 | 
| 1049 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { | 1062 Node* CodeStubAssembler::LoadMapDescriptors(Node* map) { | 
|  | 1063   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1050   return LoadObjectField(map, Map::kDescriptorsOffset); | 1064   return LoadObjectField(map, Map::kDescriptorsOffset); | 
| 1051 } | 1065 } | 
| 1052 | 1066 | 
| 1053 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { | 1067 Node* CodeStubAssembler::LoadMapPrototype(Node* map) { | 
|  | 1068   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1054   return LoadObjectField(map, Map::kPrototypeOffset); | 1069   return LoadObjectField(map, Map::kPrototypeOffset); | 
| 1055 } | 1070 } | 
| 1056 | 1071 | 
| 1057 Node* CodeStubAssembler::LoadMapPrototypeInfo(Node* map, | 1072 Node* CodeStubAssembler::LoadMapPrototypeInfo(Node* map, | 
| 1058                                               Label* if_no_proto_info) { | 1073                                               Label* if_no_proto_info) { | 
|  | 1074   CSA_ASSERT(IsMap(map)); | 
| 1059   Node* prototype_info = | 1075   Node* prototype_info = | 
| 1060       LoadObjectField(map, Map::kTransitionsOrPrototypeInfoOffset); | 1076       LoadObjectField(map, Map::kTransitionsOrPrototypeInfoOffset); | 
| 1061   GotoIf(TaggedIsSmi(prototype_info), if_no_proto_info); | 1077   GotoIf(TaggedIsSmi(prototype_info), if_no_proto_info); | 
| 1062   GotoUnless(WordEqual(LoadMap(prototype_info), | 1078   GotoUnless(WordEqual(LoadMap(prototype_info), | 
| 1063                        LoadRoot(Heap::kPrototypeInfoMapRootIndex)), | 1079                        LoadRoot(Heap::kPrototypeInfoMapRootIndex)), | 
| 1064              if_no_proto_info); | 1080              if_no_proto_info); | 
| 1065   return prototype_info; | 1081   return prototype_info; | 
| 1066 } | 1082 } | 
| 1067 | 1083 | 
| 1068 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { | 1084 Node* CodeStubAssembler::LoadMapInstanceSize(Node* map) { | 
|  | 1085   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1069   return ChangeUint32ToWord( | 1086   return ChangeUint32ToWord( | 
| 1070       LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8())); | 1087       LoadObjectField(map, Map::kInstanceSizeOffset, MachineType::Uint8())); | 
| 1071 } | 1088 } | 
| 1072 | 1089 | 
| 1073 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { | 1090 Node* CodeStubAssembler::LoadMapInobjectProperties(Node* map) { | 
|  | 1091   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1074   // See Map::GetInObjectProperties() for details. | 1092   // See Map::GetInObjectProperties() for details. | 
| 1075   STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 1093   STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 
| 1076   CSA_ASSERT(Int32GreaterThanOrEqual(LoadMapInstanceType(map), | 1094   CSA_ASSERT(Int32GreaterThanOrEqual(LoadMapInstanceType(map), | 
| 1077                                      Int32Constant(FIRST_JS_OBJECT_TYPE))); | 1095                                      Int32Constant(FIRST_JS_OBJECT_TYPE))); | 
| 1078   return ChangeUint32ToWord(LoadObjectField( | 1096   return ChangeUint32ToWord(LoadObjectField( | 
| 1079       map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 1097       map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 
| 1080       MachineType::Uint8())); | 1098       MachineType::Uint8())); | 
| 1081 } | 1099 } | 
| 1082 | 1100 | 
| 1083 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) { | 1101 Node* CodeStubAssembler::LoadMapConstructorFunctionIndex(Node* map) { | 
|  | 1102   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1084   // See Map::GetConstructorFunctionIndex() for details. | 1103   // See Map::GetConstructorFunctionIndex() for details. | 
| 1085   STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE); | 1104   STATIC_ASSERT(FIRST_PRIMITIVE_TYPE == FIRST_TYPE); | 
| 1086   CSA_ASSERT(Int32LessThanOrEqual(LoadMapInstanceType(map), | 1105   CSA_ASSERT(Int32LessThanOrEqual(LoadMapInstanceType(map), | 
| 1087                                   Int32Constant(LAST_PRIMITIVE_TYPE))); | 1106                                   Int32Constant(LAST_PRIMITIVE_TYPE))); | 
| 1088   return ChangeUint32ToWord(LoadObjectField( | 1107   return ChangeUint32ToWord(LoadObjectField( | 
| 1089       map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 1108       map, Map::kInObjectPropertiesOrConstructorFunctionIndexOffset, | 
| 1090       MachineType::Uint8())); | 1109       MachineType::Uint8())); | 
| 1091 } | 1110 } | 
| 1092 | 1111 | 
| 1093 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { | 1112 Node* CodeStubAssembler::LoadMapConstructor(Node* map) { | 
|  | 1113   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1094   Variable result(this, MachineRepresentation::kTagged); | 1114   Variable result(this, MachineRepresentation::kTagged); | 
| 1095   result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); | 1115   result.Bind(LoadObjectField(map, Map::kConstructorOrBackPointerOffset)); | 
| 1096 | 1116 | 
| 1097   Label done(this), loop(this, &result); | 1117   Label done(this), loop(this, &result); | 
| 1098   Goto(&loop); | 1118   Goto(&loop); | 
| 1099   Bind(&loop); | 1119   Bind(&loop); | 
| 1100   { | 1120   { | 
| 1101     GotoIf(TaggedIsSmi(result.value()), &done); | 1121     GotoIf(TaggedIsSmi(result.value()), &done); | 
| 1102     Node* is_map_type = | 1122     Node* is_map_type = | 
| 1103         Word32Equal(LoadInstanceType(result.value()), Int32Constant(MAP_TYPE)); | 1123         Word32Equal(LoadInstanceType(result.value()), Int32Constant(MAP_TYPE)); | 
| 1104     GotoUnless(is_map_type, &done); | 1124     GotoUnless(is_map_type, &done); | 
| 1105     result.Bind( | 1125     result.Bind( | 
| 1106         LoadObjectField(result.value(), Map::kConstructorOrBackPointerOffset)); | 1126         LoadObjectField(result.value(), Map::kConstructorOrBackPointerOffset)); | 
| 1107     Goto(&loop); | 1127     Goto(&loop); | 
| 1108   } | 1128   } | 
| 1109   Bind(&done); | 1129   Bind(&done); | 
| 1110   return result.value(); | 1130   return result.value(); | 
| 1111 } | 1131 } | 
| 1112 | 1132 | 
| 1113 Node* CodeStubAssembler::IsSpecialReceiverMap(Node* map) { |  | 
| 1114   Node* bit_field = LoadMapBitField(map); |  | 
| 1115   Node* mask = Int32Constant(1 << Map::kHasNamedInterceptor | |  | 
| 1116                              1 << Map::kIsAccessCheckNeeded); |  | 
| 1117   Assert(Word32Equal(Word32And(bit_field, mask), Int32Constant(0))); |  | 
| 1118   return IsSpecialReceiverInstanceType(LoadMapInstanceType(map)); |  | 
| 1119 } |  | 
| 1120 |  | 
| 1121 Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) { |  | 
| 1122   STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); |  | 
| 1123   return Int32LessThanOrEqual(instance_type, |  | 
| 1124                               Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)); |  | 
| 1125 } |  | 
| 1126 |  | 
| 1127 Node* CodeStubAssembler::IsDictionaryMap(Node* map) { | 1133 Node* CodeStubAssembler::IsDictionaryMap(Node* map) { | 
|  | 1134   CSA_SLOW_ASSERT(IsMap(map)); | 
| 1128   Node* bit_field3 = LoadMapBitField3(map); | 1135   Node* bit_field3 = LoadMapBitField3(map); | 
| 1129   return Word32NotEqual(IsSetWord32<Map::DictionaryMap>(bit_field3), | 1136   return Word32NotEqual(IsSetWord32<Map::DictionaryMap>(bit_field3), | 
| 1130                         Int32Constant(0)); | 1137                         Int32Constant(0)); | 
| 1131 } | 1138 } | 
| 1132 | 1139 | 
| 1133 Node* CodeStubAssembler::LoadNameHashField(Node* name) { | 1140 Node* CodeStubAssembler::LoadNameHashField(Node* name) { | 
|  | 1141   CSA_ASSERT(IsName(name)); | 
| 1134   return LoadObjectField(name, Name::kHashFieldOffset, MachineType::Uint32()); | 1142   return LoadObjectField(name, Name::kHashFieldOffset, MachineType::Uint32()); | 
| 1135 } | 1143 } | 
| 1136 | 1144 | 
| 1137 Node* CodeStubAssembler::LoadNameHash(Node* name, Label* if_hash_not_computed) { | 1145 Node* CodeStubAssembler::LoadNameHash(Node* name, Label* if_hash_not_computed) { | 
| 1138   Node* hash_field = LoadNameHashField(name); | 1146   Node* hash_field = LoadNameHashField(name); | 
| 1139   if (if_hash_not_computed != nullptr) { | 1147   if (if_hash_not_computed != nullptr) { | 
| 1140     GotoIf(Word32Equal( | 1148     GotoIf(Word32Equal( | 
| 1141                Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)), | 1149                Word32And(hash_field, Int32Constant(Name::kHashNotComputedMask)), | 
| 1142                Int32Constant(0)), | 1150                Int32Constant(0)), | 
| 1143            if_hash_not_computed); | 1151            if_hash_not_computed); | 
| 1144   } | 1152   } | 
| 1145   return Word32Shr(hash_field, Int32Constant(Name::kHashShift)); | 1153   return Word32Shr(hash_field, Int32Constant(Name::kHashShift)); | 
| 1146 } | 1154 } | 
| 1147 | 1155 | 
| 1148 Node* CodeStubAssembler::LoadStringLength(Node* object) { | 1156 Node* CodeStubAssembler::LoadStringLength(Node* object) { | 
|  | 1157   CSA_ASSERT(IsString(object)); | 
| 1149   return LoadObjectField(object, String::kLengthOffset); | 1158   return LoadObjectField(object, String::kLengthOffset); | 
| 1150 } | 1159 } | 
| 1151 | 1160 | 
| 1152 Node* CodeStubAssembler::LoadJSValueValue(Node* object) { | 1161 Node* CodeStubAssembler::LoadJSValueValue(Node* object) { | 
|  | 1162   CSA_ASSERT(IsJSValue(object)); | 
| 1153   return LoadObjectField(object, JSValue::kValueOffset); | 1163   return LoadObjectField(object, JSValue::kValueOffset); | 
| 1154 } | 1164 } | 
| 1155 | 1165 | 
|  | 1166 Node* CodeStubAssembler::LoadWeakCellValueUnchecked(Node* weak_cell) { | 
|  | 1167   // TODO(ishell): fix callers. | 
|  | 1168   return LoadObjectField(weak_cell, WeakCell::kValueOffset); | 
|  | 1169 } | 
|  | 1170 | 
| 1156 Node* CodeStubAssembler::LoadWeakCellValue(Node* weak_cell, Label* if_cleared) { | 1171 Node* CodeStubAssembler::LoadWeakCellValue(Node* weak_cell, Label* if_cleared) { | 
| 1157   Node* value = LoadObjectField(weak_cell, WeakCell::kValueOffset); | 1172   CSA_ASSERT(IsWeakCell(weak_cell)); | 
|  | 1173   Node* value = LoadWeakCellValueUnchecked(weak_cell); | 
| 1158   if (if_cleared != nullptr) { | 1174   if (if_cleared != nullptr) { | 
| 1159     GotoIf(WordEqual(value, IntPtrConstant(0)), if_cleared); | 1175     GotoIf(WordEqual(value, IntPtrConstant(0)), if_cleared); | 
| 1160   } | 1176   } | 
| 1161   return value; | 1177   return value; | 
| 1162 } | 1178 } | 
| 1163 | 1179 | 
| 1164 Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, | 1180 Node* CodeStubAssembler::LoadFixedArrayElement(Node* object, Node* index_node, | 
| 1165                                                int additional_offset, | 1181                                                int additional_offset, | 
| 1166                                                ParameterMode parameter_mode) { | 1182                                                ParameterMode parameter_mode) { | 
| 1167   int32_t header_size = | 1183   int32_t header_size = | 
| (...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1224   if (Is64()) { | 1240   if (Is64()) { | 
| 1225     return Load(MachineType::Int32(), object, offset); | 1241     return Load(MachineType::Int32(), object, offset); | 
| 1226   } else { | 1242   } else { | 
| 1227     return SmiToWord32(Load(MachineType::AnyTagged(), object, offset)); | 1243     return SmiToWord32(Load(MachineType::AnyTagged(), object, offset)); | 
| 1228   } | 1244   } | 
| 1229 } | 1245 } | 
| 1230 | 1246 | 
| 1231 Node* CodeStubAssembler::LoadFixedDoubleArrayElement( | 1247 Node* CodeStubAssembler::LoadFixedDoubleArrayElement( | 
| 1232     Node* object, Node* index_node, MachineType machine_type, | 1248     Node* object, Node* index_node, MachineType machine_type, | 
| 1233     int additional_offset, ParameterMode parameter_mode, Label* if_hole) { | 1249     int additional_offset, ParameterMode parameter_mode, Label* if_hole) { | 
|  | 1250   CSA_ASSERT(IsFixedDoubleArray(object)); | 
| 1234   int32_t header_size = | 1251   int32_t header_size = | 
| 1235       FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; | 1252       FixedDoubleArray::kHeaderSize + additional_offset - kHeapObjectTag; | 
| 1236   Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, | 1253   Node* offset = ElementOffsetFromIndex(index_node, FAST_HOLEY_DOUBLE_ELEMENTS, | 
| 1237                                         parameter_mode, header_size); | 1254                                         parameter_mode, header_size); | 
| 1238   return LoadDoubleWithHoleCheck(object, offset, if_hole, machine_type); | 1255   return LoadDoubleWithHoleCheck(object, offset, if_hole, machine_type); | 
| 1239 } | 1256 } | 
| 1240 | 1257 | 
| 1241 Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset, | 1258 Node* CodeStubAssembler::LoadDoubleWithHoleCheck(Node* base, Node* offset, | 
| 1242                                                  Label* if_hole, | 1259                                                  Label* if_hole, | 
| 1243                                                  MachineType machine_type) { | 1260                                                  MachineType machine_type) { | 
| (...skipping 30 matching lines...) Expand all  Loading... | 
| 1274   return Store(MachineRepresentation::kTagged, context, IntPtrConstant(offset), | 1291   return Store(MachineRepresentation::kTagged, context, IntPtrConstant(offset), | 
| 1275                value); | 1292                value); | 
| 1276 } | 1293 } | 
| 1277 | 1294 | 
| 1278 Node* CodeStubAssembler::LoadNativeContext(Node* context) { | 1295 Node* CodeStubAssembler::LoadNativeContext(Node* context) { | 
| 1279   return LoadContextElement(context, Context::NATIVE_CONTEXT_INDEX); | 1296   return LoadContextElement(context, Context::NATIVE_CONTEXT_INDEX); | 
| 1280 } | 1297 } | 
| 1281 | 1298 | 
| 1282 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, | 1299 Node* CodeStubAssembler::LoadJSArrayElementsMap(ElementsKind kind, | 
| 1283                                                 Node* native_context) { | 1300                                                 Node* native_context) { | 
|  | 1301   CSA_ASSERT(IsNativeContext(native_context)); | 
| 1284   return LoadFixedArrayElement(native_context, | 1302   return LoadFixedArrayElement(native_context, | 
| 1285                                IntPtrConstant(Context::ArrayMapIndex(kind))); | 1303                                IntPtrConstant(Context::ArrayMapIndex(kind))); | 
| 1286 } | 1304 } | 
| 1287 | 1305 | 
| 1288 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { | 1306 Node* CodeStubAssembler::StoreHeapNumberValue(Node* object, Node* value) { | 
| 1289   return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, | 1307   return StoreObjectFieldNoWriteBarrier(object, HeapNumber::kValueOffset, value, | 
| 1290                                         MachineRepresentation::kFloat64); | 1308                                         MachineRepresentation::kFloat64); | 
| 1291 } | 1309 } | 
| 1292 | 1310 | 
| 1293 Node* CodeStubAssembler::StoreObjectField( | 1311 Node* CodeStubAssembler::StoreObjectField( | 
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1349   MachineRepresentation rep = MachineRepresentation::kTagged; | 1367   MachineRepresentation rep = MachineRepresentation::kTagged; | 
| 1350   if (barrier_mode == SKIP_WRITE_BARRIER) { | 1368   if (barrier_mode == SKIP_WRITE_BARRIER) { | 
| 1351     return StoreNoWriteBarrier(rep, object, offset, value); | 1369     return StoreNoWriteBarrier(rep, object, offset, value); | 
| 1352   } else { | 1370   } else { | 
| 1353     return Store(rep, object, offset, value); | 1371     return Store(rep, object, offset, value); | 
| 1354   } | 1372   } | 
| 1355 } | 1373 } | 
| 1356 | 1374 | 
| 1357 Node* CodeStubAssembler::StoreFixedDoubleArrayElement( | 1375 Node* CodeStubAssembler::StoreFixedDoubleArrayElement( | 
| 1358     Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { | 1376     Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { | 
|  | 1377   CSA_ASSERT(IsFixedDoubleArray(object)); | 
| 1359   Node* offset = | 1378   Node* offset = | 
| 1360       ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, | 1379       ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, | 
| 1361                              FixedArray::kHeaderSize - kHeapObjectTag); | 1380                              FixedArray::kHeaderSize - kHeapObjectTag); | 
| 1362   MachineRepresentation rep = MachineRepresentation::kFloat64; | 1381   MachineRepresentation rep = MachineRepresentation::kFloat64; | 
| 1363   return StoreNoWriteBarrier(rep, object, offset, value); | 1382   return StoreNoWriteBarrier(rep, object, offset, value); | 
| 1364 } | 1383 } | 
| 1365 | 1384 | 
| 1366 Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) { | 1385 Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) { | 
| 1367   Node* result = Allocate(HeapNumber::kSize, kNone); | 1386   Node* result = Allocate(HeapNumber::kSize, kNone); | 
| 1368   Heap::RootListIndex heap_map_index = | 1387   Heap::RootListIndex heap_map_index = | 
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1493         CallRuntime(Runtime::kAllocateSeqTwoByteString, context, | 1512         CallRuntime(Runtime::kAllocateSeqTwoByteString, context, | 
| 1494                     mode == SMI_PARAMETERS ? length : SmiFromWord(length)); | 1513                     mode == SMI_PARAMETERS ? length : SmiFromWord(length)); | 
| 1495     var_result.Bind(result); | 1514     var_result.Bind(result); | 
| 1496     Goto(&if_join); | 1515     Goto(&if_join); | 
| 1497   } | 1516   } | 
| 1498 | 1517 | 
| 1499   Bind(&if_join); | 1518   Bind(&if_join); | 
| 1500   return var_result.value(); | 1519   return var_result.value(); | 
| 1501 } | 1520 } | 
| 1502 | 1521 | 
| 1503 Node* CodeStubAssembler::AllocateSlicedOneByteString(Node* length, Node* parent, | 1522 Node* CodeStubAssembler::AllocateSlicedString( | 
| 1504                                                      Node* offset) { | 1523     Heap::RootListIndex map_root_index, Node* length, Node* parent, | 
|  | 1524     Node* offset) { | 
|  | 1525   CSA_ASSERT(TaggedIsSmi(length)); | 
| 1505   Node* result = Allocate(SlicedString::kSize); | 1526   Node* result = Allocate(SlicedString::kSize); | 
| 1506   Node* map = LoadRoot(Heap::kSlicedOneByteStringMapRootIndex); | 1527   Node* map = LoadRoot(map_root_index); | 
|  | 1528   DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); | 
| 1507   StoreMapNoWriteBarrier(result, map); | 1529   StoreMapNoWriteBarrier(result, map); | 
| 1508   StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length, | 1530   StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length, | 
| 1509                                  MachineRepresentation::kTagged); | 1531                                  MachineRepresentation::kTagged); | 
| 1510   StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset, | 1532   StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset, | 
| 1511                                  Int32Constant(String::kEmptyHashField), | 1533                                  Int32Constant(String::kEmptyHashField), | 
| 1512                                  MachineRepresentation::kWord32); | 1534                                  MachineRepresentation::kWord32); | 
| 1513   StoreObjectFieldNoWriteBarrier(result, SlicedString::kParentOffset, parent, | 1535   StoreObjectFieldNoWriteBarrier(result, SlicedString::kParentOffset, parent, | 
| 1514                                  MachineRepresentation::kTagged); | 1536                                  MachineRepresentation::kTagged); | 
| 1515   StoreObjectFieldNoWriteBarrier(result, SlicedString::kOffsetOffset, offset, | 1537   StoreObjectFieldNoWriteBarrier(result, SlicedString::kOffsetOffset, offset, | 
| 1516                                  MachineRepresentation::kTagged); | 1538                                  MachineRepresentation::kTagged); | 
| 1517   return result; | 1539   return result; | 
| 1518 } | 1540 } | 
| 1519 | 1541 | 
|  | 1542 Node* CodeStubAssembler::AllocateSlicedOneByteString(Node* length, Node* parent, | 
|  | 1543                                                      Node* offset) { | 
|  | 1544   return AllocateSlicedString(Heap::kSlicedOneByteStringMapRootIndex, length, | 
|  | 1545                               parent, offset); | 
|  | 1546 } | 
|  | 1547 | 
| 1520 Node* CodeStubAssembler::AllocateSlicedTwoByteString(Node* length, Node* parent, | 1548 Node* CodeStubAssembler::AllocateSlicedTwoByteString(Node* length, Node* parent, | 
| 1521                                                      Node* offset) { | 1549                                                      Node* offset) { | 
| 1522   CSA_ASSERT(TaggedIsSmi(length)); | 1550   return AllocateSlicedString(Heap::kSlicedStringMapRootIndex, length, parent, | 
| 1523   Node* result = Allocate(SlicedString::kSize); | 1551                               offset); | 
| 1524   Node* map = LoadRoot(Heap::kSlicedStringMapRootIndex); |  | 
| 1525   StoreMapNoWriteBarrier(result, map); |  | 
| 1526   StoreObjectFieldNoWriteBarrier(result, SlicedString::kLengthOffset, length, |  | 
| 1527                                  MachineRepresentation::kTagged); |  | 
| 1528   StoreObjectFieldNoWriteBarrier(result, SlicedString::kHashFieldOffset, |  | 
| 1529                                  Int32Constant(String::kEmptyHashField), |  | 
| 1530                                  MachineRepresentation::kWord32); |  | 
| 1531   StoreObjectFieldNoWriteBarrier(result, SlicedString::kParentOffset, parent, |  | 
| 1532                                  MachineRepresentation::kTagged); |  | 
| 1533   StoreObjectFieldNoWriteBarrier(result, SlicedString::kOffsetOffset, offset, |  | 
| 1534                                  MachineRepresentation::kTagged); |  | 
| 1535   return result; |  | 
| 1536 } | 1552 } | 
| 1537 | 1553 | 
| 1538 Node* CodeStubAssembler::AllocateOneByteConsString(Node* length, Node* first, | 1554 Node* CodeStubAssembler::AllocateConsString(Heap::RootListIndex map_root_index, | 
| 1539                                                    Node* second, | 1555                                             Node* length, Node* first, | 
| 1540                                                    AllocationFlags flags) { | 1556                                             Node* second, | 
|  | 1557                                             AllocationFlags flags) { | 
| 1541   CSA_ASSERT(TaggedIsSmi(length)); | 1558   CSA_ASSERT(TaggedIsSmi(length)); | 
| 1542   Node* result = Allocate(ConsString::kSize, flags); | 1559   Node* result = Allocate(ConsString::kSize, flags); | 
| 1543   Node* map = LoadRoot(Heap::kConsOneByteStringMapRootIndex); | 1560   Node* map = LoadRoot(map_root_index); | 
| 1544   DCHECK(Heap::RootIsImmortalImmovable(Heap::kConsOneByteStringMapRootIndex)); | 1561   DCHECK(Heap::RootIsImmortalImmovable(map_root_index)); | 
| 1545   StoreMapNoWriteBarrier(result, map); | 1562   StoreMapNoWriteBarrier(result, map); | 
| 1546   StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length, | 1563   StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length, | 
| 1547                                  MachineRepresentation::kTagged); | 1564                                  MachineRepresentation::kTagged); | 
| 1548   StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset, | 1565   StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset, | 
| 1549                                  Int32Constant(String::kEmptyHashField), | 1566                                  Int32Constant(String::kEmptyHashField), | 
| 1550                                  MachineRepresentation::kWord32); | 1567                                  MachineRepresentation::kWord32); | 
| 1551   bool const new_space = !(flags & kPretenured); | 1568   bool const new_space = !(flags & kPretenured); | 
| 1552   if (new_space) { | 1569   if (new_space) { | 
| 1553     StoreObjectFieldNoWriteBarrier(result, ConsString::kFirstOffset, first, | 1570     StoreObjectFieldNoWriteBarrier(result, ConsString::kFirstOffset, first, | 
| 1554                                    MachineRepresentation::kTagged); | 1571                                    MachineRepresentation::kTagged); | 
| 1555     StoreObjectFieldNoWriteBarrier(result, ConsString::kSecondOffset, second, | 1572     StoreObjectFieldNoWriteBarrier(result, ConsString::kSecondOffset, second, | 
| 1556                                    MachineRepresentation::kTagged); | 1573                                    MachineRepresentation::kTagged); | 
| 1557   } else { | 1574   } else { | 
| 1558     StoreObjectField(result, ConsString::kFirstOffset, first); | 1575     StoreObjectField(result, ConsString::kFirstOffset, first); | 
| 1559     StoreObjectField(result, ConsString::kSecondOffset, second); | 1576     StoreObjectField(result, ConsString::kSecondOffset, second); | 
| 1560   } | 1577   } | 
| 1561   return result; | 1578   return result; | 
| 1562 } | 1579 } | 
| 1563 | 1580 | 
|  | 1581 Node* CodeStubAssembler::AllocateOneByteConsString(Node* length, Node* first, | 
|  | 1582                                                    Node* second, | 
|  | 1583                                                    AllocationFlags flags) { | 
|  | 1584   return AllocateConsString(Heap::kConsOneByteStringMapRootIndex, length, first, | 
|  | 1585                             second, flags); | 
|  | 1586 } | 
|  | 1587 | 
| 1564 Node* CodeStubAssembler::AllocateTwoByteConsString(Node* length, Node* first, | 1588 Node* CodeStubAssembler::AllocateTwoByteConsString(Node* length, Node* first, | 
| 1565                                                    Node* second, | 1589                                                    Node* second, | 
| 1566                                                    AllocationFlags flags) { | 1590                                                    AllocationFlags flags) { | 
| 1567   CSA_ASSERT(TaggedIsSmi(length)); | 1591   return AllocateConsString(Heap::kConsStringMapRootIndex, length, first, | 
| 1568   Node* result = Allocate(ConsString::kSize, flags); | 1592                             second, flags); | 
| 1569   Node* map = LoadRoot(Heap::kConsStringMapRootIndex); |  | 
| 1570   DCHECK(Heap::RootIsImmortalImmovable(Heap::kConsStringMapRootIndex)); |  | 
| 1571   StoreMapNoWriteBarrier(result, map); |  | 
| 1572   StoreObjectFieldNoWriteBarrier(result, ConsString::kLengthOffset, length, |  | 
| 1573                                  MachineRepresentation::kTagged); |  | 
| 1574   StoreObjectFieldNoWriteBarrier(result, ConsString::kHashFieldOffset, |  | 
| 1575                                  Int32Constant(String::kEmptyHashField), |  | 
| 1576                                  MachineRepresentation::kWord32); |  | 
| 1577   bool const new_space = !(flags & kPretenured); |  | 
| 1578   if (new_space) { |  | 
| 1579     StoreObjectFieldNoWriteBarrier(result, ConsString::kFirstOffset, first, |  | 
| 1580                                    MachineRepresentation::kTagged); |  | 
| 1581     StoreObjectFieldNoWriteBarrier(result, ConsString::kSecondOffset, second, |  | 
| 1582                                    MachineRepresentation::kTagged); |  | 
| 1583   } else { |  | 
| 1584     StoreObjectField(result, ConsString::kFirstOffset, first); |  | 
| 1585     StoreObjectField(result, ConsString::kSecondOffset, second); |  | 
| 1586   } |  | 
| 1587   return result; |  | 
| 1588 } | 1593 } | 
| 1589 | 1594 | 
| 1590 Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, | 1595 Node* CodeStubAssembler::NewConsString(Node* context, Node* length, Node* left, | 
| 1591                                        Node* right, AllocationFlags flags) { | 1596                                        Node* right, AllocationFlags flags) { | 
| 1592   CSA_ASSERT(TaggedIsSmi(length)); | 1597   CSA_ASSERT(TaggedIsSmi(length)); | 
| 1593   // Added string can be a cons string. | 1598   // Added string can be a cons string. | 
| 1594   Comment("Allocating ConsString"); | 1599   Comment("Allocating ConsString"); | 
| 1595   Node* left_instance_type = LoadInstanceType(left); | 1600   Node* left_instance_type = LoadInstanceType(left); | 
| 1596   Node* right_instance_type = LoadInstanceType(right); | 1601   Node* right_instance_type = LoadInstanceType(right); | 
| 1597 | 1602 | 
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1730                              kHeapObjectTag)); | 1735                              kHeapObjectTag)); | 
| 1731   Node* end_address = IntPtrAdd( | 1736   Node* end_address = IntPtrAdd( | 
| 1732       result, | 1737       result, | 
| 1733       IntPtrSubFoldConstants(store_size, IntPtrConstant(kHeapObjectTag))); | 1738       IntPtrSubFoldConstants(store_size, IntPtrConstant(kHeapObjectTag))); | 
| 1734   StoreFieldsNoWriteBarrier(start_address, end_address, filler); | 1739   StoreFieldsNoWriteBarrier(start_address, end_address, filler); | 
| 1735   return result; | 1740   return result; | 
| 1736 } | 1741 } | 
| 1737 | 1742 | 
| 1738 Node* CodeStubAssembler::AllocateJSObjectFromMap(Node* map, Node* properties, | 1743 Node* CodeStubAssembler::AllocateJSObjectFromMap(Node* map, Node* properties, | 
| 1739                                                  Node* elements) { | 1744                                                  Node* elements) { | 
|  | 1745   CSA_ASSERT(IsMap(map)); | 
| 1740   Node* size = | 1746   Node* size = | 
| 1741       IntPtrMul(LoadMapInstanceSize(map), IntPtrConstant(kPointerSize)); | 1747       IntPtrMul(LoadMapInstanceSize(map), IntPtrConstant(kPointerSize)); | 
| 1742   CSA_ASSERT(IsRegularHeapObjectSize(size)); | 1748   CSA_ASSERT(IsRegularHeapObjectSize(size)); | 
| 1743   Node* object = Allocate(size); | 1749   Node* object = Allocate(size); | 
| 1744   StoreMapNoWriteBarrier(object, map); | 1750   StoreMapNoWriteBarrier(object, map); | 
| 1745   InitializeJSObjectFromMap(object, map, size, properties, elements); | 1751   InitializeJSObjectFromMap(object, map, size, properties, elements); | 
| 1746   return object; | 1752   return object; | 
| 1747 } | 1753 } | 
| 1748 | 1754 | 
| 1749 void CodeStubAssembler::InitializeJSObjectFromMap(Node* object, Node* map, | 1755 void CodeStubAssembler::InitializeJSObjectFromMap(Node* object, Node* map, | 
| (...skipping 132 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1882                                                       : IntPtrConstant(0), | 1888                                                       : IntPtrConstant(0), | 
| 1883       capacity, Heap::kTheHoleValueRootIndex, capacity_mode); | 1889       capacity, Heap::kTheHoleValueRootIndex, capacity_mode); | 
| 1884 | 1890 | 
| 1885   return array; | 1891   return array; | 
| 1886 } | 1892 } | 
| 1887 | 1893 | 
| 1888 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, | 1894 Node* CodeStubAssembler::AllocateFixedArray(ElementsKind kind, | 
| 1889                                             Node* capacity_node, | 1895                                             Node* capacity_node, | 
| 1890                                             ParameterMode mode, | 1896                                             ParameterMode mode, | 
| 1891                                             AllocationFlags flags) { | 1897                                             AllocationFlags flags) { | 
|  | 1898   CSA_ASSERT(IntPtrGreaterThan(capacity_node, IntPtrOrSmiConstant(0, mode))); | 
| 1892   Node* total_size = GetFixedArrayAllocationSize(capacity_node, kind, mode); | 1899   Node* total_size = GetFixedArrayAllocationSize(capacity_node, kind, mode); | 
| 1893 | 1900 | 
| 1894   // Allocate both array and elements object, and initialize the JSArray. | 1901   // Allocate both array and elements object, and initialize the JSArray. | 
| 1895   Node* array = Allocate(total_size, flags); | 1902   Node* array = Allocate(total_size, flags); | 
| 1896   Heap* heap = isolate()->heap(); | 1903   Heap* heap = isolate()->heap(); | 
| 1897   Handle<Map> map(IsFastDoubleElementsKind(kind) | 1904   Handle<Map> map(IsFastDoubleElementsKind(kind) | 
| 1898                       ? heap->fixed_double_array_map() | 1905                       ? heap->fixed_double_array_map() | 
| 1899                       : heap->fixed_array_map()); | 1906                       : heap->fixed_array_map()); | 
| 1900   if (flags & kPretenured) { | 1907   if (flags & kPretenured) { | 
| 1901     StoreObjectField(array, JSObject::kMapOffset, HeapConstant(map)); | 1908     StoreObjectField(array, JSObject::kMapOffset, HeapConstant(map)); | 
| (...skipping 726 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2628       Runtime::kThrowIncompatibleMethodReceiver, context, | 2635       Runtime::kThrowIncompatibleMethodReceiver, context, | 
| 2629       HeapConstant(factory()->NewStringFromAsciiChecked(method_name, TENURED)), | 2636       HeapConstant(factory()->NewStringFromAsciiChecked(method_name, TENURED)), | 
| 2630       value); | 2637       value); | 
| 2631   var_value_map.Bind(UndefinedConstant()); | 2638   var_value_map.Bind(UndefinedConstant()); | 
| 2632   Goto(&out);  // Never reached. | 2639   Goto(&out);  // Never reached. | 
| 2633 | 2640 | 
| 2634   Bind(&out); | 2641   Bind(&out); | 
| 2635   return var_value_map.value(); | 2642   return var_value_map.value(); | 
| 2636 } | 2643 } | 
| 2637 | 2644 | 
|  | 2645 Node* CodeStubAssembler::IsSpecialReceiverMap(Node* map) { | 
|  | 2646   CSA_ASSERT(IsMap(map)); | 
|  | 2647   Node* bit_field = LoadMapBitField(map); | 
|  | 2648   Node* mask = Int32Constant(1 << Map::kHasNamedInterceptor | | 
|  | 2649                              1 << Map::kIsAccessCheckNeeded); | 
|  | 2650   Assert(Word32Equal(Word32And(bit_field, mask), Int32Constant(0))); | 
|  | 2651   return IsSpecialReceiverInstanceType(LoadMapInstanceType(map)); | 
|  | 2652 } | 
|  | 2653 | 
|  | 2654 Node* CodeStubAssembler::IsCallableMap(Node* map) { | 
|  | 2655   CSA_ASSERT(IsMap(map)); | 
|  | 2656   return Word32NotEqual( | 
|  | 2657       Word32And(LoadMapBitField(map), Int32Constant(1 << Map::kIsCallable)), | 
|  | 2658       Int32Constant(0)); | 
|  | 2659 } | 
|  | 2660 | 
|  | 2661 Node* CodeStubAssembler::IsSpecialReceiverInstanceType(Node* instance_type) { | 
|  | 2662   STATIC_ASSERT(JS_GLOBAL_OBJECT_TYPE <= LAST_SPECIAL_RECEIVER_TYPE); | 
|  | 2663   return Int32LessThanOrEqual(instance_type, | 
|  | 2664                               Int32Constant(LAST_SPECIAL_RECEIVER_TYPE)); | 
|  | 2665 } | 
|  | 2666 | 
| 2638 Node* CodeStubAssembler::IsStringInstanceType(Node* instance_type) { | 2667 Node* CodeStubAssembler::IsStringInstanceType(Node* instance_type) { | 
| 2639   STATIC_ASSERT(INTERNALIZED_STRING_TYPE == FIRST_TYPE); | 2668   STATIC_ASSERT(INTERNALIZED_STRING_TYPE == FIRST_TYPE); | 
| 2640   return Int32LessThan(instance_type, Int32Constant(FIRST_NONSTRING_TYPE)); | 2669   return Int32LessThan(instance_type, Int32Constant(FIRST_NONSTRING_TYPE)); | 
| 2641 } | 2670 } | 
| 2642 | 2671 | 
| 2643 Node* CodeStubAssembler::IsJSReceiverInstanceType(Node* instance_type) { | 2672 Node* CodeStubAssembler::IsJSReceiverInstanceType(Node* instance_type) { | 
| 2644   STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 2673   STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); | 
| 2645   return Int32GreaterThanOrEqual(instance_type, | 2674   return Int32GreaterThanOrEqual(instance_type, | 
| 2646                                  Int32Constant(FIRST_JS_RECEIVER_TYPE)); | 2675                                  Int32Constant(FIRST_JS_RECEIVER_TYPE)); | 
| 2647 } | 2676 } | 
| 2648 | 2677 | 
| 2649 Node* CodeStubAssembler::IsCallableMap(Node* map) { | 2678 Node* CodeStubAssembler::IsJSReceiver(Node* object) { | 
| 2650   return Word32NotEqual( | 2679   STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 
| 2651       Word32And(LoadMapBitField(map), Int32Constant(1 << Map::kIsCallable)), | 2680   return IsJSReceiverInstanceType(LoadInstanceType(object)); | 
| 2652       Int32Constant(0)); | 2681 } | 
|  | 2682 | 
|  | 2683 Node* CodeStubAssembler::IsJSObject(Node* object) { | 
|  | 2684   STATIC_ASSERT(LAST_JS_OBJECT_TYPE == LAST_TYPE); | 
|  | 2685   return Int32GreaterThanOrEqual(LoadInstanceType(object), | 
|  | 2686                                  Int32Constant(FIRST_JS_RECEIVER_TYPE)); | 
|  | 2687 } | 
|  | 2688 | 
|  | 2689 Node* CodeStubAssembler::IsMap(Node* map) { | 
|  | 2690   return HasInstanceType(map, MAP_TYPE); | 
|  | 2691 } | 
|  | 2692 | 
|  | 2693 Node* CodeStubAssembler::IsJSValue(Node* map) { | 
|  | 2694   return HasInstanceType(map, JS_VALUE_TYPE); | 
|  | 2695 } | 
|  | 2696 | 
|  | 2697 Node* CodeStubAssembler::IsJSArray(Node* object) { | 
|  | 2698   return HasInstanceType(object, JS_ARRAY_TYPE); | 
|  | 2699 } | 
|  | 2700 | 
|  | 2701 Node* CodeStubAssembler::IsWeakCell(Node* object) { | 
|  | 2702   return HasInstanceType(object, WEAK_CELL_TYPE); | 
|  | 2703 } | 
|  | 2704 | 
|  | 2705 Node* CodeStubAssembler::IsName(Node* object) { | 
|  | 2706   return Int32LessThanOrEqual(LoadInstanceType(object), | 
|  | 2707                               Int32Constant(LAST_NAME_TYPE)); | 
|  | 2708 } | 
|  | 2709 | 
|  | 2710 Node* CodeStubAssembler::IsString(Node* object) { | 
|  | 2711   return Int32LessThanOrEqual(LoadInstanceType(object), | 
|  | 2712                               Int32Constant(FIRST_NONSTRING_TYPE)); | 
|  | 2713 } | 
|  | 2714 | 
|  | 2715 Node* CodeStubAssembler::IsNativeContext(Node* object) { | 
|  | 2716   return WordEqual(LoadMap(object), LoadRoot(Heap::kNativeContextMapRootIndex)); | 
|  | 2717 } | 
|  | 2718 | 
|  | 2719 Node* CodeStubAssembler::IsFixedDoubleArray(Node* object) { | 
|  | 2720   return WordEqual(LoadMap(object), FixedDoubleArrayMapConstant()); | 
|  | 2721 } | 
|  | 2722 | 
|  | 2723 Node* CodeStubAssembler::IsHashTable(Node* object) { | 
|  | 2724   return WordEqual(LoadMap(object), LoadRoot(Heap::kHashTableMapRootIndex)); | 
|  | 2725 } | 
|  | 2726 | 
|  | 2727 Node* CodeStubAssembler::IsDictionary(Node* object) { | 
|  | 2728   return WordOr(IsHashTable(object), IsUnseededNumberDictionary(object)); | 
|  | 2729 } | 
|  | 2730 | 
|  | 2731 Node* CodeStubAssembler::IsUnseededNumberDictionary(Node* object) { | 
|  | 2732   return WordEqual(LoadMap(object), | 
|  | 2733                    LoadRoot(Heap::kUnseededNumberDictionaryMapRootIndex)); | 
| 2653 } | 2734 } | 
| 2654 | 2735 | 
| 2655 Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { | 2736 Node* CodeStubAssembler::StringCharCodeAt(Node* string, Node* index) { | 
|  | 2737   CSA_ASSERT(IsString(string)); | 
| 2656   // Translate the {index} into a Word. | 2738   // Translate the {index} into a Word. | 
| 2657   index = SmiToWord(index); | 2739   index = SmiToWord(index); | 
| 2658 | 2740 | 
| 2659   // We may need to loop in case of cons or sliced strings. | 2741   // We may need to loop in case of cons or sliced strings. | 
| 2660   Variable var_index(this, MachineType::PointerRepresentation()); | 2742   Variable var_index(this, MachineType::PointerRepresentation()); | 
| 2661   Variable var_result(this, MachineRepresentation::kWord32); | 2743   Variable var_result(this, MachineRepresentation::kWord32); | 
| 2662   Variable var_string(this, MachineRepresentation::kTagged); | 2744   Variable var_string(this, MachineRepresentation::kTagged); | 
| 2663   Variable* loop_vars[] = {&var_index, &var_string}; | 2745   Variable* loop_vars[] = {&var_index, &var_string}; | 
| 2664   Label done_loop(this, &var_result), loop(this, 2, loop_vars); | 2746   Label done_loop(this, &var_result), loop(this, 2, loop_vars); | 
| 2665   var_string.Bind(string); | 2747   var_string.Bind(string); | 
| (...skipping 591 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3257     IncrementCounter(counters->string_add_native(), 1); | 3339     IncrementCounter(counters->string_add_native(), 1); | 
| 3258     Goto(&done); | 3340     Goto(&done); | 
| 3259   } | 3341   } | 
| 3260 | 3342 | 
| 3261   Bind(&done); | 3343   Bind(&done); | 
| 3262   return result.value(); | 3344   return result.value(); | 
| 3263 } | 3345 } | 
| 3264 | 3346 | 
| 3265 Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string, | 3347 Node* CodeStubAssembler::StringIndexOfChar(Node* context, Node* string, | 
| 3266                                            Node* needle_char, Node* from) { | 3348                                            Node* needle_char, Node* from) { | 
|  | 3349   CSA_ASSERT(IsString(string)); | 
| 3267   Variable var_result(this, MachineRepresentation::kTagged); | 3350   Variable var_result(this, MachineRepresentation::kTagged); | 
| 3268 | 3351 | 
| 3269   Label out(this), runtime(this, Label::kDeferred); | 3352   Label out(this), runtime(this, Label::kDeferred); | 
| 3270 | 3353 | 
| 3271   // Let runtime handle non-one-byte {needle_char}. | 3354   // Let runtime handle non-one-byte {needle_char}. | 
| 3272 | 3355 | 
| 3273   Node* const one_byte_char_mask = IntPtrConstant(0xFF); | 3356   Node* const one_byte_char_mask = IntPtrConstant(0xFF); | 
| 3274   GotoUnless(WordEqual(WordAnd(needle_char, one_byte_char_mask), needle_char), | 3357   GotoUnless(WordEqual(WordAnd(needle_char, one_byte_char_mask), needle_char), | 
| 3275              &runtime); | 3358              &runtime); | 
| 3276 | 3359 | 
| (...skipping 409 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3686   { | 3769   { | 
| 3687     result.Bind(CallRuntime(Runtime::kToString, context, input)); | 3770     result.Bind(CallRuntime(Runtime::kToString, context, input)); | 
| 3688     Goto(&done); | 3771     Goto(&done); | 
| 3689   } | 3772   } | 
| 3690 | 3773 | 
| 3691   Bind(&done); | 3774   Bind(&done); | 
| 3692   return result.value(); | 3775   return result.value(); | 
| 3693 } | 3776 } | 
| 3694 | 3777 | 
| 3695 Node* CodeStubAssembler::FlattenString(Node* string) { | 3778 Node* CodeStubAssembler::FlattenString(Node* string) { | 
|  | 3779   CSA_ASSERT(IsString(string)); | 
| 3696   Variable var_result(this, MachineRepresentation::kTagged); | 3780   Variable var_result(this, MachineRepresentation::kTagged); | 
| 3697   var_result.Bind(string); | 3781   var_result.Bind(string); | 
| 3698 | 3782 | 
| 3699   Node* instance_type = LoadInstanceType(string); | 3783   Node* instance_type = LoadInstanceType(string); | 
| 3700 | 3784 | 
| 3701   // Check if the {string} is not a ConsString (i.e. already flat). | 3785   // Check if the {string} is not a ConsString (i.e. already flat). | 
| 3702   Label is_cons(this, Label::kDeferred), is_flat_in_cons(this), end(this); | 3786   Label is_cons(this, Label::kDeferred), is_flat_in_cons(this), end(this); | 
| 3703   { | 3787   { | 
| 3704     GotoUnless(Word32Equal(Word32And(instance_type, | 3788     GotoUnless(Word32Equal(Word32And(instance_type, | 
| 3705                                      Int32Constant(kStringRepresentationMask)), | 3789                                      Int32Constant(kStringRepresentationMask)), | 
| (...skipping 18 matching lines...) Expand all  Loading... | 
| 3724   { | 3808   { | 
| 3725     var_result.Bind(LoadObjectField(string, ConsString::kFirstOffset)); | 3809     var_result.Bind(LoadObjectField(string, ConsString::kFirstOffset)); | 
| 3726     Goto(&end); | 3810     Goto(&end); | 
| 3727   } | 3811   } | 
| 3728 | 3812 | 
| 3729   Bind(&end); | 3813   Bind(&end); | 
| 3730   return var_result.value(); | 3814   return var_result.value(); | 
| 3731 } | 3815 } | 
| 3732 | 3816 | 
| 3733 Node* CodeStubAssembler::JSReceiverToPrimitive(Node* context, Node* input) { | 3817 Node* CodeStubAssembler::JSReceiverToPrimitive(Node* context, Node* input) { | 
| 3734   STATIC_ASSERT(LAST_JS_RECEIVER_TYPE == LAST_TYPE); |  | 
| 3735   Label if_isreceiver(this, Label::kDeferred), if_isnotreceiver(this); | 3818   Label if_isreceiver(this, Label::kDeferred), if_isnotreceiver(this); | 
| 3736   Variable result(this, MachineRepresentation::kTagged); | 3819   Variable result(this, MachineRepresentation::kTagged); | 
| 3737   Label done(this, &result); | 3820   Label done(this, &result); | 
| 3738 | 3821 | 
| 3739   GotoIf(TaggedIsSmi(input), &if_isnotreceiver); | 3822   BranchIfJSReceiver(input, &if_isreceiver, &if_isnotreceiver); | 
| 3740 |  | 
| 3741   Node* map = LoadMap(input); |  | 
| 3742   Node* instance_type = LoadMapInstanceType(map); |  | 
| 3743   Branch(IsJSReceiverInstanceType(instance_type), &if_isreceiver, |  | 
| 3744          &if_isnotreceiver); |  | 
| 3745 | 3823 | 
| 3746   Bind(&if_isreceiver); | 3824   Bind(&if_isreceiver); | 
| 3747   { | 3825   { | 
| 3748     // Convert {input} to a primitive first passing Number hint. | 3826     // Convert {input} to a primitive first passing Number hint. | 
| 3749     Callable callable = CodeFactory::NonPrimitiveToPrimitive(isolate()); | 3827     Callable callable = CodeFactory::NonPrimitiveToPrimitive(isolate()); | 
| 3750     result.Bind(CallStub(callable, context, input)); | 3828     result.Bind(CallStub(callable, context, input)); | 
| 3751     Goto(&done); | 3829     Goto(&done); | 
| 3752   } | 3830   } | 
| 3753 | 3831 | 
| 3754   Bind(&if_isnotreceiver); | 3832   Bind(&if_isnotreceiver); | 
| (...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3924 Node* CodeStubAssembler::IntPtrMax(Node* left, Node* right) { | 4002 Node* CodeStubAssembler::IntPtrMax(Node* left, Node* right) { | 
| 3925   return Select(IntPtrGreaterThanOrEqual(left, right), left, right); | 4003   return Select(IntPtrGreaterThanOrEqual(left, right), left, right); | 
| 3926 } | 4004 } | 
| 3927 | 4005 | 
| 3928 template <typename Dictionary> | 4006 template <typename Dictionary> | 
| 3929 void CodeStubAssembler::NameDictionaryLookup(Node* dictionary, | 4007 void CodeStubAssembler::NameDictionaryLookup(Node* dictionary, | 
| 3930                                              Node* unique_name, Label* if_found, | 4008                                              Node* unique_name, Label* if_found, | 
| 3931                                              Variable* var_name_index, | 4009                                              Variable* var_name_index, | 
| 3932                                              Label* if_not_found, | 4010                                              Label* if_not_found, | 
| 3933                                              int inlined_probes) { | 4011                                              int inlined_probes) { | 
|  | 4012   CSA_ASSERT(IsDictionary(dictionary)); | 
| 3934   DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); | 4013   DCHECK_EQ(MachineType::PointerRepresentation(), var_name_index->rep()); | 
| 3935   Comment("NameDictionaryLookup"); | 4014   Comment("NameDictionaryLookup"); | 
| 3936 | 4015 | 
| 3937   Node* capacity = SmiUntag(LoadFixedArrayElement( | 4016   Node* capacity = SmiUntag(LoadFixedArrayElement( | 
| 3938       dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 4017       dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 
| 3939       INTPTR_PARAMETERS)); | 4018       INTPTR_PARAMETERS)); | 
| 3940   Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 4019   Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 
| 3941   Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name)); | 4020   Node* hash = ChangeUint32ToWord(LoadNameHash(unique_name)); | 
| 3942 | 4021 | 
| 3943   // See Dictionary::FirstProbe(). | 4022   // See Dictionary::FirstProbe(). | 
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4008   hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16))); | 4087   hash = Word32Xor(hash, Word32Shr(hash, Int32Constant(16))); | 
| 4009   return Word32And(hash, Int32Constant(0x3fffffff)); | 4088   return Word32And(hash, Int32Constant(0x3fffffff)); | 
| 4010 } | 4089 } | 
| 4011 | 4090 | 
| 4012 template <typename Dictionary> | 4091 template <typename Dictionary> | 
| 4013 void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary, | 4092 void CodeStubAssembler::NumberDictionaryLookup(Node* dictionary, | 
| 4014                                                Node* intptr_index, | 4093                                                Node* intptr_index, | 
| 4015                                                Label* if_found, | 4094                                                Label* if_found, | 
| 4016                                                Variable* var_entry, | 4095                                                Variable* var_entry, | 
| 4017                                                Label* if_not_found) { | 4096                                                Label* if_not_found) { | 
|  | 4097   CSA_ASSERT(IsDictionary(dictionary)); | 
| 4018   DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep()); | 4098   DCHECK_EQ(MachineType::PointerRepresentation(), var_entry->rep()); | 
| 4019   Comment("NumberDictionaryLookup"); | 4099   Comment("NumberDictionaryLookup"); | 
| 4020 | 4100 | 
| 4021   Node* capacity = SmiUntag(LoadFixedArrayElement( | 4101   Node* capacity = SmiUntag(LoadFixedArrayElement( | 
| 4022       dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 4102       dictionary, IntPtrConstant(Dictionary::kCapacityIndex), 0, | 
| 4023       INTPTR_PARAMETERS)); | 4103       INTPTR_PARAMETERS)); | 
| 4024   Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 4104   Node* mask = IntPtrSub(capacity, IntPtrConstant(1)); | 
| 4025 | 4105 | 
| 4026   Node* int32_seed; | 4106   Node* int32_seed; | 
| 4027   if (Dictionary::ShapeT::UsesSeed) { | 4107   if (Dictionary::ShapeT::UsesSeed) { | 
| (...skipping 282 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4310   Bind(&done); | 4390   Bind(&done); | 
| 4311 | 4391 | 
| 4312   Comment("] LoadPropertyFromFastObject"); | 4392   Comment("] LoadPropertyFromFastObject"); | 
| 4313 } | 4393 } | 
| 4314 | 4394 | 
| 4315 void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary, | 4395 void CodeStubAssembler::LoadPropertyFromNameDictionary(Node* dictionary, | 
| 4316                                                        Node* name_index, | 4396                                                        Node* name_index, | 
| 4317                                                        Variable* var_details, | 4397                                                        Variable* var_details, | 
| 4318                                                        Variable* var_value) { | 4398                                                        Variable* var_value) { | 
| 4319   Comment("LoadPropertyFromNameDictionary"); | 4399   Comment("LoadPropertyFromNameDictionary"); | 
| 4320 | 4400   CSA_ASSERT(IsDictionary(dictionary)); | 
| 4321   const int name_to_details_offset = | 4401   const int name_to_details_offset = | 
| 4322       (NameDictionary::kEntryDetailsIndex - NameDictionary::kEntryKeyIndex) * | 4402       (NameDictionary::kEntryDetailsIndex - NameDictionary::kEntryKeyIndex) * | 
| 4323       kPointerSize; | 4403       kPointerSize; | 
| 4324   const int name_to_value_offset = | 4404   const int name_to_value_offset = | 
| 4325       (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 4405       (NameDictionary::kEntryValueIndex - NameDictionary::kEntryKeyIndex) * | 
| 4326       kPointerSize; | 4406       kPointerSize; | 
| 4327 | 4407 | 
| 4328   Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index, | 4408   Node* details = LoadAndUntagToWord32FixedArrayElement(dictionary, name_index, | 
| 4329                                                         name_to_details_offset); | 4409                                                         name_to_details_offset); | 
| 4330 | 4410 | 
| 4331   var_details->Bind(details); | 4411   var_details->Bind(details); | 
| 4332   var_value->Bind( | 4412   var_value->Bind( | 
| 4333       LoadFixedArrayElement(dictionary, name_index, name_to_value_offset)); | 4413       LoadFixedArrayElement(dictionary, name_index, name_to_value_offset)); | 
| 4334 | 4414 | 
| 4335   Comment("] LoadPropertyFromNameDictionary"); | 4415   Comment("] LoadPropertyFromNameDictionary"); | 
| 4336 } | 4416 } | 
| 4337 | 4417 | 
| 4338 void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary, | 4418 void CodeStubAssembler::LoadPropertyFromGlobalDictionary(Node* dictionary, | 
| 4339                                                          Node* name_index, | 4419                                                          Node* name_index, | 
| 4340                                                          Variable* var_details, | 4420                                                          Variable* var_details, | 
| 4341                                                          Variable* var_value, | 4421                                                          Variable* var_value, | 
| 4342                                                          Label* if_deleted) { | 4422                                                          Label* if_deleted) { | 
| 4343   Comment("[ LoadPropertyFromGlobalDictionary"); | 4423   Comment("[ LoadPropertyFromGlobalDictionary"); | 
|  | 4424   CSA_ASSERT(IsDictionary(dictionary)); | 
| 4344 | 4425 | 
| 4345   const int name_to_value_offset = | 4426   const int name_to_value_offset = | 
| 4346       (GlobalDictionary::kEntryValueIndex - GlobalDictionary::kEntryKeyIndex) * | 4427       (GlobalDictionary::kEntryValueIndex - GlobalDictionary::kEntryKeyIndex) * | 
| 4347       kPointerSize; | 4428       kPointerSize; | 
| 4348 | 4429 | 
| 4349   Node* property_cell = | 4430   Node* property_cell = | 
| 4350       LoadFixedArrayElement(dictionary, name_index, name_to_value_offset); | 4431       LoadFixedArrayElement(dictionary, name_index, name_to_value_offset); | 
| 4351 | 4432 | 
| 4352   Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); | 4433   Node* value = LoadObjectField(property_cell, PropertyCell::kValueOffset); | 
| 4353   GotoIf(WordEqual(value, TheHoleConstant()), if_deleted); | 4434   GotoIf(WordEqual(value, TheHoleConstant()), if_deleted); | 
| (...skipping 534 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 4888     var_receiver_map.Bind(LoadMap(receiver)); | 4969     var_receiver_map.Bind(LoadMap(receiver)); | 
| 4889     Goto(&if_result); | 4970     Goto(&if_result); | 
| 4890   } | 4971   } | 
| 4891   Bind(&if_result); | 4972   Bind(&if_result); | 
| 4892   return var_receiver_map.value(); | 4973   return var_receiver_map.value(); | 
| 4893 } | 4974 } | 
| 4894 | 4975 | 
| 4895 compiler::Node* CodeStubAssembler::TryMonomorphicCase( | 4976 compiler::Node* CodeStubAssembler::TryMonomorphicCase( | 
| 4896     compiler::Node* slot, compiler::Node* vector, compiler::Node* receiver_map, | 4977     compiler::Node* slot, compiler::Node* vector, compiler::Node* receiver_map, | 
| 4897     Label* if_handler, Variable* var_handler, Label* if_miss) { | 4978     Label* if_handler, Variable* var_handler, Label* if_miss) { | 
|  | 4979   Comment("TryMonomorphicCase"); | 
| 4898   DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); | 4980   DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); | 
| 4899 | 4981 | 
| 4900   // TODO(ishell): add helper class that hides offset computations for a series | 4982   // TODO(ishell): add helper class that hides offset computations for a series | 
| 4901   // of loads. | 4983   // of loads. | 
| 4902   int32_t header_size = FixedArray::kHeaderSize - kHeapObjectTag; | 4984   int32_t header_size = FixedArray::kHeaderSize - kHeapObjectTag; | 
| 4903   // Adding |header_size| with a separate IntPtrAdd rather than passing it | 4985   // Adding |header_size| with a separate IntPtrAdd rather than passing it | 
| 4904   // into ElementOffsetFromIndex() allows it to be folded into a single | 4986   // into ElementOffsetFromIndex() allows it to be folded into a single | 
| 4905   // [base, index, offset] indirect memory access on x64. | 4987   // [base, index, offset] indirect memory access on x64. | 
| 4906   Node* offset = | 4988   Node* offset = | 
| 4907       ElementOffsetFromIndex(slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS); | 4989       ElementOffsetFromIndex(slot, FAST_HOLEY_ELEMENTS, SMI_PARAMETERS); | 
| 4908   Node* feedback = Load(MachineType::AnyTagged(), vector, | 4990   Node* feedback = Load(MachineType::AnyTagged(), vector, | 
| 4909                         IntPtrAdd(offset, IntPtrConstant(header_size))); | 4991                         IntPtrAdd(offset, IntPtrConstant(header_size))); | 
| 4910 | 4992 | 
| 4911   // Try to quickly handle the monomorphic case without knowing for sure | 4993   // Try to quickly handle the monomorphic case without knowing for sure | 
| 4912   // if we have a weak cell in feedback. We do know it's safe to look | 4994   // if we have a weak cell in feedback. We do know it's safe to look | 
| 4913   // at WeakCell::kValueOffset. | 4995   // at WeakCell::kValueOffset. | 
| 4914   GotoIf(WordNotEqual(receiver_map, LoadWeakCellValue(feedback)), if_miss); | 4996   GotoIf(WordNotEqual(receiver_map, LoadWeakCellValueUnchecked(feedback)), | 
|  | 4997          if_miss); | 
| 4915 | 4998 | 
| 4916   Node* handler = | 4999   Node* handler = | 
| 4917       Load(MachineType::AnyTagged(), vector, | 5000       Load(MachineType::AnyTagged(), vector, | 
| 4918            IntPtrAdd(offset, IntPtrConstant(header_size + kPointerSize))); | 5001            IntPtrAdd(offset, IntPtrConstant(header_size + kPointerSize))); | 
| 4919 | 5002 | 
| 4920   var_handler->Bind(handler); | 5003   var_handler->Bind(handler); | 
| 4921   Goto(if_handler); | 5004   Goto(if_handler); | 
| 4922   return feedback; | 5005   return feedback; | 
| 4923 } | 5006 } | 
| 4924 | 5007 | 
| 4925 void CodeStubAssembler::HandlePolymorphicCase( | 5008 void CodeStubAssembler::HandlePolymorphicCase( | 
| 4926     compiler::Node* receiver_map, compiler::Node* feedback, Label* if_handler, | 5009     compiler::Node* receiver_map, compiler::Node* feedback, Label* if_handler, | 
| 4927     Variable* var_handler, Label* if_miss, int unroll_count) { | 5010     Variable* var_handler, Label* if_miss, int unroll_count) { | 
|  | 5011   Comment("HandlePolymorphicCase"); | 
| 4928   DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); | 5012   DCHECK_EQ(MachineRepresentation::kTagged, var_handler->rep()); | 
| 4929 | 5013 | 
| 4930   // Iterate {feedback} array. | 5014   // Iterate {feedback} array. | 
| 4931   const int kEntrySize = 2; | 5015   const int kEntrySize = 2; | 
| 4932 | 5016 | 
| 4933   for (int i = 0; i < unroll_count; i++) { | 5017   for (int i = 0; i < unroll_count; i++) { | 
| 4934     Label next_entry(this); | 5018     Label next_entry(this); | 
| 4935     Node* cached_map = LoadWeakCellValue(LoadFixedArrayElement( | 5019     Node* cached_map = LoadWeakCellValue(LoadFixedArrayElement( | 
| 4936         feedback, IntPtrConstant(i * kEntrySize), 0, INTPTR_PARAMETERS)); | 5020         feedback, IntPtrConstant(i * kEntrySize), 0, INTPTR_PARAMETERS)); | 
| 4937     GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry); | 5021     GotoIf(WordNotEqual(receiver_map, cached_map), &next_entry); | 
| (...skipping 1709 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6647   } | 6731   } | 
| 6648   Bind(&no_memento_found); | 6732   Bind(&no_memento_found); | 
| 6649   Comment("] TrapAllocationMemento"); | 6733   Comment("] TrapAllocationMemento"); | 
| 6650 } | 6734 } | 
| 6651 | 6735 | 
| 6652 Node* CodeStubAssembler::PageFromAddress(Node* address) { | 6736 Node* CodeStubAssembler::PageFromAddress(Node* address) { | 
| 6653   return WordAnd(address, IntPtrConstant(~Page::kPageAlignmentMask)); | 6737   return WordAnd(address, IntPtrConstant(~Page::kPageAlignmentMask)); | 
| 6654 } | 6738 } | 
| 6655 | 6739 | 
| 6656 Node* CodeStubAssembler::EnumLength(Node* map) { | 6740 Node* CodeStubAssembler::EnumLength(Node* map) { | 
|  | 6741   CSA_ASSERT(IsMap(map)); | 
| 6657   Node* bitfield_3 = LoadMapBitField3(map); | 6742   Node* bitfield_3 = LoadMapBitField3(map); | 
| 6658   Node* enum_length = DecodeWordFromWord32<Map::EnumLengthBits>(bitfield_3); | 6743   Node* enum_length = DecodeWordFromWord32<Map::EnumLengthBits>(bitfield_3); | 
| 6659   return SmiTag(enum_length); | 6744   return SmiTag(enum_length); | 
| 6660 } | 6745 } | 
| 6661 | 6746 | 
| 6662 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache, | 6747 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache, | 
| 6663                                        Label* use_runtime) { | 6748                                        Label* use_runtime) { | 
| 6664   Variable current_js_object(this, MachineRepresentation::kTagged); | 6749   Variable current_js_object(this, MachineRepresentation::kTagged); | 
| 6665   current_js_object.Bind(receiver); | 6750   current_js_object.Bind(receiver); | 
| 6666 | 6751 | 
| (...skipping 1878 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 8545   Node* buffer_bit_field = LoadObjectField( | 8630   Node* buffer_bit_field = LoadObjectField( | 
| 8546       buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); | 8631       buffer, JSArrayBuffer::kBitFieldOffset, MachineType::Uint32()); | 
| 8547   Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); | 8632   Node* was_neutered_mask = Int32Constant(JSArrayBuffer::WasNeutered::kMask); | 
| 8548 | 8633 | 
| 8549   return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), | 8634   return Word32NotEqual(Word32And(buffer_bit_field, was_neutered_mask), | 
| 8550                         Int32Constant(0)); | 8635                         Int32Constant(0)); | 
| 8551 } | 8636 } | 
| 8552 | 8637 | 
| 8553 }  // namespace internal | 8638 }  // namespace internal | 
| 8554 }  // namespace v8 | 8639 }  // namespace v8 | 
| OLD | NEW | 
|---|