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

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

Issue 2325013003: [stubs] Port StoreFieldStub to TurboFan. (Closed)
Patch Set: Created 4 years, 3 months 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.h » ('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 4
5 #include "src/code-stub-assembler.h" 5 #include "src/code-stub-assembler.h"
6 #include "src/code-factory.h" 6 #include "src/code-factory.h"
7 #include "src/frames-inl.h" 7 #include "src/frames-inl.h"
8 #include "src/frames.h" 8 #include "src/frames.h"
9 #include "src/ic/handler-configuration.h" 9 #include "src/ic/handler-configuration.h"
10 #include "src/ic/stub-cache.h" 10 #include "src/ic/stub-cache.h"
(...skipping 29 matching lines...) Expand all
40 40
41 Node* CodeStubAssembler::BooleanMapConstant() { 41 Node* CodeStubAssembler::BooleanMapConstant() {
42 return HeapConstant(isolate()->factory()->boolean_map()); 42 return HeapConstant(isolate()->factory()->boolean_map());
43 } 43 }
44 44
45 Node* CodeStubAssembler::EmptyStringConstant() { 45 Node* CodeStubAssembler::EmptyStringConstant() {
46 return LoadRoot(Heap::kempty_stringRootIndex); 46 return LoadRoot(Heap::kempty_stringRootIndex);
47 } 47 }
48 48
49 Node* CodeStubAssembler::HeapNumberMapConstant() { 49 Node* CodeStubAssembler::HeapNumberMapConstant() {
50 return HeapConstant(isolate()->factory()->heap_number_map()); 50 return LoadRoot(Heap::kHeapNumberMapRootIndex);
51 } 51 }
52 52
53 Node* CodeStubAssembler::NoContextConstant() { 53 Node* CodeStubAssembler::NoContextConstant() {
54 return SmiConstant(Smi::FromInt(0)); 54 return SmiConstant(Smi::FromInt(0));
55 } 55 }
56 56
57 Node* CodeStubAssembler::MinusZeroConstant() { 57 Node* CodeStubAssembler::MinusZeroConstant() {
58 return LoadRoot(Heap::kMinusZeroValueRootIndex); 58 return LoadRoot(Heap::kMinusZeroValueRootIndex);
59 } 59 }
60 60
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after
1225 1225
1226 Node* CodeStubAssembler::StoreFixedDoubleArrayElement( 1226 Node* CodeStubAssembler::StoreFixedDoubleArrayElement(
1227 Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) { 1227 Node* object, Node* index_node, Node* value, ParameterMode parameter_mode) {
1228 Node* offset = 1228 Node* offset =
1229 ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode, 1229 ElementOffsetFromIndex(index_node, FAST_DOUBLE_ELEMENTS, parameter_mode,
1230 FixedArray::kHeaderSize - kHeapObjectTag); 1230 FixedArray::kHeaderSize - kHeapObjectTag);
1231 MachineRepresentation rep = MachineRepresentation::kFloat64; 1231 MachineRepresentation rep = MachineRepresentation::kFloat64;
1232 return StoreNoWriteBarrier(rep, object, offset, value); 1232 return StoreNoWriteBarrier(rep, object, offset, value);
1233 } 1233 }
1234 1234
1235 Node* CodeStubAssembler::AllocateHeapNumber() { 1235 Node* CodeStubAssembler::AllocateHeapNumber(MutableMode mode) {
1236 Node* result = Allocate(HeapNumber::kSize, kNone); 1236 Node* result = Allocate(HeapNumber::kSize, kNone);
1237 StoreMapNoWriteBarrier(result, HeapNumberMapConstant()); 1237 Heap::RootListIndex heap_map_index =
1238 mode == IMMUTABLE ? Heap::kHeapNumberMapRootIndex
1239 : Heap::kMutableHeapNumberMapRootIndex;
1240 Node* map = LoadRoot(heap_map_index);
1241 StoreMapNoWriteBarrier(result, map);
1238 return result; 1242 return result;
1239 } 1243 }
1240 1244
1241 Node* CodeStubAssembler::AllocateHeapNumberWithValue(Node* value) { 1245 Node* CodeStubAssembler::AllocateHeapNumberWithValue(Node* value,
1242 Node* result = AllocateHeapNumber(); 1246 MutableMode mode) {
1247 Node* result = AllocateHeapNumber(mode);
1243 StoreHeapNumberValue(result, value); 1248 StoreHeapNumberValue(result, value);
1244 return result; 1249 return result;
1245 } 1250 }
1246 1251
1247 Node* CodeStubAssembler::AllocateSeqOneByteString(int length) { 1252 Node* CodeStubAssembler::AllocateSeqOneByteString(int length) {
1248 Node* result = Allocate(SeqOneByteString::SizeFor(length)); 1253 Node* result = Allocate(SeqOneByteString::SizeFor(length));
1249 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex)); 1254 StoreMapNoWriteBarrier(result, LoadRoot(Heap::kOneByteStringMapRootIndex));
1250 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset, 1255 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kLengthOffset,
1251 SmiConstant(Smi::FromInt(length))); 1256 SmiConstant(Smi::FromInt(length)));
1252 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset, 1257 StoreObjectFieldNoWriteBarrier(result, SeqOneByteString::kHashFieldOffset,
(...skipping 3002 matching lines...) Expand 10 before | Expand all | Expand 10 after
4255 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot, 4260 TailCallStub(descriptor, handler, p->context, receiver, fake_name, p->slot,
4256 p->vector); 4261 p->vector);
4257 } 4262 }
4258 Bind(&miss); 4263 Bind(&miss);
4259 { 4264 {
4260 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot, 4265 TailCallRuntime(Runtime::kLoadGlobalIC_Miss, p->context, p->slot,
4261 p->vector); 4266 p->vector);
4262 } 4267 }
4263 } 4268 }
4264 4269
4270 Node* CodeStubAssembler::PrepareValueForWrite(Node* value,
4271 Representation representation,
4272 Label* bailout) {
4273 if (representation.IsDouble()) {
4274 Variable var_value(this, MachineRepresentation::kFloat64);
4275 Label if_smi(this), if_heap_object(this), done(this);
4276 Branch(WordIsSmi(value), &if_smi, &if_heap_object);
4277 Bind(&if_smi);
4278 {
4279 var_value.Bind(SmiToFloat64(value));
4280 Goto(&done);
4281 }
4282 Bind(&if_heap_object);
4283 {
4284 GotoUnless(
4285 Word32Equal(LoadInstanceType(value), Int32Constant(HEAP_NUMBER_TYPE)),
4286 bailout);
4287 var_value.Bind(LoadHeapNumberValue(value));
4288 Goto(&done);
4289 }
4290 Bind(&done);
4291 value = var_value.value();
4292 } else if (representation.IsHeapObject()) {
4293 // Field type is checked by the handler, here we only check if the value
4294 // is a heap object.
4295 GotoIf(WordIsSmi(value), bailout);
4296 } else if (representation.IsSmi()) {
4297 GotoUnless(WordIsSmi(value), bailout);
4298 } else {
4299 DCHECK(representation.IsTagged());
4300 }
4301 return value;
4302 }
4303
4304 void CodeStubAssembler::StoreNamedField(Node* object, FieldIndex index,
4305 Representation representation,
4306 Node* value, bool transition_to_field) {
4307 DCHECK_EQ(index.is_double(), representation.IsDouble());
4308
4309 bool store_value_as_double = representation.IsDouble();
4310 int offset = index.offset();
4311 Node* property_storage = object;
4312 if (!index.is_inobject()) {
4313 property_storage = LoadProperties(object);
4314 }
4315
4316 if (representation.IsDouble()) {
4317 if (!FLAG_unbox_double_fields || !index.is_inobject()) {
4318 if (transition_to_field) {
4319 Node* heap_number = AllocateHeapNumberWithValue(value, MUTABLE);
4320 // Store the new mutable heap number into the object.
4321 value = heap_number;
4322 store_value_as_double = false;
4323 } else {
4324 // Load the heap number.
4325 property_storage = LoadObjectField(property_storage, offset);
4326 // Store the double value into it.
4327 offset = HeapNumber::kValueOffset;
4328 }
4329 }
4330 }
4331
4332 if (store_value_as_double) {
4333 StoreObjectFieldNoWriteBarrier(property_storage, offset, value,
4334 MachineRepresentation::kFloat64);
4335 } else {
4336 StoreObjectField(property_storage, offset, value);
4337 }
4338 }
4339
4265 Node* CodeStubAssembler::EnumLength(Node* map) { 4340 Node* CodeStubAssembler::EnumLength(Node* map) {
4266 Node* bitfield_3 = LoadMapBitField3(map); 4341 Node* bitfield_3 = LoadMapBitField3(map);
4267 Node* enum_length = BitFieldDecode<Map::EnumLengthBits>(bitfield_3); 4342 Node* enum_length = BitFieldDecode<Map::EnumLengthBits>(bitfield_3);
4268 return SmiTag(enum_length); 4343 return SmiTag(enum_length);
4269 } 4344 }
4270 4345
4271 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache, 4346 void CodeStubAssembler::CheckEnumCache(Node* receiver, Label* use_cache,
4272 Label* use_runtime) { 4347 Label* use_runtime) {
4273 Variable current_js_object(this, MachineRepresentation::kTagged); 4348 Variable current_js_object(this, MachineRepresentation::kTagged);
4274 current_js_object.Bind(receiver); 4349 current_js_object.Bind(receiver);
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
4342 Heap::kTheHoleValueRootIndex); 4417 Heap::kTheHoleValueRootIndex);
4343 4418
4344 // Store the WeakCell in the feedback vector. 4419 // Store the WeakCell in the feedback vector.
4345 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER, 4420 StoreFixedArrayElement(feedback_vector, slot, cell, UPDATE_WRITE_BARRIER,
4346 CodeStubAssembler::SMI_PARAMETERS); 4421 CodeStubAssembler::SMI_PARAMETERS);
4347 return cell; 4422 return cell;
4348 } 4423 }
4349 4424
4350 } // namespace internal 4425 } // namespace internal
4351 } // namespace v8 4426 } // namespace v8
OLDNEW
« no previous file with comments | « src/code-stub-assembler.h ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698