mirror of
https://github.com/lua/lua.git
synced 2025-01-14 05:43:00 +08:00
df13f25948
In arithmetic/bitwise operators, the call to metamethods is made in a separate opcode following the main one. (The main opcode skips this next one when the operation succeeds.) This change reduces slightly the size of the binary and the complexity of the arithmetic/bitwise opcodes. It also simplfies the treatment of errors and yeld/resume in these operations, as there are much fewer cases to consider. (Only OP_MMBIN/OP_MMBINI/OP_MMBINK, instead of all variants of all arithmetic/bitwise operators.)
111 lines
4.0 KiB
C
111 lines
4.0 KiB
C
/*
|
|
** $Id: lopcodes.c $
|
|
** Opcodes for Lua virtual machine
|
|
** See Copyright Notice in lua.h
|
|
*/
|
|
|
|
#define lopcodes_c
|
|
#define LUA_CORE
|
|
|
|
#include "lprefix.h"
|
|
|
|
|
|
#include <stddef.h>
|
|
|
|
#include "lopcodes.h"
|
|
|
|
|
|
/* ORDER OP */
|
|
|
|
LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
|
|
/* OT IT T A mode opcode */
|
|
opmode(0, 0, 0, 1, iABC) /* OP_MOVE */
|
|
,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADI */
|
|
,opmode(0, 0, 0, 1, iAsBx) /* OP_LOADF */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_LOADK */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_LOADKX */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LOADBOOL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LOADNIL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETUPVAL */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETUPVAL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETTABUP */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETTABLE */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_GETFIELD */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETTABUP */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETTABLE */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETI */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_SETFIELD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_NEWTABLE */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SELF */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_ADDI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SUBI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MULI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MODI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_POWI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_DIVI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_IDIVI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_ADDK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SUBK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MULK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MODK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_POWK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_DIVK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_IDIVK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BANDK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BORK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BXORK */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHRI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHLI */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_ADD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SUB */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MUL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_MOD */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_POW */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_DIV */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_IDIV */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BAND */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BOR */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BXOR */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHL */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_SHR */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_MMBIN */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_MMBINI*/
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_MMBINK*/
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_UNM */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_BNOT */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_NOT */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_LEN */
|
|
,opmode(0, 0, 0, 1, iABC) /* OP_CONCAT */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_CLOSE */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_TBC */
|
|
,opmode(0, 0, 0, 0, isJ) /* OP_JMP */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQ */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LT */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LE */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQK */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_EQI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LTI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_LEI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_GTI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_GEI */
|
|
,opmode(0, 0, 1, 0, iABC) /* OP_TEST */
|
|
,opmode(0, 0, 1, 1, iABC) /* OP_TESTSET */
|
|
,opmode(1, 1, 0, 1, iABC) /* OP_CALL */
|
|
,opmode(1, 1, 0, 1, iABC) /* OP_TAILCALL */
|
|
,opmode(0, 1, 0, 0, iABC) /* OP_RETURN */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_RETURN0 */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_RETURN1 */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORLOOP */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_FORPREP */
|
|
,opmode(0, 0, 0, 0, iABx) /* OP_TFORPREP */
|
|
,opmode(0, 0, 0, 0, iABC) /* OP_TFORCALL */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_TFORLOOP */
|
|
,opmode(0, 1, 0, 0, iABC) /* OP_SETLIST */
|
|
,opmode(0, 0, 0, 1, iABx) /* OP_CLOSURE */
|
|
,opmode(1, 0, 0, 1, iABC) /* OP_VARARG */
|
|
,opmode(0, 1, 0, 1, iABC) /* OP_VARARGPREP */
|
|
,opmode(0, 0, 0, 0, iAx) /* OP_EXTRAARG */
|
|
};
|
|
|