| 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_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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 Loading... |
| 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 |
| OLD | NEW |