summaryrefslogtreecommitdiff
path: root/lopcodes.h
blob: e58f3f796a7282850ab12e2efd6e2b6b12caf817 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
** $Id: lopcodes.h,v 1.21 1999/02/04 16:36:16 roberto Exp roberto $
** Opcodes for Lua virtual machine
** See Copyright Notice in lua.h
*/

#ifndef lopcodes_h
#define lopcodes_h


/*
** NOTICE: variants of the same opcode must be consecutive: First, those
** with word parameter, then with byte parameter.
*/


typedef enum {
/* name          parm    before          after           side effect
-----------------------------------------------------------------------------*/
ENDCODE,/*	-	-		-  */
RETCODE,/*	b	-		-  */

PUSHNIL,/*	b	-		nil_0...nil_b  */
POP,/*		b	-		-		TOP-=(b+1)  */

PUSHNUMBERW,/*	w	-		(float)(w-NUMOFFSET)  */
PUSHNUMBER,/*	b	-		(float)(b-NUMOFFSET)  */

PUSHCONSTANTW,/*w	-		CNST[w] */
PUSHCONSTANT,/*	b	-		CNST[b] */

PUSHUPVALUE,/*	b	-		Closure[b] */

PUSHLOCAL,/*	b	-		LOC[b]  */

GETGLOBALW,/*	w	-		VAR[CNST[w]]  */
GETGLOBAL,/*	b 	-		VAR[CNST[b]]  */

GETTABLE,/*	-	i t		t[i]  */

GETDOTTEDW,/*	w	t		t[CNST[w]]  */
GETDOTTED,/*	b	t		t[CNST[b]]  */

PUSHSELFW,/*	w	t		t t[CNST[w]]  */
PUSHSELF,/*	b	t		t t[CNST[b]]  */

CREATEARRAYW,/*	w	-		newarray(size = w)  */
CREATEARRAY,/*	b	-		newarray(size = b)  */

SETLOCAL,/*	b	x		-		LOC[b]=x  */
SETLOCALDUP,/*	b	x		x		LOC[b]=x  */

SETGLOBALW,/*	w	x		-		VAR[CNST[w]]=x  */
SETGLOBAL,/*	b	x		-		VAR[CNST[b]]=x  */
SETGLOBALDUPW,/*w	x		x		VAR[CNST[w]]=x  */
SETGLOBALDUP,/*	b	x		x		VAR[CNST[b]]=x  */

SETTABLEPOP,/*	-	v i t		-		t[i]=v  */
SETTABPPDUP,/*	-	v i t		v		t[i]=v  */

SETTABLE,/*	b	v a_b...a_1 i t	a_b...a_1 i t	t[i]=v  */

SETLISTW,/*	w c	v_c...v_1 t	-		t[i+w*FPF]=v_i  */
SETLIST,/*	b c	v_c...v_1 t	-		t[i+b*FPF]=v_i  */

SETMAP,/*	b	v_b k_b ...v_0 k_0 t	t	t[k_i]=v_i  */

NEQOP,/*	-	y x		(x~=y)? 1 : nil  */
EQOP,/*		-	y x		(x==y)? 1 : nil  */
LTOP,/*		-	y x		(x<y)? 1 : nil  */
LEOP,/*		-	y x		(x<y)? 1 : nil  */
GTOP,/*		-	y x		(x>y)? 1 : nil  */
GEOP,/*		-	y x		(x>=y)? 1 : nil  */
ADDOP,/*	-	y x		x+y  */
SUBOP,/*	-	y x		x-y  */
MULTOP,/*	-	y x		x*y  */
DIVOP,/*	-	y x		x/y  */
POWOP,/*	-	y x		x^y  */
CONCOP,/*	-	y x		x..y  */
MINUSOP,/*	-	x		-x  */
NOTOP,/*	-	x		(x==nil)? 1 : nil  */

ONTJMPW,/*	w	x		(x!=nil)? x : -	(x!=nil)? PC+=w  */
ONTJMP,/*	b	x		(x!=nil)? x : -	(x!=nil)? PC+=b  */
ONFJMPW,/*	w	x		(x==nil)? x : -	(x==nil)? PC+=w  */
ONFJMP,/*	b	x		(x==nil)? x : -	(x==nil)? PC+=b  */
JMPW,/*		w	-		-		PC+=w  */
JMP,/*		b	-		-		PC+=b  */
IFFJMPW,/*	w	x		-		(x==nil)? PC+=w  */
IFFJMP,/*	b	x		-		(x==nil)? PC+=b  */
IFTUPJMPW,/*	w	x		-		(x!=nil)? PC-=w  */
IFTUPJMP,/*	b	x		-		(x!=nil)? PC-=b  */
IFFUPJMPW,/*	w	x		-		(x==nil)? PC-=w  */
IFFUPJMP,/*	b	x		-		(x==nil)? PC-=b  */

CLOSURE,/*	b c	v_c...v_1	closure(CNST[b], v_c...v_1) */

CALLFUNC,/*	b c	v_c...v_1 f	r_b...r_1	f(v1,...,v_c)  */

SETLINEW,/*	w	-		-		LINE=w  */
SETLINE,/*	b	-		-		LINE=b  */

LONGARG /*	b	(add b*(1<<16) to arg of next instruction) */

} OpCode;


#define NUMOFFSET	100	/* offset for immediate numbers */

#define RFIELDS_PER_FLUSH 32	/* records (SETMAP) */
#define LFIELDS_PER_FLUSH 64    /* FPF - lists (SETLIST) */

#define ZEROVARARG	64


/* maximum value of an arg of 3 bytes; must fit in an "int" */
#if MAX_INT < (1<<24)
#define MAX_ARG	MAX_INT
#else
#define MAX_ARG	((1<<24)-1)
#endif

/* maximum value of a word of 2 bytes; cannot be bigger than MAX_ARG */
#if MAX_ARG < (1<<16)
#define MAX_WORD	MAX_ARG
#else
#define MAX_WORD	((1<<16)-1)
#endif


/* maximum value of a byte */
#define MAX_BYTE	((1<<8)-1)


#endif