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 |