diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-08-28 09:58:03 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2019-08-28 09:58:03 -0300 |
commit | 46b84580d6d7890f4ba813f312e52514fffc38a7 (patch) | |
tree | 764855657253d0b7d2a83c810d5f3bd3493c5ed1 | |
parent | df13f259487459f3a28d31d76c890aa6c2d061e0 (diff) | |
download | lua-46b84580d6d7890f4ba813f312e52514fffc38a7.tar.gz lua-46b84580d6d7890f4ba813f312e52514fffc38a7.tar.bz2 lua-46b84580d6d7890f4ba813f312e52514fffc38a7.zip |
Use of 'MMBIN' opcodes extended to shift operators
Plus, this commit removes useless 'tm' parameters in 'op_*' macros.
-rw-r--r-- | lcode.c | 26 | ||||
-rw-r--r-- | ldebug.c | 8 | ||||
-rw-r--r-- | lvm.c | 102 | ||||
-rw-r--r-- | testes/code.lua | 8 | ||||
-rw-r--r-- | testes/db.lua | 3 |
5 files changed, 60 insertions, 87 deletions
@@ -1339,19 +1339,23 @@ static void codeunexpval (FuncState *fs, OpCode op, expdesc *e, int line) { | |||
1339 | ** Expression to produce final result will be encoded in 'e1'. | 1339 | ** Expression to produce final result will be encoded in 'e1'. |
1340 | */ | 1340 | */ |
1341 | static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, | 1341 | static void finishbinexpval (FuncState *fs, expdesc *e1, expdesc *e2, |
1342 | OpCode op, int v2, int k, int line, | 1342 | OpCode op, int v2, int flip, int line, |
1343 | OpCode mmop, TMS event) { | 1343 | OpCode mmop, TMS event) { |
1344 | int v1 = luaK_exp2anyreg(fs, e1); | 1344 | int v1 = luaK_exp2anyreg(fs, e1); |
1345 | int pc = luaK_codeABCk(fs, op, 0, v1, v2, k); | 1345 | int pc = luaK_codeABCk(fs, op, 0, v1, v2, flip); |
1346 | freeexps(fs, e1, e2); | 1346 | freeexps(fs, e1, e2); |
1347 | e1->u.info = pc; | 1347 | e1->u.info = pc; |
1348 | e1->k = VRELOC; /* all those operations are relocatable */ | 1348 | e1->k = VRELOC; /* all those operations are relocatable */ |
1349 | luaK_fixline(fs, line); | 1349 | luaK_fixline(fs, line); |
1350 | if (event != TM_SHL && event != TM_SHR) { | 1350 | if (op == OP_SHRI && flip) { |
1351 | luaK_codeABCk(fs, mmop, v1, v2, event, k); /* to call metamethod */ | 1351 | /* For the metamethod, undo the "changedir" did by 'codeshift' */ |
1352 | event = TM_SHL; | ||
1353 | v2 = -(v2 - OFFSET_sC) + OFFSET_sC; | ||
1354 | flip = 0; | ||
1355 | } | ||
1356 | luaK_codeABCk(fs, mmop, v1, v2, event, flip); /* to call metamethod */ | ||
1352 | luaK_fixline(fs, line); | 1357 | luaK_fixline(fs, line); |
1353 | } | 1358 | } |
1354 | } | ||
1355 | 1359 | ||
1356 | 1360 | ||
1357 | /* | 1361 | /* |
@@ -1371,10 +1375,10 @@ static void codebinexpval (FuncState *fs, OpCode op, | |||
1371 | ** Code binary operators ('+', '-', ...) with immediate operands. | 1375 | ** Code binary operators ('+', '-', ...) with immediate operands. |
1372 | */ | 1376 | */ |
1373 | static void codebini (FuncState *fs, OpCode op, | 1377 | static void codebini (FuncState *fs, OpCode op, |
1374 | expdesc *e1, expdesc *e2, int k, int line, | 1378 | expdesc *e1, expdesc *e2, int flip, int line, |
1375 | TMS event) { | 1379 | TMS event) { |
1376 | int v2 = cast_int(e2->u.ival) + OFFSET_sC; /* immediate operand */ | 1380 | int v2 = cast_int(e2->u.ival) + OFFSET_sC; /* immediate operand */ |
1377 | finishbinexpval(fs, e1, e2, op, v2, k, line, OP_MMBINI, event); | 1381 | finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINI, event); |
1378 | } | 1382 | } |
1379 | 1383 | ||
1380 | 1384 | ||
@@ -1429,12 +1433,12 @@ static void codecommutative (FuncState *fs, BinOpr op, | |||
1429 | */ | 1433 | */ |
1430 | static void codebitwise (FuncState *fs, BinOpr opr, | 1434 | static void codebitwise (FuncState *fs, BinOpr opr, |
1431 | expdesc *e1, expdesc *e2, int line) { | 1435 | expdesc *e1, expdesc *e2, int line) { |
1432 | int inv = 0; | 1436 | int flip = 0; |
1433 | int v2; | 1437 | int v2; |
1434 | OpCode op; | 1438 | OpCode op; |
1435 | if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { | 1439 | if (e1->k == VKINT && luaK_exp2RK(fs, e1)) { |
1436 | swapexps(e1, e2); /* 'e2' will be the constant operand */ | 1440 | swapexps(e1, e2); /* 'e2' will be the constant operand */ |
1437 | inv = 1; | 1441 | flip = 1; |
1438 | } | 1442 | } |
1439 | else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ | 1443 | else if (!(e2->k == VKINT && luaK_exp2RK(fs, e2))) { /* no constants? */ |
1440 | op = cast(OpCode, opr + OP_ADD); | 1444 | op = cast(OpCode, opr + OP_ADD); |
@@ -1444,7 +1448,7 @@ static void codebitwise (FuncState *fs, BinOpr opr, | |||
1444 | v2 = e2->u.info; /* index in K array */ | 1448 | v2 = e2->u.info; /* index in K array */ |
1445 | op = cast(OpCode, opr + OP_ADDK); | 1449 | op = cast(OpCode, opr + OP_ADDK); |
1446 | lua_assert(ttisinteger(&fs->f->k[v2])); | 1450 | lua_assert(ttisinteger(&fs->f->k[v2])); |
1447 | finishbinexpval(fs, e1, e2, op, v2, inv, line, OP_MMBINK, | 1451 | finishbinexpval(fs, e1, e2, op, v2, flip, line, OP_MMBINK, |
1448 | cast(TMS, opr + TM_ADD)); | 1452 | cast(TMS, opr + TM_ADD)); |
1449 | } | 1453 | } |
1450 | 1454 | ||
@@ -1461,7 +1465,7 @@ static void codeshift (FuncState *fs, OpCode op, | |||
1461 | changedir = 1; | 1465 | changedir = 1; |
1462 | e2->u.ival = -(e2->u.ival); | 1466 | e2->u.ival = -(e2->u.ival); |
1463 | } | 1467 | } |
1464 | codebini(fs, OP_SHRI, e1, e2, changedir, line, TM_SHL); | 1468 | codebini(fs, OP_SHRI, e1, e2, changedir, line, TM_SHR); |
1465 | } | 1469 | } |
1466 | else | 1470 | else |
1467 | codebinexpval(fs, op, e1, e2, line); | 1471 | codebinexpval(fs, op, e1, e2, line); |
@@ -628,11 +628,6 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci, | |||
628 | tm = cast(TMS, GETARG_C(i)); | 628 | tm = cast(TMS, GETARG_C(i)); |
629 | break; | 629 | break; |
630 | } | 630 | } |
631 | case OP_SHL: case OP_SHR: { | ||
632 | int offset = GET_OPCODE(i) - OP_ADD; /* ORDER OP */ | ||
633 | tm = cast(TMS, offset + TM_ADD); /* ORDER TM */ | ||
634 | break; | ||
635 | } | ||
636 | case OP_UNM: tm = TM_UNM; break; | 631 | case OP_UNM: tm = TM_UNM; break; |
637 | case OP_BNOT: tm = TM_BNOT; break; | 632 | case OP_BNOT: tm = TM_BNOT; break; |
638 | case OP_LEN: tm = TM_LEN; break; | 633 | case OP_LEN: tm = TM_LEN; break; |
@@ -641,9 +636,6 @@ static const char *funcnamefromcode (lua_State *L, CallInfo *ci, | |||
641 | case OP_LT: case OP_LE: case OP_LTI: case OP_LEI: | 636 | case OP_LT: case OP_LE: case OP_LTI: case OP_LEI: |
642 | *name = "order"; /* '<=' can call '__lt', etc. */ | 637 | *name = "order"; /* '<=' can call '__lt', etc. */ |
643 | return "metamethod"; | 638 | return "metamethod"; |
644 | case OP_SHRI: case OP_SHLI: | ||
645 | *name = "shift"; | ||
646 | return "metamethod"; | ||
647 | case OP_CLOSE: case OP_RETURN: | 639 | case OP_CLOSE: case OP_RETURN: |
648 | *name = "close"; | 640 | *name = "close"; |
649 | return "metamethod"; | 641 | return "metamethod"; |
@@ -674,6 +674,8 @@ lua_Number luaV_modf (lua_State *L, lua_Number m, lua_Number n) { | |||
674 | /* | 674 | /* |
675 | ** Shift left operation. (Shift right just negates 'y'.) | 675 | ** Shift left operation. (Shift right just negates 'y'.) |
676 | */ | 676 | */ |
677 | #define luaV_shiftr(x,y) luaV_shiftl(x,-(y)) | ||
678 | |||
677 | lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { | 679 | lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { |
678 | if (y < 0) { /* shift right? */ | 680 | if (y < 0) { /* shift right? */ |
679 | if (y <= -NBITS) return 0; | 681 | if (y <= -NBITS) return 0; |
@@ -721,7 +723,6 @@ void luaV_finishOp (lua_State *L) { | |||
721 | setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top); | 723 | setobjs2s(L, base + GETARG_A(*(ci->u.l.savedpc - 2)), --L->top); |
722 | break; | 724 | break; |
723 | } | 725 | } |
724 | case OP_SHLI: case OP_SHRI: case OP_SHL: case OP_SHR: | ||
725 | case OP_UNM: case OP_BNOT: case OP_LEN: | 726 | case OP_UNM: case OP_BNOT: case OP_LEN: |
726 | case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: | 727 | case OP_GETTABUP: case OP_GETTABLE: case OP_GETI: |
727 | case OP_GETFIELD: case OP_SELF: { | 728 | case OP_GETFIELD: case OP_SELF: { |
@@ -778,9 +779,9 @@ void luaV_finishOp (lua_State *L) { | |||
778 | #define l_addi(L,a,b) intop(+, a, b) | 779 | #define l_addi(L,a,b) intop(+, a, b) |
779 | #define l_subi(L,a,b) intop(-, a, b) | 780 | #define l_subi(L,a,b) intop(-, a, b) |
780 | #define l_muli(L,a,b) intop(*, a, b) | 781 | #define l_muli(L,a,b) intop(*, a, b) |
781 | #define l_band(L,a,b) intop(&, a, b) | 782 | #define l_band(a,b) intop(&, a, b) |
782 | #define l_bor(L,a,b) intop(|, a, b) | 783 | #define l_bor(a,b) intop(|, a, b) |
783 | #define l_bxor(L,a,b) intop(^, a, b) | 784 | #define l_bxor(a,b) intop(^, a, b) |
784 | 785 | ||
785 | #define l_lti(a,b) (a < b) | 786 | #define l_lti(a,b) (a < b) |
786 | #define l_lei(a,b) (a <= b) | 787 | #define l_lei(a,b) (a <= b) |
@@ -827,7 +828,7 @@ void luaV_finishOp (lua_State *L) { | |||
827 | ** Auxiliary function for arithmetic operations over floats and others | 828 | ** Auxiliary function for arithmetic operations over floats and others |
828 | ** with two register operands. | 829 | ** with two register operands. |
829 | */ | 830 | */ |
830 | #define op_arithf_aux(L,v1,v2,fop,tm) { \ | 831 | #define op_arithf_aux(L,v1,v2,fop) { \ |
831 | lua_Number n1; lua_Number n2; \ | 832 | lua_Number n1; lua_Number n2; \ |
832 | if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ | 833 | if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ |
833 | pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \ | 834 | pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \ |
@@ -837,29 +838,29 @@ void luaV_finishOp (lua_State *L) { | |||
837 | /* | 838 | /* |
838 | ** Arithmetic operations over floats and others with register operands. | 839 | ** Arithmetic operations over floats and others with register operands. |
839 | */ | 840 | */ |
840 | #define op_arithf(L,fop,tm) { \ | 841 | #define op_arithf(L,fop) { \ |
841 | TValue *v1 = vRB(i); \ | 842 | TValue *v1 = vRB(i); \ |
842 | TValue *v2 = vRC(i); \ | 843 | TValue *v2 = vRC(i); \ |
843 | op_arithf_aux(L, v1, v2, fop, tm); } | 844 | op_arithf_aux(L, v1, v2, fop); } |
844 | 845 | ||
845 | 846 | ||
846 | /* | 847 | /* |
847 | ** Arithmetic operations with register operands. | 848 | ** Arithmetic operations with register operands. |
848 | */ | 849 | */ |
849 | #define op_arith(L,iop,fop,tm) { \ | 850 | #define op_arith(L,iop,fop) { \ |
850 | TValue *v1 = vRB(i); \ | 851 | TValue *v1 = vRB(i); \ |
851 | TValue *v2 = vRC(i); \ | 852 | TValue *v2 = vRC(i); \ |
852 | if (ttisinteger(v1) && ttisinteger(v2)) { \ | 853 | if (ttisinteger(v1) && ttisinteger(v2)) { \ |
853 | lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ | 854 | lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ |
854 | pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ | 855 | pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ |
855 | } \ | 856 | } \ |
856 | else op_arithf_aux(L, v1, v2, fop, tm); } | 857 | else op_arithf_aux(L, v1, v2, fop); } |
857 | 858 | ||
858 | 859 | ||
859 | /* | 860 | /* |
860 | ** Arithmetic operations with K operands. | 861 | ** Arithmetic operations with K operands. |
861 | */ | 862 | */ |
862 | #define op_arithK(L,iop,fop,tm,flip) { \ | 863 | #define op_arithK(L,iop,fop,flip) { \ |
863 | TValue *v1 = vRB(i); \ | 864 | TValue *v1 = vRB(i); \ |
864 | TValue *v2 = KC(i); \ | 865 | TValue *v2 = KC(i); \ |
865 | if (ttisinteger(v1) && ttisinteger(v2)) { \ | 866 | if (ttisinteger(v1) && ttisinteger(v2)) { \ |
@@ -876,7 +877,7 @@ void luaV_finishOp (lua_State *L) { | |||
876 | /* | 877 | /* |
877 | ** Arithmetic operations with K operands for floats. | 878 | ** Arithmetic operations with K operands for floats. |
878 | */ | 879 | */ |
879 | #define op_arithfK(L,fop,tm) { \ | 880 | #define op_arithfK(L,fop) { \ |
880 | TValue *v1 = vRB(i); \ | 881 | TValue *v1 = vRB(i); \ |
881 | TValue *v2 = KC(i); \ | 882 | TValue *v2 = KC(i); \ |
882 | lua_Number n1; lua_Number n2; \ | 883 | lua_Number n1; lua_Number n2; \ |
@@ -888,25 +889,25 @@ void luaV_finishOp (lua_State *L) { | |||
888 | /* | 889 | /* |
889 | ** Bitwise operations with constant operand. | 890 | ** Bitwise operations with constant operand. |
890 | */ | 891 | */ |
891 | #define op_bitwiseK(L,op,tm) { \ | 892 | #define op_bitwiseK(L,op) { \ |
892 | TValue *v1 = vRB(i); \ | 893 | TValue *v1 = vRB(i); \ |
893 | TValue *v2 = KC(i); \ | 894 | TValue *v2 = KC(i); \ |
894 | lua_Integer i1; \ | 895 | lua_Integer i1; \ |
895 | lua_Integer i2 = ivalue(v2); \ | 896 | lua_Integer i2 = ivalue(v2); \ |
896 | if (tointegerns(v1, &i1)) { \ | 897 | if (tointegerns(v1, &i1)) { \ |
897 | pc++; setivalue(s2v(ra), op(L, i1, i2)); \ | 898 | pc++; setivalue(s2v(ra), op(i1, i2)); \ |
898 | }} | 899 | }} |
899 | 900 | ||
900 | 901 | ||
901 | /* | 902 | /* |
902 | ** Bitwise operations with register operands. | 903 | ** Bitwise operations with register operands. |
903 | */ | 904 | */ |
904 | #define op_bitwise(L,op,tm) { \ | 905 | #define op_bitwise(L,op) { \ |
905 | TValue *v1 = vRB(i); \ | 906 | TValue *v1 = vRB(i); \ |
906 | TValue *v2 = vRC(i); \ | 907 | TValue *v2 = vRC(i); \ |
907 | lua_Integer i1; lua_Integer i2; \ | 908 | lua_Integer i1; lua_Integer i2; \ |
908 | if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ | 909 | if (tointegerns(v1, &i1) && tointegerns(v2, &i2)) { \ |
909 | pc++; setivalue(s2v(ra), op(L, i1, i2)); \ | 910 | pc++; setivalue(s2v(ra), op(i1, i2)); \ |
910 | }} | 911 | }} |
911 | 912 | ||
912 | 913 | ||
@@ -1296,43 +1297,43 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1296 | vmbreak; | 1297 | vmbreak; |
1297 | } | 1298 | } |
1298 | vmcase(OP_ADDK) { | 1299 | vmcase(OP_ADDK) { |
1299 | op_arithK(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i)); | 1300 | op_arithK(L, l_addi, luai_numadd, GETARG_k(i)); |
1300 | vmbreak; | 1301 | vmbreak; |
1301 | } | 1302 | } |
1302 | vmcase(OP_SUBK) { | 1303 | vmcase(OP_SUBK) { |
1303 | op_arithK(L, l_subi, luai_numsub, TM_SUB, 0); | 1304 | op_arithK(L, l_subi, luai_numsub, 0); |
1304 | vmbreak; | 1305 | vmbreak; |
1305 | } | 1306 | } |
1306 | vmcase(OP_MULK) { | 1307 | vmcase(OP_MULK) { |
1307 | op_arithK(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i)); | 1308 | op_arithK(L, l_muli, luai_nummul, GETARG_k(i)); |
1308 | vmbreak; | 1309 | vmbreak; |
1309 | } | 1310 | } |
1310 | vmcase(OP_MODK) { | 1311 | vmcase(OP_MODK) { |
1311 | op_arithK(L, luaV_mod, luaV_modf, TM_MOD, 0); | 1312 | op_arithK(L, luaV_mod, luaV_modf, 0); |
1312 | vmbreak; | 1313 | vmbreak; |
1313 | } | 1314 | } |
1314 | vmcase(OP_POWK) { | 1315 | vmcase(OP_POWK) { |
1315 | op_arithfK(L, luai_numpow, TM_POW); | 1316 | op_arithfK(L, luai_numpow); |
1316 | vmbreak; | 1317 | vmbreak; |
1317 | } | 1318 | } |
1318 | vmcase(OP_DIVK) { | 1319 | vmcase(OP_DIVK) { |
1319 | op_arithfK(L, luai_numdiv, TM_DIV); | 1320 | op_arithfK(L, luai_numdiv); |
1320 | vmbreak; | 1321 | vmbreak; |
1321 | } | 1322 | } |
1322 | vmcase(OP_IDIVK) { | 1323 | vmcase(OP_IDIVK) { |
1323 | op_arithK(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); | 1324 | op_arithK(L, luaV_idiv, luai_numidiv, 0); |
1324 | vmbreak; | 1325 | vmbreak; |
1325 | } | 1326 | } |
1326 | vmcase(OP_BANDK) { | 1327 | vmcase(OP_BANDK) { |
1327 | op_bitwiseK(L, l_band, TM_BAND); | 1328 | op_bitwiseK(L, l_band); |
1328 | vmbreak; | 1329 | vmbreak; |
1329 | } | 1330 | } |
1330 | vmcase(OP_BORK) { | 1331 | vmcase(OP_BORK) { |
1331 | op_bitwiseK(L, l_bor, TM_BOR); | 1332 | op_bitwiseK(L, l_bor); |
1332 | vmbreak; | 1333 | vmbreak; |
1333 | } | 1334 | } |
1334 | vmcase(OP_BXORK) { | 1335 | vmcase(OP_BXORK) { |
1335 | op_bitwiseK(L, l_bxor, TM_BXOR); | 1336 | op_bitwiseK(L, l_bxor); |
1336 | vmbreak; | 1337 | vmbreak; |
1337 | } | 1338 | } |
1338 | vmcase(OP_SHRI) { | 1339 | vmcase(OP_SHRI) { |
@@ -1340,14 +1341,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1340 | int ic = GETARG_sC(i); | 1341 | int ic = GETARG_sC(i); |
1341 | lua_Integer ib; | 1342 | lua_Integer ib; |
1342 | if (tointegerns(rb, &ib)) { | 1343 | if (tointegerns(rb, &ib)) { |
1343 | setivalue(s2v(ra), luaV_shiftl(ib, -ic)); | 1344 | pc++; setivalue(s2v(ra), luaV_shiftl(ib, -ic)); |
1344 | } | ||
1345 | else { | ||
1346 | TMS ev = TM_SHR; | ||
1347 | if (TESTARG_k(i)) { | ||
1348 | ic = -ic; ev = TM_SHL; | ||
1349 | } | ||
1350 | ProtectNT(luaT_trybiniTM(L, rb, ic, 0, ra, ev)); | ||
1351 | } | 1345 | } |
1352 | vmbreak; | 1346 | vmbreak; |
1353 | } | 1347 | } |
@@ -1356,72 +1350,56 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1356 | int ic = GETARG_sC(i); | 1350 | int ic = GETARG_sC(i); |
1357 | lua_Integer ib; | 1351 | lua_Integer ib; |
1358 | if (tointegerns(rb, &ib)) { | 1352 | if (tointegerns(rb, &ib)) { |
1359 | setivalue(s2v(ra), luaV_shiftl(ic, ib)); | 1353 | pc++; setivalue(s2v(ra), luaV_shiftl(ic, ib)); |
1360 | } | 1354 | } |
1361 | else | ||
1362 | ProtectNT(luaT_trybiniTM(L, rb, ic, 1, ra, TM_SHL)); | ||
1363 | vmbreak; | 1355 | vmbreak; |
1364 | } | 1356 | } |
1365 | vmcase(OP_ADD) { | 1357 | vmcase(OP_ADD) { |
1366 | op_arith(L, l_addi, luai_numadd, TM_ADD); | 1358 | op_arith(L, l_addi, luai_numadd); |
1367 | vmbreak; | 1359 | vmbreak; |
1368 | } | 1360 | } |
1369 | vmcase(OP_SUB) { | 1361 | vmcase(OP_SUB) { |
1370 | op_arith(L, l_subi, luai_numsub, TM_SUB); | 1362 | op_arith(L, l_subi, luai_numsub); |
1371 | vmbreak; | 1363 | vmbreak; |
1372 | } | 1364 | } |
1373 | vmcase(OP_MUL) { | 1365 | vmcase(OP_MUL) { |
1374 | op_arith(L, l_muli, luai_nummul, TM_MUL); | 1366 | op_arith(L, l_muli, luai_nummul); |
1375 | vmbreak; | 1367 | vmbreak; |
1376 | } | 1368 | } |
1377 | vmcase(OP_MOD) { | 1369 | vmcase(OP_MOD) { |
1378 | op_arith(L, luaV_mod, luaV_modf, TM_MOD); | 1370 | op_arith(L, luaV_mod, luaV_modf); |
1379 | vmbreak; | 1371 | vmbreak; |
1380 | } | 1372 | } |
1381 | vmcase(OP_POW) { | 1373 | vmcase(OP_POW) { |
1382 | op_arithf(L, luai_numpow, TM_POW); | 1374 | op_arithf(L, luai_numpow); |
1383 | vmbreak; | 1375 | vmbreak; |
1384 | } | 1376 | } |
1385 | vmcase(OP_DIV) { /* float division (always with floats) */ | 1377 | vmcase(OP_DIV) { /* float division (always with floats) */ |
1386 | op_arithf(L, luai_numdiv, TM_DIV); | 1378 | op_arithf(L, luai_numdiv); |
1387 | vmbreak; | 1379 | vmbreak; |
1388 | } | 1380 | } |
1389 | vmcase(OP_IDIV) { /* floor division */ | 1381 | vmcase(OP_IDIV) { /* floor division */ |
1390 | op_arith(L, luaV_idiv, luai_numidiv, TM_IDIV); | 1382 | op_arith(L, luaV_idiv, luai_numidiv); |
1391 | vmbreak; | 1383 | vmbreak; |
1392 | } | 1384 | } |
1393 | vmcase(OP_BAND) { | 1385 | vmcase(OP_BAND) { |
1394 | op_bitwise(L, l_band, TM_BAND); | 1386 | op_bitwise(L, l_band); |
1395 | vmbreak; | 1387 | vmbreak; |
1396 | } | 1388 | } |
1397 | vmcase(OP_BOR) { | 1389 | vmcase(OP_BOR) { |
1398 | op_bitwise(L, l_bor, TM_BOR); | 1390 | op_bitwise(L, l_bor); |
1399 | vmbreak; | 1391 | vmbreak; |
1400 | } | 1392 | } |
1401 | vmcase(OP_BXOR) { | 1393 | vmcase(OP_BXOR) { |
1402 | op_bitwise(L, l_bxor, TM_BXOR); | 1394 | op_bitwise(L, l_bxor); |
1403 | vmbreak; | 1395 | vmbreak; |
1404 | } | 1396 | } |
1405 | vmcase(OP_SHR) { | 1397 | vmcase(OP_SHR) { |
1406 | TValue *rb = vRB(i); | 1398 | op_bitwise(L, luaV_shiftr); |
1407 | TValue *rc = vRC(i); | ||
1408 | lua_Integer ib; lua_Integer ic; | ||
1409 | if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { | ||
1410 | setivalue(s2v(ra), luaV_shiftl(ib, -ic)); | ||
1411 | } | ||
1412 | else | ||
1413 | ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHR)); | ||
1414 | vmbreak; | 1399 | vmbreak; |
1415 | } | 1400 | } |
1416 | vmcase(OP_SHL) { | 1401 | vmcase(OP_SHL) { |
1417 | TValue *rb = vRB(i); | 1402 | op_bitwise(L, luaV_shiftl); |
1418 | TValue *rc = vRC(i); | ||
1419 | lua_Integer ib; lua_Integer ic; | ||
1420 | if (tointegerns(rb, &ib) && tointegerns(rc, &ic)) { | ||
1421 | setivalue(s2v(ra), luaV_shiftl(ib, ic)); | ||
1422 | } | ||
1423 | else | ||
1424 | ProtectNT(luaT_trybinTM(L, rb, rc, ra, TM_SHL)); | ||
1425 | vmbreak; | 1403 | vmbreak; |
1426 | } | 1404 | } |
1427 | vmcase(OP_MMBIN) { | 1405 | vmcase(OP_MMBIN) { |
diff --git a/testes/code.lua b/testes/code.lua index fcb5c309..96560166 100644 --- a/testes/code.lua +++ b/testes/code.lua | |||
@@ -304,9 +304,9 @@ checkR(function (x) return x // 1 end, 10.0, 10.0, | |||
304 | 'IDIVI', 'MMBINI', 'RETURN1') | 304 | 'IDIVI', 'MMBINI', 'RETURN1') |
305 | checkR(function (x) return x % (100 - 10) end, 91, 1, | 305 | checkR(function (x) return x % (100 - 10) end, 91, 1, |
306 | 'MODI', 'MMBINI', 'RETURN1') | 306 | 'MODI', 'MMBINI', 'RETURN1') |
307 | checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'RETURN1') | 307 | checkR(function (x) return k1 << x end, 3, 8, 'SHLI', 'MMBINI', 'RETURN1') |
308 | checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'RETURN1') | 308 | checkR(function (x) return x << 2 end, 10, 40, 'SHRI', 'MMBINI', 'RETURN1') |
309 | checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'RETURN1') | 309 | checkR(function (x) return x >> 2 end, 8, 2, 'SHRI', 'MMBINI', 'RETURN1') |
310 | checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'MMBINK', 'RETURN1') | 310 | checkR(function (x) return x & 1 end, 9, 1, 'BANDK', 'MMBINK', 'RETURN1') |
311 | checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'MMBINK', 'RETURN1') | 311 | checkR(function (x) return 10 | x end, 1, 11, 'BORK', 'MMBINK', 'RETURN1') |
312 | checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'MMBINK', 'RETURN1') | 312 | checkR(function (x) return -10 ~ x end, -1, 9, 'BXORK', 'MMBINK', 'RETURN1') |
@@ -329,7 +329,7 @@ check(function () return -0.0 end, 'LOADF', 'UNM', 'RETURN1') | |||
329 | check(function () return k3/0 end, 'LOADI', 'DIVI', 'MMBINI', 'RETURN1') | 329 | check(function () return k3/0 end, 'LOADI', 'DIVI', 'MMBINI', 'RETURN1') |
330 | check(function () return 0%0 end, 'LOADI', 'MODI', 'MMBINI', 'RETURN1') | 330 | check(function () return 0%0 end, 'LOADI', 'MODI', 'MMBINI', 'RETURN1') |
331 | check(function () return -4//0 end, 'LOADI', 'IDIVI', 'MMBINI', 'RETURN1') | 331 | check(function () return -4//0 end, 'LOADI', 'IDIVI', 'MMBINI', 'RETURN1') |
332 | check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'RETURN1') | 332 | check(function (x) return x >> 2.0 end, 'LOADF', 'SHR', 'MMBIN', 'RETURN1') |
333 | check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'MMBIN', 'RETURN1') | 333 | check(function (x) return x & 2.0 end, 'LOADF', 'BAND', 'MMBIN', 'RETURN1') |
334 | 334 | ||
335 | -- basic 'for' loops | 335 | -- basic 'for' loops |
diff --git a/testes/db.lua b/testes/db.lua index c43243a6..074a6d0b 100644 --- a/testes/db.lua +++ b/testes/db.lua | |||
@@ -806,8 +806,7 @@ assert(a+3 == "add" and 3-a == "sub" and a*3 == "mul" and | |||
806 | -a == "unm" and #a == "len" and a&3 == "band") | 806 | -a == "unm" and #a == "len" and a&3 == "band") |
807 | assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and | 807 | assert(a + 30000 == "add" and a - 3.0 == "sub" and a * 3.0 == "mul" and |
808 | -a == "unm" and #a == "len" and a & 3 == "band") | 808 | -a == "unm" and #a == "len" and a & 3 == "band") |
809 | assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shift" and | 809 | assert(a|3 == "bor" and 3~a == "bxor" and a<<3 == "shl" and a>>1 == "shr") |
810 | a>>1 == "shift") | ||
811 | assert (a==b and a.op == "eq") | 810 | assert (a==b and a.op == "eq") |
812 | assert (a>=b and a.op == "order") | 811 | assert (a>=b and a.op == "order") |
813 | assert (a>b and a.op == "order") | 812 | assert (a>b and a.op == "order") |