summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-12-05 14:51:58 -0300
committerRoberto Ierusalimschy <roberto@inf.puc-rio.br>2019-12-05 14:51:58 -0300
commit95735bda46278a4bc0966d8a3c9079dd0072c51e (patch)
treea295309dfba9d375a8c970f7717975003b9f690b
parentd30569c06407529cc6e99f4a35ae5f9bfe6fa940 (diff)
downloadlua-95735bda46278a4bc0966d8a3c9079dd0072c51e.tar.gz
lua-95735bda46278a4bc0966d8a3c9079dd0072c51e.tar.bz2
lua-95735bda46278a4bc0966d8a3c9079dd0072c51e.zip
Simplifications in 'op_arith*' family of macros
-rw-r--r--lvm.c74
1 files changed, 27 insertions, 47 deletions
diff --git a/lvm.c b/lvm.c
index 576a945c..b8d6e828 100644
--- a/lvm.c
+++ b/lvm.c
@@ -885,38 +885,21 @@ void luaV_finishOp (lua_State *L) {
885 885
886 886
887/* 887/*
888** Auxiliary macro for arithmetic operations over floats and others
889** with immediate operand. 'fop' is the float operation; 'tm' is the
890** corresponding metamethod.
891*/
892#define op_arithfI_aux(L,v1,imm,fop,tm) { \
893 lua_Number nb; \
894 if (tonumberns(v1, nb)) { \
895 lua_Number fimm = cast_num(imm); \
896 pc++; setfltvalue(s2v(ra), fop(L, nb, fimm)); \
897 }}
898
899
900/*
901** Arithmetic operations over floats and others with immediate operand.
902*/
903#define op_arithfI(L,fop,tm) { \
904 TValue *v1 = vRB(i); \
905 int imm = GETARG_sC(i); \
906 op_arithfI_aux(L, v1, imm, fop, tm, 0); }
907
908/*
909** Arithmetic operations with immediate operands. 'iop' is the integer 888** Arithmetic operations with immediate operands. 'iop' is the integer
910** operation. 889** operation, 'fop' is the float operation.
911*/ 890*/
912#define op_arithI(L,iop,fop,tm) { \ 891#define op_arithI(L,iop,fop) { \
913 TValue *v1 = vRB(i); \ 892 TValue *v1 = vRB(i); \
914 int imm = GETARG_sC(i); \ 893 int imm = GETARG_sC(i); \
915 if (ttisinteger(v1)) { \ 894 if (ttisinteger(v1)) { \
916 lua_Integer iv1 = ivalue(v1); \ 895 lua_Integer iv1 = ivalue(v1); \
917 pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \ 896 pc++; setivalue(s2v(ra), iop(L, iv1, imm)); \
918 } \ 897 } \
919 else op_arithfI_aux(L, v1, imm, fop, tm); } 898 else if (ttisfloat(v1)) { \
899 lua_Number nb = fltvalue(v1); \
900 lua_Number fimm = cast_num(imm); \
901 pc++; setfltvalue(s2v(ra), fop(L, nb, fimm)); \
902 }}
920 903
921 904
922/* 905/*
@@ -940,11 +923,18 @@ void luaV_finishOp (lua_State *L) {
940 923
941 924
942/* 925/*
943** Arithmetic operations with register operands. 926** Arithmetic operations with K operands for floats.
944*/ 927*/
945#define op_arith(L,iop,fop) { \ 928#define op_arithfK(L,fop) { \
946 TValue *v1 = vRB(i); \ 929 TValue *v1 = vRB(i); \
947 TValue *v2 = vRC(i); \ 930 TValue *v2 = KC(i); \
931 op_arithf_aux(L, v1, v2, fop); }
932
933
934/*
935** Arithmetic operations over integers and floats.
936*/
937#define op_arith_aux(L,v1,v2,iop,fop) { \
948 if (ttisinteger(v1) && ttisinteger(v2)) { \ 938 if (ttisinteger(v1) && ttisinteger(v2)) { \
949 lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \ 939 lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \
950 pc++; setivalue(s2v(ra), iop(L, i1, i2)); \ 940 pc++; setivalue(s2v(ra), iop(L, i1, i2)); \
@@ -953,32 +943,21 @@ void luaV_finishOp (lua_State *L) {
953 943
954 944
955/* 945/*
956** Arithmetic operations with K operands. 946** Arithmetic operations with register operands.
957*/ 947*/
958#define op_arithK(L,iop,fop) { \ 948#define op_arith(L,iop,fop) { \
959 TValue *v1 = vRB(i); \ 949 TValue *v1 = vRB(i); \
960 TValue *v2 = KC(i); \ 950 TValue *v2 = vRC(i); \
961 if (ttisinteger(v1) && ttisinteger(v2)) { \ 951 op_arith_aux(L, v1, v2, iop, fop); }
962 lua_Integer i1 = ivalue(v1); lua_Integer i2 = ivalue(v2); \
963 pc++; setivalue(s2v(ra), iop(L, i1, i2)); \
964 } \
965 else { \
966 lua_Number n1; lua_Number n2; \
967 if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \
968 pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \
969 }}}
970 952
971 953
972/* 954/*
973** Arithmetic operations with K operands for floats. 955** Arithmetic operations with K operands.
974*/ 956*/
975#define op_arithfK(L,fop) { \ 957#define op_arithK(L,iop,fop) { \
976 TValue *v1 = vRB(i); \ 958 TValue *v1 = vRB(i); \
977 TValue *v2 = KC(i); \ 959 TValue *v2 = KC(i); \
978 lua_Number n1; lua_Number n2; \ 960 op_arith_aux(L, v1, v2, iop, fop); }
979 if (tonumberns(v1, n1) && tonumberns(v2, n2)) { \
980 pc++; setfltvalue(s2v(ra), fop(L, n1, n2)); \
981 }}
982 961
983 962
984/* 963/*
@@ -1025,7 +1004,8 @@ void luaV_finishOp (lua_State *L) {
1025 1004
1026 1005
1027/* 1006/*
1028** Order operations with immediate operand. 1007** Order operations with immediate operand. (Immediate operand is
1008** always small enough to have an exact representation as a float.)
1029*/ 1009*/
1030#define op_orderI(L,opi,opf,inv,tm) { \ 1010#define op_orderI(L,opi,opf,inv,tm) { \
1031 int cond; \ 1011 int cond; \
@@ -1364,7 +1344,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) {
1364 vmbreak; 1344 vmbreak;
1365 } 1345 }
1366 vmcase(OP_ADDI) { 1346 vmcase(OP_ADDI) {
1367 op_arithI(L, l_addi, luai_numadd, TM_ADD); 1347 op_arithI(L, l_addi, luai_numadd);
1368 vmbreak; 1348 vmbreak;
1369 } 1349 }
1370 vmcase(OP_ADDK) { 1350 vmcase(OP_ADDK) {