aboutsummaryrefslogtreecommitdiff
path: root/lopcodes.h
diff options
context:
space:
mode:
Diffstat (limited to 'lopcodes.h')
-rw-r--r--lopcodes.h57
1 files changed, 37 insertions, 20 deletions
diff --git a/lopcodes.h b/lopcodes.h
index 494cb84c..1e3b9ee9 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -24,34 +24,51 @@
24 is the usigned value minus 2^23. 24 is the usigned value minus 2^23.
25===========================================================================*/ 25===========================================================================*/
26 26
27#define EXCESS_S (1<<23) /* == 2^23 */ 27#define SIZE_OP 8
28#define SIZE_U 24
29#define POS_U 8
30#define SIZE_S 24
31#define POS_S 8
32#define SIZE_A 16
33#define POS_A 16
34#define SIZE_B 8
35#define POS_B 8
36
37#define EXCESS_S (1<<(SIZE_S-1)) /* == 2^23 */
38
39
40/* creates a mask with `n' 1 bits at position `p' */
41#define MASK1(n,p) ((~((~0ul)<<n))<<p)
42
43/* creates a mask with `n' 0 bits at position `p' */
44#define MASK0(n,p) (~MASK1(n,p))
28 45
29/* 46/*
30** the following macros help to manipulate instructions 47** the following macros help to manipulate instructions
31*/ 48*/
32 49
33#define MAXARG_U ((1<<24)-1) 50#define MAXARG_U ((1<<SIZE_U)-1)
34#define MAXARG_S ((1<<23)-1) 51#define MAXARG_S ((1<<(SIZE_S-1))-1) /* `S' is signed */
35#define MAXARG_A ((1<<16)-1) 52#define MAXARG_A ((1<<SIZE_A)-1)
36#define MAXARG_B ((1<<8)-1) 53#define MAXARG_B ((1<<SIZE_B)-1)
37 54
38#define GET_OPCODE(i) ((OpCode)((i)&0xFF)) 55#define GET_OPCODE(i) ((OpCode)((i)&MASK1(SIZE_OP,0)))
39#define GETARG_U(i) ((int)((i)>>8)) 56#define GETARG_U(i) ((int)((i)>>POS_U))
40#define GETARG_S(i) ((int)((i)>>8)-EXCESS_S) 57#define GETARG_S(i) ((int)((i)>>POS_S)-EXCESS_S)
41#define GETARG_A(i) ((int)((i)>>16)) 58#define GETARG_A(i) ((int)((i)>>POS_A))
42#define GETARG_B(i) ((int)(((i)>>8) & 0xFF)) 59#define GETARG_B(i) ((int)(((i)>>POS_B) & MASK1(SIZE_B,0)))
43 60
44#define SET_OPCODE(i,o) (((i)&0xFFFFFF00u) | (Instruction)(o)) 61#define SET_OPCODE(i,o) (((i)&MASK0(SIZE_OP,0)) | (Instruction)(o))
45#define SETARG_U(i,u) (((i)&0x000000FFu) | ((Instruction)(u)<<8)) 62#define SETARG_U(i,u) (((i)&MASK0(SIZE_U,POS_U)) | ((Instruction)(u)<<POS_U))
46#define SETARG_S(i,s) (((i)&0x000000FFu) | ((Instruction)((s)+EXCESS_S)<<8)) 63#define SETARG_S(i,s) (((i)&MASK0(SIZE_S,POS_S)) | ((Instruction)((s)+EXCESS_S)<<POS_S))
47#define SETARG_A(i,a) (((i)&0x0000FFFFu) | ((Instruction)(a)<<16)) 64#define SETARG_A(i,a) (((i)&MASK0(SIZE_A,POS_A)) | ((Instruction)(a)<<POS_A))
48#define SETARG_B(i,b) (((i)&0xFFFF00FFu) | ((Instruction)(b)<<8)) 65#define SETARG_B(i,b) (((i)&MASK0(SIZE_B,POS_B)) | ((Instruction)(b)<<POS_B))
49 66
50#define CREATE_0(o) ((Instruction)(o)) 67#define CREATE_0(o) ((Instruction)(o))
51#define CREATE_U(o,u) ((Instruction)(o) | (Instruction)(u)<<8) 68#define CREATE_U(o,u) ((Instruction)(o) | (Instruction)(u)<<POS_U)
52#define CREATE_S(o,s) ((Instruction)(o) | ((Instruction)(s)+EXCESS_S)<<8) 69#define CREATE_S(o,s) ((Instruction)(o) | ((Instruction)(s)+EXCESS_S)<<POS_S)
53#define CREATE_AB(o,a,b) ((Instruction)(o) | ((Instruction)(a)<<16) \ 70#define CREATE_AB(o,a,b) ((Instruction)(o) | ((Instruction)(a)<<POS_A) \
54 | ((Instruction)(b)<<8)) 71 | ((Instruction)(b)<<POS_B))
55 72
56 73
57/* 74/*
@@ -111,7 +128,7 @@ SUBOP,/* - y x x-y */
111MULTOP,/* - y x x*y */ 128MULTOP,/* - y x x*y */
112DIVOP,/* - y x x/y */ 129DIVOP,/* - y x x/y */
113POWOP,/* - y x x^y */ 130POWOP,/* - y x x^y */
114CONCOP,/* - y x x..y */ 131CONCOP,/* U v_u-v_1 v1..-..v_u */
115MINUSOP,/* - x -x */ 132MINUSOP,/* - x -x */
116NOTOP,/* - x (x==nil)? 1 : nil */ 133NOTOP,/* - x (x==nil)? 1 : nil */
117 134