| 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 "vm/dart_entry.h" | 10 #include "vm/dart_entry.h" | 
| (...skipping 2033 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2044                                   Label* done) { | 2044                                   Label* done) { | 
| 2045   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize. | 2045   const int kInlineArraySize = 12;  // Same as kInlineInstanceSize. | 
| 2046   const Register kLengthReg = EDX; | 2046   const Register kLengthReg = EDX; | 
| 2047   const Register kElemTypeReg = ECX; | 2047   const Register kElemTypeReg = ECX; | 
| 2048   const intptr_t instance_size = Array::InstanceSize(num_elements); | 2048   const intptr_t instance_size = Array::InstanceSize(num_elements); | 
| 2049 | 2049 | 
| 2050   // Instance in EAX. | 2050   // Instance in EAX. | 
| 2051   // Object end address in EBX. | 2051   // Object end address in EBX. | 
| 2052   __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump, | 2052   __ TryAllocateArray(kArrayCid, instance_size, slow_path, Assembler::kFarJump, | 
| 2053                       EAX,  // instance | 2053                       EAX,  // instance | 
| 2054                       EBX);  // end address | 2054                       EBX,  // end address | 
|  | 2055                       EDI);  // temp | 
| 2055 | 2056 | 
| 2056   // Store the type argument field. | 2057   // Store the type argument field. | 
| 2057   __ InitializeFieldNoBarrier(EAX, | 2058   __ InitializeFieldNoBarrier(EAX, | 
| 2058                               FieldAddress(EAX, Array::type_arguments_offset()), | 2059                               FieldAddress(EAX, Array::type_arguments_offset()), | 
| 2059                               kElemTypeReg); | 2060                               kElemTypeReg); | 
| 2060 | 2061 | 
| 2061   // Set the length field. | 2062   // Set the length field. | 
| 2062   __ InitializeFieldNoBarrier(EAX, | 2063   __ InitializeFieldNoBarrier(EAX, | 
| 2063                               FieldAddress(EAX, Array::length_offset()), | 2064                               FieldAddress(EAX, Array::length_offset()), | 
| 2064                               kLengthReg); | 2065                               kLengthReg); | 
| (...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 2366   __ popl(result_reg);  // Pop instantiated type arguments. | 2367   __ popl(result_reg);  // Pop instantiated type arguments. | 
| 2367   __ Bind(&type_arguments_instantiated); | 2368   __ Bind(&type_arguments_instantiated); | 
| 2368 } | 2369 } | 
| 2369 | 2370 | 
| 2370 | 2371 | 
| 2371 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary( | 2372 LocationSummary* AllocateUninitializedContextInstr::MakeLocationSummary( | 
| 2372     Zone* zone, | 2373     Zone* zone, | 
| 2373     bool opt) const { | 2374     bool opt) const { | 
| 2374   ASSERT(opt); | 2375   ASSERT(opt); | 
| 2375   const intptr_t kNumInputs = 0; | 2376   const intptr_t kNumInputs = 0; | 
| 2376   const intptr_t kNumTemps = 1; | 2377   const intptr_t kNumTemps = 2; | 
| 2377   LocationSummary* locs = new(zone) LocationSummary( | 2378   LocationSummary* locs = new(zone) LocationSummary( | 
| 2378       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 2379       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 
| 2379   locs->set_temp(0, Location::RegisterLocation(ECX)); | 2380   locs->set_temp(0, Location::RegisterLocation(ECX)); | 
|  | 2381   locs->set_temp(1, Location::RegisterLocation(EDI)); | 
| 2380   locs->set_out(0, Location::RegisterLocation(EAX)); | 2382   locs->set_out(0, Location::RegisterLocation(EAX)); | 
| 2381   return locs; | 2383   return locs; | 
| 2382 } | 2384 } | 
| 2383 | 2385 | 
| 2384 | 2386 | 
| 2385 class AllocateContextSlowPath : public SlowPathCode { | 2387 class AllocateContextSlowPath : public SlowPathCode { | 
| 2386  public: | 2388  public: | 
| 2387   explicit AllocateContextSlowPath( | 2389   explicit AllocateContextSlowPath( | 
| 2388       AllocateUninitializedContextInstr* instruction) | 2390       AllocateUninitializedContextInstr* instruction) | 
| 2389       : instruction_(instruction) { } | 2391       : instruction_(instruction) { } | 
| (...skipping 20 matching lines...) Expand all  Loading... | 
| 2410 | 2412 | 
| 2411  private: | 2413  private: | 
| 2412   AllocateUninitializedContextInstr* instruction_; | 2414   AllocateUninitializedContextInstr* instruction_; | 
| 2413 }; | 2415 }; | 
| 2414 | 2416 | 
| 2415 | 2417 | 
| 2416 void AllocateUninitializedContextInstr::EmitNativeCode( | 2418 void AllocateUninitializedContextInstr::EmitNativeCode( | 
| 2417     FlowGraphCompiler* compiler) { | 2419     FlowGraphCompiler* compiler) { | 
| 2418   ASSERT(compiler->is_optimizing()); | 2420   ASSERT(compiler->is_optimizing()); | 
| 2419   Register temp = locs()->temp(0).reg(); | 2421   Register temp = locs()->temp(0).reg(); | 
|  | 2422   Register temp2 = locs()->temp(1).reg(); | 
| 2420   Register result = locs()->out(0).reg(); | 2423   Register result = locs()->out(0).reg(); | 
| 2421   // Try allocate the object. | 2424   // Try allocate the object. | 
| 2422   AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this); | 2425   AllocateContextSlowPath* slow_path = new AllocateContextSlowPath(this); | 
| 2423   compiler->AddSlowPathCode(slow_path); | 2426   compiler->AddSlowPathCode(slow_path); | 
| 2424   intptr_t instance_size = Context::InstanceSize(num_context_variables()); | 2427   intptr_t instance_size = Context::InstanceSize(num_context_variables()); | 
| 2425 | 2428 | 
| 2426   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(), | 2429   __ TryAllocateArray(kContextCid, instance_size, slow_path->entry_label(), | 
| 2427                       Assembler::kFarJump, | 2430                       Assembler::kFarJump, | 
| 2428                       result,  // instance | 2431                       result,  // instance | 
| 2429                       temp);  // end address | 2432                       temp,  // end address | 
|  | 2433                       temp2);  // temp | 
| 2430 | 2434 | 
| 2431   // Setup up number of context variables field. | 2435   // Setup up number of context variables field. | 
| 2432   __ movl(FieldAddress(result, Context::num_variables_offset()), | 2436   __ movl(FieldAddress(result, Context::num_variables_offset()), | 
| 2433           Immediate(num_context_variables())); | 2437           Immediate(num_context_variables())); | 
| 2434 | 2438 | 
| 2435   __ Bind(slow_path->exit_label()); | 2439   __ Bind(slow_path->exit_label()); | 
| 2436 } | 2440 } | 
| 2437 | 2441 | 
| 2438 | 2442 | 
| 2439 LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone, | 2443 LocationSummary* AllocateContextInstr::MakeLocationSummary(Zone* zone, | 
| (...skipping 877 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3317     __ orl(temp, right); | 3321     __ orl(temp, right); | 
| 3318     __ testl(temp, Immediate(kSmiTagMask)); | 3322     __ testl(temp, Immediate(kSmiTagMask)); | 
| 3319   } | 3323   } | 
| 3320   __ j(ZERO, deopt); | 3324   __ j(ZERO, deopt); | 
| 3321 } | 3325 } | 
| 3322 | 3326 | 
| 3323 | 3327 | 
| 3324 LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, | 3328 LocationSummary* BoxInstr::MakeLocationSummary(Zone* zone, | 
| 3325                                                      bool opt) const { | 3329                                                      bool opt) const { | 
| 3326   const intptr_t kNumInputs = 1; | 3330   const intptr_t kNumInputs = 1; | 
| 3327   const intptr_t kNumTemps = 0; | 3331   const intptr_t kNumTemps = 1; | 
| 3328   LocationSummary* summary = new(zone) LocationSummary( | 3332   LocationSummary* summary = new(zone) LocationSummary( | 
| 3329       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 3333       zone, kNumInputs, kNumTemps, LocationSummary::kCallOnSlowPath); | 
| 3330   summary->set_in(0, Location::RequiresFpuRegister()); | 3334   summary->set_in(0, Location::RequiresFpuRegister()); | 
|  | 3335   summary->set_temp(0, Location::RequiresRegister()); | 
| 3331   summary->set_out(0, Location::RequiresRegister()); | 3336   summary->set_out(0, Location::RequiresRegister()); | 
| 3332   return summary; | 3337   return summary; | 
| 3333 } | 3338 } | 
| 3334 | 3339 | 
| 3335 | 3340 | 
| 3336 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3341 void BoxInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
| 3337   Register out_reg = locs()->out(0).reg(); | 3342   Register out_reg = locs()->out(0).reg(); | 
| 3338   XmmRegister value = locs()->in(0).fpu_reg(); | 3343   XmmRegister value = locs()->in(0).fpu_reg(); | 
| 3339 | 3344 | 
| 3340   BoxAllocationSlowPath::Allocate( | 3345   BoxAllocationSlowPath::Allocate( | 
| 3341       compiler, | 3346       compiler, | 
| 3342       this, | 3347       this, | 
| 3343       compiler->BoxClassFor(from_representation()), | 3348       compiler->BoxClassFor(from_representation()), | 
| 3344       out_reg, | 3349       out_reg, | 
| 3345       kNoRegister); | 3350       locs()->temp(0).reg()); | 
| 3346 | 3351 | 
| 3347   switch (from_representation()) { | 3352   switch (from_representation()) { | 
| 3348     case kUnboxedDouble: | 3353     case kUnboxedDouble: | 
| 3349       __ movsd(FieldAddress(out_reg, ValueOffset()), value); | 3354       __ movsd(FieldAddress(out_reg, ValueOffset()), value); | 
| 3350       break; | 3355       break; | 
| 3351     case kUnboxedFloat32x4: | 3356     case kUnboxedFloat32x4: | 
| 3352     case kUnboxedFloat64x2: | 3357     case kUnboxedFloat64x2: | 
| 3353     case kUnboxedInt32x4: | 3358     case kUnboxedInt32x4: | 
| 3354       __ movups(FieldAddress(out_reg, ValueOffset()), value); | 3359       __ movups(FieldAddress(out_reg, ValueOffset()), value); | 
| 3355       break; | 3360       break; | 
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3483       EmitSmiConversion(compiler); | 3488       EmitSmiConversion(compiler); | 
| 3484       __ Bind(&done); | 3489       __ Bind(&done); | 
| 3485     } | 3490     } | 
| 3486   } | 3491   } | 
| 3487 } | 3492 } | 
| 3488 | 3493 | 
| 3489 | 3494 | 
| 3490 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone, | 3495 LocationSummary* BoxInteger32Instr::MakeLocationSummary(Zone* zone, | 
| 3491                                                         bool opt) const { | 3496                                                         bool opt) const { | 
| 3492   const intptr_t kNumInputs = 1; | 3497   const intptr_t kNumInputs = 1; | 
| 3493   const intptr_t kNumTemps = 0; | 3498   const intptr_t kNumTemps = ValueFitsSmi() ? 0 : 1; | 
| 3494   LocationSummary* summary = new(zone) LocationSummary( | 3499   LocationSummary* summary = new(zone) LocationSummary( | 
| 3495       zone, kNumInputs, kNumTemps, | 3500       zone, kNumInputs, kNumTemps, | 
| 3496       ValueFitsSmi() ? LocationSummary::kNoCall | 3501       ValueFitsSmi() ? LocationSummary::kNoCall | 
| 3497                      : LocationSummary::kCallOnSlowPath); | 3502                      : LocationSummary::kCallOnSlowPath); | 
| 3498   const bool needs_writable_input = ValueFitsSmi() || | 3503   const bool needs_writable_input = ValueFitsSmi() || | 
| 3499       (from_representation() == kUnboxedUint32); | 3504       (from_representation() == kUnboxedUint32); | 
| 3500   summary->set_in(0, needs_writable_input ? Location::RequiresRegister() | 3505   summary->set_in(0, needs_writable_input ? Location::RequiresRegister() | 
| 3501                                           : Location::WritableRegister()); | 3506                                           : Location::WritableRegister()); | 
|  | 3507   if (!ValueFitsSmi()) { | 
|  | 3508     summary->set_temp(0, Location::RequiresRegister()); | 
|  | 3509   } | 
| 3502   summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput() | 3510   summary->set_out(0, ValueFitsSmi() ? Location::SameAsFirstInput() | 
| 3503                                      : Location::RequiresRegister()); | 3511                                      : Location::RequiresRegister()); | 
| 3504   return summary; | 3512   return summary; | 
| 3505 } | 3513 } | 
| 3506 | 3514 | 
| 3507 | 3515 | 
| 3508 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 3516 void BoxInteger32Instr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
| 3509   const Register value = locs()->in(0).reg(); | 3517   const Register value = locs()->in(0).reg(); | 
| 3510   const Register out = locs()->out(0).reg(); | 3518   const Register out = locs()->out(0).reg(); | 
| 3511 | 3519 | 
| 3512   __ MoveRegister(out, value); | 3520   __ MoveRegister(out, value); | 
| 3513   __ shll(out, Immediate(kSmiTagSize)); | 3521   __ shll(out, Immediate(kSmiTagSize)); | 
| 3514   if (!ValueFitsSmi()) { | 3522   if (!ValueFitsSmi()) { | 
| 3515     Label done; | 3523     Label done; | 
| 3516     ASSERT(value != out); | 3524     ASSERT(value != out); | 
| 3517     if (from_representation() == kUnboxedInt32) { | 3525     if (from_representation() == kUnboxedInt32) { | 
| 3518       __ j(NO_OVERFLOW, &done); | 3526       __ j(NO_OVERFLOW, &done); | 
| 3519     } else { | 3527     } else { | 
| 3520       __ testl(value, Immediate(0xC0000000)); | 3528       __ testl(value, Immediate(0xC0000000)); | 
| 3521       __ j(ZERO, &done); | 3529       __ j(ZERO, &done); | 
| 3522     } | 3530     } | 
| 3523 | 3531 | 
| 3524     // Allocate a mint. | 3532     // Allocate a mint. | 
| 3525     // Value input is writable register and has to be manually preserved | 3533     // Value input is writable register and has to be manually preserved | 
| 3526     // on the slow path. | 3534     // on the slow path. | 
| 3527     locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32); | 3535     locs()->live_registers()->Add(locs()->in(0), kUnboxedInt32); | 
| 3528     BoxAllocationSlowPath::Allocate( | 3536     BoxAllocationSlowPath::Allocate( | 
| 3529         compiler, this, compiler->mint_class(), out, kNoRegister); | 3537         compiler, this, compiler->mint_class(), out, locs()->temp(0).reg()); | 
| 3530     __ movl(FieldAddress(out, Mint::value_offset()), value); | 3538     __ movl(FieldAddress(out, Mint::value_offset()), value); | 
| 3531     if (from_representation() == kUnboxedInt32) { | 3539     if (from_representation() == kUnboxedInt32) { | 
| 3532       __ sarl(value, Immediate(31));  // Sign extend. | 3540       __ sarl(value, Immediate(31));  // Sign extend. | 
| 3533       __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value); | 3541       __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), value); | 
| 3534     } else { | 3542     } else { | 
| 3535       __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), | 3543       __ movl(FieldAddress(out, Mint::value_offset() + kWordSize), | 
| 3536               Immediate(0)); | 3544               Immediate(0)); | 
| 3537     } | 3545     } | 
| 3538     __ Bind(&done); | 3546     __ Bind(&done); | 
| 3539   } | 3547   } | 
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3594   // 3. Restore lower half if result is a smi. | 3602   // 3. Restore lower half if result is a smi. | 
| 3595   __ subl(value_lo, Immediate(0x40000000)); | 3603   __ subl(value_lo, Immediate(0x40000000)); | 
| 3596   __ movl(out_reg, value_lo); | 3604   __ movl(out_reg, value_lo); | 
| 3597   __ SmiTag(out_reg); | 3605   __ SmiTag(out_reg); | 
| 3598   __ jmp(&done); | 3606   __ jmp(&done); | 
| 3599   __ Bind(¬_smi); | 3607   __ Bind(¬_smi); | 
| 3600   // 3. Restore lower half of input before using it. | 3608   // 3. Restore lower half of input before using it. | 
| 3601   __ subl(value_lo, Immediate(0x40000000)); | 3609   __ subl(value_lo, Immediate(0x40000000)); | 
| 3602 | 3610 | 
| 3603   BoxAllocationSlowPath::Allocate( | 3611   BoxAllocationSlowPath::Allocate( | 
| 3604       compiler, this, compiler->mint_class(), out_reg, kNoRegister); | 3612       compiler, this, compiler->mint_class(), out_reg, locs()->temp(0).reg()); | 
| 3605   __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo); | 3613   __ movl(FieldAddress(out_reg, Mint::value_offset()), value_lo); | 
| 3606   __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi); | 3614   __ movl(FieldAddress(out_reg, Mint::value_offset() + kWordSize), value_hi); | 
| 3607   __ Bind(&done); | 3615   __ Bind(&done); | 
| 3608 } | 3616 } | 
| 3609 | 3617 | 
| 3610 | 3618 | 
| 3611 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone, | 3619 LocationSummary* UnboxInteger32Instr::MakeLocationSummary(Zone* zone, | 
| 3612                                                           bool opt) const { | 3620                                                           bool opt) const { | 
| 3613   const intptr_t value_cid = value()->Type()->ToCid(); | 3621   const intptr_t value_cid = value()->Type()->ToCid(); | 
| 3614   const intptr_t kNumInputs = 1; | 3622   const intptr_t kNumInputs = 1; | 
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3701                       out_of_range); | 3709                       out_of_range); | 
| 3702     __ Bind(&done); | 3710     __ Bind(&done); | 
| 3703   } | 3711   } | 
| 3704 } | 3712 } | 
| 3705 | 3713 | 
| 3706 | 3714 | 
| 3707 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone, | 3715 LocationSummary* LoadCodeUnitsInstr::MakeLocationSummary(Zone* zone, | 
| 3708                                                          bool opt) const { | 3716                                                          bool opt) const { | 
| 3709   const bool might_box = (representation() == kTagged) && !can_pack_into_smi(); | 3717   const bool might_box = (representation() == kTagged) && !can_pack_into_smi(); | 
| 3710   const intptr_t kNumInputs = 2; | 3718   const intptr_t kNumInputs = 2; | 
| 3711   const intptr_t kNumTemps = might_box ? 1 : 0; | 3719   const intptr_t kNumTemps = might_box ? 2 : 0; | 
| 3712   LocationSummary* summary = new(zone) LocationSummary( | 3720   LocationSummary* summary = new(zone) LocationSummary( | 
| 3713       zone, kNumInputs, kNumTemps, | 3721       zone, kNumInputs, kNumTemps, | 
| 3714       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall); | 3722       might_box ? LocationSummary::kCallOnSlowPath : LocationSummary::kNoCall); | 
| 3715   summary->set_in(0, Location::RequiresRegister()); | 3723   summary->set_in(0, Location::RequiresRegister()); | 
| 3716   // The smi index is either untagged (element size == 1), or it is left smi | 3724   // The smi index is either untagged (element size == 1), or it is left smi | 
| 3717   // tagged (for all element sizes > 1). | 3725   // tagged (for all element sizes > 1). | 
| 3718   summary->set_in(1, (index_scale() == 1) ? Location::WritableRegister() | 3726   summary->set_in(1, (index_scale() == 1) ? Location::WritableRegister() | 
| 3719                                           : Location::RequiresRegister()); | 3727                                           : Location::RequiresRegister()); | 
| 3720   if (might_box) { | 3728   if (might_box) { | 
| 3721     summary->set_temp(0, Location::RequiresRegister()); | 3729     summary->set_temp(0, Location::RequiresRegister()); | 
|  | 3730     summary->set_temp(1, Location::RequiresRegister()); | 
| 3722   } | 3731   } | 
| 3723 | 3732 | 
| 3724   if (representation() == kUnboxedMint) { | 3733   if (representation() == kUnboxedMint) { | 
| 3725     summary->set_out(0, Location::Pair(Location::RequiresRegister(), | 3734     summary->set_out(0, Location::Pair(Location::RequiresRegister(), | 
| 3726                                        Location::RequiresRegister())); | 3735                                        Location::RequiresRegister())); | 
| 3727   } else { | 3736   } else { | 
| 3728     ASSERT(representation() == kTagged); | 3737     ASSERT(representation() == kTagged); | 
| 3729     summary->set_out(0, Location::RequiresRegister()); | 3738     summary->set_out(0, Location::RequiresRegister()); | 
| 3730   } | 3739   } | 
| 3731 | 3740 | 
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 3791         break; | 3800         break; | 
| 3792       default: | 3801       default: | 
| 3793         UNREACHABLE(); | 3802         UNREACHABLE(); | 
| 3794         break; | 3803         break; | 
| 3795     } | 3804     } | 
| 3796     if (can_pack_into_smi()) { | 3805     if (can_pack_into_smi()) { | 
| 3797       __ SmiTag(result); | 3806       __ SmiTag(result); | 
| 3798     } else { | 3807     } else { | 
| 3799       // If the value cannot fit in a smi then allocate a mint box for it. | 3808       // If the value cannot fit in a smi then allocate a mint box for it. | 
| 3800       Register temp = locs()->temp(0).reg(); | 3809       Register temp = locs()->temp(0).reg(); | 
|  | 3810       Register temp2 = locs()->temp(1).reg(); | 
| 3801       // Temp register needs to be manually preserved on allocation slow-path. | 3811       // Temp register needs to be manually preserved on allocation slow-path. | 
| 3802       locs()->live_registers()->Add(locs()->temp(0), kUnboxedInt32); | 3812       locs()->live_registers()->Add(locs()->temp(0), kUnboxedInt32); | 
| 3803 | 3813 | 
| 3804       ASSERT(temp != result); | 3814       ASSERT(temp != result); | 
| 3805       __ MoveRegister(temp, result); | 3815       __ MoveRegister(temp, result); | 
| 3806       __ SmiTag(result); | 3816       __ SmiTag(result); | 
| 3807 | 3817 | 
| 3808       Label done; | 3818       Label done; | 
| 3809       __ testl(temp, Immediate(0xC0000000)); | 3819       __ testl(temp, Immediate(0xC0000000)); | 
| 3810       __ j(ZERO, &done); | 3820       __ j(ZERO, &done); | 
| 3811       BoxAllocationSlowPath::Allocate( | 3821       BoxAllocationSlowPath::Allocate( | 
| 3812           compiler, this, compiler->mint_class(), result, kNoRegister); | 3822           compiler, this, compiler->mint_class(), result, temp2); | 
| 3813       __ movl(FieldAddress(result, Mint::value_offset()), temp); | 3823       __ movl(FieldAddress(result, Mint::value_offset()), temp); | 
| 3814       __ movl(FieldAddress(result, Mint::value_offset() + kWordSize), | 3824       __ movl(FieldAddress(result, Mint::value_offset() + kWordSize), | 
| 3815               Immediate(0)); | 3825               Immediate(0)); | 
| 3816       __ Bind(&done); | 3826       __ Bind(&done); | 
| 3817     } | 3827     } | 
| 3818   } | 3828   } | 
| 3819 } | 3829 } | 
| 3820 | 3830 | 
| 3821 | 3831 | 
| 3822 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone, | 3832 LocationSummary* BinaryDoubleOpInstr::MakeLocationSummary(Zone* zone, | 
| (...skipping 3023 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 6846   __ Drop(1); | 6856   __ Drop(1); | 
| 6847   __ popl(result); | 6857   __ popl(result); | 
| 6848 } | 6858 } | 
| 6849 | 6859 | 
| 6850 | 6860 | 
| 6851 }  // namespace dart | 6861 }  // namespace dart | 
| 6852 | 6862 | 
| 6853 #undef __ | 6863 #undef __ | 
| 6854 | 6864 | 
| 6855 #endif  // defined TARGET_ARCH_IA32 | 6865 #endif  // defined TARGET_ARCH_IA32 | 
| OLD | NEW | 
|---|