diff options
author | Mike Pall <mike> | 2010-10-18 16:12:27 +0200 |
---|---|---|
committer | Mike Pall <mike> | 2010-10-18 16:12:27 +0200 |
commit | 65dec38e44b4d5cb5f834cd4c06bf9a79ab4a92a (patch) | |
tree | a8b46f3f5c08e0d24847053a1cd4cfe5b33cc1db /src | |
parent | 5391a5f5b19b5b8713a12b3ccc3a8257e87317b7 (diff) | |
download | luajit-65dec38e44b4d5cb5f834cd4c06bf9a79ab4a92a.tar.gz luajit-65dec38e44b4d5cb5f834cd4c06bf9a79ab4a92a.tar.bz2 luajit-65dec38e44b4d5cb5f834cd4c06bf9a79ab4a92a.zip |
PPC: Preserve RD during array resizing in BC_TSETM.
Diffstat (limited to 'src')
-rw-r--r-- | src/buildvm_ppc.dasc | 2 | ||||
-rw-r--r-- | src/buildvm_ppcspe.h | 106 |
2 files changed, 56 insertions, 52 deletions
diff --git a/src/buildvm_ppc.dasc b/src/buildvm_ppc.dasc index e2c61564..870e061d 100644 --- a/src/buildvm_ppc.dasc +++ b/src/buildvm_ppc.dasc | |||
@@ -2948,8 +2948,10 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
2948 | | stw BASE, L->base | 2948 | | stw BASE, L->base |
2949 | | mr CARG1, L | 2949 | | mr CARG1, L |
2950 | | stw PC, SAVE_PC | 2950 | | stw PC, SAVE_PC |
2951 | | mr SAVE0, RD | ||
2951 | | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) | 2952 | | bl extern lj_tab_reasize // (lua_State *L, GCtab *t, int nasize) |
2952 | | // Must not reallocate the stack. | 2953 | | // Must not reallocate the stack. |
2954 | | mr RD, SAVE0 | ||
2953 | | b <1 | 2955 | | b <1 |
2954 | | | 2956 | | |
2955 | |7: // Possible table write barrier for any value. Skip valiswhite check. | 2957 | |7: // Possible table write barrier for any value. Skip valiswhite check. |
diff --git a/src/buildvm_ppcspe.h b/src/buildvm_ppcspe.h index 8e1c81af..0cedee2c 100644 --- a/src/buildvm_ppcspe.h +++ b/src/buildvm_ppcspe.h | |||
@@ -12,7 +12,7 @@ | |||
12 | #define DASM_SECTION_CODE_OP 0 | 12 | #define DASM_SECTION_CODE_OP 0 |
13 | #define DASM_SECTION_CODE_SUB 1 | 13 | #define DASM_SECTION_CODE_SUB 1 |
14 | #define DASM_MAXSECTION 2 | 14 | #define DASM_MAXSECTION 2 |
15 | static const unsigned int build_actionlist[4905] = { | 15 | static const unsigned int build_actionlist[4907] = { |
16 | 0x00010001, | 16 | 0x00010001, |
17 | 0x00060014, | 17 | 0x00060014, |
18 | 0x72000000, | 18 | 0x72000000, |
@@ -4187,8 +4187,10 @@ static const unsigned int build_actionlist[4905] = { | |||
4187 | 0x00098200, | 4187 | 0x00098200, |
4188 | 0x7e439378, | 4188 | 0x7e439378, |
4189 | 0x9201000c, | 4189 | 0x9201000c, |
4190 | 0x7d956378, | ||
4190 | 0x48000001, | 4191 | 0x48000001, |
4191 | 0x0003002e, | 4192 | 0x0003002e, |
4193 | 0x7eacab78, | ||
4192 | 0x48000000, | 4194 | 0x48000000, |
4193 | 0x0005000b, | 4195 | 0x0005000b, |
4194 | 0x00060011, | 4196 | 0x00060011, |
@@ -5674,69 +5676,69 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
5674 | 5676 | ||
5675 | case BC_TSETM: | 5677 | case BC_TSETM: |
5676 | dasm_put(Dst, 4122, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); | 5678 | dasm_put(Dst, 4122, 32-3, Dt6(->asize), 31-3, Dt6(->marked), Dt6(->array), LJ_GC_BLACK, Dt1(->base), DISPATCH_GL(gc.grayagain), DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); |
5677 | dasm_put(Dst, 4189); | 5679 | dasm_put(Dst, 4191); |
5678 | break; | 5680 | break; |
5679 | 5681 | ||
5680 | /* -- Calls and vararg handling ----------------------------------------- */ | 5682 | /* -- Calls and vararg handling ----------------------------------------- */ |
5681 | 5683 | ||
5682 | case BC_CALLM: | 5684 | case BC_CALLM: |
5683 | dasm_put(Dst, 4192); | 5685 | dasm_put(Dst, 4194); |
5684 | break; | 5686 | break; |
5685 | case BC_CALL: | 5687 | case BC_CALL: |
5686 | dasm_put(Dst, 4194, Dt7(->pc)); | 5688 | dasm_put(Dst, 4196, Dt7(->pc)); |
5687 | break; | 5689 | break; |
5688 | 5690 | ||
5689 | case BC_CALLMT: | 5691 | case BC_CALLMT: |
5690 | dasm_put(Dst, 4214); | 5692 | dasm_put(Dst, 4216); |
5691 | break; | 5693 | break; |
5692 | case BC_CALLT: | 5694 | case BC_CALLT: |
5693 | dasm_put(Dst, 4216, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); | 5695 | dasm_put(Dst, 4218, FRAME_TYPE, Dt7(->ffid), FRAME_VARG, Dt7(->pc), -4-8, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); |
5694 | dasm_put(Dst, 4281, FRAME_TYPE); | 5696 | dasm_put(Dst, 4283, FRAME_TYPE); |
5695 | break; | 5697 | break; |
5696 | 5698 | ||
5697 | case BC_ITERC: | 5699 | case BC_ITERC: |
5698 | dasm_put(Dst, 4288, Dt7(->pc)); | 5700 | dasm_put(Dst, 4290, Dt7(->pc)); |
5699 | break; | 5701 | break; |
5700 | 5702 | ||
5701 | case BC_ITERN: | 5703 | case BC_ITERN: |
5702 | #if LJ_HASJIT | 5704 | #if LJ_HASJIT |
5703 | #endif | 5705 | #endif |
5704 | dasm_put(Dst, 4314, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16)); | 5706 | dasm_put(Dst, 4316, Dt6(->asize), Dt6(->array), 31-3, -(BCBIAS_J*4 >> 16), Dt6(->hmask), Dt6(->node), 31-5, 31-3, DtB(->key), -(BCBIAS_J*4 >> 16)); |
5705 | dasm_put(Dst, 4393); | 5707 | dasm_put(Dst, 4395); |
5706 | break; | 5708 | break; |
5707 | 5709 | ||
5708 | case BC_ISNEXT: | 5710 | case BC_ISNEXT: |
5709 | dasm_put(Dst, 4397, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16)); | 5711 | dasm_put(Dst, 4399, LJ_TTAB, LJ_TFUNC, LJ_TNIL, Dt8(->ffid), FF_next_N, 32-1, -(BCBIAS_J*4 >> 16), BC_JMP, BC_ITERC, -(BCBIAS_J*4 >> 16)); |
5710 | break; | 5712 | break; |
5711 | 5713 | ||
5712 | case BC_VARG: | 5714 | case BC_VARG: |
5713 | dasm_put(Dst, 4448, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base)); | 5715 | dasm_put(Dst, 4450, FRAME_VARG, Dt1(->maxstack), Dt1(->top), Dt1(->base), 32-3, Dt1(->base)); |
5714 | dasm_put(Dst, 4528); | 5716 | dasm_put(Dst, 4530); |
5715 | break; | 5717 | break; |
5716 | 5718 | ||
5717 | /* -- Returns ----------------------------------------------------------- */ | 5719 | /* -- Returns ----------------------------------------------------------- */ |
5718 | 5720 | ||
5719 | case BC_RETM: | 5721 | case BC_RETM: |
5720 | dasm_put(Dst, 4534); | 5722 | dasm_put(Dst, 4536); |
5721 | break; | 5723 | break; |
5722 | 5724 | ||
5723 | case BC_RET: | 5725 | case BC_RET: |
5724 | dasm_put(Dst, 4536, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); | 5726 | dasm_put(Dst, 4538, FRAME_TYPE, FRAME_VARG, Dt7(->pc), PC2PROTO(k), FRAME_TYPEP); |
5725 | break; | 5727 | break; |
5726 | 5728 | ||
5727 | case BC_RET0: case BC_RET1: | 5729 | case BC_RET0: case BC_RET1: |
5728 | dasm_put(Dst, 4606, FRAME_TYPE, FRAME_VARG); | 5730 | dasm_put(Dst, 4608, FRAME_TYPE, FRAME_VARG); |
5729 | if (op == BC_RET1) { | 5731 | if (op == BC_RET1) { |
5730 | dasm_put(Dst, 4619); | 5732 | dasm_put(Dst, 4621); |
5731 | } | 5733 | } |
5732 | dasm_put(Dst, 4622, Dt7(->pc), PC2PROTO(k)); | 5734 | dasm_put(Dst, 4624, Dt7(->pc), PC2PROTO(k)); |
5733 | break; | 5735 | break; |
5734 | 5736 | ||
5735 | /* -- Loops and branches ------------------------------------------------ */ | 5737 | /* -- Loops and branches ------------------------------------------------ */ |
5736 | 5738 | ||
5737 | case BC_FORL: | 5739 | case BC_FORL: |
5738 | #if LJ_HASJIT | 5740 | #if LJ_HASJIT |
5739 | dasm_put(Dst, 4650); | 5741 | dasm_put(Dst, 4652); |
5740 | #endif | 5742 | #endif |
5741 | break; | 5743 | break; |
5742 | 5744 | ||
@@ -5748,35 +5750,35 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
5748 | case BC_FORI: | 5750 | case BC_FORI: |
5749 | case BC_IFORL: | 5751 | case BC_IFORL: |
5750 | vk = (op == BC_IFORL || op == BC_JFORL); | 5752 | vk = (op == BC_IFORL || op == BC_JFORL); |
5751 | dasm_put(Dst, 4652, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8); | 5753 | dasm_put(Dst, 4654, FORL_IDX*8, FORL_STEP*8, FORL_STOP*8); |
5752 | if (!vk) { | 5754 | if (!vk) { |
5753 | dasm_put(Dst, 4660); | 5755 | dasm_put(Dst, 4662); |
5754 | } | 5756 | } |
5755 | if (vk) { | 5757 | if (vk) { |
5756 | dasm_put(Dst, 4668, FORL_IDX*8); | 5758 | dasm_put(Dst, 4670, FORL_IDX*8); |
5757 | } | 5759 | } |
5758 | dasm_put(Dst, 4672, FORL_EXT*8); | 5760 | dasm_put(Dst, 4674, FORL_EXT*8); |
5759 | if (op != BC_JFORL) { | 5761 | if (op != BC_JFORL) { |
5760 | dasm_put(Dst, 4680, 32-1); | 5762 | dasm_put(Dst, 4682, 32-1); |
5761 | if (op == BC_JFORI) { | 5763 | if (op == BC_JFORI) { |
5762 | dasm_put(Dst, 4684, -(BCBIAS_J*4 >> 16)); | 5764 | dasm_put(Dst, 4686, -(BCBIAS_J*4 >> 16)); |
5763 | } else { | 5765 | } else { |
5764 | dasm_put(Dst, 4687, -(BCBIAS_J*4 >> 16)); | 5766 | dasm_put(Dst, 4689, -(BCBIAS_J*4 >> 16)); |
5765 | } | 5767 | } |
5766 | } | 5768 | } |
5767 | if (op == BC_FORI) { | 5769 | if (op == BC_FORI) { |
5768 | dasm_put(Dst, 4690); | ||
5769 | } else if (op == BC_IFORL) { | ||
5770 | dasm_put(Dst, 4692); | 5770 | dasm_put(Dst, 4692); |
5771 | } else if (op == BC_IFORL) { | ||
5772 | dasm_put(Dst, 4694); | ||
5771 | } else { | 5773 | } else { |
5772 | dasm_put(Dst, 4694, BC_JLOOP); | 5774 | dasm_put(Dst, 4696, BC_JLOOP); |
5773 | } | 5775 | } |
5774 | dasm_put(Dst, 4697); | 5776 | dasm_put(Dst, 4699); |
5775 | break; | 5777 | break; |
5776 | 5778 | ||
5777 | case BC_ITERL: | 5779 | case BC_ITERL: |
5778 | #if LJ_HASJIT | 5780 | #if LJ_HASJIT |
5779 | dasm_put(Dst, 4712); | 5781 | dasm_put(Dst, 4714); |
5780 | #endif | 5782 | #endif |
5781 | break; | 5783 | break; |
5782 | 5784 | ||
@@ -5785,40 +5787,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
5785 | break; | 5787 | break; |
5786 | #endif | 5788 | #endif |
5787 | case BC_IITERL: | 5789 | case BC_IITERL: |
5788 | dasm_put(Dst, 4714); | 5790 | dasm_put(Dst, 4716); |
5789 | if (op == BC_JITERL) { | 5791 | if (op == BC_JITERL) { |
5790 | dasm_put(Dst, 4720); | 5792 | dasm_put(Dst, 4722); |
5791 | } else { | 5793 | } else { |
5792 | dasm_put(Dst, 4722, 32-1, -(BCBIAS_J*4 >> 16)); | 5794 | dasm_put(Dst, 4724, 32-1, -(BCBIAS_J*4 >> 16)); |
5793 | } | 5795 | } |
5794 | dasm_put(Dst, 4729); | 5796 | dasm_put(Dst, 4731); |
5795 | break; | 5797 | break; |
5796 | 5798 | ||
5797 | case BC_LOOP: | 5799 | case BC_LOOP: |
5798 | #if LJ_HASJIT | 5800 | #if LJ_HASJIT |
5799 | dasm_put(Dst, 4741); | 5801 | dasm_put(Dst, 4743); |
5800 | #endif | 5802 | #endif |
5801 | break; | 5803 | break; |
5802 | 5804 | ||
5803 | case BC_ILOOP: | 5805 | case BC_ILOOP: |
5804 | dasm_put(Dst, 4743); | 5806 | dasm_put(Dst, 4745); |
5805 | break; | 5807 | break; |
5806 | 5808 | ||
5807 | case BC_JLOOP: | 5809 | case BC_JLOOP: |
5808 | #if LJ_HASJIT | 5810 | #if LJ_HASJIT |
5809 | dasm_put(Dst, 4754); | 5811 | dasm_put(Dst, 4756); |
5810 | #endif | 5812 | #endif |
5811 | break; | 5813 | break; |
5812 | 5814 | ||
5813 | case BC_JMP: | 5815 | case BC_JMP: |
5814 | dasm_put(Dst, 4756, 32-1, -(BCBIAS_J*4 >> 16)); | 5816 | dasm_put(Dst, 4758, 32-1, -(BCBIAS_J*4 >> 16)); |
5815 | break; | 5817 | break; |
5816 | 5818 | ||
5817 | /* -- Function headers -------------------------------------------------- */ | 5819 | /* -- Function headers -------------------------------------------------- */ |
5818 | 5820 | ||
5819 | case BC_FUNCF: | 5821 | case BC_FUNCF: |
5820 | #if LJ_HASJIT | 5822 | #if LJ_HASJIT |
5821 | dasm_put(Dst, 4772); | 5823 | dasm_put(Dst, 4774); |
5822 | #endif | 5824 | #endif |
5823 | case BC_FUNCV: /* NYI: compiled vararg functions. */ | 5825 | case BC_FUNCV: /* NYI: compiled vararg functions. */ |
5824 | break; | 5826 | break; |
@@ -5828,38 +5830,38 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop) | |||
5828 | break; | 5830 | break; |
5829 | #endif | 5831 | #endif |
5830 | case BC_IFUNCF: | 5832 | case BC_IFUNCF: |
5831 | dasm_put(Dst, 4774, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); | 5833 | dasm_put(Dst, 4776, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k), 31-3); |
5832 | if (op == BC_JFUNCF) { | 5834 | if (op == BC_JFUNCF) { |
5833 | dasm_put(Dst, 4792); | ||
5834 | } else { | ||
5835 | dasm_put(Dst, 4794); | 5835 | dasm_put(Dst, 4794); |
5836 | } else { | ||
5837 | dasm_put(Dst, 4796); | ||
5836 | } | 5838 | } |
5837 | dasm_put(Dst, 4803); | 5839 | dasm_put(Dst, 4805); |
5838 | break; | 5840 | break; |
5839 | 5841 | ||
5840 | case BC_JFUNCV: | 5842 | case BC_JFUNCV: |
5841 | #if !LJ_HASJIT | 5843 | #if !LJ_HASJIT |
5842 | break; | 5844 | break; |
5843 | #endif | 5845 | #endif |
5844 | dasm_put(Dst, 4809); | 5846 | dasm_put(Dst, 4811); |
5845 | break; /* NYI: compiled vararg functions. */ | 5847 | break; /* NYI: compiled vararg functions. */ |
5846 | 5848 | ||
5847 | case BC_IFUNCV: | 5849 | case BC_IFUNCV: |
5848 | dasm_put(Dst, 4811, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams)); | 5850 | dasm_put(Dst, 4813, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams)); |
5849 | break; | 5851 | break; |
5850 | 5852 | ||
5851 | case BC_FUNCC: | 5853 | case BC_FUNCC: |
5852 | case BC_FUNCCW: | 5854 | case BC_FUNCCW: |
5853 | if (op == BC_FUNCC) { | 5855 | if (op == BC_FUNCC) { |
5854 | dasm_put(Dst, 4861, Dt8(->f)); | 5856 | dasm_put(Dst, 4863, Dt8(->f)); |
5855 | } else { | 5857 | } else { |
5856 | dasm_put(Dst, 4864, DISPATCH_GL(wrapf)); | 5858 | dasm_put(Dst, 4866, DISPATCH_GL(wrapf)); |
5857 | } | 5859 | } |
5858 | dasm_put(Dst, 4867, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); | 5860 | dasm_put(Dst, 4869, Dt1(->maxstack), Dt1(->base), Dt1(->top), ~LJ_VMST_C); |
5859 | if (op == BC_FUNCCW) { | 5861 | if (op == BC_FUNCCW) { |
5860 | dasm_put(Dst, 4880, Dt8(->f)); | 5862 | dasm_put(Dst, 4882, Dt8(->f)); |
5861 | } | 5863 | } |
5862 | dasm_put(Dst, 4883, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); | 5864 | dasm_put(Dst, 4885, DISPATCH_GL(vmstate), Dt1(->top), 31-3, Dt1(->base), ~LJ_VMST_INTERP, DISPATCH_GL(vmstate)); |
5863 | break; | 5865 | break; |
5864 | 5866 | ||
5865 | /* ---------------------------------------------------------------------- */ | 5867 | /* ---------------------------------------------------------------------- */ |
@@ -5879,7 +5881,7 @@ static int build_backend(BuildCtx *ctx) | |||
5879 | 5881 | ||
5880 | build_subroutines(ctx); | 5882 | build_subroutines(ctx); |
5881 | 5883 | ||
5882 | dasm_put(Dst, 4904); | 5884 | dasm_put(Dst, 4906); |
5883 | for (op = 0; op < BC__MAX; op++) | 5885 | for (op = 0; op < BC__MAX; op++) |
5884 | build_ins(ctx, (BCOp)op, op); | 5886 | build_ins(ctx, (BCOp)op, op); |
5885 | 5887 | ||