Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 #ifndef RUNTIME_VM_CONSTANTS_DBC_H_ | 5 #ifndef RUNTIME_VM_CONSTANTS_DBC_H_ |
| 6 #define RUNTIME_VM_CONSTANTS_DBC_H_ | 6 #define RUNTIME_VM_CONSTANTS_DBC_H_ |
| 7 | 7 |
| 8 #include "platform/globals.h" | 8 #include "platform/globals.h" |
| 9 #include "platform/assert.h" | 9 #include "platform/assert.h" |
| 10 #include "platform/utils.h" | 10 #include "platform/utils.h" |
| (...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 163 // | 163 // |
| 164 // Invoke native function SP[-1] with argc_tag SP[0]. | 164 // Invoke native function SP[-1] with argc_tag SP[0]. |
| 165 // | 165 // |
| 166 // - PushPolymorphicInstanceCall ArgC, D | 166 // - PushPolymorphicInstanceCall ArgC, D |
| 167 // | 167 // |
| 168 // Skips 2*D + 1 instructions and pushes a function object onto the stack | 168 // Skips 2*D + 1 instructions and pushes a function object onto the stack |
| 169 // if one can be found as follows. Otherwise skips only 2*D instructions. | 169 // if one can be found as follows. Otherwise skips only 2*D instructions. |
| 170 // The function is looked up in the IC data encoded in the following 2*D | 170 // The function is looked up in the IC data encoded in the following 2*D |
| 171 // Nop instructions. The Nop instructions should be arranged in pairs with | 171 // Nop instructions. The Nop instructions should be arranged in pairs with |
| 172 // the first being the cid, and the second being the function to push if | 172 // the first being the cid, and the second being the function to push if |
| 173 // the cid is the cid of the receiver found at SP[-(1 + ArgC)]. | 173 // the cid matches the cid in the pair. |
| 174 // | |
| 175 // - PushPolymorphic3InstanceCall ArgC, D | |
|
Vyacheslav Egorov (Google)
2017/03/10 10:31:30
Better call it
PushPolymorphicInstanceCallByRang
erikcorry
2017/03/10 13:30:01
Done.
| |
| 176 // | |
| 177 // Skips 3*D + 1 instructions and pushes a function object onto the stack | |
| 178 // if one can be found as follows. Otherwise skips only 3*D instructions. | |
| 179 // The function is looked up in the IC data encoded in the following 3*D | |
| 180 // Nop instructions. The Nop instructions should be arranged in triples with | |
| 181 // the first being the start cid, the second being the number of cids, and | |
| 182 // the third being the function to push if the cid is in the range given | |
| 183 // by the first two Nop instructions. | |
| 174 // | 184 // |
| 175 // - OneByteStringFromCharCode rA, rX | 185 // - OneByteStringFromCharCode rA, rX |
| 176 // | 186 // |
| 177 // Load the one-character symbol with the char code given by the Smi | 187 // Load the one-character symbol with the char code given by the Smi |
| 178 // in FP[rX] into FP[rA]. | 188 // in FP[rX] into FP[rA]. |
| 179 // | 189 // |
| 180 // - StringToCharCode rA, rX | 190 // - StringToCharCode rA, rX |
| 181 // | 191 // |
| 182 // Load and smi-encode the single char code of the string in FP[rX] into | 192 // Load and smi-encode the single char code of the string in FP[rX] into |
| 183 // FP[rA]. If the string's length is not 1, load smi -1 instead. | 193 // FP[rA]. If the string's length is not 1, load smi -1 instead. |
| (...skipping 399 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 583 // a dense switch with low cid encoded in the following Nop instruction, and | 593 // a dense switch with low cid encoded in the following Nop instruction, and |
| 584 // the cid mask encoded in the Nop instruction after that, or if D == 1 and | 594 // the cid mask encoded in the Nop instruction after that, or if D == 1 and |
| 585 // FP[rA] is a Smi. Skips 2 instructions otherwise. | 595 // FP[rA] is a Smi. Skips 2 instructions otherwise. |
| 586 // | 596 // |
| 587 // - CheckCids rA, rB, rC | 597 // - CheckCids rA, rB, rC |
| 588 // | 598 // |
| 589 // Skips rC + 1 instructions if the object at FP[rA] is a Smi and | 599 // Skips rC + 1 instructions if the object at FP[rA] is a Smi and |
| 590 // rB == 1, or if FP[rA]'s cid is found in the array of cids encoded by the | 600 // rB == 1, or if FP[rA]'s cid is found in the array of cids encoded by the |
| 591 // following rC Nop instructions. Otherwise skips only rC instructions. | 601 // following rC Nop instructions. Otherwise skips only rC instructions. |
| 592 // | 602 // |
| 603 // - CheckCids2 rA, rB, rC | |
|
Vyacheslav Egorov (Google)
2017/03/10 10:31:30
Better call it CheckCidRanges
erikcorry
2017/03/10 13:30:01
Done.
| |
| 604 // | |
| 605 // Skips rC + 1 instructions if the object at FP[rA] is a Smi and rB == | |
| 606 // 1, or if FP[rA]'s cid is found in the array of cid ranges encoded by the | |
| 607 // following rC Nop instructions. The cid ranges from a inclusive to b | |
| 608 // exclusive are coded in pairs of (a, b - a). Otherwise skips only 2 | |
| 609 // instructions. | |
| 610 // | |
| 593 // - CheckStack | 611 // - CheckStack |
| 594 // | 612 // |
| 595 // Compare SP against isolate stack limit and call StackOverflow handler if | 613 // Compare SP against isolate stack limit and call StackOverflow handler if |
| 596 // necessary. | 614 // necessary. |
| 597 // | 615 // |
| 598 // - DebugStep, DebugBreak A | 616 // - DebugStep, DebugBreak A |
| 599 // | 617 // |
| 600 // Debugger support. DebugBreak is bytecode that can be patched into the | 618 // Debugger support. DebugBreak is bytecode that can be patched into the |
| 601 // instruction stream to trigger in place breakpoint. | 619 // instruction stream to trigger in place breakpoint. |
| 602 // | 620 // |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 671 V(PushConstant, D, lit, ___, ___) \ | 689 V(PushConstant, D, lit, ___, ___) \ |
| 672 V(StoreLocal, X, xeg, ___, ___) \ | 690 V(StoreLocal, X, xeg, ___, ___) \ |
| 673 V(PopLocal, X, xeg, ___, ___) \ | 691 V(PopLocal, X, xeg, ___, ___) \ |
| 674 V(IndirectStaticCall, A_D, num, num, ___) \ | 692 V(IndirectStaticCall, A_D, num, num, ___) \ |
| 675 V(StaticCall, A_D, num, num, ___) \ | 693 V(StaticCall, A_D, num, num, ___) \ |
| 676 V(InstanceCall1, A_D, num, num, ___) \ | 694 V(InstanceCall1, A_D, num, num, ___) \ |
| 677 V(InstanceCall2, A_D, num, num, ___) \ | 695 V(InstanceCall2, A_D, num, num, ___) \ |
| 678 V(InstanceCall1Opt, A_D, num, num, ___) \ | 696 V(InstanceCall1Opt, A_D, num, num, ___) \ |
| 679 V(InstanceCall2Opt, A_D, num, num, ___) \ | 697 V(InstanceCall2Opt, A_D, num, num, ___) \ |
| 680 V(PushPolymorphicInstanceCall, A_D, num, num, ___) \ | 698 V(PushPolymorphicInstanceCall, A_D, num, num, ___) \ |
| 699 V(PushPolymorphic3InstanceCall, A_D, num, num, ___) \ | |
| 681 V(NativeCall, 0, ___, ___, ___) \ | 700 V(NativeCall, 0, ___, ___, ___) \ |
| 682 V(NativeBootstrapCall, 0, ___, ___, ___) \ | 701 V(NativeBootstrapCall, 0, ___, ___, ___) \ |
| 683 V(OneByteStringFromCharCode, A_X, reg, xeg, ___) \ | 702 V(OneByteStringFromCharCode, A_X, reg, xeg, ___) \ |
| 684 V(StringToCharCode, A_X, reg, xeg, ___) \ | 703 V(StringToCharCode, A_X, reg, xeg, ___) \ |
| 685 V(AddTOS, 0, ___, ___, ___) \ | 704 V(AddTOS, 0, ___, ___, ___) \ |
| 686 V(SubTOS, 0, ___, ___, ___) \ | 705 V(SubTOS, 0, ___, ___, ___) \ |
| 687 V(MulTOS, 0, ___, ___, ___) \ | 706 V(MulTOS, 0, ___, ___, ___) \ |
| 688 V(BitOrTOS, 0, ___, ___, ___) \ | 707 V(BitOrTOS, 0, ___, ___, ___) \ |
| 689 V(BitAndTOS, 0, ___, ___, ___) \ | 708 V(BitAndTOS, 0, ___, ___, ___) \ |
| 690 V(EqualTOS, 0, ___, ___, ___) \ | 709 V(EqualTOS, 0, ___, ___, ___) \ |
| (...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 813 V(BadTypeError, 0, ___, ___, ___) \ | 832 V(BadTypeError, 0, ___, ___, ___) \ |
| 814 V(AssertAssignable, A_D, num, lit, ___) \ | 833 V(AssertAssignable, A_D, num, lit, ___) \ |
| 815 V(AssertBoolean, A, num, ___, ___) \ | 834 V(AssertBoolean, A, num, ___, ___) \ |
| 816 V(TestSmi, A_D, reg, reg, ___) \ | 835 V(TestSmi, A_D, reg, reg, ___) \ |
| 817 V(TestCids, A_D, reg, num, ___) \ | 836 V(TestCids, A_D, reg, num, ___) \ |
| 818 V(CheckSmi, A, reg, ___, ___) \ | 837 V(CheckSmi, A, reg, ___, ___) \ |
| 819 V(CheckEitherNonSmi, A_D, reg, reg, ___) \ | 838 V(CheckEitherNonSmi, A_D, reg, reg, ___) \ |
| 820 V(CheckClassId, A_D, reg, num, ___) \ | 839 V(CheckClassId, A_D, reg, num, ___) \ |
| 821 V(CheckDenseSwitch, A_D, reg, num, ___) \ | 840 V(CheckDenseSwitch, A_D, reg, num, ___) \ |
| 822 V(CheckCids, A_B_C, reg, num, num) \ | 841 V(CheckCids, A_B_C, reg, num, num) \ |
| 842 V(CheckCids2, A_B_C, reg, num, num) \ | |
| 823 V(CheckStack, 0, ___, ___, ___) \ | 843 V(CheckStack, 0, ___, ___, ___) \ |
| 824 V(CheckStackAlwaysExit, 0, ___, ___, ___) \ | 844 V(CheckStackAlwaysExit, 0, ___, ___, ___) \ |
| 825 V(DebugStep, 0, ___, ___, ___) \ | 845 V(DebugStep, 0, ___, ___, ___) \ |
| 826 V(DebugBreak, A, num, ___, ___) \ | 846 V(DebugBreak, A, num, ___, ___) \ |
| 827 V(Deopt, A_D, num, num, ___) \ | 847 V(Deopt, A_D, num, num, ___) \ |
| 828 V(DeoptRewind, 0, ___, ___, ___) | 848 V(DeoptRewind, 0, ___, ___, ___) |
| 829 | 849 |
| 830 // clang-format on | 850 // clang-format on |
| 831 | 851 |
| 832 typedef uint32_t Instr; | 852 typedef uint32_t Instr; |
| (...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 963 | 983 |
| 964 // After a comparison, the condition NEXT_IS_TRUE means the following | 984 // After a comparison, the condition NEXT_IS_TRUE means the following |
| 965 // instruction is executed if the comparision is true and skipped over overwise. | 985 // instruction is executed if the comparision is true and skipped over overwise. |
| 966 // Conidition NEXT_IS_FALSE means the following instruction is executed if the | 986 // Conidition NEXT_IS_FALSE means the following instruction is executed if the |
| 967 // comparison is false and skipped over otherwise. | 987 // comparison is false and skipped over otherwise. |
| 968 enum Condition { NEXT_IS_TRUE, NEXT_IS_FALSE }; | 988 enum Condition { NEXT_IS_TRUE, NEXT_IS_FALSE }; |
| 969 | 989 |
| 970 } // namespace dart | 990 } // namespace dart |
| 971 | 991 |
| 972 #endif // RUNTIME_VM_CONSTANTS_DBC_H_ | 992 #endif // RUNTIME_VM_CONSTANTS_DBC_H_ |
| OLD | NEW |