diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-11-23 12:23:45 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-11-23 12:23:45 -0200 |
commit | 84e32ad2ebd6bd160c1320456743a5b1d8f233e9 (patch) | |
tree | c5a32eaf7577c99e7598e9de1385a6b53522f04b /lvm.c | |
parent | 35296e1fde705b3ac8356a4f4ce426497cf7b64c (diff) | |
download | lua-84e32ad2ebd6bd160c1320456743a5b1d8f233e9.tar.gz lua-84e32ad2ebd6bd160c1320456743a5b1d8f233e9.tar.bz2 lua-84e32ad2ebd6bd160c1320456743a5b1d8f233e9.zip |
Added opcodes for arithmetic with K operands
Added opcodes for all seven arithmetic operators with K operands
(that is, operands that are numbers in the array of constants of
the function). They cover the cases of constant float operands
(e.g., 'x + .0.0', 'x^0.5') and large integer operands (e.g.,
'x % 10000').
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 61 |
1 files changed, 61 insertions, 0 deletions
@@ -856,6 +856,39 @@ void luaV_finishOp (lua_State *L) { | |||
856 | 856 | ||
857 | 857 | ||
858 | /* | 858 | /* |
859 | ** Arithmetic operations with K operands. | ||
860 | */ | ||
861 | #define op_arithK(L,iop,fop,tm,flip) { \ | ||
862 | TValue *v1 = vRB(i); \ | ||
863 | TValue *v2 = KC(i); \ | ||
864 | if (ttisinteger(v1) && ttisinteger(v2)) { \ | ||
865 | lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ | ||
866 | setivalue(s2v(ra), iop(L, i1, i2)); \ | ||
867 | } \ | ||
868 | else { \ | ||
869 | lua_Number n1; lua_Number n2; \ | ||
870 | if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ | ||
871 | setfltvalue(s2v(ra), fop(L, n1, n2)); \ | ||
872 | } \ | ||
873 | else \ | ||
874 | Protect(luaT_trybinassocTM(L, v1, v2, ra, flip, tm)); } } | ||
875 | |||
876 | |||
877 | /* | ||
878 | ** Arithmetic operations with K operands for floats. | ||
879 | */ | ||
880 | #define op_arithfK(L,fop,tm) { \ | ||
881 | TValue *v1 = vRB(i); \ | ||
882 | TValue *v2 = KC(i); \ | ||
883 | lua_Number n1; lua_Number n2; \ | ||
884 | if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \ | ||
885 | setfltvalue(s2v(ra), fop(L, n1, n2)); \ | ||
886 | } \ | ||
887 | else \ | ||
888 | Protect(luaT_trybinTM(L, v1, v2, ra, tm)); } | ||
889 | |||
890 | |||
891 | /* | ||
859 | ** Bitwise operations with constant operand. | 892 | ** Bitwise operations with constant operand. |
860 | */ | 893 | */ |
861 | #define op_bitwiseK(L,op,tm) { \ | 894 | #define op_bitwiseK(L,op,tm) { \ |
@@ -1219,6 +1252,34 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
1219 | op_arithI(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); | 1252 | op_arithI(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); |
1220 | vmbreak; | 1253 | vmbreak; |
1221 | } | 1254 | } |
1255 | vmcase(OP_ADDK) { | ||
1256 | op_arithK(L, l_addi, luai_numadd, TM_ADD, GETARG_k(i)); | ||
1257 | vmbreak; | ||
1258 | } | ||
1259 | vmcase(OP_SUBK) { | ||
1260 | op_arithK(L, l_subi, luai_numsub, TM_SUB, 0); | ||
1261 | vmbreak; | ||
1262 | } | ||
1263 | vmcase(OP_MULK) { | ||
1264 | op_arithK(L, l_muli, luai_nummul, TM_MUL, GETARG_k(i)); | ||
1265 | vmbreak; | ||
1266 | } | ||
1267 | vmcase(OP_MODK) { | ||
1268 | op_arithK(L, luaV_mod, luaV_modf, TM_MOD, 0); | ||
1269 | vmbreak; | ||
1270 | } | ||
1271 | vmcase(OP_POWK) { | ||
1272 | op_arithfK(L, luai_numpow, TM_POW); | ||
1273 | vmbreak; | ||
1274 | } | ||
1275 | vmcase(OP_DIVK) { | ||
1276 | op_arithfK(L, luai_numdiv, TM_DIV); | ||
1277 | vmbreak; | ||
1278 | } | ||
1279 | vmcase(OP_IDIVK) { | ||
1280 | op_arithK(L, luaV_idiv, luai_numidiv, TM_IDIV, 0); | ||
1281 | vmbreak; | ||
1282 | } | ||
1222 | vmcase(OP_ADD) { | 1283 | vmcase(OP_ADD) { |
1223 | op_arith(L, l_addi, luai_numadd, TM_ADD); | 1284 | op_arith(L, l_addi, luai_numadd, TM_ADD); |
1224 | vmbreak; | 1285 | vmbreak; |