diff options
Diffstat (limited to 'lopcodes.h')
-rw-r--r-- | lopcodes.h | 35 |
1 files changed, 29 insertions, 6 deletions
@@ -19,25 +19,30 @@ | |||
19 | 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 | 19 | 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 |
20 | 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 | 20 | 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 |
21 | iABC C(8) | B(8) |k| A(8) | Op(7) | | 21 | iABC C(8) | B(8) |k| A(8) | Op(7) | |
22 | ivABC vC(10) | vB(6) |k| A(8) | Op(7) | | ||
22 | iABx Bx(17) | A(8) | Op(7) | | 23 | iABx Bx(17) | A(8) | Op(7) | |
23 | iAsBx sBx (signed)(17) | A(8) | Op(7) | | 24 | iAsBx sBx (signed)(17) | A(8) | Op(7) | |
24 | iAx Ax(25) | Op(7) | | 25 | iAx Ax(25) | Op(7) | |
25 | isJ sJ (signed)(25) | Op(7) | | 26 | isJ sJ (signed)(25) | Op(7) | |
26 | 27 | ||
28 | ('v' stands for "variant", 's' for "signed", 'x' for "extended".) | ||
27 | A signed argument is represented in excess K: The represented value is | 29 | A signed argument is represented in excess K: The represented value is |
28 | the written unsigned value minus K, where K is half (rounded down) the | 30 | the written unsigned value minus K, where K is half (rounded down) the |
29 | maximum value for the corresponding unsigned argument. | 31 | maximum value for the corresponding unsigned argument. |
30 | ===========================================================================*/ | 32 | ===========================================================================*/ |
31 | 33 | ||
32 | 34 | ||
33 | enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | 35 | /* basic instruction formats */ |
36 | enum OpMode {iABC, ivABC, iABx, iAsBx, iAx, isJ}; | ||
34 | 37 | ||
35 | 38 | ||
36 | /* | 39 | /* |
37 | ** size and position of opcode arguments. | 40 | ** size and position of opcode arguments. |
38 | */ | 41 | */ |
39 | #define SIZE_C 8 | 42 | #define SIZE_C 8 |
43 | #define SIZE_vC 10 | ||
40 | #define SIZE_B 8 | 44 | #define SIZE_B 8 |
45 | #define SIZE_vB 6 | ||
41 | #define SIZE_Bx (SIZE_C + SIZE_B + 1) | 46 | #define SIZE_Bx (SIZE_C + SIZE_B + 1) |
42 | #define SIZE_A 8 | 47 | #define SIZE_A 8 |
43 | #define SIZE_Ax (SIZE_Bx + SIZE_A) | 48 | #define SIZE_Ax (SIZE_Bx + SIZE_A) |
@@ -50,7 +55,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
50 | #define POS_A (POS_OP + SIZE_OP) | 55 | #define POS_A (POS_OP + SIZE_OP) |
51 | #define POS_k (POS_A + SIZE_A) | 56 | #define POS_k (POS_A + SIZE_A) |
52 | #define POS_B (POS_k + 1) | 57 | #define POS_B (POS_k + 1) |
58 | #define POS_vB (POS_k + 1) | ||
53 | #define POS_C (POS_B + SIZE_B) | 59 | #define POS_C (POS_B + SIZE_B) |
60 | #define POS_vC (POS_vB + SIZE_vB) | ||
54 | 61 | ||
55 | #define POS_Bx POS_k | 62 | #define POS_Bx POS_k |
56 | 63 | ||
@@ -95,7 +102,9 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
95 | 102 | ||
96 | #define MAXARG_A ((1<<SIZE_A)-1) | 103 | #define MAXARG_A ((1<<SIZE_A)-1) |
97 | #define MAXARG_B ((1<<SIZE_B)-1) | 104 | #define MAXARG_B ((1<<SIZE_B)-1) |
105 | #define MAXARG_vB ((1<<SIZE_vB)-1) | ||
98 | #define MAXARG_C ((1<<SIZE_C)-1) | 106 | #define MAXARG_C ((1<<SIZE_C)-1) |
107 | #define MAXARG_vC ((1<<SIZE_vC)-1) | ||
99 | #define OFFSET_sC (MAXARG_C >> 1) | 108 | #define OFFSET_sC (MAXARG_C >> 1) |
100 | 109 | ||
101 | #define int2sC(i) ((i) + OFFSET_sC) | 110 | #define int2sC(i) ((i) + OFFSET_sC) |
@@ -126,16 +135,24 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
126 | #define GETARG_A(i) getarg(i, POS_A, SIZE_A) | 135 | #define GETARG_A(i) getarg(i, POS_A, SIZE_A) |
127 | #define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A) | 136 | #define SETARG_A(i,v) setarg(i, v, POS_A, SIZE_A) |
128 | 137 | ||
129 | #define GETARG_B(i) check_exp(checkopm(i, iABC), getarg(i, POS_B, SIZE_B)) | 138 | #define GETARG_B(i) \ |
139 | check_exp(checkopm(i, iABC), getarg(i, POS_B, SIZE_B)) | ||
140 | #define GETARG_vB(i) \ | ||
141 | check_exp(checkopm(i, ivABC), getarg(i, POS_vB, SIZE_vB)) | ||
130 | #define GETARG_sB(i) sC2int(GETARG_B(i)) | 142 | #define GETARG_sB(i) sC2int(GETARG_B(i)) |
131 | #define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B) | 143 | #define SETARG_B(i,v) setarg(i, v, POS_B, SIZE_B) |
144 | #define SETARG_vB(i,v) setarg(i, v, POS_vB, SIZE_vB) | ||
132 | 145 | ||
133 | #define GETARG_C(i) check_exp(checkopm(i, iABC), getarg(i, POS_C, SIZE_C)) | 146 | #define GETARG_C(i) \ |
147 | check_exp(checkopm(i, iABC), getarg(i, POS_C, SIZE_C)) | ||
148 | #define GETARG_vC(i) \ | ||
149 | check_exp(checkopm(i, ivABC), getarg(i, POS_vC, SIZE_vC)) | ||
134 | #define GETARG_sC(i) sC2int(GETARG_C(i)) | 150 | #define GETARG_sC(i) sC2int(GETARG_C(i)) |
135 | #define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C) | 151 | #define SETARG_C(i,v) setarg(i, v, POS_C, SIZE_C) |
152 | #define SETARG_vC(i,v) setarg(i, v, POS_vC, SIZE_vC) | ||
136 | 153 | ||
137 | #define TESTARG_k(i) check_exp(checkopm(i, iABC), (cast_int(((i) & (1u << POS_k))))) | 154 | #define TESTARG_k(i) (cast_int(((i) & (1u << POS_k)))) |
138 | #define GETARG_k(i) check_exp(checkopm(i, iABC), getarg(i, POS_k, 1)) | 155 | #define GETARG_k(i) getarg(i, POS_k, 1) |
139 | #define SETARG_k(i,v) setarg(i, v, POS_k, 1) | 156 | #define SETARG_k(i,v) setarg(i, v, POS_k, 1) |
140 | 157 | ||
141 | #define GETARG_Bx(i) check_exp(checkopm(i, iABx), getarg(i, POS_Bx, SIZE_Bx)) | 158 | #define GETARG_Bx(i) check_exp(checkopm(i, iABx), getarg(i, POS_Bx, SIZE_Bx)) |
@@ -160,6 +177,12 @@ enum OpMode {iABC, iABx, iAsBx, iAx, isJ}; /* basic instruction formats */ | |||
160 | | (cast(Instruction, c)<<POS_C) \ | 177 | | (cast(Instruction, c)<<POS_C) \ |
161 | | (cast(Instruction, k)<<POS_k)) | 178 | | (cast(Instruction, k)<<POS_k)) |
162 | 179 | ||
180 | #define CREATE_vABCk(o,a,b,c,k) ((cast(Instruction, o)<<POS_OP) \ | ||
181 | | (cast(Instruction, a)<<POS_A) \ | ||
182 | | (cast(Instruction, b)<<POS_vB) \ | ||
183 | | (cast(Instruction, c)<<POS_vC) \ | ||
184 | | (cast(Instruction, k)<<POS_k)) | ||
185 | |||
163 | #define CREATE_ABx(o,a,bc) ((cast(Instruction, o)<<POS_OP) \ | 186 | #define CREATE_ABx(o,a,bc) ((cast(Instruction, o)<<POS_OP) \ |
164 | | (cast(Instruction, a)<<POS_A) \ | 187 | | (cast(Instruction, a)<<POS_A) \ |
165 | | (cast(Instruction, bc)<<POS_Bx)) | 188 | | (cast(Instruction, bc)<<POS_Bx)) |
@@ -306,7 +329,7 @@ OP_TFORPREP,/* A Bx create upvalue for R[A + 3]; pc+=Bx */ | |||
306 | OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ | 329 | OP_TFORCALL,/* A C R[A+4], ... ,R[A+3+C] := R[A](R[A+1], R[A+2]); */ |
307 | OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ | 330 | OP_TFORLOOP,/* A Bx if R[A+2] ~= nil then { R[A]=R[A+2]; pc -= Bx } */ |
308 | 331 | ||
309 | OP_SETLIST,/* A B C k R[A][C+i] := R[A+i], 1 <= i <= B */ | 332 | OP_SETLIST,/* A vB vC k R[A][vC+i] := R[A+i], 1 <= i <= vB */ |
310 | 333 | ||
311 | OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ | 334 | OP_CLOSURE,/* A Bx R[A] := closure(KPROTO[Bx]) */ |
312 | 335 | ||