| 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_ARM. |     5 #include "vm/globals.h"  // Needed here to get TARGET_ARCH_ARM. | 
|     6 #if defined(TARGET_ARCH_ARM) |     6 #if defined(TARGET_ARCH_ARM) | 
|     7  |     7  | 
|     8 #include "vm/intermediate_language.h" |     8 #include "vm/intermediate_language.h" | 
|     9  |     9  | 
|    10 #include "vm/cpu.h" |    10 #include "vm/cpu.h" | 
| (...skipping 201 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   212   // R4: Arguments descriptor. |   212   // R4: Arguments descriptor. | 
|   213   // R0: Function. |   213   // R0: Function. | 
|   214   ASSERT(locs()->in(0).reg() == R0); |   214   ASSERT(locs()->in(0).reg() == R0); | 
|   215   __ ldr(R2, FieldAddress(R0, Function::instructions_offset())); |   215   __ ldr(R2, FieldAddress(R0, Function::instructions_offset())); | 
|   216  |   216  | 
|   217   // R2: instructions. |   217   // R2: instructions. | 
|   218   // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value). |   218   // R5: Smi 0 (no IC data; the lazy-compile stub expects a GC-safe value). | 
|   219   __ LoadImmediate(R5, 0); |   219   __ LoadImmediate(R5, 0); | 
|   220   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag); |   220   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag); | 
|   221   __ blx(R2); |   221   __ blx(R2); | 
|   222   compiler->AddCurrentDescriptor(PcDescriptors::kClosureCall, |   222   compiler->AddCurrentDescriptor(RawPcDescriptors::kClosureCall, | 
|   223                                  deopt_id(), |   223                                  deopt_id(), | 
|   224                                  token_pos()); |   224                                  token_pos()); | 
|   225   compiler->RecordSafepoint(locs()); |   225   compiler->RecordSafepoint(locs()); | 
|   226   // Marks either the continuation point in unoptimized code or the |   226   // Marks either the continuation point in unoptimized code or the | 
|   227   // deoptimization point in optimized code, after call. |   227   // deoptimization point in optimized code, after call. | 
|   228   const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id()); |   228   const intptr_t deopt_id_after = Isolate::ToDeoptAfter(deopt_id()); | 
|   229   if (compiler->is_optimizing()) { |   229   if (compiler->is_optimizing()) { | 
|   230     compiler->AddDeoptIndexAtCall(deopt_id_after, token_pos()); |   230     compiler->AddDeoptIndexAtCall(deopt_id_after, token_pos()); | 
|   231   } else { |   231   } else { | 
|   232     // Add deoptimization continuation point after the call and before the |   232     // Add deoptimization continuation point after the call and before the | 
|   233     // arguments are removed. |   233     // arguments are removed. | 
|   234     compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |   234     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 
|   235                                    deopt_id_after, |   235                                    deopt_id_after, | 
|   236                                    token_pos()); |   236                                    token_pos()); | 
|   237   } |   237   } | 
|   238   __ Drop(argument_count); |   238   __ Drop(argument_count); | 
|   239 } |   239 } | 
|   240  |   240  | 
|   241  |   241  | 
|   242 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, |   242 LocationSummary* LoadLocalInstr::MakeLocationSummary(Isolate* isolate, | 
|   243                                                      bool opt) const { |   243                                                      bool opt) const { | 
|   244   return LocationSummary::Make(isolate, |   244   return LocationSummary::Make(isolate, | 
| (...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   944     if (!function().IsNativeAutoSetupScope()) { |   944     if (!function().IsNativeAutoSetupScope()) { | 
|   945       entry = Simulator::RedirectExternalReference( |   945       entry = Simulator::RedirectExternalReference( | 
|   946           entry, Simulator::kBootstrapNativeCall, function().NumParameters()); |   946           entry, Simulator::kBootstrapNativeCall, function().NumParameters()); | 
|   947     } |   947     } | 
|   948 #endif |   948 #endif | 
|   949   } |   949   } | 
|   950   __ LoadImmediate(R5, entry); |   950   __ LoadImmediate(R5, entry); | 
|   951   __ LoadImmediate(R1, argc_tag); |   951   __ LoadImmediate(R1, argc_tag); | 
|   952   compiler->GenerateCall(token_pos(), |   952   compiler->GenerateCall(token_pos(), | 
|   953                          stub_entry, |   953                          stub_entry, | 
|   954                          PcDescriptors::kOther, |   954                          RawPcDescriptors::kOther, | 
|   955                          locs()); |   955                          locs()); | 
|   956   __ Pop(result); |   956   __ Pop(result); | 
|   957 } |   957 } | 
|   958  |   958  | 
|   959  |   959  | 
|   960 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, |   960 LocationSummary* StringFromCharCodeInstr::MakeLocationSummary(Isolate* isolate, | 
|   961                                                               bool opt) const { |   961                                                               bool opt) const { | 
|   962   const intptr_t kNumInputs = 1; |   962   const intptr_t kNumInputs = 1; | 
|   963   // TODO(fschneider): Allow immediate operands for the char code. |   963   // TODO(fschneider): Allow immediate operands for the char code. | 
|   964   return LocationSummary::Make(isolate, |   964   return LocationSummary::Make(isolate, | 
| (...skipping 959 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  1924     const Code& stub = |  1924     const Code& stub = | 
|  1925         Code::Handle(StubCode::GetAllocationStubForClass(cls_)); |  1925         Code::Handle(StubCode::GetAllocationStubForClass(cls_)); | 
|  1926     const ExternalLabel label(stub.EntryPoint()); |  1926     const ExternalLabel label(stub.EntryPoint()); | 
|  1927  |  1927  | 
|  1928     LocationSummary* locs = instruction_->locs(); |  1928     LocationSummary* locs = instruction_->locs(); | 
|  1929     locs->live_registers()->Remove(locs->out(0)); |  1929     locs->live_registers()->Remove(locs->out(0)); | 
|  1930  |  1930  | 
|  1931     compiler->SaveLiveRegisters(locs); |  1931     compiler->SaveLiveRegisters(locs); | 
|  1932     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  1932     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  1933                            &label, |  1933                            &label, | 
|  1934                            PcDescriptors::kOther, |  1934                            RawPcDescriptors::kOther, | 
|  1935                            locs); |  1935                            locs); | 
|  1936     __ MoveRegister(locs->temp(0).reg(), R0); |  1936     __ MoveRegister(locs->temp(0).reg(), R0); | 
|  1937     compiler->RestoreLiveRegisters(locs); |  1937     compiler->RestoreLiveRegisters(locs); | 
|  1938  |  1938  | 
|  1939     __ b(exit_label()); |  1939     __ b(exit_label()); | 
|  1940   } |  1940   } | 
|  1941  |  1941  | 
|  1942  private: |  1942  private: | 
|  1943   StoreInstanceFieldInstr* instruction_; |  1943   StoreInstanceFieldInstr* instruction_; | 
|  1944   const Class& cls_; |  1944   const Class& cls_; | 
| (...skipping 428 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2373                                     locs()); |  2373                                     locs()); | 
|  2374       __ Drop(2); |  2374       __ Drop(2); | 
|  2375       __ Pop(kResultReg); |  2375       __ Pop(kResultReg); | 
|  2376       __ Bind(&done); |  2376       __ Bind(&done); | 
|  2377       return; |  2377       return; | 
|  2378     } |  2378     } | 
|  2379   } |  2379   } | 
|  2380  |  2380  | 
|  2381   compiler->GenerateCall(token_pos(), |  2381   compiler->GenerateCall(token_pos(), | 
|  2382                          &StubCode::AllocateArrayLabel(), |  2382                          &StubCode::AllocateArrayLabel(), | 
|  2383                          PcDescriptors::kOther, |  2383                          RawPcDescriptors::kOther, | 
|  2384                          locs()); |  2384                          locs()); | 
|  2385   ASSERT(locs()->out(0).reg() == kResultReg); |  2385   ASSERT(locs()->out(0).reg() == kResultReg); | 
|  2386 } |  2386 } | 
|  2387  |  2387  | 
|  2388  |  2388  | 
|  2389 class BoxDoubleSlowPath : public SlowPathCode { |  2389 class BoxDoubleSlowPath : public SlowPathCode { | 
|  2390  public: |  2390  public: | 
|  2391   explicit BoxDoubleSlowPath(Instruction* instruction) |  2391   explicit BoxDoubleSlowPath(Instruction* instruction) | 
|  2392       : instruction_(instruction) { } |  2392       : instruction_(instruction) { } | 
|  2393  |  2393  | 
|  2394   virtual void EmitNativeCode(FlowGraphCompiler* compiler) { |  2394   virtual void EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  2395     __ Comment("BoxDoubleSlowPath"); |  2395     __ Comment("BoxDoubleSlowPath"); | 
|  2396     __ Bind(entry_label()); |  2396     __ Bind(entry_label()); | 
|  2397     const Class& double_class = compiler->double_class(); |  2397     const Class& double_class = compiler->double_class(); | 
|  2398     const Code& stub = |  2398     const Code& stub = | 
|  2399         Code::Handle(StubCode::GetAllocationStubForClass(double_class)); |  2399         Code::Handle(StubCode::GetAllocationStubForClass(double_class)); | 
|  2400     const ExternalLabel label(stub.EntryPoint()); |  2400     const ExternalLabel label(stub.EntryPoint()); | 
|  2401  |  2401  | 
|  2402     LocationSummary* locs = instruction_->locs(); |  2402     LocationSummary* locs = instruction_->locs(); | 
|  2403     locs->live_registers()->Remove(locs->out(0)); |  2403     locs->live_registers()->Remove(locs->out(0)); | 
|  2404  |  2404  | 
|  2405     compiler->SaveLiveRegisters(locs); |  2405     compiler->SaveLiveRegisters(locs); | 
|  2406     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  2406     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  2407                            &label, |  2407                            &label, | 
|  2408                            PcDescriptors::kOther, |  2408                            RawPcDescriptors::kOther, | 
|  2409                            locs); |  2409                            locs); | 
|  2410     __ MoveRegister(locs->out(0).reg(), R0); |  2410     __ MoveRegister(locs->out(0).reg(), R0); | 
|  2411     compiler->RestoreLiveRegisters(locs); |  2411     compiler->RestoreLiveRegisters(locs); | 
|  2412  |  2412  | 
|  2413     __ b(exit_label()); |  2413     __ b(exit_label()); | 
|  2414   } |  2414   } | 
|  2415  |  2415  | 
|  2416  private: |  2416  private: | 
|  2417   Instruction* instruction_; |  2417   Instruction* instruction_; | 
|  2418 }; |  2418 }; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  2430     const Code& stub = |  2430     const Code& stub = | 
|  2431         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class)); |  2431         Code::Handle(StubCode::GetAllocationStubForClass(float32x4_class)); | 
|  2432     const ExternalLabel label(stub.EntryPoint()); |  2432     const ExternalLabel label(stub.EntryPoint()); | 
|  2433  |  2433  | 
|  2434     LocationSummary* locs = instruction_->locs(); |  2434     LocationSummary* locs = instruction_->locs(); | 
|  2435     locs->live_registers()->Remove(locs->out(0)); |  2435     locs->live_registers()->Remove(locs->out(0)); | 
|  2436  |  2436  | 
|  2437     compiler->SaveLiveRegisters(locs); |  2437     compiler->SaveLiveRegisters(locs); | 
|  2438     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  2438     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  2439                            &label, |  2439                            &label, | 
|  2440                            PcDescriptors::kOther, |  2440                            RawPcDescriptors::kOther, | 
|  2441                            locs); |  2441                            locs); | 
|  2442     __ mov(locs->out(0).reg(), Operand(R0)); |  2442     __ mov(locs->out(0).reg(), Operand(R0)); | 
|  2443     compiler->RestoreLiveRegisters(locs); |  2443     compiler->RestoreLiveRegisters(locs); | 
|  2444  |  2444  | 
|  2445     __ b(exit_label()); |  2445     __ b(exit_label()); | 
|  2446   } |  2446   } | 
|  2447  |  2447  | 
|  2448  private: |  2448  private: | 
|  2449   Instruction* instruction_; |  2449   Instruction* instruction_; | 
|  2450 }; |  2450 }; | 
| (...skipping 11 matching lines...) Expand all  Loading... | 
|  2462     const Code& stub = |  2462     const Code& stub = | 
|  2463         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class)); |  2463         Code::Handle(StubCode::GetAllocationStubForClass(float64x2_class)); | 
|  2464     const ExternalLabel label(stub.EntryPoint()); |  2464     const ExternalLabel label(stub.EntryPoint()); | 
|  2465  |  2465  | 
|  2466     LocationSummary* locs = instruction_->locs(); |  2466     LocationSummary* locs = instruction_->locs(); | 
|  2467     locs->live_registers()->Remove(locs->out(0)); |  2467     locs->live_registers()->Remove(locs->out(0)); | 
|  2468  |  2468  | 
|  2469     compiler->SaveLiveRegisters(locs); |  2469     compiler->SaveLiveRegisters(locs); | 
|  2470     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  2470     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  2471                            &label, |  2471                            &label, | 
|  2472                            PcDescriptors::kOther, |  2472                            RawPcDescriptors::kOther, | 
|  2473                            locs); |  2473                            locs); | 
|  2474     __ mov(locs->out(0).reg(), Operand(R0)); |  2474     __ mov(locs->out(0).reg(), Operand(R0)); | 
|  2475     compiler->RestoreLiveRegisters(locs); |  2475     compiler->RestoreLiveRegisters(locs); | 
|  2476  |  2476  | 
|  2477     __ b(exit_label()); |  2477     __ b(exit_label()); | 
|  2478   } |  2478   } | 
|  2479  |  2479  | 
|  2480  private: |  2480  private: | 
|  2481   Instruction* instruction_; |  2481   Instruction* instruction_; | 
|  2482 }; |  2482 }; | 
| (...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2747  |  2747  | 
|  2748  |  2748  | 
|  2749 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  2749 void AllocateContextInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  2750   ASSERT(locs()->temp(0).reg() == R1); |  2750   ASSERT(locs()->temp(0).reg() == R1); | 
|  2751   ASSERT(locs()->out(0).reg() == R0); |  2751   ASSERT(locs()->out(0).reg() == R0); | 
|  2752  |  2752  | 
|  2753   __ LoadImmediate(R1, num_context_variables()); |  2753   __ LoadImmediate(R1, num_context_variables()); | 
|  2754   const ExternalLabel label(StubCode::AllocateContextEntryPoint()); |  2754   const ExternalLabel label(StubCode::AllocateContextEntryPoint()); | 
|  2755   compiler->GenerateCall(token_pos(), |  2755   compiler->GenerateCall(token_pos(), | 
|  2756                          &label, |  2756                          &label, | 
|  2757                          PcDescriptors::kOther, |  2757                          RawPcDescriptors::kOther, | 
|  2758                          locs()); |  2758                          locs()); | 
|  2759 } |  2759 } | 
|  2760  |  2760  | 
|  2761  |  2761  | 
|  2762 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, |  2762 LocationSummary* CloneContextInstr::MakeLocationSummary(Isolate* isolate, | 
|  2763                                                         bool opt) const { |  2763                                                         bool opt) const { | 
|  2764   const intptr_t kNumInputs = 1; |  2764   const intptr_t kNumInputs = 1; | 
|  2765   const intptr_t kNumTemps = 0; |  2765   const intptr_t kNumTemps = 0; | 
|  2766   LocationSummary* locs = new(isolate) LocationSummary( |  2766   LocationSummary* locs = new(isolate) LocationSummary( | 
|  2767       isolate, kNumInputs, kNumTemps, LocationSummary::kCall); |  2767       isolate, kNumInputs, kNumTemps, LocationSummary::kCall); | 
| (...skipping 94 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2862     Environment* env = compiler->SlowPathEnvironmentFor(instruction_); |  2862     Environment* env = compiler->SlowPathEnvironmentFor(instruction_); | 
|  2863     compiler->pending_deoptimization_env_ = env; |  2863     compiler->pending_deoptimization_env_ = env; | 
|  2864     compiler->GenerateRuntimeCall(instruction_->token_pos(), |  2864     compiler->GenerateRuntimeCall(instruction_->token_pos(), | 
|  2865                                   instruction_->deopt_id(), |  2865                                   instruction_->deopt_id(), | 
|  2866                                   kStackOverflowRuntimeEntry, |  2866                                   kStackOverflowRuntimeEntry, | 
|  2867                                   0, |  2867                                   0, | 
|  2868                                   instruction_->locs()); |  2868                                   instruction_->locs()); | 
|  2869  |  2869  | 
|  2870     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) { |  2870     if (FLAG_use_osr && !compiler->is_optimizing() && instruction_->in_loop()) { | 
|  2871       // In unoptimized code, record loop stack checks as possible OSR entries. |  2871       // In unoptimized code, record loop stack checks as possible OSR entries. | 
|  2872       compiler->AddCurrentDescriptor(PcDescriptors::kOsrEntry, |  2872       compiler->AddCurrentDescriptor(RawPcDescriptors::kOsrEntry, | 
|  2873                                      instruction_->deopt_id(), |  2873                                      instruction_->deopt_id(), | 
|  2874                                      0);  // No token position. |  2874                                      0);  // No token position. | 
|  2875     } |  2875     } | 
|  2876     compiler->pending_deoptimization_env_ = NULL; |  2876     compiler->pending_deoptimization_env_ = NULL; | 
|  2877     compiler->RestoreLiveRegisters(instruction_->locs()); |  2877     compiler->RestoreLiveRegisters(instruction_->locs()); | 
|  2878     __ b(exit_label()); |  2878     __ b(exit_label()); | 
|  2879   } |  2879   } | 
|  2880  |  2880  | 
|  2881   Label* osr_entry_label() { |  2881   Label* osr_entry_label() { | 
|  2882     ASSERT(FLAG_use_osr); |  2882     ASSERT(FLAG_use_osr); | 
| (...skipping 815 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3698     const Code& stub = |  3698     const Code& stub = | 
|  3699         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class)); |  3699         Code::Handle(StubCode::GetAllocationStubForClass(int32x4_class)); | 
|  3700     const ExternalLabel label(stub.EntryPoint()); |  3700     const ExternalLabel label(stub.EntryPoint()); | 
|  3701  |  3701  | 
|  3702     LocationSummary* locs = instruction_->locs(); |  3702     LocationSummary* locs = instruction_->locs(); | 
|  3703     locs->live_registers()->Remove(locs->out(0)); |  3703     locs->live_registers()->Remove(locs->out(0)); | 
|  3704  |  3704  | 
|  3705     compiler->SaveLiveRegisters(locs); |  3705     compiler->SaveLiveRegisters(locs); | 
|  3706     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  3706     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  3707                            &label, |  3707                            &label, | 
|  3708                            PcDescriptors::kOther, |  3708                            RawPcDescriptors::kOther, | 
|  3709                            locs); |  3709                            locs); | 
|  3710     __ mov(locs->out(0).reg(), Operand(R0)); |  3710     __ mov(locs->out(0).reg(), Operand(R0)); | 
|  3711     compiler->RestoreLiveRegisters(locs); |  3711     compiler->RestoreLiveRegisters(locs); | 
|  3712  |  3712  | 
|  3713     __ b(exit_label()); |  3713     __ b(exit_label()); | 
|  3714   } |  3714   } | 
|  3715  |  3715  | 
|  3716  private: |  3716  private: | 
|  3717   BoxInt32x4Instr* instruction_; |  3717   BoxInt32x4Instr* instruction_; | 
|  3718 }; |  3718 }; | 
| (...skipping 2199 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  5918     const Code& stub = |  5918     const Code& stub = | 
|  5919         Code::Handle(StubCode::GetAllocationStubForClass(mint_class)); |  5919         Code::Handle(StubCode::GetAllocationStubForClass(mint_class)); | 
|  5920     const ExternalLabel label(stub.EntryPoint()); |  5920     const ExternalLabel label(stub.EntryPoint()); | 
|  5921  |  5921  | 
|  5922     LocationSummary* locs = instruction_->locs(); |  5922     LocationSummary* locs = instruction_->locs(); | 
|  5923     locs->live_registers()->Remove(locs->out(0)); |  5923     locs->live_registers()->Remove(locs->out(0)); | 
|  5924  |  5924  | 
|  5925     compiler->SaveLiveRegisters(locs); |  5925     compiler->SaveLiveRegisters(locs); | 
|  5926     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. |  5926     compiler->GenerateCall(Scanner::kNoSourcePos,  // No token position. | 
|  5927                            &label, |  5927                            &label, | 
|  5928                            PcDescriptors::kOther, |  5928                            RawPcDescriptors::kOther, | 
|  5929                            locs); |  5929                            locs); | 
|  5930     __ mov(locs->out(0).reg(), Operand(R0)); |  5930     __ mov(locs->out(0).reg(), Operand(R0)); | 
|  5931     compiler->RestoreLiveRegisters(locs); |  5931     compiler->RestoreLiveRegisters(locs); | 
|  5932  |  5932  | 
|  5933     __ b(exit_label()); |  5933     __ b(exit_label()); | 
|  5934   } |  5934   } | 
|  5935  |  5935  | 
|  5936  private: |  5936  private: | 
|  5937   BoxIntegerInstr* instruction_; |  5937   BoxIntegerInstr* instruction_; | 
|  5938 }; |  5938 }; | 
| (...skipping 315 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  6254 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  6254 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  6255   __ Bind(compiler->GetJumpLabel(this)); |  6255   __ Bind(compiler->GetJumpLabel(this)); | 
|  6256   if (!compiler->is_optimizing()) { |  6256   if (!compiler->is_optimizing()) { | 
|  6257     if (compiler->NeedsEdgeCounter(this)) { |  6257     if (compiler->NeedsEdgeCounter(this)) { | 
|  6258       compiler->EmitEdgeCounter(); |  6258       compiler->EmitEdgeCounter(); | 
|  6259     } |  6259     } | 
|  6260     // Add an edge counter. |  6260     // Add an edge counter. | 
|  6261     // On ARM the deoptimization descriptor points after the edge counter |  6261     // On ARM the deoptimization descriptor points after the edge counter | 
|  6262     // code so that we can reuse the same pattern matching code as at call |  6262     // code so that we can reuse the same pattern matching code as at call | 
|  6263     // sites, which matches backwards from the end of the pattern. |  6263     // sites, which matches backwards from the end of the pattern. | 
|  6264     compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |  6264     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 
|  6265                                    deopt_id_, |  6265                                    deopt_id_, | 
|  6266                                    Scanner::kNoSourcePos); |  6266                                    Scanner::kNoSourcePos); | 
|  6267   } |  6267   } | 
|  6268   if (HasParallelMove()) { |  6268   if (HasParallelMove()) { | 
|  6269     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |  6269     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 
|  6270   } |  6270   } | 
|  6271 } |  6271 } | 
|  6272  |  6272  | 
|  6273  |  6273  | 
|  6274 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, |  6274 LocationSummary* GotoInstr::MakeLocationSummary(Isolate* isolate, | 
|  6275                                                 bool opt) const { |  6275                                                 bool opt) const { | 
|  6276   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); |  6276   return new(isolate) LocationSummary(isolate, 0, 0, LocationSummary::kNoCall); | 
|  6277 } |  6277 } | 
|  6278  |  6278  | 
|  6279  |  6279  | 
|  6280 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  6280 void GotoInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  6281   if (!compiler->is_optimizing()) { |  6281   if (!compiler->is_optimizing()) { | 
|  6282     if (FLAG_emit_edge_counters) { |  6282     if (FLAG_emit_edge_counters) { | 
|  6283       compiler->EmitEdgeCounter(); |  6283       compiler->EmitEdgeCounter(); | 
|  6284     } |  6284     } | 
|  6285     // Add a deoptimization descriptor for deoptimizing instructions that |  6285     // Add a deoptimization descriptor for deoptimizing instructions that | 
|  6286     // may be inserted before this instruction.  On ARM this descriptor |  6286     // may be inserted before this instruction.  On ARM this descriptor | 
|  6287     // points after the edge counter code so that we can reuse the same |  6287     // points after the edge counter code so that we can reuse the same | 
|  6288     // pattern matching code as at call sites, which matches backwards from |  6288     // pattern matching code as at call sites, which matches backwards from | 
|  6289     // the end of the pattern. |  6289     // the end of the pattern. | 
|  6290     compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |  6290     compiler->AddCurrentDescriptor(RawPcDescriptors::kDeopt, | 
|  6291                                    GetDeoptId(), |  6291                                    GetDeoptId(), | 
|  6292                                    Scanner::kNoSourcePos); |  6292                                    Scanner::kNoSourcePos); | 
|  6293   } |  6293   } | 
|  6294   if (HasParallelMove()) { |  6294   if (HasParallelMove()) { | 
|  6295     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); |  6295     compiler->parallel_move_resolver()->EmitNativeCode(parallel_move()); | 
|  6296   } |  6296   } | 
|  6297  |  6297  | 
|  6298   // We can fall through if the successor is the next block in the list. |  6298   // We can fall through if the successor is the next block in the list. | 
|  6299   // Otherwise, we need a jump. |  6299   // Otherwise, we need a jump. | 
|  6300   if (!compiler->CanFallThroughTo(successor())) { |  6300   if (!compiler->CanFallThroughTo(successor())) { | 
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  6414                                                           bool opt) const { |  6414                                                           bool opt) const { | 
|  6415   return MakeCallSummary(); |  6415   return MakeCallSummary(); | 
|  6416 } |  6416 } | 
|  6417  |  6417  | 
|  6418  |  6418  | 
|  6419 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  6419 void AllocateObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  6420   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); |  6420   const Code& stub = Code::Handle(StubCode::GetAllocationStubForClass(cls())); | 
|  6421   const ExternalLabel label(stub.EntryPoint()); |  6421   const ExternalLabel label(stub.EntryPoint()); | 
|  6422   compiler->GenerateCall(token_pos(), |  6422   compiler->GenerateCall(token_pos(), | 
|  6423                          &label, |  6423                          &label, | 
|  6424                          PcDescriptors::kOther, |  6424                          RawPcDescriptors::kOther, | 
|  6425                          locs()); |  6425                          locs()); | 
|  6426   __ Drop(ArgumentCount());  // Discard arguments. |  6426   __ Drop(ArgumentCount());  // Discard arguments. | 
|  6427 } |  6427 } | 
|  6428  |  6428  | 
|  6429  |  6429  | 
|  6430 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  6430 void DebugStepCheckInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  6431   ASSERT(!compiler->is_optimizing()); |  6431   ASSERT(!compiler->is_optimizing()); | 
|  6432   const ExternalLabel label(StubCode::DebugStepCheckEntryPoint()); |  6432   const ExternalLabel label(StubCode::DebugStepCheckEntryPoint()); | 
|  6433   __ LoadImmediate(R4, 0); |  6433   __ LoadImmediate(R4, 0); | 
|  6434   __ LoadImmediate(R5, 0); |  6434   __ LoadImmediate(R5, 0); | 
|  6435   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); |  6435   compiler->GenerateCall(token_pos(), &label, stub_kind_, locs()); | 
|  6436 #if defined(DEBUG) |  6436 #if defined(DEBUG) | 
|  6437   __ LoadImmediate(R4, kInvalidObjectPointer); |  6437   __ LoadImmediate(R4, kInvalidObjectPointer); | 
|  6438   __ LoadImmediate(R5, kInvalidObjectPointer); |  6438   __ LoadImmediate(R5, kInvalidObjectPointer); | 
|  6439 #endif |  6439 #endif | 
|  6440 } |  6440 } | 
|  6441  |  6441  | 
|  6442 }  // namespace dart |  6442 }  // namespace dart | 
|  6443  |  6443  | 
|  6444 #endif  // defined TARGET_ARCH_ARM |  6444 #endif  // defined TARGET_ARCH_ARM | 
| OLD | NEW |