summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-12-05 12:59:42 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-12-05 12:59:42 -0300
commit490ecfcaa1f25fcc17f9dcb0ed7216da54a391e3 (patch)
tree0f6c221c65ddad7b73a223c40cb6cd3e4f324102
parente174f43807d46a7c0a9ab5eeb3fc4434bcb0091f (diff)
downloadlua-490ecfcaa1f25fcc17f9dcb0ed7216da54a391e3.tar.gz
lua-490ecfcaa1f25fcc17f9dcb0ed7216da54a391e3.tar.bz2
lua-490ecfcaa1f25fcc17f9dcb0ed7216da54a391e3.zip
Better comments about the use of 'k' in opcodes
-rw-r--r--lopcodes.h42
-rw-r--r--lvm.c22
2 files changed, 34 insertions, 30 deletions
diff --git a/lopcodes.h b/lopcodes.h
index 382dec05..aec9dcbc 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -217,7 +217,7 @@ OP_SETTABLE,/* A B C R[A][R[B]] := RK(C) */
217OP_SETI,/* A B C R[A][B] := RK(C) */ 217OP_SETI,/* A B C R[A][B] := RK(C) */
218OP_SETFIELD,/* A B C R[A][K[B]:string] := RK(C) */ 218OP_SETFIELD,/* A B C R[A][K[B]:string] := RK(C) */
219 219
220OP_NEWTABLE,/* A B C R[A] := {} */ 220OP_NEWTABLE,/* A B C k R[A] := {} */
221 221
222OP_SELF,/* A B C R[A+1] := R[B]; R[A] := R[B][RK(C):string] */ 222OP_SELF,/* A B C R[A+1] := R[B]; R[A] := R[B][RK(C):string] */
223 223
@@ -253,8 +253,8 @@ OP_SHL,/* A B C R[A] := R[B] << R[C] */
253OP_SHR,/* A B C R[A] := R[B] >> R[C] */ 253OP_SHR,/* A B C R[A] := R[B] >> R[C] */
254 254
255OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] */ 255OP_MMBIN,/* A B C call C metamethod over R[A] and R[B] */
256OP_MMBINI,/* A sB C call C metamethod over R[A] and sB */ 256OP_MMBINI,/* A sB C k call C metamethod over R[A] and sB */
257OP_MMBINK,/* A B C call C metamethod over R[A] and K[B] */ 257OP_MMBINK,/* A B C k call C metamethod over R[A] and K[B] */
258 258
259OP_UNM,/* A B R[A] := -R[B] */ 259OP_UNM,/* A B R[A] := -R[B] */
260OP_BNOT,/* A B R[A] := ~R[B] */ 260OP_BNOT,/* A B R[A] := ~R[B] */
@@ -266,24 +266,24 @@ OP_CONCAT,/* A B R[A] := R[A].. ... ..R[A + B - 1] */
266OP_CLOSE,/* A close all upvalues >= R[A] */ 266OP_CLOSE,/* A close all upvalues >= R[A] */
267OP_TBC,/* A mark variable A "to be closed" */ 267OP_TBC,/* A mark variable A "to be closed" */
268OP_JMP,/* sJ pc += sJ */ 268OP_JMP,/* sJ pc += sJ */
269OP_EQ,/* A B if ((R[A] == R[B]) ~= k) then pc++ */ 269OP_EQ,/* A B k if ((R[A] == R[B]) ~= k) then pc++ */
270OP_LT,/* A B if ((R[A] < R[B]) ~= k) then pc++ */ 270OP_LT,/* A B k if ((R[A] < R[B]) ~= k) then pc++ */
271OP_LE,/* A B if ((R[A] <= R[B]) ~= k) then pc++ */ 271OP_LE,/* A B k if ((R[A] <= R[B]) ~= k) then pc++ */
272 272
273OP_EQK,/* A B if ((R[A] == K[B]) ~= k) then pc++ */ 273OP_EQK,/* A B k if ((R[A] == K[B]) ~= k) then pc++ */
274OP_EQI,/* A sB if ((R[A] == sB) ~= k) then pc++ */ 274OP_EQI,/* A sB k if ((R[A] == sB) ~= k) then pc++ */
275OP_LTI,/* A sB if ((R[A] < sB) ~= k) then pc++ */ 275OP_LTI,/* A sB k if ((R[A] < sB) ~= k) then pc++ */
276OP_LEI,/* A sB if ((R[A] <= sB) ~= k) then pc++ */ 276OP_LEI,/* A sB k if ((R[A] <= sB) ~= k) then pc++ */
277OP_GTI,/* A sB if ((R[A] > sB) ~= k) then pc++ */ 277OP_GTI,/* A sB k if ((R[A] > sB) ~= k) then pc++ */
278OP_GEI,/* A sB if ((R[A] >= sB) ~= k) then pc++ */ 278OP_GEI,/* A sB k if ((R[A] >= sB) ~= k) then pc++ */
279 279
280OP_TEST,/* A if (not R[A] == k) then pc++ */ 280OP_TEST,/* A k if (not R[A] == k) then pc++ */
281OP_TESTSET,/* A B if (not R[B] == k) then pc++ else R[A] := R[B] */ 281OP_TESTSET,/* A B k if (not R[B] == k) then pc++ else R[A] := R[B] */
282 282
283OP_CALL,/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) */ 283OP_CALL,/* A B C R[A], ... ,R[A+C-2] := R[A](R[A+1], ... ,R[A+B-1]) */
284OP_TAILCALL,/* A B C return R[A](R[A+1], ... ,R[A+B-1]) */ 284OP_TAILCALL,/* A B C k return R[A](R[A+1], ... ,R[A+B-1]) */
285 285
286OP_RETURN,/* A B C return R[A], ... ,R[A+B-2] (see note) */ 286OP_RETURN,/* A B C k return R[A], ... ,R[A+B-2] (see note) */
287OP_RETURN0,/* return */ 287OP_RETURN0,/* return */
288OP_RETURN1,/* A return R[A] */ 288OP_RETURN1,/* A return R[A] */
289 289
@@ -295,7 +295,7 @@ OP_TFORPREP,/* A Bx create upvalue for R[A + 3]; pc+=Bx */
295OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ 295OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */
296OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ 296OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */
297 297
298OP_SETLIST,/* A B C R[A][(C-1)*FPF+i] := R[A+i], 1 <= i <= B */ 298OP_SETLIST,/* A B C k R[A][(C-1)*FPF+i] := R[A+i], 1 <= i <= B */
299 299
300OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ 300OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */
301 301
@@ -323,7 +323,7 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
323 (*) In OP_RETURN, if (B == 0) then return up to 'top'. 323 (*) In OP_RETURN, if (B == 0) then return up to 'top'.
324 324
325 (*) In OP_LOADKX and OP_NEWTABLE, the next instruction is always 325 (*) In OP_LOADKX and OP_NEWTABLE, the next instruction is always
326 EXTRAARG. 326 OP_EXTRAARG.
327 327
328 (*) In OP_SETLIST, if (B == 0) then real B = 'top'; if k, then 328 (*) In OP_SETLIST, if (B == 0) then real B = 'top'; if k, then
329 real C = EXTRAARG _ C (the bits of EXTRAARG concatenated with the 329 real C = EXTRAARG _ C (the bits of EXTRAARG concatenated with the
@@ -336,6 +336,9 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
336 (*) For comparisons, k specifies what condition the test should accept 336 (*) For comparisons, k specifies what condition the test should accept
337 (true or false). 337 (true or false).
338 338
339 (*) In OP_MMBINI/OP_MMBINK, k means the arguments were flipped
340 (the constant is the first operand).
341
339 (*) All 'skips' (pc++) assume that next instruction is a jump. 342 (*) All 'skips' (pc++) assume that next instruction is a jump.
340 343
341 (*) In instructions OP_RETURN/OP_TAILCALL, 'k' specifies that the 344 (*) In instructions OP_RETURN/OP_TAILCALL, 'k' specifies that the
@@ -344,7 +347,8 @@ OP_EXTRAARG/* Ax extra (larger) argument for previous opcode */
344 returning; in this case, (C - 1) is its number of fixed parameters. 347 returning; in this case, (C - 1) is its number of fixed parameters.
345 348
346 (*) In comparisons with an immediate operand, C signals whether the 349 (*) In comparisons with an immediate operand, C signals whether the
347 original operand was a float. 350 original operand was a float. (It must be corrected in case of
351 metamethods.)
348 352
349===========================================================================*/ 353===========================================================================*/
350 354
diff --git a/lvm.c b/lvm.c
index dc479f0a..d70ac7ac 100644
--- a/lvm.c
+++ b/lvm.c
@@ -890,9 +890,9 @@ void luaV_finishOp (lua_State *L) {
890/* 890/*
891** Auxiliary macro for arithmetic operations over floats and others 891** Auxiliary macro for arithmetic operations over floats and others
892** with immediate operand. 'fop' is the float operation; 'tm' is the 892** with immediate operand. 'fop' is the float operation; 'tm' is the
893** corresponding metamethod; 'flip' is true if operands were flipped. 893** corresponding metamethod.
894*/ 894*/
895#define op_arithfI_aux(L,v1,imm,fop,tm,flip) { \ 895#define op_arithfI_aux(L,v1,imm,fop,tm) { \
896 lua_Number nb; \ 896 lua_Number nb; \
897 if (tonumberns(v1, nb)) { \ 897 if (tonumberns(v1, nb)) { \
898 lua_Number fimm = cast_num(imm); \ 898 lua_Number fimm = cast_num(imm); \
@@ -912,14 +912,14 @@ void luaV_finishOp (lua_State *L) {
912** Arithmetic operations with immediate operands. 'iop' is the integer 912** Arithmetic operations with immediate operands. 'iop' is the integer
913** operation. 913** operation.
914*/ 914*/
915#define op_arithI(L,iop,fop,tm,flip) { \ 915#define op_arithI(L,iop,fop,tm) { \
916 TValue *v1 = vRB(i); \ 916 TValue *v1 = vRB(i); \
917 int imm = GETARG_sC(i); \ 917 int imm = GETARG_sC(i); \
918 if (ttisinteger(v1)) { \ 918 if (ttisinteger(v1)) { \
919 lua_Integer iv1 = ivalue(v1); \ 919 lua_Integer iv1 = ivalue(v1); \
920 pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \ 920 pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \
921 } \ 921 } \
922 else op_arithfI_aux(L, v1, imm, fop, tm, flip); } 922 else op_arithfI_aux(L, v1, imm, fop, tm); }
923 923
924 924
925/* 925/*
@@ -958,7 +958,7 @@ void luaV_finishOp (lua_State *L) {
958/* 958/*
959** Arithmetic operations with K operands. 959** Arithmetic operations with K operands.
960*/ 960*/
961#define op_arithK(L,iop,fop,flip) { \ 961#define op_arithK(L,iop,fop) { \
962 TValue *v1 = vRB(i); \ 962 TValue *v1 = vRB(i); \
963 TValue *v2 = KC(i); \ 963 TValue *v2 = KC(i); \
964 if (ttisinteger(v1) && ttisinteger(v2)) { \ 964 if (ttisinteger(v1) && ttisinteger(v2)) { \
@@ -1367,23 +1367,23 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1367 vmbreak; 1367 vmbreak;
1368 } 1368 }
1369 vmcase(OP_ADDI) { 1369 vmcase(OP_ADDI) {
1370 op_arithI(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i)); 1370 op_arithI(L, l_addi, luai_numadd, TM_ADD);
1371 vmbreak; 1371 vmbreak;
1372 } 1372 }
1373 vmcase(OP_ADDK) { 1373 vmcase(OP_ADDK) {
1374 op_arithK(L, l_addi, luai_numadd, GETARG_k(i)); 1374 op_arithK(L, l_addi, luai_numadd);
1375 vmbreak; 1375 vmbreak;
1376 } 1376 }
1377 vmcase(OP_SUBK) { 1377 vmcase(OP_SUBK) {
1378 op_arithK(L, l_subi, luai_numsub, 0); 1378 op_arithK(L, l_subi, luai_numsub);
1379 vmbreak; 1379 vmbreak;
1380 } 1380 }
1381 vmcase(OP_MULK) { 1381 vmcase(OP_MULK) {
1382 op_arithK(L, l_muli, luai_nummul, GETARG_k(i)); 1382 op_arithK(L, l_muli, luai_nummul);
1383 vmbreak; 1383 vmbreak;
1384 } 1384 }
1385 vmcase(OP_MODK) { 1385 vmcase(OP_MODK) {
1386 op_arithK(L, luaV_mod, luaV_modf, 0); 1386 op_arithK(L, luaV_mod, luaV_modf);
1387 vmbreak; 1387 vmbreak;
1388 } 1388 }
1389 vmcase(OP_POWK) { 1389 vmcase(OP_POWK) {
@@ -1395,7 +1395,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1395 vmbreak; 1395 vmbreak;
1396 } 1396 }
1397 vmcase(OP_IDIVK) { 1397 vmcase(OP_IDIVK) {
1398 op_arithK(L, luaV_idiv, luai_numidiv, 0); 1398 op_arithK(L, luaV_idiv, luai_numidiv);
1399 vmbreak; 1399 vmbreak;
1400 } 1400 }
1401 vmcase(OP_BANDK) { 1401 vmcase(OP_BANDK) {