Changeset 131516 in webkit for trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
- Timestamp:
- Oct 16, 2012, 3:28:32 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/llint/LowLevelInterpreter.asm
r131276 r131516 55 55 const tagTypeNumber = csr1 56 56 const tagMask = csr2 57 58 macro loadisFromInstruction(offset, dest) 59 loadis offset * 8[PB, PC, 8], dest 60 end 61 62 macro loadpFromInstruction(offset, dest) 63 loadp offset * 8[PB, PC, 8], dest 64 end 65 66 macro storepToInstruction(value, offset) 67 storep value, offset * 8[PB, PC, 8] 68 end 69 57 70 else 58 71 const PC = t4 72 macro loadisFromInstruction(offset, dest) 73 loadis offset * 4[PC], dest 74 end 75 76 macro loadpFromInstruction(offset, dest) 77 loadp offset * 4[PC], dest 78 end 59 79 end 60 80 … … 100 120 # Copied from PropertyOffset.h 101 121 const firstOutOfLineOffset = 100 122 123 # From ResolveOperations.h 124 const ResolveOperationFail = 0 125 const ResolveOperationSetBaseToUndefined = 1 126 const ResolveOperationReturnScopeAsBase = 2 127 const ResolveOperationSetBaseToScope = 3 128 const ResolveOperationSetBaseToGlobal = 4 129 const ResolveOperationGetAndReturnScopedVar = 5 130 const ResolveOperationGetAndReturnGlobalVar = 6 131 const ResolveOperationGetAndReturnGlobalVarWatchable = 7 132 const ResolveOperationSkipTopScopeNode = 8 133 const ResolveOperationSkipScopes = 9 134 const ResolveOperationReturnGlobalObjectAsBase = 10 135 const ResolveOperationGetAndReturnGlobalProperty = 11 136 const ResolveOperationCheckForDynamicEntriesBeforeGlobalScope = 12 137 138 const PutToBaseOperationKindUninitialised = 0 139 const PutToBaseOperationKindGeneric = 1 140 const PutToBaseOperationKindReadonly = 2 141 const PutToBaseOperationKindGlobalVariablePut = 3 142 const PutToBaseOperationKindGlobalVariablePutChecked = 4 143 const PutToBaseOperationKindGlobalPropertyPut = 5 144 const PutToBaseOperationKindVariablePut = 6 102 145 103 146 # Allocation constants … … 494 537 dispatch(4) 495 538 539 macro getPutToBaseOperationField(scratch, scratch1, fieldOffset, fieldGetter) 540 loadisFromInstruction(4, scratch) 541 mulp sizeof PutToBaseOperation, scratch, scratch 542 loadp CodeBlock[cfr], scratch1 543 loadp VectorBufferOffset + CodeBlock::m_putToBaseOperations[scratch1], scratch1 544 fieldGetter(fieldOffset[scratch1, scratch, 1]) 545 end 546 547 macro moveJSValueFromRegisterWithoutProfiling(value, destBuffer, destOffsetReg) 548 storep value, [destBuffer, destOffsetReg, 8] 549 end 550 551 552 macro moveJSValueFromRegistersWithoutProfiling(tag, payload, destBuffer, destOffsetReg) 553 storep tag, TagOffset[destBuffer, destOffsetReg, 8] 554 storep payload, PayloadOffset[destBuffer, destOffsetReg, 8] 555 end 556 557 macro putToBaseVariableBody(variableOffset, scratch1, scratch2, scratch3) 558 loadisFromInstruction(1, scratch1) 559 loadp PayloadOffset[cfr, scratch1, 8], scratch1 560 loadp JSVariableObject::m_registers[scratch1], scratch1 561 loadisFromInstruction(3, scratch2) 562 if JSVALUE64 563 loadConstantOrVariable(scratch2, scratch3) 564 moveJSValueFromRegisterWithoutProfiling(scratch3, scratch1, variableOffset) 565 else 566 loadConstantOrVariable(scratch2, scratch3, scratch2) # scratch3=tag, scratch2=payload 567 moveJSValueFromRegistersWithoutProfiling(scratch3, scratch2, scratch1, variableOffset) 568 end 569 end 570 571 _llint_op_put_to_base_variable: 572 traceExecution() 573 getPutToBaseOperationField(t0, t1, PutToBaseOperation::m_offset, macro(addr) 574 loadis addr, t0 575 end) 576 putToBaseVariableBody(t0, t1, t2, t3) 577 dispatch(5) 578 579 _llint_op_put_to_base: 580 traceExecution() 581 getPutToBaseOperationField(t0, t1, 0, macro(addr) 582 leap addr, t0 583 bbneq PutToBaseOperation::m_kindAsUint8[t0], PutToBaseOperationKindVariablePut, .notPutToBaseVariable 584 loadis PutToBaseOperation::m_offset[t0], t0 585 putToBaseVariableBody(t0, t1, t2, t3) 586 dispatch(5) 587 .notPutToBaseVariable: 588 end) 589 callSlowPath(_llint_slow_path_put_to_base) 590 dispatch(5) 591 592 macro getResolveOperation(resolveOperationIndex, dest, scratch) 593 loadisFromInstruction(resolveOperationIndex, dest) 594 mulp sizeof ResolveOperations, dest, dest 595 loadp CodeBlock[cfr], scratch 596 loadp VectorBufferOffset + CodeBlock::m_resolveOperations[scratch], scratch 597 loadp VectorBufferOffset[scratch, dest, 1], dest 598 end 599 600 macro getScope(loadInitialScope, scopeCount, dest, scratch) 601 loadInitialScope(dest) 602 loadi scopeCount, scratch 603 604 btiz scratch, .done 605 .loop: 606 loadp JSScope::m_next[dest], dest 607 subi 1, scratch 608 btinz scratch, .loop 609 610 .done: 611 end 612 613 macro moveJSValue(sourceBuffer, sourceOffsetReg, destBuffer, destOffsetReg, profileOffset, scratchRegister) 614 if JSVALUE64 615 loadp [sourceBuffer, sourceOffsetReg, 8], scratchRegister 616 storep scratchRegister, [destBuffer, destOffsetReg, 8] 617 loadpFromInstruction(profileOffset, destOffsetReg) 618 valueProfile(scratchRegister, destOffsetReg) 619 else 620 loadp PayloadOffset[sourceBuffer, sourceOffsetReg, 8], scratchRegister 621 storep scratchRegister, PayloadOffset[destBuffer, destOffsetReg, 8] 622 loadp TagOffset[sourceBuffer, sourceOffsetReg, 8], sourceOffsetReg 623 storep sourceOffsetReg, TagOffset[destBuffer, destOffsetReg, 8] 624 loadpFromInstruction(profileOffset, destOffsetReg) 625 valueProfile(sourceOffsetReg, scratchRegister, destOffsetReg) 626 end 627 end 628 629 macro moveJSValueFromSlot(slot, destBuffer, destOffsetReg, profileOffset, scratchRegister) 630 if JSVALUE64 631 loadp [slot], scratchRegister 632 storep scratchRegister, [destBuffer, destOffsetReg, 8] 633 loadpFromInstruction(profileOffset, destOffsetReg) 634 valueProfile(scratchRegister, destOffsetReg) 635 else 636 loadp PayloadOffset[slot], scratchRegister 637 storep scratchRegister, PayloadOffset[destBuffer, destOffsetReg, 8] 638 loadp TagOffset[slot], slot 639 storep slot, TagOffset[destBuffer, destOffsetReg, 8] 640 loadpFromInstruction(profileOffset, destOffsetReg) 641 valueProfile(slot, scratchRegister, destOffsetReg) 642 end 643 end 644 645 macro moveJSValueFromRegister(value, destBuffer, destOffsetReg, profileOffset) 646 storep value, [destBuffer, destOffsetReg, 8] 647 loadpFromInstruction(profileOffset, destOffsetReg) 648 valueProfile(value, destOffsetReg) 649 end 650 651 macro moveJSValueFromRegisters(tag, payload, destBuffer, destOffsetReg, profileOffset) 652 storep tag, TagOffset[destBuffer, destOffsetReg, 8] 653 storep payload, PayloadOffset[destBuffer, destOffsetReg, 8] 654 loadpFromInstruction(profileOffset, destOffsetReg) 655 valueProfile(tag, payload, destOffsetReg) 656 end 657 658 _llint_op_resolve_global_property: 659 traceExecution() 660 getResolveOperation(3, t0, t1) 661 loadp CodeBlock[cfr], t1 662 loadp CodeBlock::m_globalObject[t1], t1 663 loadp ResolveOperation::m_structure[t0], t2 664 bpneq JSCell::m_structure[t1], t2, _llint_op_resolve 665 loadis ResolveOperation::m_offset[t0], t0 666 if JSVALUE64 667 loadPropertyAtVariableOffsetKnownNotInline(t0, t1, t2) 668 loadisFromInstruction(1, t0) 669 moveJSValueFromRegister(t2, cfr, t0, 4) 670 else 671 loadPropertyAtVariableOffsetKnownNotInline(t0, t1, t2, t3) 672 loadisFromInstruction(1, t0) 673 moveJSValueFromRegisters(t2, t3, cfr, t0, 4) 674 end 675 dispatch(5) 676 677 _llint_op_resolve_global_var: 678 traceExecution() 679 getResolveOperation(3, t0, t1) 680 loadp ResolveOperation::m_registerAddress[t0], t0 681 loadisFromInstruction(1, t1) 682 moveJSValueFromSlot(t0, cfr, t1, 4, t3) 683 dispatch(5) 684 685 macro resolveScopedVarBody(resolveOperations) 686 # First ResolveOperation is to skip scope chain nodes 687 getScope(macro(dest) 688 loadp ScopeChain + PayloadOffset[cfr], dest 689 end, 690 ResolveOperation::m_scopesToSkip[resolveOperations], t1, t2) 691 loadp JSVariableObject::m_registers[t1], t1 # t1 now contains the activation registers 692 693 # Second ResolveOperation tells us what offset to use 694 loadis ResolveOperation::m_offset + sizeof ResolveOperation[resolveOperations], t2 695 loadisFromInstruction(1, t3) 696 moveJSValue(t1, t2, cfr, t3, 4, t0) 697 end 698 699 _llint_op_resolve_scoped_var: 700 traceExecution() 701 getResolveOperation(3, t0, t1) 702 resolveScopedVarBody(t0) 703 dispatch(5) 704 705 _llint_op_resolve_scoped_var_on_top_scope: 706 traceExecution() 707 getResolveOperation(3, t0, t1) 708 709 # Load destination index 710 loadisFromInstruction(1, t3) 711 712 # We know we want the top scope chain entry 713 loadp ScopeChain + PayloadOffset[cfr], t1 714 loadp JSVariableObject::m_registers[t1], t1 # t1 now contains the activation registers 715 716 # Second ResolveOperation tells us what offset to use 717 loadis ResolveOperation::m_offset + sizeof ResolveOperation[t0], t2 718 719 moveJSValue(t1, t2, cfr, t3, 4, t0) 720 dispatch(5) 721 722 _llint_op_resolve_scoped_var_with_top_scope_check: 723 traceExecution() 724 getResolveOperation(3, t0, t1) 725 # First ResolveOperation tells us what register to check 726 loadis ResolveOperation::m_activationRegister[t0], t1 727 728 loadp PayloadOffset[cfr, t1, 8], t1 729 730 getScope(macro(dest) 731 btpz t1, .scopeChainNotCreated 732 loadp JSScope::m_next[t1], dest 733 jmp .done 734 .scopeChainNotCreated: 735 loadp ScopeChain + PayloadOffset[cfr], dest 736 .done: 737 end, 738 # Second ResolveOperation tells us how many more nodes to skip 739 ResolveOperation::m_scopesToSkip + sizeof ResolveOperation[t0], t1, t2) 740 loadp JSVariableObject::m_registers[t1], t1 # t1 now contains the activation registers 741 742 # Third operation tells us what offset to use 743 loadis ResolveOperation::m_offset + 2 * sizeof ResolveOperation[t0], t2 744 loadisFromInstruction(1, t3) 745 moveJSValue(t1, t2, cfr, t3, 4, t0) 746 dispatch(5) 496 747 497 748 _llint_op_resolve: 498 749 traceExecution() 750 getResolveOperation(3, t0, t1) 751 btpz t0, .noInstructions 752 loadis ResolveOperation::m_operation[t0], t1 753 bineq t1, ResolveOperationSkipScopes, .notSkipScopes 754 resolveScopedVarBody(t0) 755 dispatch(5) 756 .notSkipScopes: 757 bineq t1, ResolveOperationGetAndReturnGlobalVar, .notGetAndReturnGlobalVar 758 loadp ResolveOperation::m_registerAddress[t0], t0 759 loadisFromInstruction(1, t1) 760 moveJSValueFromSlot(t0, cfr, t1, 4, t3) 761 dispatch(5) 762 .notGetAndReturnGlobalVar: 763 764 .noInstructions: 499 765 callSlowPath(_llint_slow_path_resolve) 500 dispatch(4)501 502 503 _llint_op_resolve_skip:504 traceExecution()505 callSlowPath(_llint_slow_path_resolve_skip)506 766 dispatch(5) 507 767 768 _llint_op_resolve_base_to_global: 769 traceExecution() 770 loadp CodeBlock[cfr], t1 771 loadp CodeBlock::m_globalObject[t1], t1 772 loadisFromInstruction(1, t3) 773 if JSVALUE64 774 moveJSValueFromRegister(t1, cfr, t3, 6) 775 else 776 move CellTag, t2 777 moveJSValueFromRegisters(t2, t1, cfr, t3, 6) 778 end 779 dispatch(7) 780 781 _llint_op_resolve_base_to_global_dynamic: 782 jmp _llint_op_resolve_base 783 784 _llint_op_resolve_base_to_scope: 785 traceExecution() 786 getResolveOperation(4, t0, t1) 787 # First ResolveOperation is to skip scope chain nodes 788 getScope(macro(dest) 789 loadp ScopeChain + PayloadOffset[cfr], dest 790 end, 791 ResolveOperation::m_scopesToSkip[t0], t1, t2) 792 loadisFromInstruction(1, t3) 793 if JSVALUE64 794 moveJSValueFromRegister(t1, cfr, t3, 6) 795 else 796 move CellTag, t2 797 moveJSValueFromRegisters(t2, t1, cfr, t3, 6) 798 end 799 dispatch(7) 800 801 _llint_op_resolve_base_to_scope_with_top_scope_check: 802 traceExecution() 803 getResolveOperation(4, t0, t1) 804 # First ResolveOperation tells us what register to check 805 loadis ResolveOperation::m_activationRegister[t0], t1 806 807 loadp PayloadOffset[cfr, t1, 8], t1 808 809 getScope(macro(dest) 810 btpz t1, .scopeChainNotCreated 811 loadp JSScope::m_next[t1], dest 812 jmp .done 813 .scopeChainNotCreated: 814 loadp ScopeChain + PayloadOffset[cfr], dest 815 .done: 816 end, 817 # Second ResolveOperation tells us how many more nodes to skip 818 ResolveOperation::m_scopesToSkip + sizeof ResolveOperation[t0], t1, t2) 819 820 loadisFromInstruction(1, t3) 821 if JSVALUE64 822 moveJSValueFromRegister(t1, cfr, t3, 6) 823 else 824 move CellTag, t2 825 moveJSValueFromRegisters(t2, t1, cfr, t3, 6) 826 end 827 dispatch(7) 508 828 509 829 _llint_op_resolve_base: 510 830 traceExecution() 511 831 callSlowPath(_llint_slow_path_resolve_base) 512 dispatch(5) 513 832 dispatch(7) 514 833 515 834 _llint_op_ensure_property_exists: … … 518 837 dispatch(3) 519 838 839 macro interpretResolveWithBase(opcodeLength, slowPath) 840 traceExecution() 841 getResolveOperation(4, t0, t1) 842 btpz t0, .slowPath 843 844 loadp ScopeChain[cfr], t3 845 # Get the base 846 loadis ResolveOperation::m_operation[t0], t2 847 848 bineq t2, ResolveOperationSkipScopes, .notSkipScopes 849 getScope(macro(dest) move t3, dest end, 850 ResolveOperation::m_scopesToSkip[t0], t1, t2) 851 move t1, t3 852 addp sizeof ResolveOperation, t0, t0 853 jmp .haveCorrectScope 854 855 .notSkipScopes: 856 857 bineq t2, ResolveOperationSkipTopScopeNode, .notSkipTopScopeNode 858 loadis ResolveOperation::m_activationRegister[t0], t1 859 loadp PayloadOffset[cfr, t1, 8], t1 860 861 getScope(macro(dest) 862 btpz t1, .scopeChainNotCreated 863 loadp JSScope::m_next[t1], dest 864 jmp .done 865 .scopeChainNotCreated: 866 loadp ScopeChain + PayloadOffset[cfr], dest 867 .done: 868 end, 869 sizeof ResolveOperation + ResolveOperation::m_scopesToSkip[t0], t1, t2) 870 move t1, t3 871 # We've handled two opcodes here 872 addp 2 * sizeof ResolveOperation, t0, t0 873 874 .notSkipTopScopeNode: 875 876 .haveCorrectScope: 877 878 # t3 now contains the correct Scope 879 # t0 contains a pointer to the current ResolveOperation 880 881 loadis ResolveOperation::m_operation[t0], t2 882 # t2 contains the next instruction 883 884 loadisFromInstruction(1, t1) 885 # t1 now contains the index for the base register 886 887 bineq t2, ResolveOperationSetBaseToScope, .notSetBaseToScope 888 storep t3, PayloadOffset[cfr, t1, 8] 889 if JSVALUE64 890 else 891 storep CellTag, TagOffset[cfr, t1, 8] 892 end 893 jmp .haveSetBase 894 895 .notSetBaseToScope: 896 897 bineq t2, ResolveOperationSetBaseToUndefined, .notSetBaseToUndefined 898 if JSVALUE64 899 storep ValueUndefined, PayloadOffset[cfr, t1, 8] 900 else 901 storep 0, PayloadOffset[cfr, t1, 8] 902 storep UndefinedTag, TagOffset[cfr, t1, 8] 903 end 904 jmp .haveSetBase 905 906 .notSetBaseToUndefined: 907 bineq t2, ResolveOperationSetBaseToGlobal, .slowPath 908 loadp JSCell::m_structure[t3], t2 909 loadp Structure::m_globalObject[t2], t2 910 storep t2, PayloadOffset[cfr, t1, 8] 911 if JSVALUE64 912 else 913 storep CellTag, TagOffset[cfr, t1, 8] 914 end 915 916 .haveSetBase: 917 918 # Get the value 919 920 # Load the operation into t2 921 loadis ResolveOperation::m_operation + sizeof ResolveOperation[t0], t2 922 923 # Load the index for the value register into t1 924 loadisFromInstruction(2, t1) 925 926 bineq t2, ResolveOperationGetAndReturnScopedVar, .notGetAndReturnScopedVar 927 loadp JSVariableObject::m_registers[t3], t3 # t3 now contains the activation registers 928 929 # Second ResolveOperation tells us what offset to use 930 loadis ResolveOperation::m_offset + sizeof ResolveOperation[t0], t2 931 moveJSValue(t3, t2, cfr, t1, opcodeLength - 1, t0) 932 dispatch(opcodeLength) 933 934 .notGetAndReturnScopedVar: 935 bineq t2, ResolveOperationGetAndReturnGlobalProperty, .slowPath 936 callSlowPath(slowPath) 937 dispatch(opcodeLength) 938 939 .slowPath: 940 callSlowPath(slowPath) 941 dispatch(opcodeLength) 942 end 520 943 521 944 _llint_op_resolve_with_base: 522 traceExecution() 523 callSlowPath(_llint_slow_path_resolve_with_base) 524 dispatch(5) 945 interpretResolveWithBase(7, _llint_slow_path_resolve_with_base) 525 946 526 947 527 948 _llint_op_resolve_with_this: 528 traceExecution() 529 callSlowPath(_llint_slow_path_resolve_with_this) 530 dispatch(5) 949 interpretResolveWithBase(6, _llint_slow_path_resolve_with_this) 531 950 532 951
Note:
See TracChangeset
for help on using the changeset viewer.