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

Side by Side Diff: src/compiler/js-generic-lowering.cc

Issue 1513543003: [turbofan] Make MachineType a pair of enums. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Moar rebase Created 5 years 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/compiler/js-builtin-reducer.cc ('k') | src/compiler/js-inlining.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 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/code-factory.h" 5 #include "src/code-factory.h"
6 #include "src/code-stubs.h" 6 #include "src/code-stubs.h"
7 #include "src/compiler/common-operator.h" 7 #include "src/compiler/common-operator.h"
8 #include "src/compiler/js-generic-lowering.h" 8 #include "src/compiler/js-generic-lowering.h"
9 #include "src/compiler/js-graph.h" 9 #include "src/compiler/js-graph.h"
10 #include "src/compiler/machine-operator.h" 10 #include "src/compiler/machine-operator.h"
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
152 ? NodeProperties::GetEffectInput(node) 152 ? NodeProperties::GetEffectInput(node)
153 : graph()->start(); 153 : graph()->start();
154 inputs.push_back(effect); 154 inputs.push_back(effect);
155 Node* control = (node->op()->ControlInputCount() > 0) 155 Node* control = (node->op()->ControlInputCount() > 0)
156 ? NodeProperties::GetControlInput(node) 156 ? NodeProperties::GetControlInput(node)
157 : graph()->start(); 157 : graph()->start();
158 inputs.push_back(control); 158 inputs.push_back(control);
159 CallDescriptor* desc_compare = Linkage::GetStubCallDescriptor( 159 CallDescriptor* desc_compare = Linkage::GetStubCallDescriptor(
160 isolate(), zone(), callable.descriptor(), 0, 160 isolate(), zone(), callable.descriptor(), 0,
161 CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node), 161 CallDescriptor::kPatchableCallSiteWithNop | FlagsForNode(node),
162 Operator::kNoProperties, kMachIntPtr); 162 Operator::kNoProperties, MachineType::IntPtr());
163 Node* compare = 163 Node* compare =
164 graph()->NewNode(common()->Call(desc_compare), 164 graph()->NewNode(common()->Call(desc_compare),
165 static_cast<int>(inputs.size()), &inputs.front()); 165 static_cast<int>(inputs.size()), &inputs.front());
166 166
167 // Decide how the return value from the above CompareIC can be converted into 167 // Decide how the return value from the above CompareIC can be converted into
168 // a JavaScript boolean oddball depending on the given token. 168 // a JavaScript boolean oddball depending on the given token.
169 Node* false_value = jsgraph()->FalseConstant(); 169 Node* false_value = jsgraph()->FalseConstant();
170 Node* true_value = jsgraph()->TrueConstant(); 170 Node* true_value = jsgraph()->TrueConstant();
171 const Operator* op = nullptr; 171 const Operator* op = nullptr;
172 switch (token) { 172 switch (token) {
(...skipping 24 matching lines...) Expand all
197 UNREACHABLE(); 197 UNREACHABLE();
198 } 198 }
199 Node* booleanize = graph()->NewNode(op, compare, jsgraph()->ZeroConstant()); 199 Node* booleanize = graph()->NewNode(op, compare, jsgraph()->ZeroConstant());
200 200
201 // Finally patch the original node to select a boolean. 201 // Finally patch the original node to select a boolean.
202 NodeProperties::ReplaceUses(node, node, compare, compare, compare); 202 NodeProperties::ReplaceUses(node, node, compare, compare, compare);
203 node->TrimInputCount(3); 203 node->TrimInputCount(3);
204 node->ReplaceInput(0, booleanize); 204 node->ReplaceInput(0, booleanize);
205 node->ReplaceInput(1, true_value); 205 node->ReplaceInput(1, true_value);
206 node->ReplaceInput(2, false_value); 206 node->ReplaceInput(2, false_value);
207 NodeProperties::ChangeOp(node, common()->Select(kMachAnyTagged)); 207 NodeProperties::ChangeOp(node,
208 common()->Select(MachineRepresentation::kTagged));
208 } 209 }
209 210
210 211
211 void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable, 212 void JSGenericLowering::ReplaceWithStubCall(Node* node, Callable callable,
212 CallDescriptor::Flags flags) { 213 CallDescriptor::Flags flags) {
213 Operator::Properties properties = node->op()->properties(); 214 Operator::Properties properties = node->op()->properties();
214 CallDescriptor* desc = Linkage::GetStubCallDescriptor( 215 CallDescriptor* desc = Linkage::GetStubCallDescriptor(
215 isolate(), zone(), callable.descriptor(), 0, flags, properties); 216 isolate(), zone(), callable.descriptor(), 0, flags, properties);
216 Node* stub_code = jsgraph()->HeapConstant(callable.code()); 217 Node* stub_code = jsgraph()->HeapConstant(callable.code());
217 node->InsertInput(zone(), 0, stub_code); 218 node->InsertInput(zone(), 0, stub_code);
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after
300 301
301 void JSGenericLowering::LowerJSLoadGlobal(Node* node) { 302 void JSGenericLowering::LowerJSLoadGlobal(Node* node) {
302 Node* context = NodeProperties::GetContextInput(node); 303 Node* context = NodeProperties::GetContextInput(node);
303 Node* effect = NodeProperties::GetEffectInput(node); 304 Node* effect = NodeProperties::GetEffectInput(node);
304 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); 305 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node);
305 const LoadGlobalParameters& p = LoadGlobalParametersOf(node->op()); 306 const LoadGlobalParameters& p = LoadGlobalParametersOf(node->op());
306 Callable callable = CodeFactory::LoadICInOptimizedCode( 307 Callable callable = CodeFactory::LoadICInOptimizedCode(
307 isolate(), p.typeof_mode(), SLOPPY, UNINITIALIZED); 308 isolate(), p.typeof_mode(), SLOPPY, UNINITIALIZED);
308 // Load global object from the context. 309 // Load global object from the context.
309 Node* native_context = 310 Node* native_context =
310 graph()->NewNode(machine()->Load(kMachAnyTagged), context, 311 graph()->NewNode(machine()->Load(MachineType::AnyTagged()), context,
311 jsgraph()->IntPtrConstant( 312 jsgraph()->IntPtrConstant(
312 Context::SlotOffset(Context::NATIVE_CONTEXT_INDEX)), 313 Context::SlotOffset(Context::NATIVE_CONTEXT_INDEX)),
313 effect, graph()->start()); 314 effect, graph()->start());
314 Node* global = graph()->NewNode( 315 Node* global = graph()->NewNode(
315 machine()->Load(kMachAnyTagged), native_context, 316 machine()->Load(MachineType::AnyTagged()), native_context,
316 jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)), 317 jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)),
317 effect, graph()->start()); 318 effect, graph()->start());
318 node->InsertInput(zone(), 0, global); 319 node->InsertInput(zone(), 0, global);
319 node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name())); 320 node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
320 node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index())); 321 node->InsertInput(zone(), 2, jsgraph()->SmiConstant(p.feedback().index()));
321 ReplaceWithStubCall(node, callable, flags); 322 ReplaceWithStubCall(node, callable, flags);
322 } 323 }
323 324
324 325
325 void JSGenericLowering::LowerJSStoreProperty(Node* node) { 326 void JSGenericLowering::LowerJSStoreProperty(Node* node) {
(...skipping 24 matching lines...) Expand all
350 351
351 void JSGenericLowering::LowerJSStoreGlobal(Node* node) { 352 void JSGenericLowering::LowerJSStoreGlobal(Node* node) {
352 Node* context = NodeProperties::GetContextInput(node); 353 Node* context = NodeProperties::GetContextInput(node);
353 Node* effect = NodeProperties::GetEffectInput(node); 354 Node* effect = NodeProperties::GetEffectInput(node);
354 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); 355 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node);
355 const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op()); 356 const StoreGlobalParameters& p = StoreGlobalParametersOf(node->op());
356 Callable callable = CodeFactory::StoreICInOptimizedCode( 357 Callable callable = CodeFactory::StoreICInOptimizedCode(
357 isolate(), p.language_mode(), UNINITIALIZED); 358 isolate(), p.language_mode(), UNINITIALIZED);
358 // Load global object from the context. 359 // Load global object from the context.
359 Node* native_context = 360 Node* native_context =
360 graph()->NewNode(machine()->Load(kMachAnyTagged), context, 361 graph()->NewNode(machine()->Load(MachineType::AnyTagged()), context,
361 jsgraph()->IntPtrConstant( 362 jsgraph()->IntPtrConstant(
362 Context::SlotOffset(Context::NATIVE_CONTEXT_INDEX)), 363 Context::SlotOffset(Context::NATIVE_CONTEXT_INDEX)),
363 effect, graph()->start()); 364 effect, graph()->start());
364 Node* global = graph()->NewNode( 365 Node* global = graph()->NewNode(
365 machine()->Load(kMachAnyTagged), native_context, 366 machine()->Load(MachineType::AnyTagged()), native_context,
366 jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)), 367 jsgraph()->IntPtrConstant(Context::SlotOffset(Context::EXTENSION_INDEX)),
367 effect, graph()->start()); 368 effect, graph()->start());
368 node->InsertInput(zone(), 0, global); 369 node->InsertInput(zone(), 0, global);
369 node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name())); 370 node->InsertInput(zone(), 1, jsgraph()->HeapConstant(p.name()));
370 DCHECK(p.feedback().index() != -1); 371 DCHECK(p.feedback().index() != -1);
371 node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index())); 372 node->InsertInput(zone(), 3, jsgraph()->SmiConstant(p.feedback().index()));
372 ReplaceWithStubCall(node, callable, 373 ReplaceWithStubCall(node, callable,
373 CallDescriptor::kPatchableCallSite | flags); 374 CallDescriptor::kPatchableCallSite | flags);
374 } 375 }
375 376
(...skipping 15 matching lines...) Expand all
391 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node); 392 CallDescriptor::Flags flags = AdjustFrameStatesForCall(node);
392 Callable callable = CodeFactory::InstanceOf(isolate()); 393 Callable callable = CodeFactory::InstanceOf(isolate());
393 ReplaceWithStubCall(node, callable, flags); 394 ReplaceWithStubCall(node, callable, flags);
394 } 395 }
395 396
396 397
397 void JSGenericLowering::LowerJSLoadContext(Node* node) { 398 void JSGenericLowering::LowerJSLoadContext(Node* node) {
398 const ContextAccess& access = ContextAccessOf(node->op()); 399 const ContextAccess& access = ContextAccessOf(node->op());
399 for (size_t i = 0; i < access.depth(); ++i) { 400 for (size_t i = 0; i < access.depth(); ++i) {
400 node->ReplaceInput( 401 node->ReplaceInput(
401 0, graph()->NewNode(machine()->Load(kMachAnyTagged), 402 0, graph()->NewNode(machine()->Load(MachineType::AnyTagged()),
402 NodeProperties::GetValueInput(node, 0), 403 NodeProperties::GetValueInput(node, 0),
403 jsgraph()->Int32Constant( 404 jsgraph()->Int32Constant(
404 Context::SlotOffset(Context::PREVIOUS_INDEX)), 405 Context::SlotOffset(Context::PREVIOUS_INDEX)),
405 NodeProperties::GetEffectInput(node), 406 NodeProperties::GetEffectInput(node),
406 graph()->start())); 407 graph()->start()));
407 } 408 }
408 node->ReplaceInput(1, jsgraph()->Int32Constant(Context::SlotOffset( 409 node->ReplaceInput(1, jsgraph()->Int32Constant(Context::SlotOffset(
409 static_cast<int>(access.index())))); 410 static_cast<int>(access.index()))));
410 node->AppendInput(zone(), graph()->start()); 411 node->AppendInput(zone(), graph()->start());
411 NodeProperties::ChangeOp(node, machine()->Load(kMachAnyTagged)); 412 NodeProperties::ChangeOp(node, machine()->Load(MachineType::AnyTagged()));
412 } 413 }
413 414
414 415
415 void JSGenericLowering::LowerJSStoreContext(Node* node) { 416 void JSGenericLowering::LowerJSStoreContext(Node* node) {
416 const ContextAccess& access = ContextAccessOf(node->op()); 417 const ContextAccess& access = ContextAccessOf(node->op());
417 for (size_t i = 0; i < access.depth(); ++i) { 418 for (size_t i = 0; i < access.depth(); ++i) {
418 node->ReplaceInput( 419 node->ReplaceInput(
419 0, graph()->NewNode(machine()->Load(kMachAnyTagged), 420 0, graph()->NewNode(machine()->Load(MachineType::AnyTagged()),
420 NodeProperties::GetValueInput(node, 0), 421 NodeProperties::GetValueInput(node, 0),
421 jsgraph()->Int32Constant( 422 jsgraph()->Int32Constant(
422 Context::SlotOffset(Context::PREVIOUS_INDEX)), 423 Context::SlotOffset(Context::PREVIOUS_INDEX)),
423 NodeProperties::GetEffectInput(node), 424 NodeProperties::GetEffectInput(node),
424 graph()->start())); 425 graph()->start()));
425 } 426 }
426 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1)); 427 node->ReplaceInput(2, NodeProperties::GetValueInput(node, 1));
427 node->ReplaceInput(1, jsgraph()->Int32Constant(Context::SlotOffset( 428 node->ReplaceInput(1, jsgraph()->Int32Constant(Context::SlotOffset(
428 static_cast<int>(access.index())))); 429 static_cast<int>(access.index()))));
429 NodeProperties::ChangeOp(node, machine()->Store(StoreRepresentation( 430 NodeProperties::ChangeOp(
430 kMachAnyTagged, kFullWriteBarrier))); 431 node, machine()->Store(StoreRepresentation(MachineType::AnyTagged(),
432 kFullWriteBarrier)));
431 } 433 }
432 434
433 435
434 void JSGenericLowering::LowerJSLoadDynamic(Node* node) { 436 void JSGenericLowering::LowerJSLoadDynamic(Node* node) {
435 const DynamicAccess& access = DynamicAccessOf(node->op()); 437 const DynamicAccess& access = DynamicAccessOf(node->op());
436 Runtime::FunctionId function_id = 438 Runtime::FunctionId function_id =
437 (access.typeof_mode() == NOT_INSIDE_TYPEOF) 439 (access.typeof_mode() == NOT_INSIDE_TYPEOF)
438 ? Runtime::kLoadLookupSlot 440 ? Runtime::kLoadLookupSlot
439 : Runtime::kLoadLookupSlotNoReferenceError; 441 : Runtime::kLoadLookupSlotNoReferenceError;
440 Node* projection = graph()->NewNode(common()->Projection(0), node); 442 Node* projection = graph()->NewNode(common()->Projection(0), node);
(...skipping 178 matching lines...) Expand 10 before | Expand all | Expand 10 after
619 zone(), function->function_id, 1, Operator::kNoProperties, 621 zone(), function->function_id, 1, Operator::kNoProperties,
620 CallDescriptor::kNeedsFrameState); 622 CallDescriptor::kNeedsFrameState);
621 Node* cache_type = effect = graph()->NewNode( 623 Node* cache_type = effect = graph()->NewNode(
622 common()->Call(descriptor), 624 common()->Call(descriptor),
623 jsgraph()->CEntryStubConstant(function->result_size), object, 625 jsgraph()->CEntryStubConstant(function->result_size), object,
624 jsgraph()->ExternalConstant(function->function_id), 626 jsgraph()->ExternalConstant(function->function_id),
625 jsgraph()->Int32Constant(1), context, frame_state, effect, control); 627 jsgraph()->Int32Constant(1), context, frame_state, effect, control);
626 control = graph()->NewNode(common()->IfSuccess(), cache_type); 628 control = graph()->NewNode(common()->IfSuccess(), cache_type);
627 629
628 Node* object_map = effect = graph()->NewNode( 630 Node* object_map = effect = graph()->NewNode(
629 machine()->Load(kMachAnyTagged), object, 631 machine()->Load(MachineType::AnyTagged()), object,
630 jsgraph()->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag), 632 jsgraph()->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag),
631 effect, control); 633 effect, control);
632 Node* cache_type_map = effect = graph()->NewNode( 634 Node* cache_type_map = effect = graph()->NewNode(
633 machine()->Load(kMachAnyTagged), cache_type, 635 machine()->Load(MachineType::AnyTagged()), cache_type,
634 jsgraph()->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag), 636 jsgraph()->IntPtrConstant(HeapObject::kMapOffset - kHeapObjectTag),
635 effect, control); 637 effect, control);
636 Node* meta_map = jsgraph()->HeapConstant(isolate()->factory()->meta_map()); 638 Node* meta_map = jsgraph()->HeapConstant(isolate()->factory()->meta_map());
637 639
638 // If we got a map from the GetPropertyNamesFast runtime call, we can do a 640 // If we got a map from the GetPropertyNamesFast runtime call, we can do a
639 // fast modification check. Otherwise, we got a fixed array, and we have to 641 // fast modification check. Otherwise, we got a fixed array, and we have to
640 // perform a slow check on every iteration. 642 // perform a slow check on every iteration.
641 Node* check0 = 643 Node* check0 =
642 graph()->NewNode(machine()->WordEqual(), cache_type_map, meta_map); 644 graph()->NewNode(machine()->WordEqual(), cache_type_map, meta_map);
643 Node* branch0 = 645 Node* branch0 =
644 graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control); 646 graph()->NewNode(common()->Branch(BranchHint::kTrue), check0, control);
645 647
646 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0); 648 Node* if_true0 = graph()->NewNode(common()->IfTrue(), branch0);
647 Node* cache_array_true0; 649 Node* cache_array_true0;
648 Node* cache_length_true0; 650 Node* cache_length_true0;
649 Node* cache_type_true0; 651 Node* cache_type_true0;
650 Node* etrue0; 652 Node* etrue0;
651 { 653 {
652 // Enum cache case. 654 // Enum cache case.
653 Node* cache_type_enum_length = etrue0 = graph()->NewNode( 655 Node* cache_type_enum_length = etrue0 = graph()->NewNode(
654 machine()->Load(kMachUint32), cache_type, 656 machine()->Load(MachineType::Uint32()), cache_type,
655 jsgraph()->IntPtrConstant(Map::kBitField3Offset - kHeapObjectTag), 657 jsgraph()->IntPtrConstant(Map::kBitField3Offset - kHeapObjectTag),
656 effect, if_true0); 658 effect, if_true0);
657 cache_type_enum_length = 659 cache_type_enum_length =
658 graph()->NewNode(machine()->Word32And(), cache_type_enum_length, 660 graph()->NewNode(machine()->Word32And(), cache_type_enum_length,
659 jsgraph()->Uint32Constant(Map::EnumLengthBits::kMask)); 661 jsgraph()->Uint32Constant(Map::EnumLengthBits::kMask));
660 662
661 Node* check1 = 663 Node* check1 =
662 graph()->NewNode(machine()->Word32Equal(), cache_type_enum_length, 664 graph()->NewNode(machine()->Word32Equal(), cache_type_enum_length,
663 jsgraph()->Int32Constant(0)); 665 jsgraph()->Int32Constant(0));
664 Node* branch1 = 666 Node* branch1 =
665 graph()->NewNode(common()->Branch(BranchHint::kTrue), check1, if_true0); 667 graph()->NewNode(common()->Branch(BranchHint::kTrue), check1, if_true0);
666 668
667 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); 669 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
668 Node* cache_array_true1; 670 Node* cache_array_true1;
669 Node* etrue1; 671 Node* etrue1;
670 { 672 {
671 // No properties to enumerate. 673 // No properties to enumerate.
672 cache_array_true1 = 674 cache_array_true1 =
673 jsgraph()->HeapConstant(isolate()->factory()->empty_fixed_array()); 675 jsgraph()->HeapConstant(isolate()->factory()->empty_fixed_array());
674 etrue1 = etrue0; 676 etrue1 = etrue0;
675 } 677 }
676 678
677 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); 679 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
678 Node* cache_array_false1; 680 Node* cache_array_false1;
679 Node* efalse1; 681 Node* efalse1;
680 { 682 {
681 // Load the enumeration cache from the instance descriptors of {object}. 683 // Load the enumeration cache from the instance descriptors of {object}.
682 Node* object_map_descriptors = efalse1 = graph()->NewNode( 684 Node* object_map_descriptors = efalse1 = graph()->NewNode(
683 machine()->Load(kMachAnyTagged), object_map, 685 machine()->Load(MachineType::AnyTagged()), object_map,
684 jsgraph()->IntPtrConstant(Map::kDescriptorsOffset - kHeapObjectTag), 686 jsgraph()->IntPtrConstant(Map::kDescriptorsOffset - kHeapObjectTag),
685 etrue0, if_false1); 687 etrue0, if_false1);
686 Node* object_map_enum_cache = efalse1 = graph()->NewNode( 688 Node* object_map_enum_cache = efalse1 = graph()->NewNode(
687 machine()->Load(kMachAnyTagged), object_map_descriptors, 689 machine()->Load(MachineType::AnyTagged()), object_map_descriptors,
688 jsgraph()->IntPtrConstant(DescriptorArray::kEnumCacheOffset - 690 jsgraph()->IntPtrConstant(DescriptorArray::kEnumCacheOffset -
689 kHeapObjectTag), 691 kHeapObjectTag),
690 efalse1, if_false1); 692 efalse1, if_false1);
691 cache_array_false1 = efalse1 = graph()->NewNode( 693 cache_array_false1 = efalse1 = graph()->NewNode(
692 machine()->Load(kMachAnyTagged), object_map_enum_cache, 694 machine()->Load(MachineType::AnyTagged()), object_map_enum_cache,
693 jsgraph()->IntPtrConstant( 695 jsgraph()->IntPtrConstant(
694 DescriptorArray::kEnumCacheBridgeCacheOffset - kHeapObjectTag), 696 DescriptorArray::kEnumCacheBridgeCacheOffset - kHeapObjectTag),
695 efalse1, if_false1); 697 efalse1, if_false1);
696 } 698 }
697 699
698 if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); 700 if_true0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
699 etrue0 = 701 etrue0 =
700 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_true0); 702 graph()->NewNode(common()->EffectPhi(2), etrue1, efalse1, if_true0);
701 cache_array_true0 = 703 cache_array_true0 =
702 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_array_true1, 704 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
703 cache_array_false1, if_true0); 705 cache_array_true1, cache_array_false1, if_true0);
704 706
705 cache_length_true0 = graph()->NewNode( 707 cache_length_true0 = graph()->NewNode(
706 machine()->WordShl(), 708 machine()->WordShl(),
707 machine()->Is64() 709 machine()->Is64()
708 ? graph()->NewNode(machine()->ChangeUint32ToUint64(), 710 ? graph()->NewNode(machine()->ChangeUint32ToUint64(),
709 cache_type_enum_length) 711 cache_type_enum_length)
710 : cache_type_enum_length, 712 : cache_type_enum_length,
711 jsgraph()->Int32Constant(kSmiShiftSize + kSmiTagSize)); 713 jsgraph()->Int32Constant(kSmiShiftSize + kSmiTagSize));
712 cache_type_true0 = cache_type; 714 cache_type_true0 = cache_type;
713 } 715 }
714 716
715 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0); 717 Node* if_false0 = graph()->NewNode(common()->IfFalse(), branch0);
716 Node* cache_array_false0; 718 Node* cache_array_false0;
717 Node* cache_length_false0; 719 Node* cache_length_false0;
718 Node* cache_type_false0; 720 Node* cache_type_false0;
719 Node* efalse0; 721 Node* efalse0;
720 { 722 {
721 // FixedArray case. 723 // FixedArray case.
722 Node* object_instance_type = efalse0 = graph()->NewNode( 724 Node* object_instance_type = efalse0 = graph()->NewNode(
723 machine()->Load(kMachUint8), object_map, 725 machine()->Load(MachineType::Uint8()), object_map,
724 jsgraph()->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag), 726 jsgraph()->IntPtrConstant(Map::kInstanceTypeOffset - kHeapObjectTag),
725 effect, if_false0); 727 effect, if_false0);
726 728
727 Node* check1 = 729 Node* check1 =
728 graph()->NewNode(machine()->Word32Equal(), object_instance_type, 730 graph()->NewNode(machine()->Word32Equal(), object_instance_type,
729 jsgraph()->Uint32Constant(JS_PROXY_TYPE)); 731 jsgraph()->Uint32Constant(JS_PROXY_TYPE));
730 Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse), 732 Node* branch1 = graph()->NewNode(common()->Branch(BranchHint::kFalse),
731 check1, if_false0); 733 check1, if_false0);
732 734
733 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1); 735 Node* if_true1 = graph()->NewNode(common()->IfTrue(), branch1);
734 Node* cache_type_true1 = jsgraph()->ZeroConstant(); // Zero indicates proxy 736 Node* cache_type_true1 = jsgraph()->ZeroConstant(); // Zero indicates proxy
735 737
736 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1); 738 Node* if_false1 = graph()->NewNode(common()->IfFalse(), branch1);
737 Node* cache_type_false1 = jsgraph()->OneConstant(); // One means slow check 739 Node* cache_type_false1 = jsgraph()->OneConstant(); // One means slow check
738 740
739 if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1); 741 if_false0 = graph()->NewNode(common()->Merge(2), if_true1, if_false1);
740 cache_type_false0 = 742 cache_type_false0 =
741 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_type_true1, 743 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
742 cache_type_false1, if_false0); 744 cache_type_true1, cache_type_false1, if_false0);
743 745
744 cache_array_false0 = cache_type; 746 cache_array_false0 = cache_type;
745 cache_length_false0 = efalse0 = graph()->NewNode( 747 cache_length_false0 = efalse0 = graph()->NewNode(
746 machine()->Load(kMachAnyTagged), cache_array_false0, 748 machine()->Load(MachineType::AnyTagged()), cache_array_false0,
747 jsgraph()->IntPtrConstant(FixedArray::kLengthOffset - kHeapObjectTag), 749 jsgraph()->IntPtrConstant(FixedArray::kLengthOffset - kHeapObjectTag),
748 efalse0, if_false0); 750 efalse0, if_false0);
749 } 751 }
750 752
751 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0); 753 control = graph()->NewNode(common()->Merge(2), if_true0, if_false0);
752 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control); 754 effect = graph()->NewNode(common()->EffectPhi(2), etrue0, efalse0, control);
753 Node* cache_array = 755 Node* cache_array =
754 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_array_true0, 756 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
755 cache_array_false0, control); 757 cache_array_true0, cache_array_false0, control);
756 Node* cache_length = 758 Node* cache_length =
757 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), cache_length_true0, 759 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
758 cache_length_false0, control); 760 cache_length_true0, cache_length_false0, control);
759 cache_type = graph()->NewNode(common()->Phi(kMachAnyTagged, 2), 761 cache_type =
760 cache_type_true0, cache_type_false0, control); 762 graph()->NewNode(common()->Phi(MachineRepresentation::kTagged, 2),
763 cache_type_true0, cache_type_false0, control);
761 764
762 for (auto edge : node->use_edges()) { 765 for (auto edge : node->use_edges()) {
763 if (NodeProperties::IsEffectEdge(edge)) { 766 if (NodeProperties::IsEffectEdge(edge)) {
764 edge.UpdateTo(effect); 767 edge.UpdateTo(effect);
765 } else if (NodeProperties::IsControlEdge(edge)) { 768 } else if (NodeProperties::IsControlEdge(edge)) {
766 Node* const use = edge.from(); 769 Node* const use = edge.from();
767 if (use->opcode() == IrOpcode::kIfSuccess) { 770 if (use->opcode() == IrOpcode::kIfSuccess) {
768 use->ReplaceUses(control); 771 use->ReplaceUses(control);
769 use->Kill(); 772 use->Kill();
770 } else if (use->opcode() == IrOpcode::kIfException) { 773 } else if (use->opcode() == IrOpcode::kIfException) {
(...skipping 29 matching lines...) Expand all
800 ReplaceWithRuntimeCall(node, Runtime::kForInStep); 803 ReplaceWithRuntimeCall(node, Runtime::kForInStep);
801 } 804 }
802 805
803 806
804 void JSGenericLowering::LowerJSLoadMessage(Node* node) { 807 void JSGenericLowering::LowerJSLoadMessage(Node* node) {
805 ExternalReference message_address = 808 ExternalReference message_address =
806 ExternalReference::address_of_pending_message_obj(isolate()); 809 ExternalReference::address_of_pending_message_obj(isolate());
807 node->RemoveInput(NodeProperties::FirstContextIndex(node)); 810 node->RemoveInput(NodeProperties::FirstContextIndex(node));
808 node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address)); 811 node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address));
809 node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0)); 812 node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0));
810 NodeProperties::ChangeOp(node, machine()->Load(kMachAnyTagged)); 813 NodeProperties::ChangeOp(node, machine()->Load(MachineType::AnyTagged()));
811 } 814 }
812 815
813 816
814 void JSGenericLowering::LowerJSStoreMessage(Node* node) { 817 void JSGenericLowering::LowerJSStoreMessage(Node* node) {
815 ExternalReference message_address = 818 ExternalReference message_address =
816 ExternalReference::address_of_pending_message_obj(isolate()); 819 ExternalReference::address_of_pending_message_obj(isolate());
817 node->RemoveInput(NodeProperties::FirstContextIndex(node)); 820 node->RemoveInput(NodeProperties::FirstContextIndex(node));
818 node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address)); 821 node->InsertInput(zone(), 0, jsgraph()->ExternalConstant(message_address));
819 node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0)); 822 node->InsertInput(zone(), 1, jsgraph()->IntPtrConstant(0));
820 StoreRepresentation representation(kMachAnyTagged, kNoWriteBarrier); 823 StoreRepresentation representation(MachineType::AnyTagged(), kNoWriteBarrier);
821 NodeProperties::ChangeOp(node, machine()->Store(representation)); 824 NodeProperties::ChangeOp(node, machine()->Store(representation));
822 } 825 }
823 826
824 827
825 void JSGenericLowering::LowerJSYield(Node* node) { UNIMPLEMENTED(); } 828 void JSGenericLowering::LowerJSYield(Node* node) { UNIMPLEMENTED(); }
826 829
827 830
828 void JSGenericLowering::LowerJSStackCheck(Node* node) { 831 void JSGenericLowering::LowerJSStackCheck(Node* node) {
829 Node* effect = NodeProperties::GetEffectInput(node); 832 Node* effect = NodeProperties::GetEffectInput(node);
830 Node* control = NodeProperties::GetControlInput(node); 833 Node* control = NodeProperties::GetControlInput(node);
831 834
832 Node* limit = graph()->NewNode( 835 Node* limit = graph()->NewNode(
833 machine()->Load(kMachPtr), 836 machine()->Load(MachineType::Pointer()),
834 jsgraph()->ExternalConstant( 837 jsgraph()->ExternalConstant(
835 ExternalReference::address_of_stack_limit(isolate())), 838 ExternalReference::address_of_stack_limit(isolate())),
836 jsgraph()->IntPtrConstant(0), effect, control); 839 jsgraph()->IntPtrConstant(0), effect, control);
837 Node* pointer = graph()->NewNode(machine()->LoadStackPointer()); 840 Node* pointer = graph()->NewNode(machine()->LoadStackPointer());
838 841
839 Node* check = graph()->NewNode(machine()->UintLessThan(), limit, pointer); 842 Node* check = graph()->NewNode(machine()->UintLessThan(), limit, pointer);
840 Node* branch = 843 Node* branch =
841 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control); 844 graph()->NewNode(common()->Branch(BranchHint::kTrue), check, control);
842 845
843 Node* if_true = graph()->NewNode(common()->IfTrue(), branch); 846 Node* if_true = graph()->NewNode(common()->IfTrue(), branch);
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
882 } 885 }
883 886
884 887
885 MachineOperatorBuilder* JSGenericLowering::machine() const { 888 MachineOperatorBuilder* JSGenericLowering::machine() const {
886 return jsgraph()->machine(); 889 return jsgraph()->machine();
887 } 890 }
888 891
889 } // namespace compiler 892 } // namespace compiler
890 } // namespace internal 893 } // namespace internal
891 } // namespace v8 894 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/js-builtin-reducer.cc ('k') | src/compiler/js-inlining.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698