lua

A copy of the Lua development repository
Log | Files | Refs | README

lopcodes.c (4885B)


      1 /*
      2 ** $Id: lopcodes.c $
      3 ** Opcodes for Lua virtual machine
      4 ** See Copyright Notice in lua.h
      5 */
      6 
      7 #define lopcodes_c
      8 #define LUA_CORE
      9 
     10 #include "lprefix.h"
     11 
     12 
     13 #include "lopcodes.h"
     14 
     15 
     16 #define opmode(mm,ot,it,t,a,m)  \
     17     (((mm) << 7) | ((ot) << 6) | ((it) << 5) | ((t) << 4) | ((a) << 3) | (m))
     18 
     19 
     20 /* ORDER OP */
     21 
     22 LUAI_DDEF const lu_byte luaP_opmodes[NUM_OPCODES] = {
     23 /*       MM OT IT T  A  mode		   opcode  */
     24   opmode(0, 0, 0, 0, 1, iABC)		/* OP_MOVE */
     25  ,opmode(0, 0, 0, 0, 1, iAsBx)		/* OP_LOADI */
     26  ,opmode(0, 0, 0, 0, 1, iAsBx)		/* OP_LOADF */
     27  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_LOADK */
     28  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_LOADKX */
     29  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_LOADFALSE */
     30  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_LFALSESKIP */
     31  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_LOADTRUE */
     32  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_LOADNIL */
     33  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_GETUPVAL */
     34  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_SETUPVAL */
     35  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_GETTABUP */
     36  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_GETTABLE */
     37  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_GETI */
     38  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_GETFIELD */
     39  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_SETTABUP */
     40  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_SETTABLE */
     41  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_SETI */
     42  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_SETFIELD */
     43  ,opmode(0, 0, 0, 0, 1, ivABC)		/* OP_NEWTABLE */
     44  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SELF */
     45  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_ADDI */
     46  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_ADDK */
     47  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SUBK */
     48  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_MULK */
     49  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_MODK */
     50  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_POWK */
     51  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_DIVK */
     52  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_IDIVK */
     53  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BANDK */
     54  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BORK */
     55  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BXORK */
     56  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SHRI */
     57  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SHLI */
     58  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_ADD */
     59  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SUB */
     60  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_MUL */
     61  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_MOD */
     62  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_POW */
     63  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_DIV */
     64  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_IDIV */
     65  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BAND */
     66  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BOR */
     67  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BXOR */
     68  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SHL */
     69  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_SHR */
     70  ,opmode(1, 0, 0, 0, 0, iABC)		/* OP_MMBIN */
     71  ,opmode(1, 0, 0, 0, 0, iABC)		/* OP_MMBINI */
     72  ,opmode(1, 0, 0, 0, 0, iABC)		/* OP_MMBINK */
     73  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_UNM */
     74  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_BNOT */
     75  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_NOT */
     76  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_LEN */
     77  ,opmode(0, 0, 0, 0, 1, iABC)		/* OP_CONCAT */
     78  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_CLOSE */
     79  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_TBC */
     80  ,opmode(0, 0, 0, 0, 0, isJ)		/* OP_JMP */
     81  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_EQ */
     82  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_LT */
     83  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_LE */
     84  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_EQK */
     85  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_EQI */
     86  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_LTI */
     87  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_LEI */
     88  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_GTI */
     89  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_GEI */
     90  ,opmode(0, 0, 0, 1, 0, iABC)		/* OP_TEST */
     91  ,opmode(0, 0, 0, 1, 1, iABC)		/* OP_TESTSET */
     92  ,opmode(0, 1, 1, 0, 1, iABC)		/* OP_CALL */
     93  ,opmode(0, 1, 1, 0, 1, iABC)		/* OP_TAILCALL */
     94  ,opmode(0, 0, 1, 0, 0, iABC)		/* OP_RETURN */
     95  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_RETURN0 */
     96  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_RETURN1 */
     97  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_FORLOOP */
     98  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_FORPREP */
     99  ,opmode(0, 0, 0, 0, 0, iABx)		/* OP_TFORPREP */
    100  ,opmode(0, 0, 0, 0, 0, iABC)		/* OP_TFORCALL */
    101  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_TFORLOOP */
    102  ,opmode(0, 0, 1, 0, 0, ivABC)		/* OP_SETLIST */
    103  ,opmode(0, 0, 0, 0, 1, iABx)		/* OP_CLOSURE */
    104  ,opmode(0, 1, 0, 0, 1, iABC)		/* OP_VARARG */
    105  ,opmode(0, 0, 1, 0, 1, iABC)		/* OP_VARARGPREP */
    106  ,opmode(0, 0, 0, 0, 0, iAx)		/* OP_EXTRAARG */
    107 };
    108 
    109 
    110 
    111 /*
    112 ** Check whether instruction sets top for next instruction, that is,
    113 ** it results in multiple values.
    114 */
    115 int luaP_isOT (Instruction i) {
    116   OpCode op = GET_OPCODE(i);
    117   switch (op) {
    118     case OP_TAILCALL: return 1;
    119     default:
    120       return testOTMode(op) && GETARG_C(i) == 0;
    121   }
    122 }
    123 
    124 
    125 /*
    126 ** Check whether instruction uses top from previous instruction, that is,
    127 ** it accepts multiple results.
    128 */
    129 int luaP_isIT (Instruction i) {
    130   OpCode op = GET_OPCODE(i);
    131   switch (op) {
    132     case OP_SETLIST:
    133       return testITMode(GET_OPCODE(i)) && GETARG_vB(i) == 0;
    134     default:
    135       return testITMode(GET_OPCODE(i)) && GETARG_B(i) == 0;
    136   }
    137 }
    138