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

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

Issue 616873003: Use UnboxedInt32 and UnboxedUint32 representation for LoadIndexedInstr (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 2 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 | Annotate | Revision Log
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/dart_entry.h" 10 #include "vm/dart_entry.h"
(...skipping 950 matching lines...) Expand 10 before | Expand all | Expand 10 after
961 case kImmutableArrayCid: 961 case kImmutableArrayCid:
962 case kTypedDataInt8ArrayCid: 962 case kTypedDataInt8ArrayCid:
963 case kTypedDataUint8ArrayCid: 963 case kTypedDataUint8ArrayCid:
964 case kTypedDataUint8ClampedArrayCid: 964 case kTypedDataUint8ClampedArrayCid:
965 case kExternalTypedDataUint8ArrayCid: 965 case kExternalTypedDataUint8ArrayCid:
966 case kExternalTypedDataUint8ClampedArrayCid: 966 case kExternalTypedDataUint8ClampedArrayCid:
967 case kTypedDataInt16ArrayCid: 967 case kTypedDataInt16ArrayCid:
968 case kTypedDataUint16ArrayCid: 968 case kTypedDataUint16ArrayCid:
969 case kOneByteStringCid: 969 case kOneByteStringCid:
970 case kTwoByteStringCid: 970 case kTwoByteStringCid:
971 return kTagged;
971 case kTypedDataInt32ArrayCid: 972 case kTypedDataInt32ArrayCid:
973 return kUnboxedInt32;
972 case kTypedDataUint32ArrayCid: 974 case kTypedDataUint32ArrayCid:
973 return kTagged; 975 return kUnboxedUint32;
974 case kTypedDataFloat32ArrayCid: 976 case kTypedDataFloat32ArrayCid:
975 case kTypedDataFloat64ArrayCid: 977 case kTypedDataFloat64ArrayCid:
976 return kUnboxedDouble; 978 return kUnboxedDouble;
977 case kTypedDataInt32x4ArrayCid: 979 case kTypedDataInt32x4ArrayCid:
978 return kUnboxedInt32x4; 980 return kUnboxedInt32x4;
979 case kTypedDataFloat32x4ArrayCid: 981 case kTypedDataFloat32x4ArrayCid:
980 return kUnboxedFloat32x4; 982 return kUnboxedFloat32x4;
981 case kTypedDataFloat64x2ArrayCid: 983 case kTypedDataFloat64x2ArrayCid:
982 return kUnboxedFloat64x2; 984 return kUnboxedFloat64x2;
983 default: 985 default:
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
1045 __ movsd(result, element_address); 1047 __ movsd(result, element_address);
1046 } else { 1048 } else {
1047 ASSERT((class_id() == kTypedDataInt32x4ArrayCid) || 1049 ASSERT((class_id() == kTypedDataInt32x4ArrayCid) ||
1048 (class_id() == kTypedDataFloat32x4ArrayCid) || 1050 (class_id() == kTypedDataFloat32x4ArrayCid) ||
1049 (class_id() == kTypedDataFloat64x2ArrayCid)); 1051 (class_id() == kTypedDataFloat64x2ArrayCid));
1050 __ movups(result, element_address); 1052 __ movups(result, element_address);
1051 } 1053 }
1052 return; 1054 return;
1053 } 1055 }
1054 1056
1057 if ((representation() == kUnboxedUint32) ||
1058 (representation() == kUnboxedInt32)) {
1059 if ((index_scale() == 1) && index.IsRegister()) {
1060 __ SmiUntag(index.reg());
1061 }
1062 Register result = locs()->out(0).reg();
1063 switch (class_id()) {
1064 case kTypedDataInt32ArrayCid:
1065 ASSERT(representation() == kUnboxedInt32);
1066 __ movsxd(result, element_address);
1067 break;
1068 case kTypedDataUint32ArrayCid:
1069 ASSERT(representation() == kUnboxedUint32);
1070 __ movl(result, element_address);
1071 break;
1072 default:
1073 UNREACHABLE();
1074 }
1075 return;
1076 }
1077
1078 ASSERT(representation() == kTagged);
1079
1055 if ((index_scale() == 1) && index.IsRegister()) { 1080 if ((index_scale() == 1) && index.IsRegister()) {
1056 __ SmiUntag(index.reg()); 1081 __ SmiUntag(index.reg());
1057 } 1082 }
1058 Register result = locs()->out(0).reg(); 1083 Register result = locs()->out(0).reg();
1059 switch (class_id()) { 1084 switch (class_id()) {
1060 case kTypedDataInt8ArrayCid: 1085 case kTypedDataInt8ArrayCid:
1061 __ movsxb(result, element_address); 1086 __ movsxb(result, element_address);
1062 __ SmiTag(result); 1087 __ SmiTag(result);
1063 break; 1088 break;
1064 case kTypedDataUint8ArrayCid: 1089 case kTypedDataUint8ArrayCid:
1065 case kTypedDataUint8ClampedArrayCid: 1090 case kTypedDataUint8ClampedArrayCid:
1066 case kExternalTypedDataUint8ArrayCid: 1091 case kExternalTypedDataUint8ArrayCid:
1067 case kExternalTypedDataUint8ClampedArrayCid: 1092 case kExternalTypedDataUint8ClampedArrayCid:
1068 case kOneByteStringCid: 1093 case kOneByteStringCid:
1069 __ movzxb(result, element_address); 1094 __ movzxb(result, element_address);
1070 __ SmiTag(result); 1095 __ SmiTag(result);
1071 break; 1096 break;
1072 case kTypedDataInt16ArrayCid: 1097 case kTypedDataInt16ArrayCid:
1073 __ movsxw(result, element_address); 1098 __ movsxw(result, element_address);
1074 __ SmiTag(result); 1099 __ SmiTag(result);
1075 break; 1100 break;
1076 case kTypedDataUint16ArrayCid: 1101 case kTypedDataUint16ArrayCid:
1077 case kTwoByteStringCid: 1102 case kTwoByteStringCid:
1078 __ movzxw(result, element_address); 1103 __ movzxw(result, element_address);
1079 __ SmiTag(result); 1104 __ SmiTag(result);
1080 break; 1105 break;
1081 case kTypedDataInt32ArrayCid:
1082 __ movsxd(result, element_address);
1083 __ SmiTag(result);
1084 break;
1085 case kTypedDataUint32ArrayCid:
1086 __ movl(result, element_address);
1087 __ SmiTag(result);
1088 break;
1089 default: 1106 default:
1090 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid)); 1107 ASSERT((class_id() == kArrayCid) || (class_id() == kImmutableArrayCid));
1091 __ movq(result, element_address); 1108 __ movq(result, element_address);
1092 break; 1109 break;
1093 } 1110 }
1094 } 1111 }
1095 1112
1096 1113
1097 Representation StoreIndexedInstr::RequiredInputRepresentation( 1114 Representation StoreIndexedInstr::RequiredInputRepresentation(
1098 intptr_t idx) const { 1115 intptr_t idx) const {
(...skipping 3523 matching lines...) Expand 10 before | Expand all | Expand 10 after
4622 __ cmpq(left, right); 4639 __ cmpq(left, right);
4623 ASSERT(result == left); 4640 ASSERT(result == left);
4624 if (is_min) { 4641 if (is_min) {
4625 __ cmovgeq(result, right); 4642 __ cmovgeq(result, right);
4626 } else { 4643 } else {
4627 __ cmovlessq(result, right); 4644 __ cmovlessq(result, right);
4628 } 4645 }
4629 } 4646 }
4630 4647
4631 4648
4632 DEFINE_UNIMPLEMENTED_INSTRUCTION(Int32ToDoubleInstr) 4649 LocationSummary* Int32ToDoubleInstr::MakeLocationSummary(Isolate* isolate,
4650 bool opt) const {
4651 const intptr_t kNumInputs = 1;
4652 const intptr_t kNumTemps = 0;
4653 LocationSummary* result = new(isolate) LocationSummary(
4654 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4655 result->set_in(0, Location::RequiresRegister());
4656 result->set_out(0, Location::RequiresFpuRegister());
4657 return result;
4658 }
4659
4660
4661 void Int32ToDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
4662 Register value = locs()->in(0).reg();
4663 FpuRegister result = locs()->out(0).fpu_reg();
4664 __ cvtsi2sd32(result, value);
4665 }
4633 4666
4634 4667
4635 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate, 4668 LocationSummary* SmiToDoubleInstr::MakeLocationSummary(Isolate* isolate,
4636 bool opt) const { 4669 bool opt) const {
4637 const intptr_t kNumInputs = 1; 4670 const intptr_t kNumInputs = 1;
4638 const intptr_t kNumTemps = 0; 4671 const intptr_t kNumTemps = 0;
4639 LocationSummary* result = new(isolate) LocationSummary( 4672 LocationSummary* result = new(isolate) LocationSummary(
4640 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall); 4673 isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
4641 result->set_in(0, Location::WritableRegister()); 4674 result->set_in(0, Location::WritableRegister());
4642 result->set_out(0, Location::RequiresFpuRegister()); 4675 result->set_out(0, Location::RequiresFpuRegister());
(...skipping 1286 matching lines...) Expand 10 before | Expand all | Expand 10 after
5929 __ movq(R10, Immediate(kInvalidObjectPointer)); 5962 __ movq(R10, Immediate(kInvalidObjectPointer));
5930 __ movq(RBX, Immediate(kInvalidObjectPointer)); 5963 __ movq(RBX, Immediate(kInvalidObjectPointer));
5931 #endif 5964 #endif
5932 } 5965 }
5933 5966
5934 } // namespace dart 5967 } // namespace dart
5935 5968
5936 #undef __ 5969 #undef __
5937 5970
5938 #endif // defined TARGET_ARCH_X64 5971 #endif // defined TARGET_ARCH_X64
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698