| 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 | 
|---|