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

Side by Side Diff: runtime/vm/intrinsifier.cc

Issue 2856543002: Use off-heap data for class check instructions (Closed)
Patch Set: Feedback from Slava: rejig inheritance of CallTargets Created 3 years, 7 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
OLDNEW
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
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 Cids* value_check = new (zone) Cids(zone);
537 Symbols::Empty(), // Dummy function name. 537 value_check->Add(new (zone) CidRange(value_check_cid, value_check_cid));
Vyacheslav Egorov (Google) 2017/05/09 21:07:28 can this be Cids::CreateMonomorphic?
erikcorry 2017/05/10 08:47:43 Done.
538 Object::empty_array(), // Dummy args. descr.
539 Thread::kNoDeoptId, 1, false));
540 value_check.AddReceiverCheck(value_check_cid, flow_graph->function());
541 builder.AddInstruction( 538 builder.AddInstruction(
542 new CheckClassInstr(new Value(value), Thread::kNoDeoptId, value_check, 539 new CheckClassInstr(new Value(value), Thread::kNoDeoptId,
543 builder.TokenPos())); 540 *value_check, builder.TokenPos()));
544 value = builder.AddUnboxInstr(rep, new Value(value), 541 value = builder.AddUnboxInstr(rep, new Value(value),
545 /* is_checked = */ true); 542 /* is_checked = */ true);
546 if (array_cid == kTypedDataFloat32ArrayCid) { 543 if (array_cid == kTypedDataFloat32ArrayCid) {
547 value = builder.AddDefinition( 544 value = builder.AddDefinition(
548 new DoubleToFloatInstr(new Value(value), Thread::kNoDeoptId)); 545 new DoubleToFloatInstr(new Value(value), Thread::kNoDeoptId));
549 } 546 }
550 break; 547 break;
551 } 548 }
552 default: 549 default:
553 UNREACHABLE(); 550 UNREACHABLE();
(...skipping 169 matching lines...) Expand 10 before | Expand all | Expand 10 after
723 720
724 bool Intrinsifier::Build_ExternalTwoByteStringCodeUnitAt( 721 bool Intrinsifier::Build_ExternalTwoByteStringCodeUnitAt(
725 FlowGraph* flow_graph) { 722 FlowGraph* flow_graph) {
726 return BuildCodeUnitAt(flow_graph, kExternalTwoByteStringCid); 723 return BuildCodeUnitAt(flow_graph, kExternalTwoByteStringCid);
727 } 724 }
728 725
729 726
730 static bool BuildBinaryFloat32x4Op(FlowGraph* flow_graph, Token::Kind kind) { 727 static bool BuildBinaryFloat32x4Op(FlowGraph* flow_graph, Token::Kind kind) {
731 if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false; 728 if (!FlowGraphCompiler::SupportsUnboxedSimd128()) return false;
732 729
730 Zone* zone = flow_graph->zone();
733 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); 731 GraphEntryInstr* graph_entry = flow_graph->graph_entry();
734 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); 732 TargetEntryInstr* normal_entry = graph_entry->normal_entry();
735 BlockBuilder builder(flow_graph, normal_entry); 733 BlockBuilder builder(flow_graph, normal_entry);
736 734
737 Definition* right = builder.AddParameter(1); 735 Definition* right = builder.AddParameter(1);
738 Definition* left = builder.AddParameter(2); 736 Definition* left = builder.AddParameter(2);
739 737
740 const ICData& value_check = ICData::ZoneHandle(ICData::New( 738 Cids* value_check = new (zone) Cids(zone);
741 flow_graph->function(), String::Handle(flow_graph->function().name()), 739 value_check->Add(new (zone) CidRange(kFloat32x4Cid, kFloat32x4Cid));
Vyacheslav Egorov (Google) 2017/05/09 21:07:28 can this be Cids::CreateMonomorphic()?
erikcorry 2017/05/10 08:47:43 Done.
742 Object::empty_array(), // Dummy args. descr.
743 Thread::kNoDeoptId, 1, false));
744 value_check.AddReceiverCheck(kFloat32x4Cid, flow_graph->function());
745 // Check argument. Receiver (left) is known to be a Float32x4. 740 // Check argument. Receiver (left) is known to be a Float32x4.
746 builder.AddInstruction(new CheckClassInstr( 741 builder.AddInstruction(new CheckClassInstr(
747 new Value(right), Thread::kNoDeoptId, value_check, builder.TokenPos())); 742 new Value(right), Thread::kNoDeoptId, *value_check, builder.TokenPos()));
748 Definition* left_simd = 743 Definition* left_simd =
749 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left), 744 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(left),
750 /* is_checked = */ true); 745 /* is_checked = */ true);
751 746
752 Definition* right_simd = 747 Definition* right_simd =
753 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right), 748 builder.AddUnboxInstr(kUnboxedFloat32x4, new Value(right),
754 /* is_checked = */ true); 749 /* is_checked = */ true);
755 750
756 Definition* unboxed_result = builder.AddDefinition(new BinaryFloat32x4OpInstr( 751 Definition* unboxed_result = builder.AddDefinition(new BinaryFloat32x4OpInstr(
757 kind, new Value(left_simd), new Value(right_simd), Thread::kNoDeoptId)); 752 kind, new Value(left_simd), new Value(right_simd), Thread::kNoDeoptId));
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
939 } 934 }
940 935
941 936
942 bool Intrinsifier::Build_GrowableArraySetData(FlowGraph* flow_graph) { 937 bool Intrinsifier::Build_GrowableArraySetData(FlowGraph* flow_graph) {
943 GraphEntryInstr* graph_entry = flow_graph->graph_entry(); 938 GraphEntryInstr* graph_entry = flow_graph->graph_entry();
944 TargetEntryInstr* normal_entry = graph_entry->normal_entry(); 939 TargetEntryInstr* normal_entry = graph_entry->normal_entry();
945 BlockBuilder builder(flow_graph, normal_entry); 940 BlockBuilder builder(flow_graph, normal_entry);
946 941
947 Definition* data = builder.AddParameter(1); 942 Definition* data = builder.AddParameter(1);
948 Definition* growable_array = builder.AddParameter(2); 943 Definition* growable_array = builder.AddParameter(2);
944 Zone* zone = flow_graph->zone();
949 945
950 const ICData& value_check = ICData::ZoneHandle(ICData::New( 946 Cids* value_check = Cids::CreateMonomorphic(zone, kArrayCid);
951 flow_graph->function(), String::Handle(flow_graph->function().name()),
952 Object::empty_array(), // Dummy args. descr.
953 Thread::kNoDeoptId, 1, false));
954 value_check.AddReceiverCheck(kArrayCid, flow_graph->function());
955 builder.AddInstruction(new CheckClassInstr( 947 builder.AddInstruction(new CheckClassInstr(
956 new Value(data), Thread::kNoDeoptId, value_check, builder.TokenPos())); 948 new Value(data), Thread::kNoDeoptId, *value_check, builder.TokenPos()));
957 949
958 builder.AddInstruction(new StoreInstanceFieldInstr( 950 builder.AddInstruction(new StoreInstanceFieldInstr(
959 GrowableObjectArray::data_offset(), new Value(growable_array), 951 GrowableObjectArray::data_offset(), new Value(growable_array),
960 new Value(data), kEmitStoreBarrier, builder.TokenPos())); 952 new Value(data), kEmitStoreBarrier, builder.TokenPos()));
961 // Return null. 953 // Return null.
962 Definition* null_def = builder.AddNullDefinition(); 954 Definition* null_def = builder.AddNullDefinition();
963 builder.AddIntrinsicReturn(new Value(null_def)); 955 builder.AddIntrinsicReturn(new Value(null_def));
964 return true; 956 return true;
965 } 957 }
966 958
(...skipping 214 matching lines...) Expand 10 before | Expand all | Expand 10 after
1181 } 1173 }
1182 1174
1183 1175
1184 void Intrinsifier::RegExp_ExecuteMatchSticky(Assembler* assembler) { 1176 void Intrinsifier::RegExp_ExecuteMatchSticky(Assembler* assembler) {
1185 IntrinsifyRegExpExecuteMatch(assembler, /*sticky=*/true); 1177 IntrinsifyRegExpExecuteMatch(assembler, /*sticky=*/true);
1186 } 1178 }
1187 #endif // !defined(TARGET_ARCH_DBC) 1179 #endif // !defined(TARGET_ARCH_DBC)
1188 1180
1189 1181
1190 } // namespace dart 1182 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698