OLD | NEW |
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2012, 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 // Class for intrinsifying functions. | 4 // Class for intrinsifying functions. |
5 | 5 |
6 #include "vm/assembler.h" | 6 #include "vm/assembler.h" |
7 #include "vm/compiler.h" | 7 #include "vm/compiler.h" |
8 #include "vm/cpu.h" | 8 #include "vm/cpu.h" |
9 #include "vm/flags.h" | 9 #include "vm/flags.h" |
10 #include "vm/flow_graph.h" | 10 #include "vm/flow_graph.h" |
(...skipping 514 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
525 rep = kUnboxedInt32x4; | 525 rep = kUnboxedInt32x4; |
526 break; | 526 break; |
527 case kTypedDataFloat64x2ArrayCid: | 527 case kTypedDataFloat64x2ArrayCid: |
528 value_check_cid = kFloat64x2Cid; | 528 value_check_cid = kFloat64x2Cid; |
529 rep = kUnboxedFloat64x2; | 529 rep = kUnboxedFloat64x2; |
530 break; | 530 break; |
531 default: | 531 default: |
532 // Float32/Float64 case already handled. | 532 // Float32/Float64 case already handled. |
533 break; | 533 break; |
534 } | 534 } |
535 const ICData& value_check = ICData::ZoneHandle( | 535 Zone* zone = flow_graph->zone(); |
536 ICData::New(flow_graph->function(), | 536 CallTargets* value_check = new (zone) CallTargets(); |
537 Symbols::Empty(), // Dummy function name. | 537 value_check->Add(CidRangeTarget(value_check_cid, value_check_cid, |
538 Object::empty_array(), // Dummy args. descr. | 538 &flow_graph->function(), 1)); |
539 Thread::kNoDeoptId, 1, false)); | |
540 value_check.AddReceiverCheck(value_check_cid, flow_graph->function()); | |
541 builder.AddInstruction( | 539 builder.AddInstruction( |
542 new CheckClassInstr(new Value(value), Thread::kNoDeoptId, value_check, | 540 new CheckClassInstr(new Value(value), Thread::kNoDeoptId, |
543 builder.TokenPos())); | 541 *value_check, builder.TokenPos())); |
544 value = builder.AddUnboxInstr(rep, new Value(value), | 542 value = builder.AddUnboxInstr(rep, new Value(value), |
545 /* is_checked = */ true); | 543 /* is_checked = */ true); |
546 if (array_cid == kTypedDataFloat32ArrayCid) { | 544 if (array_cid == kTypedDataFloat32ArrayCid) { |
547 value = builder.AddDefinition( | 545 value = builder.AddDefinition( |
548 new DoubleToFloatInstr(new Value(value), Thread::kNoDeoptId)); | 546 new DoubleToFloatInstr(new Value(value), Thread::kNoDeoptId)); |
549 } | 547 } |
550 break; | 548 break; |
551 } | 549 } |
552 default: | 550 default: |
553 UNREACHABLE(); | 551 UNREACHABLE(); |
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
723 | 721 |
724 bool Intrinsifier::Build_ExternalTwoByteStringCodeUnitAt( | 722 bool Intrinsifier::Build_ExternalTwoByteStringCodeUnitAt( |
725 FlowGraph* flow_graph) { | 723 FlowGraph* flow_graph) { |
726 return BuildCodeUnitAt(flow_graph, kExternalTwoByteStringCid); | 724 return BuildCodeUnitAt(flow_graph, kExternalTwoByteStringCid); |
727 } | 725 } |
728 | 726 |
729 | 727 |
730 static bool BuildBinaryFloat32x4Op(FlowGraph* flow_graph, Token::Kind kind) { | 728 static bool BuildBinaryFloat32x4Op(FlowGraph* flow_graph, Token::Kind kind) { |
731 if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false; | 729 if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false; |
732 | 730 |
| 731 Zone* zone = flow_graph->zone(); |
733 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); | 732 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); |
734 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); | 733 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); |
735 BlockBuilder builder(flow_graph, normal_entry); | 734 BlockBuilder builder(flow_graph, normal_entry); |
736 | 735 |
737 Definition* right = builder.AddParameter(1); | 736 Definition* right = builder.AddParameter(1); |
738 Definition* left = builder.AddParameter(2); | 737 Definition* left = builder.AddParameter(2); |
739 | 738 |
740 const ICData& value_check = ICData::ZoneHandle(ICData::New( | 739 CallTargets* value_check = new (zone) CallTargets(); |
741 flow_graph->function(), String::Handle(flow_graph->function().name()), | 740 value_check->Add( |
742 Object::empty_array(), // Dummy args. descr. | 741 CidRangeTarget(kFloat32x4Cid, kFloat32x4Cid, &flow_graph->function(), 1)); |
743 Thread::kNoDeoptId, 1, false)); | |
744 value_check.AddReceiverCheck(kFloat32x4Cid, flow_graph->function()); | |
745 // Check argument. Receiver (left) is known to be a Float32x4. | 742 // Check argument. Receiver (left) is known to be a Float32x4. |
746 builder.AddInstruction(new CheckClassInstr( | 743 builder.AddInstruction(new CheckClassInstr( |
747 new Value(right), Thread::kNoDeoptId, value_check, builder.TokenPos())); | 744 new Value(right), Thread::kNoDeoptId, *value_check, builder.TokenPos())); |
748 Definition* left_simd = | 745 Definition* left_simd = |
749 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left), | 746 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left), |
750 /* is_checked = */ true); | 747 /* is_checked = */ true); |
751 | 748 |
752 Definition* right_simd = | 749 Definition* right_simd = |
753 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right), | 750 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right), |
754 /* is_checked = */ true); | 751 /* is_checked = */ true); |
755 | 752 |
756 Definition* unboxed_result = builder.AddDefinition(new BinaryFloat32x4OpInstr( | 753 Definition* unboxed_result = builder.AddDefinition(new BinaryFloat32x4OpInstr( |
757 kind, new Value(left_simd), new Value(right_simd), Thread::kNoDeoptId)); | 754 kind, new Value(left_simd), new Value(right_simd), Thread::kNoDeoptId)); |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
939 } | 936 } |
940 | 937 |
941 | 938 |
942 bool Intrinsifier::Build_GrowableArraySetData(FlowGraph* flow_graph) { | 939 bool Intrinsifier::Build_GrowableArraySetData(FlowGraph* flow_graph) { |
943 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); | 940 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); |
944 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); | 941 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); |
945 BlockBuilder builder(flow_graph, normal_entry); | 942 BlockBuilder builder(flow_graph, normal_entry); |
946 | 943 |
947 Definition* data = builder.AddParameter(1); | 944 Definition* data = builder.AddParameter(1); |
948 Definition* growable_array = builder.AddParameter(2); | 945 Definition* growable_array = builder.AddParameter(2); |
| 946 Zone* zone = flow_graph->zone(); |
949 | 947 |
950 const ICData& value_check = ICData::ZoneHandle(ICData::New( | 948 CallTargets* value_check = new (zone) CallTargets(); |
951 flow_graph->function(), String::Handle(flow_graph->function().name()), | 949 value_check->Add( |
952 Object::empty_array(), // Dummy args. descr. | 950 CidRangeTarget(kArrayCid, kArrayCid, &flow_graph->function(), 1)); |
953 Thread::kNoDeoptId, 1, false)); | |
954 value_check.AddReceiverCheck(kArrayCid, flow_graph->function()); | |
955 builder.AddInstruction(new CheckClassInstr( | 951 builder.AddInstruction(new CheckClassInstr( |
956 new Value(data), Thread::kNoDeoptId, value_check, builder.TokenPos())); | 952 new Value(data), Thread::kNoDeoptId, *value_check, builder.TokenPos())); |
957 | 953 |
958 builder.AddInstruction(new StoreInstanceFieldInstr( | 954 builder.AddInstruction(new StoreInstanceFieldInstr( |
959 GrowableObjectArray::data_offset(), new Value(growable_array), | 955 GrowableObjectArray::data_offset(), new Value(growable_array), |
960 new Value(data), kEmitStoreBarrier, builder.TokenPos())); | 956 new Value(data), kEmitStoreBarrier, builder.TokenPos())); |
961 // Return null. | 957 // Return null. |
962 Definition* null_def = builder.AddNullDefinition(); | 958 Definition* null_def = builder.AddNullDefinition(); |
963 builder.AddIntrinsicReturn(new Value(null_def)); | 959 builder.AddIntrinsicReturn(new Value(null_def)); |
964 return true; | 960 return true; |
965 } | 961 } |
966 | 962 |
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1181 } | 1177 } |
1182 | 1178 |
1183 | 1179 |
1184 void Intrinsifier::RegExp_ExecuteMatchSticky(Assembler* assembler) { | 1180 void Intrinsifier::RegExp_ExecuteMatchSticky(Assembler* assembler) { |
1185 IntrinsifyRegExpExecuteMatch(assembler, /*sticky=*/true); | 1181 IntrinsifyRegExpExecuteMatch(assembler, /*sticky=*/true); |
1186 } | 1182 } |
1187 #endif // !defined(TARGET_ARCH_DBC) | 1183 #endif // !defined(TARGET_ARCH_DBC) |
1188 | 1184 |
1189 | 1185 |
1190 } // namespace dart | 1186 } // namespace dart |
OLD | NEW |