| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 486 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 497 | 497 |
| 498 if (id == IC::kCallIC_Miss) { | 498 if (id == IC::kCallIC_Miss) { |
| 499 __ IncrementCounter(isolate->counters()->call_miss(), 1, r3, r4); | 499 __ IncrementCounter(isolate->counters()->call_miss(), 1, r3, r4); |
| 500 } else { | 500 } else { |
| 501 __ IncrementCounter(isolate->counters()->keyed_call_miss(), 1, r3, r4); | 501 __ IncrementCounter(isolate->counters()->keyed_call_miss(), 1, r3, r4); |
| 502 } | 502 } |
| 503 | 503 |
| 504 // Get the receiver of the function from the stack. | 504 // Get the receiver of the function from the stack. |
| 505 __ ldr(r3, MemOperand(sp, argc * kPointerSize)); | 505 __ ldr(r3, MemOperand(sp, argc * kPointerSize)); |
| 506 | 506 |
| 507 __ EnterInternalFrame(); | 507 { |
| 508 FrameScope scope(masm, StackFrame::INTERNAL); |
| 508 | 509 |
| 509 // Push the receiver and the name of the function. | 510 // Push the receiver and the name of the function. |
| 510 __ Push(r3, r2); | 511 __ Push(r3, r2); |
| 511 | 512 |
| 512 // Call the entry. | 513 // Call the entry. |
| 513 __ mov(r0, Operand(2)); | 514 __ mov(r0, Operand(2)); |
| 514 __ mov(r1, Operand(ExternalReference(IC_Utility(id), isolate))); | 515 __ mov(r1, Operand(ExternalReference(IC_Utility(id), isolate))); |
| 515 | 516 |
| 516 CEntryStub stub(1); | 517 CEntryStub stub(1); |
| 517 __ CallStub(&stub); | 518 __ CallStub(&stub); |
| 518 | 519 |
| 519 // Move result to r1 and leave the internal frame. | 520 // Move result to r1 and leave the internal frame. |
| 520 __ mov(r1, Operand(r0)); | 521 __ mov(r1, Operand(r0)); |
| 521 __ LeaveInternalFrame(); | 522 } |
| 522 | 523 |
| 523 // Check if the receiver is a global object of some sort. | 524 // Check if the receiver is a global object of some sort. |
| 524 // This can happen only for regular CallIC but not KeyedCallIC. | 525 // This can happen only for regular CallIC but not KeyedCallIC. |
| 525 if (id == IC::kCallIC_Miss) { | 526 if (id == IC::kCallIC_Miss) { |
| 526 Label invoke, global; | 527 Label invoke, global; |
| 527 __ ldr(r2, MemOperand(sp, argc * kPointerSize)); // receiver | 528 __ ldr(r2, MemOperand(sp, argc * kPointerSize)); // receiver |
| 528 __ JumpIfSmi(r2, &invoke); | 529 __ JumpIfSmi(r2, &invoke); |
| 529 __ CompareObjectType(r2, r3, r3, JS_GLOBAL_OBJECT_TYPE); | 530 __ CompareObjectType(r2, r3, r3, JS_GLOBAL_OBJECT_TYPE); |
| 530 __ b(eq, &global); | 531 __ b(eq, &global); |
| 531 __ cmp(r3, Operand(JS_BUILTINS_OBJECT_TYPE)); | 532 __ cmp(r3, Operand(JS_BUILTINS_OBJECT_TYPE)); |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 643 __ mov(r0, Operand(r2, ASR, kSmiTagSize)); | 644 __ mov(r0, Operand(r2, ASR, kSmiTagSize)); |
| 644 // r0: untagged index | 645 // r0: untagged index |
| 645 __ LoadFromNumberDictionary(&slow_load, r4, r2, r1, r0, r3, r5); | 646 __ LoadFromNumberDictionary(&slow_load, r4, r2, r1, r0, r3, r5); |
| 646 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1, r0, r3); | 647 __ IncrementCounter(counters->keyed_call_generic_smi_dict(), 1, r0, r3); |
| 647 __ jmp(&do_call); | 648 __ jmp(&do_call); |
| 648 | 649 |
| 649 __ bind(&slow_load); | 650 __ bind(&slow_load); |
| 650 // This branch is taken when calling KeyedCallIC_Miss is neither required | 651 // This branch is taken when calling KeyedCallIC_Miss is neither required |
| 651 // nor beneficial. | 652 // nor beneficial. |
| 652 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1, r0, r3); | 653 __ IncrementCounter(counters->keyed_call_generic_slow_load(), 1, r0, r3); |
| 653 __ EnterInternalFrame(); | 654 { |
| 654 __ push(r2); // save the key | 655 FrameScope scope(masm, StackFrame::INTERNAL); |
| 655 __ Push(r1, r2); // pass the receiver and the key | 656 __ push(r2); // save the key |
| 656 __ CallRuntime(Runtime::kKeyedGetProperty, 2); | 657 __ Push(r1, r2); // pass the receiver and the key |
| 657 __ pop(r2); // restore the key | 658 __ CallRuntime(Runtime::kKeyedGetProperty, 2); |
| 658 __ LeaveInternalFrame(); | 659 __ pop(r2); // restore the key |
| 660 } |
| 659 __ mov(r1, r0); | 661 __ mov(r1, r0); |
| 660 __ jmp(&do_call); | 662 __ jmp(&do_call); |
| 661 | 663 |
| 662 __ bind(&check_string); | 664 __ bind(&check_string); |
| 663 GenerateKeyStringCheck(masm, r2, r0, r3, &index_string, &slow_call); | 665 GenerateKeyStringCheck(masm, r2, r0, r3, &index_string, &slow_call); |
| 664 | 666 |
| 665 // The key is known to be a symbol. | 667 // The key is known to be a symbol. |
| 666 // If the receiver is a regular JS object with slow properties then do | 668 // If the receiver is a regular JS object with slow properties then do |
| 667 // a quick inline probe of the receiver's dictionary. | 669 // a quick inline probe of the receiver's dictionary. |
| 668 // Otherwise do the monomorphic cache probe. | 670 // Otherwise do the monomorphic cache probe. |
| (...skipping 948 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1617 Register reg = Assembler::GetRn(instr_at_patch); | 1619 Register reg = Assembler::GetRn(instr_at_patch); |
| 1618 patcher.masm()->tst(reg, Operand(kSmiTagMask)); | 1620 patcher.masm()->tst(reg, Operand(kSmiTagMask)); |
| 1619 patcher.EmitCondition(eq); | 1621 patcher.EmitCondition(eq); |
| 1620 } | 1622 } |
| 1621 } | 1623 } |
| 1622 | 1624 |
| 1623 | 1625 |
| 1624 } } // namespace v8::internal | 1626 } } // namespace v8::internal |
| 1625 | 1627 |
| 1626 #endif // V8_TARGET_ARCH_ARM | 1628 #endif // V8_TARGET_ARCH_ARM |
| OLD | NEW |