diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-21 12:49:32 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2018-02-21 12:49:32 -0300 |
| commit | 212095a601ee68e99065b553f7b6bc216056d82e (patch) | |
| tree | 3843f9dde40eeb71c56ac8a0be8d77c78272f6ef /lcode.c | |
| parent | c67603fafba7f982e92eb870ff4da6c6433c2a85 (diff) | |
| download | lua-212095a601ee68e99065b553f7b6bc216056d82e.tar.gz lua-212095a601ee68e99065b553f7b6bc216056d82e.tar.bz2 lua-212095a601ee68e99065b553f7b6bc216056d82e.zip | |
new opcodes OP_GTI/OP_GEI
Diffstat (limited to 'lcode.c')
| -rw-r--r-- | lcode.c | 30 |
1 files changed, 12 insertions, 18 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lcode.c,v 2.155 2018/02/17 19:20:00 roberto Exp roberto $ | 2 | ** $Id: lcode.c,v 2.156 2018/02/21 12:54:26 roberto Exp roberto $ |
| 3 | ** Code generator for Lua | 3 | ** Code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -171,8 +171,8 @@ void luaK_ret (FuncState *fs, int first, int nret) { | |||
| 171 | ** Code a "conditional jump", that is, a test or comparison opcode | 171 | ** Code a "conditional jump", that is, a test or comparison opcode |
| 172 | ** followed by a jump. Return jump position. | 172 | ** followed by a jump. Return jump position. |
| 173 | */ | 173 | */ |
| 174 | static int condjump (FuncState *fs, OpCode op, int A, int B, int C, int k) { | 174 | static int condjump (FuncState *fs, OpCode op, int A, int B, int k) { |
| 175 | luaK_codeABCk(fs, op, A, B, C, k); | 175 | luaK_codeABCk(fs, op, A, B, 0, k); |
| 176 | return luaK_jump(fs); | 176 | return luaK_jump(fs); |
| 177 | } | 177 | } |
| 178 | 178 | ||
| @@ -979,13 +979,13 @@ static int jumponcond (FuncState *fs, expdesc *e, int cond) { | |||
| 979 | Instruction ie = getinstruction(fs, e); | 979 | Instruction ie = getinstruction(fs, e); |
| 980 | if (GET_OPCODE(ie) == OP_NOT) { | 980 | if (GET_OPCODE(ie) == OP_NOT) { |
| 981 | fs->pc--; /* remove previous OP_NOT */ | 981 | fs->pc--; /* remove previous OP_NOT */ |
| 982 | return condjump(fs, OP_TEST, GETARG_B(ie), 0, 0, !cond); | 982 | return condjump(fs, OP_TEST, GETARG_B(ie), 0, !cond); |
| 983 | } | 983 | } |
| 984 | /* else go through */ | 984 | /* else go through */ |
| 985 | } | 985 | } |
| 986 | discharge2anyreg(fs, e); | 986 | discharge2anyreg(fs, e); |
| 987 | freeexp(fs, e); | 987 | freeexp(fs, e); |
| 988 | return condjump(fs, OP_TESTSET, NO_REG, e->u.info, 0, cond); | 988 | return condjump(fs, OP_TESTSET, NO_REG, e->u.info, cond); |
| 989 | } | 989 | } |
| 990 | 990 | ||
| 991 | 991 | ||
| @@ -1338,16 +1338,12 @@ static void codeshift (FuncState *fs, OpCode op, | |||
| 1338 | 1338 | ||
| 1339 | /* | 1339 | /* |
| 1340 | ** Emit code for order comparisons. | 1340 | ** Emit code for order comparisons. |
| 1341 | ** When the first operand is an integral value in the proper range, | 1341 | ** When the first operand A is an integral value in the proper range, |
| 1342 | ** change (A < B) to (!(B <= A)) and (A <= B) to (!(B < A)) so that | 1342 | ** change (A < B) to (B > A) and (A <= B) to (B >= A) so that |
| 1343 | ** it can use an immediate operand. In this case, C indicates this | 1343 | ** it can use an immediate operand. |
| 1344 | ** change, for cases that cannot assume a total order (NaN and | ||
| 1345 | ** metamethods). | ||
| 1346 | */ | 1344 | */ |
| 1347 | static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { | 1345 | static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { |
| 1348 | int r1, r2; | 1346 | int r1, r2; |
| 1349 | int cond = 1; | ||
| 1350 | int C = 0; | ||
| 1351 | lua_Integer im; | 1347 | lua_Integer im; |
| 1352 | if (isSCnumber(e2, &im)) { | 1348 | if (isSCnumber(e2, &im)) { |
| 1353 | /* use immediate operand */ | 1349 | /* use immediate operand */ |
| @@ -1356,19 +1352,17 @@ static void codeorder (FuncState *fs, OpCode op, expdesc *e1, expdesc *e2) { | |||
| 1356 | op = cast(OpCode, (op - OP_LT) + OP_LTI); | 1352 | op = cast(OpCode, (op - OP_LT) + OP_LTI); |
| 1357 | } | 1353 | } |
| 1358 | else if (isSCnumber(e1, &im)) { | 1354 | else if (isSCnumber(e1, &im)) { |
| 1359 | /* transform (A < B) to (!(B <= A)) and (A <= B) to (!(B < A)) */ | 1355 | /* transform (A < B) to (B > A) and (A <= B) to (B >= A) */ |
| 1360 | r1 = luaK_exp2anyreg(fs, e2); | 1356 | r1 = luaK_exp2anyreg(fs, e2); |
| 1361 | r2 = cast_int(im); | 1357 | r2 = cast_int(im); |
| 1362 | op = (op == OP_LT) ? OP_LEI : OP_LTI; | 1358 | op = (op == OP_LT) ? OP_GTI : OP_GEI; |
| 1363 | cond = 0; /* negate original test */ | ||
| 1364 | C = 1; /* indication that it used the transformations */ | ||
| 1365 | } | 1359 | } |
| 1366 | else { /* regular case, compare two registers */ | 1360 | else { /* regular case, compare two registers */ |
| 1367 | r1 = luaK_exp2anyreg(fs, e1); | 1361 | r1 = luaK_exp2anyreg(fs, e1); |
| 1368 | r2 = luaK_exp2anyreg(fs, e2); | 1362 | r2 = luaK_exp2anyreg(fs, e2); |
| 1369 | } | 1363 | } |
| 1370 | freeexps(fs, e1, e2); | 1364 | freeexps(fs, e1, e2); |
| 1371 | e1->u.info = condjump(fs, op, r1, r2, C, cond); | 1365 | e1->u.info = condjump(fs, op, r1, r2, 1); |
| 1372 | e1->k = VJMP; | 1366 | e1->k = VJMP; |
| 1373 | } | 1367 | } |
| 1374 | 1368 | ||
| @@ -1399,7 +1393,7 @@ static void codeeq (FuncState *fs, BinOpr opr, expdesc *e1, expdesc *e2) { | |||
| 1399 | r2 = luaK_exp2anyreg(fs, e2); | 1393 | r2 = luaK_exp2anyreg(fs, e2); |
| 1400 | } | 1394 | } |
| 1401 | freeexps(fs, e1, e2); | 1395 | freeexps(fs, e1, e2); |
| 1402 | e1->u.info = condjump(fs, op, r1, r2, 0, (opr == OPR_EQ)); | 1396 | e1->u.info = condjump(fs, op, r1, r2, (opr == OPR_EQ)); |
| 1403 | e1->k = VJMP; | 1397 | e1->k = VJMP; |
| 1404 | } | 1398 | } |
| 1405 | 1399 | ||
