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

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

Issue 1961393002: VM: Optimized code for all of [External]{One|Two}ByteString::codeUnitAt. (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: addressed comment Created 4 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
« no previous file with comments | « runtime/vm/intermediate_language_mips.cc ('k') | runtime/vm/intrinsifier.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 (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_X64. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64.
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/intermediate_language.h" 8 #include "vm/intermediate_language.h"
9 9
10 #include "vm/compiler.h" 10 #include "vm/compiler.h"
(...skipping 794 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 const Object& constant = index->definition()->AsConstant()->value(); 805 const Object& constant = index->definition()->AsConstant()->value();
806 if (!constant.IsSmi()) return false; 806 if (!constant.IsSmi()) return false;
807 const Smi& smi_const = Smi::Cast(constant); 807 const Smi& smi_const = Smi::Cast(constant);
808 const intptr_t scale = Instance::ElementSizeFor(cid); 808 const intptr_t scale = Instance::ElementSizeFor(cid);
809 const intptr_t data_offset = Instance::DataOffsetFor(cid); 809 const intptr_t data_offset = Instance::DataOffsetFor(cid);
810 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset; 810 const int64_t disp = smi_const.AsInt64Value() * scale + data_offset;
811 return Utils::IsInt(32, disp); 811 return Utils::IsInt(32, disp);
812 } 812 }
813 813
814 814
815 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Zone* zone, 815 LocationSummary* OneByteStringFromCharCodeInstr::MakeLocationSummary(
816 bool opt) const { 816 Zone* zone, bool opt) const {
817 const intptr_t kNumInputs = 1; 817 const intptr_t kNumInputs = 1;
818 // TODO(fschneider): Allow immediate operands for the char code. 818 // TODO(fschneider): Allow immediate operands for the char code.
819 return LocationSummary::Make(zone, 819 return LocationSummary::Make(zone,
820 kNumInputs, 820 kNumInputs,
821 Location::RequiresRegister(), 821 Location::RequiresRegister(),
822 LocationSummary::kNoCall); 822 LocationSummary::kNoCall);
823 } 823 }
824 824
825 825
826 void StringFromCharCodeInstr::EmitNativeCode(FlowGraphCompiler* compiler) { 826 void OneByteStringFromCharCodeInstr::EmitNativeCode(
827 FlowGraphCompiler* compiler) {
827 ASSERT(compiler->is_optimizing()); 828 ASSERT(compiler->is_optimizing());
828 Register char_code = locs()->in(0).reg(); 829 Register char_code = locs()->in(0).reg();
829 Register result = locs()->out(0).reg(); 830 Register result = locs()->out(0).reg();
830 831
831 __ movq(result, Address(THR, Thread::predefined_symbols_address_offset())); 832 __ movq(result, Address(THR, Thread::predefined_symbols_address_offset()));
832 __ movq(result, Address(result, 833 __ movq(result, Address(result,
833 char_code, 834 char_code,
834 TIMES_HALF_WORD_SIZE, // Char code is a smi. 835 TIMES_HALF_WORD_SIZE, // Char code is a smi.
835 Symbols::kNullCharCodeSymbolOffset * kWordSize)); 836 Symbols::kNullCharCodeSymbolOffset * kWordSize));
836 } 837 }
(...skipping 129 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 967
967 case kTypedDataInt8ArrayCid: 968 case kTypedDataInt8ArrayCid:
968 case kTypedDataUint8ArrayCid: 969 case kTypedDataUint8ArrayCid:
969 case kTypedDataUint8ClampedArrayCid: 970 case kTypedDataUint8ClampedArrayCid:
970 case kExternalTypedDataUint8ArrayCid: 971 case kExternalTypedDataUint8ArrayCid:
971 case kExternalTypedDataUint8ClampedArrayCid: 972 case kExternalTypedDataUint8ClampedArrayCid:
972 case kTypedDataInt16ArrayCid: 973 case kTypedDataInt16ArrayCid:
973 case kTypedDataUint16ArrayCid: 974 case kTypedDataUint16ArrayCid:
974 case kOneByteStringCid: 975 case kOneByteStringCid:
975 case kTwoByteStringCid: 976 case kTwoByteStringCid:
977 case kExternalOneByteStringCid:
978 case kExternalTwoByteStringCid:
976 case kTypedDataInt32ArrayCid: 979 case kTypedDataInt32ArrayCid:
977 case kTypedDataUint32ArrayCid: 980 case kTypedDataUint32ArrayCid:
978 return CompileType::FromCid(kSmiCid); 981 return CompileType::FromCid(kSmiCid);
979 982
980 case kTypedDataInt64ArrayCid: 983 case kTypedDataInt64ArrayCid:
981 return CompileType::Int(); 984 return CompileType::Int();
982 985
983 default: 986 default:
984 UNIMPLEMENTED(); 987 UNIMPLEMENTED();
985 return CompileType::Dynamic(); 988 return CompileType::Dynamic();
986 } 989 }
987 } 990 }
988 991
989 992
990 Representation LoadIndexedInstr::representation() const { 993 Representation LoadIndexedInstr::representation() const {
991 switch (class_id_) { 994 switch (class_id_) {
992 case kArrayCid: 995 case kArrayCid:
993 case kImmutableArrayCid: 996 case kImmutableArrayCid:
994 case kTypedDataInt8ArrayCid: 997 case kTypedDataInt8ArrayCid:
995 case kTypedDataUint8ArrayCid: 998 case kTypedDataUint8ArrayCid:
996 case kTypedDataUint8ClampedArrayCid: 999 case kTypedDataUint8ClampedArrayCid:
997 case kExternalTypedDataUint8ArrayCid: 1000 case kExternalTypedDataUint8ArrayCid:
998 case kExternalTypedDataUint8ClampedArrayCid: 1001 case kExternalTypedDataUint8ClampedArrayCid:
999 case kTypedDataInt16ArrayCid: 1002 case kTypedDataInt16ArrayCid:
1000 case kTypedDataUint16ArrayCid: 1003 case kTypedDataUint16ArrayCid:
1001 case kOneByteStringCid: 1004 case kOneByteStringCid:
1002 case kTwoByteStringCid: 1005 case kTwoByteStringCid:
1006 case kExternalOneByteStringCid:
1007 case kExternalTwoByteStringCid:
1003 return kTagged; 1008 return kTagged;
1004 case kTypedDataInt32ArrayCid: 1009 case kTypedDataInt32ArrayCid:
1005 return kUnboxedInt32; 1010 return kUnboxedInt32;
1006 case kTypedDataUint32ArrayCid: 1011 case kTypedDataUint32ArrayCid:
1007 return kUnboxedUint32; 1012 return kUnboxedUint32;
1008 case kTypedDataInt64ArrayCid: 1013 case kTypedDataInt64ArrayCid:
1009 return kUnboxedMint; 1014 return kUnboxedMint;
1010 case kTypedDataFloat32ArrayCid: 1015 case kTypedDataFloat32ArrayCid:
1011 case kTypedDataFloat64ArrayCid: 1016 case kTypedDataFloat64ArrayCid:
1012 return kUnboxedDouble; 1017 return kUnboxedDouble;
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
1128 switch (class_id()) { 1133 switch (class_id()) {
1129 case kTypedDataInt8ArrayCid: 1134 case kTypedDataInt8ArrayCid:
1130 __ movsxb(result, element_address); 1135 __ movsxb(result, element_address);
1131 __ SmiTag(result); 1136 __ SmiTag(result);
1132 break; 1137 break;
1133 case kTypedDataUint8ArrayCid: 1138 case kTypedDataUint8ArrayCid:
1134 case kTypedDataUint8ClampedArrayCid: 1139 case kTypedDataUint8ClampedArrayCid:
1135 case kExternalTypedDataUint8ArrayCid: 1140 case kExternalTypedDataUint8ArrayCid:
1136 case kExternalTypedDataUint8ClampedArrayCid: 1141 case kExternalTypedDataUint8ClampedArrayCid:
1137 case kOneByteStringCid: 1142 case kOneByteStringCid:
1143 case kExternalOneByteStringCid:
1138 __ movzxb(result, element_address); 1144 __ movzxb(result, element_address);
1139 __ SmiTag(result); 1145 __ SmiTag(result);
1140 break; 1146 break;
1141 case kTypedDataInt16ArrayCid: 1147 case kTypedDataInt16ArrayCid:
1142 __ movsxw(result, element_address); 1148 __ movsxw(result, element_address);
1143 __ SmiTag(result); 1149 __ SmiTag(result);
1144 break; 1150 break;
1145 case kTypedDataUint16ArrayCid: 1151 case kTypedDataUint16ArrayCid:
1146 case kTwoByteStringCid: 1152 case kTwoByteStringCid:
1153 case kExternalTwoByteStringCid:
1147 __ movzxw(result, element_address); 1154 __ movzxw(result, element_address);
1148 __ SmiTag(result); 1155 __ SmiTag(result);
1149 break; 1156 break;
1150 default: 1157 default:
1151 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); 1158 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
1152 __ movq(result, element_address); 1159 __ movq(result, element_address);
1153 break; 1160 break;
1154 } 1161 }
1155 } 1162 }
1156 1163
(...skipping 5389 matching lines...) Expand 10 before | Expand all | Expand 10 after
6546 __ Drop(1); 6553 __ Drop(1);
6547 __ popq(result); 6554 __ popq(result);
6548 } 6555 }
6549 6556
6550 6557
6551 } // namespace dart 6558 } // namespace dart
6552 6559
6553 #undef __ 6560 #undef __
6554 6561
6555 #endif // defined TARGET_ARCH_X64 6562 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/intermediate_language_mips.cc ('k') | runtime/vm/intrinsifier.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698