| 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_IA32. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_IA32. |
| 6 #if defined(TARGET_ARCH_IA32) | 6 #if defined(TARGET_ARCH_IA32) |
| 7 | 7 |
| 8 #include "vm/intermediate_language.h" | 8 #include "vm/intermediate_language.h" |
| 9 | 9 |
| 10 #include "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 205 // We should never return here. | 205 // We should never return here. |
| 206 __ int3(); | 206 __ int3(); |
| 207 __ Bind(&done); | 207 __ Bind(&done); |
| 208 } | 208 } |
| 209 | 209 |
| 210 | 210 |
| 211 void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 211 void AssertBooleanInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 212 Register obj = locs()->in(0).reg(); | 212 Register obj = locs()->in(0).reg(); |
| 213 Register result = locs()->out().reg(); | 213 Register result = locs()->out().reg(); |
| 214 | 214 |
| 215 if (!is_eliminated()) { | 215 EmitAssertBoolean(obj, token_pos(), deopt_id(), locs(), compiler); |
| 216 EmitAssertBoolean(obj, token_pos(), deopt_id(), locs(), compiler); | |
| 217 } | |
| 218 ASSERT(obj == result); | 216 ASSERT(obj == result); |
| 219 } | 217 } |
| 220 | 218 |
| 221 | 219 |
| 222 LocationSummary* ArgumentDefinitionTestInstr::MakeLocationSummary() const { | 220 LocationSummary* ArgumentDefinitionTestInstr::MakeLocationSummary() const { |
| 223 const intptr_t kNumInputs = 1; | 221 const intptr_t kNumInputs = 1; |
| 224 const intptr_t kNumTemps = 0; | 222 const intptr_t kNumTemps = 0; |
| 225 LocationSummary* locs = | 223 LocationSummary* locs = |
| 226 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); | 224 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kCall); |
| 227 locs->set_in(0, Location::RegisterLocation(EAX)); | 225 locs->set_in(0, Location::RegisterLocation(EAX)); |
| (...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1090 Register result = locs()->out().reg(); | 1088 Register result = locs()->out().reg(); |
| 1091 __ movl(result, | 1089 __ movl(result, |
| 1092 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress()))); | 1090 Immediate(reinterpret_cast<uword>(Symbols::PredefinedAddress()))); |
| 1093 __ movl(result, Address(result, | 1091 __ movl(result, Address(result, |
| 1094 char_code, | 1092 char_code, |
| 1095 TIMES_HALF_WORD_SIZE, // Char code is a smi. | 1093 TIMES_HALF_WORD_SIZE, // Char code is a smi. |
| 1096 Symbols::kNullCharCodeSymbolOffset * kWordSize)); | 1094 Symbols::kNullCharCodeSymbolOffset * kWordSize)); |
| 1097 } | 1095 } |
| 1098 | 1096 |
| 1099 | 1097 |
| 1100 intptr_t LoadIndexedInstr::ResultCid() const { | 1098 CompileType* LoadIndexedInstr::ComputeInitialType() const { |
| 1101 switch (class_id_) { | 1099 switch (class_id_) { |
| 1102 case kArrayCid: | 1100 case kArrayCid: |
| 1103 case kImmutableArrayCid: | 1101 case kImmutableArrayCid: |
| 1104 return kDynamicCid; | 1102 return CompileType::Dynamic(); |
| 1103 |
| 1105 case kFloat32ArrayCid : | 1104 case kFloat32ArrayCid : |
| 1106 case kFloat64ArrayCid : | 1105 case kFloat64ArrayCid : |
| 1107 return kDoubleCid; | 1106 return CompileType::FromCid(kDoubleCid); |
| 1107 |
| 1108 case kInt8ArrayCid: | 1108 case kInt8ArrayCid: |
| 1109 case kUint8ArrayCid: | 1109 case kUint8ArrayCid: |
| 1110 case kUint8ClampedArrayCid: | 1110 case kUint8ClampedArrayCid: |
| 1111 case kExternalUint8ArrayCid: | 1111 case kExternalUint8ArrayCid: |
| 1112 case kExternalUint8ClampedArrayCid: | 1112 case kExternalUint8ClampedArrayCid: |
| 1113 case kInt16ArrayCid: | 1113 case kInt16ArrayCid: |
| 1114 case kUint16ArrayCid: | 1114 case kUint16ArrayCid: |
| 1115 case kOneByteStringCid: | 1115 case kOneByteStringCid: |
| 1116 case kTwoByteStringCid: | 1116 case kTwoByteStringCid: |
| 1117 return kSmiCid; | 1117 return CompileType::FromCid(kSmiCid); |
| 1118 |
| 1118 case kInt32ArrayCid: | 1119 case kInt32ArrayCid: |
| 1119 case kUint32ArrayCid: | 1120 case kUint32ArrayCid: |
| 1120 // Result can be Smi or Mint when boxed. | 1121 // Result can be Smi or Mint when boxed. |
| 1121 // Instruction can deoptimize if we optimistically assumed that the result | 1122 // Instruction can deoptimize if we optimistically assumed that the result |
| 1122 // fits into Smi. | 1123 // fits into Smi. |
| 1123 return CanDeoptimize() ? kSmiCid : kDynamicCid; | 1124 return CanDeoptimize() ? CompileType::FromCid(kSmiCid) |
| 1125 : CompileType::Int(); |
| 1126 |
| 1124 default: | 1127 default: |
| 1125 UNIMPLEMENTED(); | 1128 UNIMPLEMENTED(); |
| 1126 return kDynamicCid; | 1129 return CompileType::Dynamic(); |
| 1127 } | 1130 } |
| 1128 } | 1131 } |
| 1129 | 1132 |
| 1130 | 1133 |
| 1131 Representation LoadIndexedInstr::representation() const { | 1134 Representation LoadIndexedInstr::representation() const { |
| 1132 switch (class_id_) { | 1135 switch (class_id_) { |
| 1133 case kArrayCid: | 1136 case kArrayCid: |
| 1134 case kImmutableArrayCid: | 1137 case kImmutableArrayCid: |
| 1135 case kInt8ArrayCid: | 1138 case kInt8ArrayCid: |
| 1136 case kUint8ArrayCid: | 1139 case kUint8ArrayCid: |
| (...skipping 1123 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2260 break; | 2263 break; |
| 2261 } | 2264 } |
| 2262 default: | 2265 default: |
| 2263 UNREACHABLE(); | 2266 UNREACHABLE(); |
| 2264 break; | 2267 break; |
| 2265 } | 2268 } |
| 2266 } | 2269 } |
| 2267 | 2270 |
| 2268 | 2271 |
| 2269 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary() const { | 2272 LocationSummary* CheckEitherNonSmiInstr::MakeLocationSummary() const { |
| 2270 ASSERT((left()->ResultCid() != kDoubleCid) && | 2273 ASSERT((left()->Type()->ToCid() != kDoubleCid) && |
| 2271 (right()->ResultCid() != kDoubleCid)); | 2274 (right()->Type()->ToCid() != kDoubleCid)); |
| 2272 const intptr_t kNumInputs = 2; | 2275 const intptr_t kNumInputs = 2; |
| 2273 const intptr_t kNumTemps = 1; | 2276 const intptr_t kNumTemps = 1; |
| 2274 LocationSummary* summary = | 2277 LocationSummary* summary = |
| 2275 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2278 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 2276 summary->set_in(0, Location::RequiresRegister()); | 2279 summary->set_in(0, Location::RequiresRegister()); |
| 2277 summary->set_in(1, Location::RequiresRegister()); | 2280 summary->set_in(1, Location::RequiresRegister()); |
| 2278 summary->set_temp(0, Location::RequiresRegister()); | 2281 summary->set_temp(0, Location::RequiresRegister()); |
| 2279 return summary; | 2282 return summary; |
| 2280 } | 2283 } |
| 2281 | 2284 |
| (...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2358 LocationSummary* summary = | 2361 LocationSummary* summary = |
| 2359 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2362 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 2360 summary->set_in(0, Location::RequiresRegister()); | 2363 summary->set_in(0, Location::RequiresRegister()); |
| 2361 if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister()); | 2364 if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister()); |
| 2362 summary->set_out(Location::RequiresFpuRegister()); | 2365 summary->set_out(Location::RequiresFpuRegister()); |
| 2363 return summary; | 2366 return summary; |
| 2364 } | 2367 } |
| 2365 | 2368 |
| 2366 | 2369 |
| 2367 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2370 void UnboxDoubleInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 2368 const intptr_t value_cid = value()->ResultCid(); | 2371 const intptr_t value_cid = value()->Type()->ToCid(); |
| 2369 const Register value = locs()->in(0).reg(); | 2372 const Register value = locs()->in(0).reg(); |
| 2370 const XmmRegister result = locs()->out().fpu_reg(); | 2373 const XmmRegister result = locs()->out().fpu_reg(); |
| 2371 | 2374 |
| 2372 if (value_cid == kDoubleCid) { | 2375 if (value_cid == kDoubleCid) { |
| 2373 __ movsd(result, FieldAddress(value, Double::value_offset())); | 2376 __ movsd(result, FieldAddress(value, Double::value_offset())); |
| 2374 } else if (value_cid == kSmiCid) { | 2377 } else if (value_cid == kSmiCid) { |
| 2375 __ SmiUntag(value); // Untag input before conversion. | 2378 __ SmiUntag(value); // Untag input before conversion. |
| 2376 __ cvtsi2sd(result, value); | 2379 __ cvtsi2sd(result, value); |
| 2377 __ SmiTag(value); // Restore input register. | 2380 __ SmiTag(value); // Restore input register. |
| 2378 } else { | 2381 } else { |
| (...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2746 const intptr_t kNumInputs = 1; | 2749 const intptr_t kNumInputs = 1; |
| 2747 const intptr_t kNumTemps = 0; | 2750 const intptr_t kNumTemps = 0; |
| 2748 LocationSummary* summary = | 2751 LocationSummary* summary = |
| 2749 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2752 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 2750 summary->set_in(0, Location::RequiresRegister()); | 2753 summary->set_in(0, Location::RequiresRegister()); |
| 2751 return summary; | 2754 return summary; |
| 2752 } | 2755 } |
| 2753 | 2756 |
| 2754 | 2757 |
| 2755 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2758 void CheckSmiInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 2756 // TODO(srdjan): Check if we can remove this by reordering CSE and LICM. | |
| 2757 if (value()->ResultCid() == kSmiCid) return; | |
| 2758 Register value = locs()->in(0).reg(); | 2759 Register value = locs()->in(0).reg(); |
| 2759 Label* deopt = compiler->AddDeoptStub(deopt_id(), | 2760 Label* deopt = compiler->AddDeoptStub(deopt_id(), |
| 2760 kDeoptCheckSmi); | 2761 kDeoptCheckSmi); |
| 2761 __ testl(value, Immediate(kSmiTagMask)); | 2762 __ testl(value, Immediate(kSmiTagMask)); |
| 2762 __ j(NOT_ZERO, deopt); | 2763 __ j(NOT_ZERO, deopt); |
| 2763 } | 2764 } |
| 2764 | 2765 |
| 2765 | 2766 |
| 2766 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary() const { | 2767 LocationSummary* CheckArrayBoundInstr::MakeLocationSummary() const { |
| 2767 const intptr_t kNumInputs = 2; | 2768 const intptr_t kNumInputs = 2; |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 2813 LocationSummary* summary = | 2814 LocationSummary* summary = |
| 2814 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); | 2815 new LocationSummary(kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| 2815 summary->set_in(0, Location::RequiresRegister()); | 2816 summary->set_in(0, Location::RequiresRegister()); |
| 2816 if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister()); | 2817 if (CanDeoptimize()) summary->set_temp(0, Location::RequiresRegister()); |
| 2817 summary->set_out(Location::RequiresFpuRegister()); | 2818 summary->set_out(Location::RequiresFpuRegister()); |
| 2818 return summary; | 2819 return summary; |
| 2819 } | 2820 } |
| 2820 | 2821 |
| 2821 | 2822 |
| 2822 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 2823 void UnboxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |
| 2823 const intptr_t value_cid = value()->ResultCid(); | 2824 const intptr_t value_cid = value()->Type()->ToCid(); |
| 2824 const Register value = locs()->in(0).reg(); | 2825 const Register value = locs()->in(0).reg(); |
| 2825 const XmmRegister result = locs()->out().fpu_reg(); | 2826 const XmmRegister result = locs()->out().fpu_reg(); |
| 2826 | 2827 |
| 2827 if (value_cid == kMintCid) { | 2828 if (value_cid == kMintCid) { |
| 2828 __ movsd(result, FieldAddress(value, Mint::value_offset())); | 2829 __ movsd(result, FieldAddress(value, Mint::value_offset())); |
| 2829 } else if (value_cid == kSmiCid) { | 2830 } else if (value_cid == kSmiCid) { |
| 2830 __ SmiUntag(value); // Untag input before conversion. | 2831 __ SmiUntag(value); // Untag input before conversion. |
| 2831 __ movd(result, value); | 2832 __ movd(result, value); |
| 2832 __ pmovsxdq(result, result); | 2833 __ pmovsxdq(result, result); |
| 2833 __ SmiTag(value); // Restore input register. | 2834 __ SmiTag(value); // Restore input register. |
| (...skipping 583 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3417 PcDescriptors::kOther, | 3418 PcDescriptors::kOther, |
| 3418 locs()); | 3419 locs()); |
| 3419 __ Drop(2); // Discard type arguments and receiver. | 3420 __ Drop(2); // Discard type arguments and receiver. |
| 3420 } | 3421 } |
| 3421 | 3422 |
| 3422 } // namespace dart | 3423 } // namespace dart |
| 3423 | 3424 |
| 3424 #undef __ | 3425 #undef __ |
| 3425 | 3426 |
| 3426 #endif // defined TARGET_ARCH_IA32 | 3427 #endif // defined TARGET_ARCH_IA32 |
| OLD | NEW |