OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_MIPS. |
6 #if defined(TARGET_ARCH_MIPS) | 6 #if defined(TARGET_ARCH_MIPS) |
7 | 7 |
8 #include "vm/flow_graph_compiler.h" | 8 #include "vm/flow_graph_compiler.h" |
9 | 9 |
10 #include "vm/ast_printer.h" | 10 #include "vm/ast_printer.h" |
(...skipping 502 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
513 // Clobbers: T0, T1, T2 | 513 // Clobbers: T0, T1, T2 |
514 // Note that this inlined code must be followed by the runtime_call code, as it | 514 // Note that this inlined code must be followed by the runtime_call code, as it |
515 // may fall through to it. Otherwise, this inline code will jump to the label | 515 // may fall through to it. Otherwise, this inline code will jump to the label |
516 // is_instance or to the label is_not_instance. | 516 // is_instance or to the label is_not_instance. |
517 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof( | 517 RawSubtypeTestCache* FlowGraphCompiler::GenerateInlineInstanceof( |
518 TokenPosition token_pos, | 518 TokenPosition token_pos, |
519 const AbstractType& type, | 519 const AbstractType& type, |
520 Label* is_instance_lbl, | 520 Label* is_instance_lbl, |
521 Label* is_not_instance_lbl) { | 521 Label* is_not_instance_lbl) { |
522 __ Comment("InlineInstanceof"); | 522 __ Comment("InlineInstanceof"); |
523 if (type.IsVoidType()) { | |
524 // A non-null value is returned from a void function, which will result in a | |
525 // type error. A null value is handled prior to executing this inline code. | |
526 return SubtypeTestCache::null(); | |
527 } | |
528 if (type.IsInstantiated()) { | 523 if (type.IsInstantiated()) { |
529 const Class& type_class = Class::ZoneHandle(zone(), type.type_class()); | 524 const Class& type_class = Class::ZoneHandle(zone(), type.type_class()); |
530 // A class equality check is only applicable with a dst type (not a | 525 // A class equality check is only applicable with a dst type (not a |
531 // function type) of a non-parameterized class or with a raw dst type of | 526 // function type) of a non-parameterized class or with a raw dst type of |
532 // a parameterized class. | 527 // a parameterized class. |
533 if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) { | 528 if (type.IsFunctionType() || (type_class.NumTypeArguments() > 0)) { |
534 return GenerateInstantiatedTypeWithArgumentsTest( | 529 return GenerateInstantiatedTypeWithArgumentsTest( |
535 token_pos, type, is_instance_lbl, is_not_instance_lbl); | 530 token_pos, type, is_instance_lbl, is_not_instance_lbl); |
536 // Fall through to runtime call. | 531 // Fall through to runtime call. |
537 } | 532 } |
(...skipping 22 matching lines...) Expand all Loading... |
560 // - A0: object. | 555 // - A0: object. |
561 // - A1: instantiator type arguments or raw_null. | 556 // - A1: instantiator type arguments or raw_null. |
562 // - A2: function type arguments or raw_null. | 557 // - A2: function type arguments or raw_null. |
563 // Returns: | 558 // Returns: |
564 // - true or false in V0. | 559 // - true or false in V0. |
565 void FlowGraphCompiler::GenerateInstanceOf(TokenPosition token_pos, | 560 void FlowGraphCompiler::GenerateInstanceOf(TokenPosition token_pos, |
566 intptr_t deopt_id, | 561 intptr_t deopt_id, |
567 const AbstractType& type, | 562 const AbstractType& type, |
568 LocationSummary* locs) { | 563 LocationSummary* locs) { |
569 ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded()); | 564 ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded()); |
570 ASSERT(!type.IsObjectType() && !type.IsDynamicType()); | 565 ASSERT(!type.IsObjectType() && !type.IsDynamicType() && !type.IsVoidType()); |
571 | 566 |
572 // Preserve instantiator type arguments (A1) and function type arguments (A2). | 567 // Preserve instantiator type arguments (A1) and function type arguments (A2). |
573 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 568 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
574 __ sw(A1, Address(SP, 1 * kWordSize)); | 569 __ sw(A1, Address(SP, 1 * kWordSize)); |
575 __ sw(A2, Address(SP, 0 * kWordSize)); | 570 __ sw(A2, Address(SP, 0 * kWordSize)); |
576 | 571 |
577 Label is_instance, is_not_instance; | 572 Label is_instance, is_not_instance; |
578 // If type is instantiated and non-parameterized, we can inline code | 573 // If type is instantiated and non-parameterized, we can inline code |
579 // checking whether the tested instance is a Smi. | 574 // checking whether the tested instance is a Smi. |
580 if (type.IsInstantiated()) { | 575 if (type.IsInstantiated()) { |
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
646 intptr_t deopt_id, | 641 intptr_t deopt_id, |
647 const AbstractType& dst_type, | 642 const AbstractType& dst_type, |
648 const String& dst_name, | 643 const String& dst_name, |
649 LocationSummary* locs) { | 644 LocationSummary* locs) { |
650 __ Comment("AssertAssignable"); | 645 __ Comment("AssertAssignable"); |
651 ASSERT(!token_pos.IsClassifying()); | 646 ASSERT(!token_pos.IsClassifying()); |
652 ASSERT(!dst_type.IsNull()); | 647 ASSERT(!dst_type.IsNull()); |
653 ASSERT(dst_type.IsFinalized()); | 648 ASSERT(dst_type.IsFinalized()); |
654 // Assignable check is skipped in FlowGraphBuilder, not here. | 649 // Assignable check is skipped in FlowGraphBuilder, not here. |
655 ASSERT(dst_type.IsMalformedOrMalbounded() || | 650 ASSERT(dst_type.IsMalformedOrMalbounded() || |
656 (!dst_type.IsDynamicType() && !dst_type.IsObjectType())); | 651 (!dst_type.IsDynamicType() && !dst_type.IsObjectType() && |
| 652 !dst_type.IsVoidType())); |
657 | 653 |
658 // Preserve instantiator type arguments (A1) and function type arguments (A2). | 654 // Preserve instantiator type arguments (A1) and function type arguments (A2). |
659 __ addiu(SP, SP, Immediate(-2 * kWordSize)); | 655 __ addiu(SP, SP, Immediate(-2 * kWordSize)); |
660 __ sw(A1, Address(SP, 1 * kWordSize)); | 656 __ sw(A1, Address(SP, 1 * kWordSize)); |
661 __ sw(A2, Address(SP, 0 * kWordSize)); | 657 __ sw(A2, Address(SP, 0 * kWordSize)); |
662 | 658 |
663 // A null object is always assignable and is returned as result. | 659 // A null object is always assignable and is returned as result. |
664 Label is_assignable, runtime_call; | 660 Label is_assignable, runtime_call; |
665 | 661 |
666 __ BranchEqual(A0, Object::null_object(), &is_assignable); | 662 __ BranchEqual(A0, Object::null_object(), &is_assignable); |
(...skipping 1148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1815 __ AddImmediate(SP, kDoubleSize); | 1811 __ AddImmediate(SP, kDoubleSize); |
1816 } | 1812 } |
1817 | 1813 |
1818 | 1814 |
1819 #undef __ | 1815 #undef __ |
1820 | 1816 |
1821 | 1817 |
1822 } // namespace dart | 1818 } // namespace dart |
1823 | 1819 |
1824 #endif // defined TARGET_ARCH_MIPS | 1820 #endif // defined TARGET_ARCH_MIPS |
OLD | NEW |