diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-28 11:18:14 -0300 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2024-06-28 11:18:14 -0300 |
commit | c403e456b66ddacf7f8f974323e9cffdfe6365d4 (patch) | |
tree | 2e25027eface85c3156359e4ec182b4a9215903b /lopcodes.h | |
parent | 6ac7219da31df0238dc33c2d4457f69bfe0c1e79 (diff) | |
download | lua-c403e456b66ddacf7f8f974323e9cffdfe6365d4.tar.gz lua-c403e456b66ddacf7f8f974323e9cffdfe6365d4.tar.bz2 lua-c403e456b66ddacf7f8f974323e9cffdfe6365d4.zip |
New instruction format for SETLIST/NEWTABLE
New instruction format 'ivABC' (a variant of iABC where parameter vC has
10 bits) allows constructors of up to 1024 elements to be coded without
EXTRAARG.
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 | ||