From 88b306f495fa7034c708c6b75a355a6deee51c58 Mon Sep 17 00:00:00 2001
From: Roberto Ierusalimschy <roberto@inf.puc-rio.br>
Date: Wed, 8 Mar 2000 21:19:22 -0300
Subject: some optimizations

---
 lopcodes.h | 57 +++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 37 insertions(+), 20 deletions(-)

(limited to 'lopcodes.h')

diff --git a/lopcodes.h b/lopcodes.h
index 494cb84c..1e3b9ee9 100644
--- a/lopcodes.h
+++ b/lopcodes.h
@@ -24,34 +24,51 @@
   is the usigned value minus 2^23.
 ===========================================================================*/
 
-#define EXCESS_S	(1<<23)		/* == 2^23 */
+#define SIZE_OP		8
+#define SIZE_U		24
+#define POS_U		8
+#define SIZE_S		24
+#define POS_S		8
+#define SIZE_A		16
+#define POS_A		16
+#define SIZE_B		8
+#define POS_B		8
+
+#define EXCESS_S	(1<<(SIZE_S-1))		/* == 2^23 */
+
+
+/* creates a mask with `n' 1 bits at position `p' */
+#define MASK1(n,p)	((~((~0ul)<<n))<<p)
+
+/* creates a mask with `n' 0 bits at position `p' */
+#define MASK0(n,p)	(~MASK1(n,p))
 
 /*
 ** the following macros help to manipulate instructions
 */
 
-#define MAXARG_U	((1<<24)-1)
-#define MAXARG_S	((1<<23)-1)
-#define MAXARG_A	((1<<16)-1)
-#define MAXARG_B	((1<<8)-1)
+#define MAXARG_U	((1<<SIZE_U)-1)
+#define MAXARG_S	((1<<(SIZE_S-1))-1)  /* `S' is signed */
+#define MAXARG_A	((1<<SIZE_A)-1)
+#define MAXARG_B	((1<<SIZE_B)-1)
 
-#define GET_OPCODE(i)	((OpCode)((i)&0xFF))
-#define GETARG_U(i)	((int)((i)>>8))
-#define GETARG_S(i)	((int)((i)>>8)-EXCESS_S)
-#define GETARG_A(i)	((int)((i)>>16))
-#define GETARG_B(i)	((int)(((i)>>8) & 0xFF))
+#define GET_OPCODE(i)	((OpCode)((i)&MASK1(SIZE_OP,0)))
+#define GETARG_U(i)	((int)((i)>>POS_U))
+#define GETARG_S(i)	((int)((i)>>POS_S)-EXCESS_S)
+#define GETARG_A(i)	((int)((i)>>POS_A))
+#define GETARG_B(i)	((int)(((i)>>POS_B) & MASK1(SIZE_B,0)))
 
-#define SET_OPCODE(i,o)	(((i)&0xFFFFFF00u) | (Instruction)(o))
-#define SETARG_U(i,u)	(((i)&0x000000FFu) | ((Instruction)(u)<<8))
-#define SETARG_S(i,s)	(((i)&0x000000FFu) | ((Instruction)((s)+EXCESS_S)<<8))
-#define SETARG_A(i,a)	(((i)&0x0000FFFFu) | ((Instruction)(a)<<16))
-#define SETARG_B(i,b)	(((i)&0xFFFF00FFu) | ((Instruction)(b)<<8))
+#define SET_OPCODE(i,o)	(((i)&MASK0(SIZE_OP,0)) | (Instruction)(o))
+#define SETARG_U(i,u)	(((i)&MASK0(SIZE_U,POS_U)) | ((Instruction)(u)<<POS_U))
+#define SETARG_S(i,s)	(((i)&MASK0(SIZE_S,POS_S)) | ((Instruction)((s)+EXCESS_S)<<POS_S))
+#define SETARG_A(i,a)	(((i)&MASK0(SIZE_A,POS_A)) | ((Instruction)(a)<<POS_A))
+#define SETARG_B(i,b)	(((i)&MASK0(SIZE_B,POS_B)) | ((Instruction)(b)<<POS_B))
 
 #define CREATE_0(o)	 ((Instruction)(o))
-#define CREATE_U(o,u)	 ((Instruction)(o) | (Instruction)(u)<<8)
-#define CREATE_S(o,s)	 ((Instruction)(o) | ((Instruction)(s)+EXCESS_S)<<8)
-#define CREATE_AB(o,a,b) ((Instruction)(o) | ((Instruction)(a)<<16) \
-                                           |  ((Instruction)(b)<<8))
+#define CREATE_U(o,u)	 ((Instruction)(o) | (Instruction)(u)<<POS_U)
+#define CREATE_S(o,s)	 ((Instruction)(o) | ((Instruction)(s)+EXCESS_S)<<POS_S)
+#define CREATE_AB(o,a,b) ((Instruction)(o) | ((Instruction)(a)<<POS_A) \
+                                           |  ((Instruction)(b)<<POS_B))
 
 
 /*
@@ -111,7 +128,7 @@ 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				*/
+CONCOP,/*	U	v_u-v_1		v1..-..v_u			*/
 MINUSOP,/*	-	x		-x				*/
 NOTOP,/*	-	x		(x==nil)? 1 : nil		*/
 
-- 
cgit v1.2.3-55-g6feb