| 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 "lib/error.h" | 10 #include "lib/error.h" |
| (...skipping 368 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 379 intptr_t token_pos, | 379 intptr_t token_pos, |
| 380 Token::Kind kind, | 380 Token::Kind kind, |
| 381 LocationSummary* locs, | 381 LocationSummary* locs, |
| 382 const ICData& original_ic_data) { | 382 const ICData& original_ic_data) { |
| 383 if (!compiler->is_optimizing()) { | 383 if (!compiler->is_optimizing()) { |
| 384 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 384 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
| 385 deopt_id, | 385 deopt_id, |
| 386 token_pos); | 386 token_pos); |
| 387 } | 387 } |
| 388 const int kNumberOfArguments = 2; | 388 const int kNumberOfArguments = 2; |
| 389 const Array& kNoArgumentNames = Array::Handle(); | 389 const Array& kNoArgumentNames = Object::null_array(); |
| 390 const int kNumArgumentsChecked = 2; | 390 const int kNumArgumentsChecked = 2; |
| 391 | 391 |
| 392 Label check_identity; | 392 Label check_identity; |
| 393 __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null())); | 393 __ LoadImmediate(IP, reinterpret_cast<intptr_t>(Object::null())); |
| 394 __ ldm(IA, SP, (1 << R0) | (1 << R1)); | 394 __ ldm(IA, SP, (1 << R0) | (1 << R1)); |
| 395 __ cmp(R1, ShifterOperand(IP)); | 395 __ cmp(R1, ShifterOperand(IP)); |
| 396 __ b(&check_identity, EQ); | 396 __ b(&check_identity, EQ); |
| 397 __ cmp(R0, ShifterOperand(IP)); | 397 __ cmp(R0, ShifterOperand(IP)); |
| 398 __ b(&check_identity, EQ); | 398 __ b(&check_identity, EQ); |
| 399 | 399 |
| (...skipping 143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 543 __ cmp(left, ShifterOperand(right)); | 543 __ cmp(left, ShifterOperand(right)); |
| 544 if (branch != NULL) { | 544 if (branch != NULL) { |
| 545 branch->EmitBranchOnCondition(compiler, cond); | 545 branch->EmitBranchOnCondition(compiler, cond); |
| 546 } else { | 546 } else { |
| 547 Register result = locs->out().reg(); | 547 Register result = locs->out().reg(); |
| 548 __ LoadObject(result, Bool::True(), cond); | 548 __ LoadObject(result, Bool::True(), cond); |
| 549 __ LoadObject(result, Bool::False(), NegateCondition(cond)); | 549 __ LoadObject(result, Bool::False(), NegateCondition(cond)); |
| 550 } | 550 } |
| 551 } else { | 551 } else { |
| 552 const int kNumberOfArguments = 2; | 552 const int kNumberOfArguments = 2; |
| 553 const Array& kNoArgumentNames = Array::Handle(); | 553 const Array& kNoArgumentNames = Object::null_array(); |
| 554 compiler->GenerateStaticCall(deopt_id, | 554 compiler->GenerateStaticCall(deopt_id, |
| 555 token_pos, | 555 token_pos, |
| 556 target, | 556 target, |
| 557 kNumberOfArguments, | 557 kNumberOfArguments, |
| 558 kNoArgumentNames, | 558 kNoArgumentNames, |
| 559 locs); | 559 locs); |
| 560 if (branch == NULL) { | 560 if (branch == NULL) { |
| 561 if (kind == Token::kNE) { | 561 if (kind == Token::kNE) { |
| 562 __ CompareObject(R0, Bool::True()); | 562 __ CompareObject(R0, Bool::True()); |
| 563 __ LoadObject(R0, Bool::True(), NE); | 563 __ LoadObject(R0, Bool::True(), NE); |
| (...skipping 360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 924 if (HasICData() && (ic_data()->NumberOfChecks() > 0)) { | 924 if (HasICData() && (ic_data()->NumberOfChecks() > 0)) { |
| 925 Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptRelationalOp); | 925 Label* deopt = compiler->AddDeoptStub(deopt_id(), kDeoptRelationalOp); |
| 926 // Load class into R2. Since this is a call, any register except | 926 // Load class into R2. Since this is a call, any register except |
| 927 // the fixed input registers would be ok. | 927 // the fixed input registers would be ok. |
| 928 ASSERT((left != R2) && (right != R2)); | 928 ASSERT((left != R2) && (right != R2)); |
| 929 const intptr_t kNumArguments = 2; | 929 const intptr_t kNumArguments = 2; |
| 930 LoadValueCid(compiler, R2, left); | 930 LoadValueCid(compiler, R2, left); |
| 931 compiler->EmitTestAndCall(ICData::Handle(ic_data()->AsUnaryClassChecks()), | 931 compiler->EmitTestAndCall(ICData::Handle(ic_data()->AsUnaryClassChecks()), |
| 932 R2, // Class id register. | 932 R2, // Class id register. |
| 933 kNumArguments, | 933 kNumArguments, |
| 934 Array::Handle(), // No named arguments. | 934 Object::null_array(), // No named arguments. |
| 935 deopt, // Deoptimize target. | 935 deopt, // Deoptimize target. |
| 936 deopt_id(), | 936 deopt_id(), |
| 937 token_pos(), | 937 token_pos(), |
| 938 locs()); | 938 locs()); |
| 939 return; | 939 return; |
| 940 } | 940 } |
| 941 const String& function_name = | 941 const String& function_name = |
| 942 String::ZoneHandle(Symbols::New(Token::Str(kind()))); | 942 String::ZoneHandle(Symbols::New(Token::Str(kind()))); |
| 943 if (!compiler->is_optimizing()) { | 943 if (!compiler->is_optimizing()) { |
| 944 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, | 944 compiler->AddCurrentDescriptor(PcDescriptors::kDeopt, |
| (...skipping 2077 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3022 ASSERT(instance_call()->HasICData()); | 3022 ASSERT(instance_call()->HasICData()); |
| 3023 const ICData& ic_data = *instance_call()->ic_data(); | 3023 const ICData& ic_data = *instance_call()->ic_data(); |
| 3024 ASSERT((ic_data.NumberOfChecks() == 1)); | 3024 ASSERT((ic_data.NumberOfChecks() == 1)); |
| 3025 const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0)); | 3025 const Function& target = Function::ZoneHandle(ic_data.GetTargetAt(0)); |
| 3026 | 3026 |
| 3027 const intptr_t kNumberOfArguments = 1; | 3027 const intptr_t kNumberOfArguments = 1; |
| 3028 compiler->GenerateStaticCall(deopt_id(), | 3028 compiler->GenerateStaticCall(deopt_id(), |
| 3029 instance_call()->token_pos(), | 3029 instance_call()->token_pos(), |
| 3030 target, | 3030 target, |
| 3031 kNumberOfArguments, | 3031 kNumberOfArguments, |
| 3032 Array::Handle(), // No argument names., | 3032 Object::null_array(), // No argument names., |
| 3033 locs()); | 3033 locs()); |
| 3034 __ Bind(&done); | 3034 __ Bind(&done); |
| 3035 } | 3035 } |
| 3036 | 3036 |
| 3037 | 3037 |
| 3038 LocationSummary* DoubleToSmiInstr::MakeLocationSummary() const { | 3038 LocationSummary* DoubleToSmiInstr::MakeLocationSummary() const { |
| 3039 const intptr_t kNumInputs = 1; | 3039 const intptr_t kNumInputs = 1; |
| 3040 const intptr_t kNumTemps = 0; | 3040 const intptr_t kNumTemps = 0; |
| 3041 LocationSummary* result = new LocationSummary( | 3041 LocationSummary* result = new LocationSummary( |
| 3042 kNumInputs, kNumTemps, LocationSummary::kNoCall); | 3042 kNumInputs, kNumTemps, LocationSummary::kNoCall); |
| (...skipping 584 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3627 compiler->GenerateCall(token_pos(), | 3627 compiler->GenerateCall(token_pos(), |
| 3628 &label, | 3628 &label, |
| 3629 PcDescriptors::kOther, | 3629 PcDescriptors::kOther, |
| 3630 locs()); | 3630 locs()); |
| 3631 __ Drop(2); // Discard type arguments and receiver. | 3631 __ Drop(2); // Discard type arguments and receiver. |
| 3632 } | 3632 } |
| 3633 | 3633 |
| 3634 } // namespace dart | 3634 } // namespace dart |
| 3635 | 3635 |
| 3636 #endif // defined TARGET_ARCH_ARM | 3636 #endif // defined TARGET_ARCH_ARM |
| OLD | NEW |