aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMike Pall <mike>2011-05-31 21:35:55 +0200
committerMike Pall <mike>2011-05-31 21:37:44 +0200
commit514ccfceb889567c0ea5936c6363d675a957887d (patch)
tree2f6a7eeb8cc325473b2a326a93eebb7d0115ac8a /src
parent0764c615fd835b2e0fb2acb400d2bcc7253dede6 (diff)
downloadluajit-514ccfceb889567c0ea5936c6363d675a957887d.tar.gz
luajit-514ccfceb889567c0ea5936c6363d675a957887d.tar.bz2
luajit-514ccfceb889567c0ea5936c6363d675a957887d.zip
ARM: Fix __newindex metamethod handling for BC_TSETB.
Diffstat (limited to 'src')
-rw-r--r--src/buildvm_arm.dasc1
-rw-r--r--src/buildvm_arm.h149
2 files changed, 76 insertions, 74 deletions
diff --git a/src/buildvm_arm.dasc b/src/buildvm_arm.dasc
index eed836fa..2e87acdd 100644
--- a/src/buildvm_arm.dasc
+++ b/src/buildvm_arm.dasc
@@ -3207,6 +3207,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
3207 | tst RA, #1<<MM_newindex 3207 | tst RA, #1<<MM_newindex
3208 | bne <1 // 'no __newindex' flag set: done. 3208 | bne <1 // 'no __newindex' flag set: done.
3209 | ldr INS, [PC, #-4] // Restore INS. 3209 | ldr INS, [PC, #-4] // Restore INS.
3210 | decode_RA8 RA, INS
3210 | b ->vmeta_tsetb 3211 | b ->vmeta_tsetb
3211 | 3212 |
3212 |7: // Possible table write barrier for the value. Skip valiswhite check. 3213 |7: // Possible table write barrier for the value. Skip valiswhite check.
diff --git a/src/buildvm_arm.h b/src/buildvm_arm.h
index 3b480326..0d106bdb 100644
--- a/src/buildvm_arm.h
+++ b/src/buildvm_arm.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
15static const unsigned int build_actionlist[5614] = { 15static const unsigned int build_actionlist[5615] = {
160x00010001, 160x00010001,
170x00060014, 170x00060014,
180xe3160000, 180xe3160000,
@@ -4788,6 +4788,7 @@ static const unsigned int build_actionlist[5614] = {
47880x1a000000, 47880x1a000000,
47890x0005000b, 47890x0005000b,
47900xe516e004, 47900xe516e004,
47910xe004a2ae,
47910xea000000, 47920xea000000,
47920x00050032, 47930x00050032,
47930x00060011, 47940x00060011,
@@ -6989,72 +6990,72 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
6989 break; 6990 break;
6990 case BC_TSETB: 6991 case BC_TSETB:
6991 dasm_put(Dst, 4726, -LJ_TTAB, Dt6(->asize), Dt6(->array), -LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK); 6992 dasm_put(Dst, 4726, -LJ_TTAB, Dt6(->asize), Dt6(->array), -LJ_TNIL, Dt6(->marked), LJ_GC_BLACK, Dt6(->metatable), Dt6(->nomm), 1<<MM_newindex, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK);
6992 dasm_put(Dst, 4783, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); 6993 dasm_put(Dst, 4784, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
6993 break; 6994 break;
6994 6995
6995 case BC_TSETM: 6996 case BC_TSETM:
6996 dasm_put(Dst, 4792, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt1(->base)); 6997 dasm_put(Dst, 4793, Dt6(->asize), Dt6(->array), Dt6(->marked), LJ_GC_BLACK, Dt1(->base));
6997 if (LJ_TARGET_OSX) { 6998 if (LJ_TARGET_OSX) {
6998 dasm_put(Dst, 4837, Dt1(->base)); 6999 dasm_put(Dst, 4838, Dt1(->base));
6999 } 7000 }
7000 dasm_put(Dst, 4840, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist)); 7001 dasm_put(Dst, 4841, DISPATCH_GL(gc.grayagain), LJ_GC_BLACK, DISPATCH_GL(gc.grayagain), Dt6(->marked), Dt6(->gclist));
7001 break; 7002 break;
7002 7003
7003 /* -- Calls and vararg handling ----------------------------------------- */ 7004 /* -- Calls and vararg handling ----------------------------------------- */
7004 7005
7005 case BC_CALLM: 7006 case BC_CALLM:
7006 dasm_put(Dst, 4856); 7007 dasm_put(Dst, 4857);
7007 break; 7008 break;
7008 case BC_CALL: 7009 case BC_CALL:
7009 dasm_put(Dst, 4862, -LJ_TFUNC, Dt7(->field_pc)); 7010 dasm_put(Dst, 4863, -LJ_TFUNC, Dt7(->field_pc));
7010 break; 7011 break;
7011 7012
7012 case BC_CALLMT: 7013 case BC_CALLMT:
7013 dasm_put(Dst, 4882); 7014 dasm_put(Dst, 4883);
7014 break; 7015 break;
7015 case BC_CALLT: 7016 case BC_CALLT:
7016 dasm_put(Dst, 4887, -LJ_TFUNC, Dt7(->ffid), FRAME_TYPE, Dt7(->field_pc), Dt7(->field_pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP); 7017 dasm_put(Dst, 4888, -LJ_TFUNC, Dt7(->ffid), FRAME_TYPE, Dt7(->field_pc), Dt7(->field_pc), PC2PROTO(k), FRAME_VARG, FRAME_TYPEP);
7017 dasm_put(Dst, 4948, FRAME_TYPE); 7018 dasm_put(Dst, 4949, FRAME_TYPE);
7018 break; 7019 break;
7019 7020
7020 case BC_ITERC: 7021 case BC_ITERC:
7021 dasm_put(Dst, 4959, -LJ_TFUNC, Dt7(->field_pc)); 7022 dasm_put(Dst, 4960, -LJ_TFUNC, Dt7(->field_pc));
7022 break; 7023 break;
7023 7024
7024 case BC_ITERN: 7025 case BC_ITERN:
7025#if LJ_HASJIT 7026#if LJ_HASJIT
7026#endif 7027#endif
7027 dasm_put(Dst, 4983, Dt6(->asize), Dt6(->array), -LJ_TNIL, ~LJ_TISNUM, Dt6(->hmask), Dt6(->node), DtB(->val), -LJ_TNIL, DtB(->key)); 7028 dasm_put(Dst, 4984, Dt6(->asize), Dt6(->array), -LJ_TNIL, ~LJ_TISNUM, Dt6(->hmask), Dt6(->node), DtB(->val), -LJ_TNIL, DtB(->key));
7028 break; 7029 break;
7029 7030
7030 case BC_ISNEXT: 7031 case BC_ISNEXT:
7031 dasm_put(Dst, 5048, -LJ_TFUNC, Dt8(->ffid), -LJ_TTAB, -LJ_TNIL, FF_next_N, BC_JMP, BC_ITERC); 7032 dasm_put(Dst, 5049, -LJ_TFUNC, Dt8(->ffid), -LJ_TTAB, -LJ_TNIL, FF_next_N, BC_JMP, BC_ITERC);
7032 break; 7033 break;
7033 7034
7034 case BC_VARG: 7035 case BC_VARG:
7035 dasm_put(Dst, 5087, FRAME_VARG, ~LJ_TNIL, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->base)); 7036 dasm_put(Dst, 5088, FRAME_VARG, ~LJ_TNIL, Dt1(->maxstack), Dt1(->top), Dt1(->base), Dt1(->base));
7036 break; 7037 break;
7037 7038
7038 /* -- Returns ----------------------------------------------------------- */ 7039 /* -- Returns ----------------------------------------------------------- */
7039 7040
7040 case BC_RETM: 7041 case BC_RETM:
7041 dasm_put(Dst, 5159); 7042 dasm_put(Dst, 5160);
7042 break; 7043 break;
7043 7044
7044 case BC_RET: 7045 case BC_RET:
7045 dasm_put(Dst, 5166, FRAME_TYPE, FRAME_VARG, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL, FRAME_TYPEP); 7046 dasm_put(Dst, 5167, FRAME_TYPE, FRAME_VARG, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL, FRAME_TYPEP);
7046 break; 7047 break;
7047 7048
7048 case BC_RET0: case BC_RET1: 7049 case BC_RET0: case BC_RET1:
7049 dasm_put(Dst, 5231, FRAME_TYPE, FRAME_VARG); 7050 dasm_put(Dst, 5232, FRAME_TYPE, FRAME_VARG);
7050 if (op == BC_RET1) { 7051 if (op == BC_RET1) {
7051 dasm_put(Dst, 5242); 7052 dasm_put(Dst, 5243);
7052 } 7053 }
7053 dasm_put(Dst, 5244); 7054 dasm_put(Dst, 5245);
7054 if (op == BC_RET1) { 7055 if (op == BC_RET1) {
7055 dasm_put(Dst, 5247); 7056 dasm_put(Dst, 5248);
7056 } 7057 }
7057 dasm_put(Dst, 5249, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL); 7058 dasm_put(Dst, 5250, Dt7(->field_pc), PC2PROTO(k), ~LJ_TNIL);
7058 break; 7059 break;
7059 7060
7060 /* -- Loops and branches ------------------------------------------------ */ 7061 /* -- Loops and branches ------------------------------------------------ */
@@ -7062,7 +7063,7 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7062 7063
7063 case BC_FORL: 7064 case BC_FORL:
7064#if LJ_HASJIT 7065#if LJ_HASJIT
7065 dasm_put(Dst, 5275, -GG_DISP2HOT); 7066 dasm_put(Dst, 5276, -GG_DISP2HOT);
7066#endif 7067#endif
7067 break; 7068 break;
7068 7069
@@ -7074,68 +7075,68 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7074 case BC_FORI: 7075 case BC_FORI:
7075 case BC_IFORL: 7076 case BC_IFORL:
7076 vk = (op == BC_IFORL || op == BC_JFORL); 7077 vk = (op == BC_IFORL || op == BC_JFORL);
7077 dasm_put(Dst, 5285); 7078 dasm_put(Dst, 5286);
7078 if (op != BC_JFORL) { 7079 if (op != BC_JFORL) {
7079 dasm_put(Dst, 5287); 7080 dasm_put(Dst, 5288);
7080 } 7081 }
7081 if (!vk) { 7082 if (!vk) {
7082 dasm_put(Dst, 5289, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM); 7083 dasm_put(Dst, 5290, -LJ_TISNUM, -LJ_TISNUM, -LJ_TISNUM);
7083 } else { 7084 } else {
7084 dasm_put(Dst, 5307, -LJ_TISNUM); 7085 dasm_put(Dst, 5308, -LJ_TISNUM);
7085 if (op == BC_IFORL) { 7086 if (op == BC_IFORL) {
7086 dasm_put(Dst, 5315); 7087 dasm_put(Dst, 5316);
7087 } else { 7088 } else {
7088 dasm_put(Dst, 5317); 7089 dasm_put(Dst, 5318);
7089 } 7090 }
7090 dasm_put(Dst, 5320); 7091 dasm_put(Dst, 5321);
7091 } 7092 }
7092 dasm_put(Dst, 5325); 7093 dasm_put(Dst, 5326);
7093 if (op == BC_FORI) { 7094 if (op == BC_FORI) {
7094 dasm_put(Dst, 5327); 7095 dasm_put(Dst, 5328);
7095 } else if (op == BC_JFORI) { 7096 } else if (op == BC_JFORI) {
7096 dasm_put(Dst, 5329); 7097 dasm_put(Dst, 5330);
7097 } else if (op == BC_IFORL) { 7098 } else if (op == BC_IFORL) {
7098 dasm_put(Dst, 5332); 7099 dasm_put(Dst, 5333);
7099 } 7100 }
7100 if (vk) { 7101 if (vk) {
7101 dasm_put(Dst, 5334); 7102 dasm_put(Dst, 5335);
7102 } 7103 }
7103 dasm_put(Dst, 5336); 7104 dasm_put(Dst, 5337);
7104 if (op == BC_JFORI || op == BC_JFORL) { 7105 if (op == BC_JFORI || op == BC_JFORL) {
7105 dasm_put(Dst, 5341, BC_JLOOP); 7106 dasm_put(Dst, 5342, BC_JLOOP);
7106 } 7107 }
7107 dasm_put(Dst, 5344); 7108 dasm_put(Dst, 5345);
7108 if (!vk) { 7109 if (!vk) {
7109 dasm_put(Dst, 5351); 7110 dasm_put(Dst, 5352);
7110 } else { 7111 } else {
7111 dasm_put(Dst, 5353); 7112 dasm_put(Dst, 5354);
7112 } 7113 }
7113 dasm_put(Dst, 5355); 7114 dasm_put(Dst, 5356);
7114 if (!vk) { 7115 if (!vk) {
7115 dasm_put(Dst, 5359, -LJ_TISNUM, -LJ_TISNUM); 7116 dasm_put(Dst, 5360, -LJ_TISNUM, -LJ_TISNUM);
7116 } else { 7117 } else {
7117 dasm_put(Dst, 5371); 7118 dasm_put(Dst, 5372);
7118 } 7119 }
7119 dasm_put(Dst, 5380); 7120 dasm_put(Dst, 5381);
7120 if (op == BC_FORI) { 7121 if (op == BC_FORI) {
7121 dasm_put(Dst, 5384); 7122 dasm_put(Dst, 5385);
7122 } else if (op == BC_JFORI) { 7123 } else if (op == BC_JFORI) {
7123 dasm_put(Dst, 5386, BC_JLOOP); 7124 dasm_put(Dst, 5387, BC_JLOOP);
7124 } else if (op == BC_IFORL) { 7125 } else if (op == BC_IFORL) {
7125 dasm_put(Dst, 5391); 7126 dasm_put(Dst, 5392);
7126 } else { 7127 } else {
7127 dasm_put(Dst, 5393, BC_JLOOP); 7128 dasm_put(Dst, 5394, BC_JLOOP);
7128 } 7129 }
7129 dasm_put(Dst, 5396); 7130 dasm_put(Dst, 5397);
7130 if (vk) { 7131 if (vk) {
7131 dasm_put(Dst, 5402); 7132 dasm_put(Dst, 5403);
7132 } 7133 }
7133 dasm_put(Dst, 5407); 7134 dasm_put(Dst, 5408);
7134 break; 7135 break;
7135 7136
7136 case BC_ITERL: 7137 case BC_ITERL:
7137#if LJ_HASJIT 7138#if LJ_HASJIT
7138 dasm_put(Dst, 5413, -GG_DISP2HOT); 7139 dasm_put(Dst, 5414, -GG_DISP2HOT);
7139#endif 7140#endif
7140 break; 7141 break;
7141 7142
@@ -7144,40 +7145,40 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7144 break; 7145 break;
7145#endif 7146#endif
7146 case BC_IITERL: 7147 case BC_IITERL:
7147 dasm_put(Dst, 5423); 7148 dasm_put(Dst, 5424);
7148 if (op == BC_JITERL) { 7149 if (op == BC_JITERL) {
7149 dasm_put(Dst, 5425, -LJ_TNIL, BC_JLOOP); 7150 dasm_put(Dst, 5426, -LJ_TNIL, BC_JLOOP);
7150 } else { 7151 } else {
7151 dasm_put(Dst, 5431, -LJ_TNIL); 7152 dasm_put(Dst, 5432, -LJ_TNIL);
7152 } 7153 }
7153 dasm_put(Dst, 5437); 7154 dasm_put(Dst, 5438);
7154 break; 7155 break;
7155 7156
7156 case BC_LOOP: 7157 case BC_LOOP:
7157#if LJ_HASJIT 7158#if LJ_HASJIT
7158 dasm_put(Dst, 5444, -GG_DISP2HOT); 7159 dasm_put(Dst, 5445, -GG_DISP2HOT);
7159#endif 7160#endif
7160 break; 7161 break;
7161 7162
7162 case BC_ILOOP: 7163 case BC_ILOOP:
7163 dasm_put(Dst, 5454); 7164 dasm_put(Dst, 5455);
7164 break; 7165 break;
7165 7166
7166 case BC_JLOOP: 7167 case BC_JLOOP:
7167#if LJ_HASJIT 7168#if LJ_HASJIT
7168 dasm_put(Dst, 5461, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L)); 7169 dasm_put(Dst, 5462, DISPATCH_J(trace), DISPATCH_GL(vmstate), DtD(->mcode), DISPATCH_GL(jit_base), DISPATCH_GL(jit_L));
7169#endif 7170#endif
7170 break; 7171 break;
7171 7172
7172 case BC_JMP: 7173 case BC_JMP:
7173 dasm_put(Dst, 5475); 7174 dasm_put(Dst, 5476);
7174 break; 7175 break;
7175 7176
7176 /* -- Function headers -------------------------------------------------- */ 7177 /* -- Function headers -------------------------------------------------- */
7177 7178
7178 case BC_FUNCF: 7179 case BC_FUNCF:
7179#if LJ_HASJIT 7180#if LJ_HASJIT
7180 dasm_put(Dst, 5484, -GG_DISP2HOT); 7181 dasm_put(Dst, 5485, -GG_DISP2HOT);
7181#endif 7182#endif
7182 case BC_FUNCV: /* NYI: compiled vararg functions. */ 7183 case BC_FUNCV: /* NYI: compiled vararg functions. */
7183 break; 7184 break;
@@ -7187,42 +7188,42 @@ static void build_ins(BuildCtx *ctx, BCOp op, int defop)
7187 break; 7188 break;
7188#endif 7189#endif
7189 case BC_IFUNCF: 7190 case BC_IFUNCF:
7190 dasm_put(Dst, 5494, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k)); 7191 dasm_put(Dst, 5495, Dt1(->maxstack), -4+PC2PROTO(numparams), -4+PC2PROTO(k));
7191 if (op != BC_JFUNCF) { 7192 if (op != BC_JFUNCF) {
7192 dasm_put(Dst, 5504); 7193 dasm_put(Dst, 5505);
7193 } 7194 }
7194 dasm_put(Dst, 5507, ~LJ_TNIL); 7195 dasm_put(Dst, 5508, ~LJ_TNIL);
7195 if (op == BC_JFUNCF) { 7196 if (op == BC_JFUNCF) {
7196 dasm_put(Dst, 5514, BC_JLOOP); 7197 dasm_put(Dst, 5515, BC_JLOOP);
7197 } else { 7198 } else {
7198 dasm_put(Dst, 5518); 7199 dasm_put(Dst, 5519);
7199 } 7200 }
7200 dasm_put(Dst, 5523); 7201 dasm_put(Dst, 5524);
7201 break; 7202 break;
7202 7203
7203 case BC_JFUNCV: 7204 case BC_JFUNCV:
7204#if !LJ_HASJIT 7205#if !LJ_HASJIT
7205 break; 7206 break;
7206#endif 7207#endif
7207 dasm_put(Dst, 5529); 7208 dasm_put(Dst, 5530);
7208 break; /* NYI: compiled vararg functions. */ 7209 break; /* NYI: compiled vararg functions. */
7209 7210
7210 case BC_IFUNCV: 7211 case BC_IFUNCV:
7211 dasm_put(Dst, 5531, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL); 7212 dasm_put(Dst, 5532, Dt1(->maxstack), 8+FRAME_VARG, -4+PC2PROTO(k), -4+PC2PROTO(numparams), ~LJ_TNIL);
7212 break; 7213 break;
7213 7214
7214 case BC_FUNCC: 7215 case BC_FUNCC:
7215 case BC_FUNCCW: 7216 case BC_FUNCCW:
7216 if (op == BC_FUNCC) { 7217 if (op == BC_FUNCC) {
7217 dasm_put(Dst, 5572, Dt8(->f)); 7218 dasm_put(Dst, 5573, Dt8(->f));
7218 } else { 7219 } else {
7219 dasm_put(Dst, 5575, DISPATCH_GL(wrapf)); 7220 dasm_put(Dst, 5576, DISPATCH_GL(wrapf));
7220 } 7221 }
7221 dasm_put(Dst, 5578, Dt1(->maxstack), Dt1(->base), Dt1(->top)); 7222 dasm_put(Dst, 5579, Dt1(->maxstack), Dt1(->base), Dt1(->top));
7222 if (op == BC_FUNCCW) { 7223 if (op == BC_FUNCCW) {
7223 dasm_put(Dst, 5588, Dt8(->f)); 7224 dasm_put(Dst, 5589, Dt8(->f));
7224 } 7225 }
7225 dasm_put(Dst, 5591, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate)); 7226 dasm_put(Dst, 5592, LJ_VMST_C, DISPATCH_GL(vmstate), Dt1(->base), LJ_VMST_INTERP, Dt1(->top), DISPATCH_GL(vmstate));
7226 break; 7227 break;
7227 7228
7228 /* ---------------------------------------------------------------------- */ 7229 /* ---------------------------------------------------------------------- */
@@ -7242,7 +7243,7 @@ static int build_backend(BuildCtx *ctx)
7242 7243
7243 build_subroutines(ctx); 7244 build_subroutines(ctx);
7244 7245
7245 dasm_put(Dst, 5613); 7246 dasm_put(Dst, 5614);
7246 for (op = 0; op < BC__MAX; op++) 7247 for (op = 0; op < BC__MAX; op++)
7247 build_ins(ctx, (BCOp)op, op); 7248 build_ins(ctx, (BCOp)op, op);
7248 7249