From 173e41b2ebed59a716d299470de25e50aee3b921 Mon Sep 17 00:00:00 2001 From: Roberto Ierusalimschy Date: Wed, 26 Apr 2017 14:46:52 -0300 Subject: new opcode OP_ADDI (for immediate integer operand) (Experimental) --- lvm.c | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) (limited to 'lvm.c') diff --git a/lvm.c b/lvm.c index e1268567..52a6ca35 100644 --- a/lvm.c +++ b/lvm.c @@ -1,5 +1,5 @@ /* -** $Id: lvm.c,v 2.271 2017/04/20 19:53:55 roberto Exp roberto $ +** $Id: lvm.c,v 2.272 2017/04/24 20:26:39 roberto Exp roberto $ ** Lua virtual machine ** See Copyright Notice in lua.h */ @@ -725,10 +725,10 @@ void luaV_finishOp (lua_State *L) { #define RA(i) (base+GETARG_A(i)) -#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_B(i)) +#define RB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgR, base+GETARG_Br(i)) #define RC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgR, base+GETARG_C(i)) #define RKB(i) check_exp(getBMode(GET_OPCODE(i)) == OpArgK, \ - ISK(GETARG_B(i)) ? k+INDEXK(GETARG_B(i)) : base+GETARG_B(i)) + (GETARG_Bk(i)) ? k+GETARG_Br(i) : base+GETARG_Br(i)) #define RKC(i) check_exp(getCMode(GET_OPCODE(i)) == OpArgK, \ ISK(GETARG_C(i)) ? k+INDEXK(GETARG_C(i)) : base+GETARG_C(i)) @@ -898,6 +898,27 @@ void luaV_execute (lua_State *L) { else Protect(luaV_finishget(L, rb, rc, ra, slot)); vmbreak; } + vmcase(OP_ADDI) { + TValue *rb = RB(i); + int ic = GETARG_C(i); + lua_Number nb; + if (ttisinteger(rb)) { + setivalue(ra, intop(+, ivalue(rb), ic)); + } + else if (tonumber(rb, &nb)) { + setfltvalue(ra, luai_numadd(L, nb, cast_num(ic))); + } + else { + TValue aux; TValue *rc; + setivalue(&aux, ic); + if (GETARG_Bk(i)) { /* arguments were exchanged? */ + rc = rb; rb = &aux; /* correct them */ + } + else rc = &aux; + Protect(luaT_trybinTM(L, rb, rc, ra, TM_ADD)); + } + vmbreak; + } vmcase(OP_ADD) { TValue *rb = RKB(i); TValue *rc = RKC(i); -- cgit v1.2.3-55-g6feb