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

Side by Side Diff: src/code-stub-assembler.cc

Issue 2489743002: [stubs] Ensure CSA_ASSERT and CSA_SLOW_ASSERT do not produce unused instructions in release mode. (Closed)
Patch Set: ((void)0) Created 4 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 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, &not_ok); 40 Branch(condition, &ok, &not_ok);
40 Bind(&not_ok); 41 Bind(&not_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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698