#ifndef C_CMD_BYTECODES
#define C_CMD_BYTECODES
//
// opcode definitions
// symbol, bits, arg format
//
#define OPCODE_COUNT	0x38

//Family: Math
#define OP_ADD    	0x00	// dest, src1, src2
#define OP_SUB    	0x01	// dest, src1, src2
#define OP_NEG    	0x02	// dest, src
#define OP_MUL    	0x03	// dest, src1, src2
#define OP_DIV    	0x04	// dest, src1, src2
#define OP_MOD    	0x05	// dest, src1, src2

//Family: Logic
#define OP_AND    	0x06	// dest, src1, src2
#define OP_OR     	0x07	// dest, src1, src2
#define OP_XOR    	0x08	// dest, src1, src2
#define OP_NOT    	0x09	// dest, src

//Family: Bit manipulation
#define OP_CMNT   	0x0A	// dest, src
#define OP_LSL    	0x0B	// dest, src
#define OP_LSR    	0x0C	// dest, src
#define OP_ASL    	0x0D	// dest, src
#define OP_ASR    	0x0E	// dest, src
#define OP_ROTL   	0x0F	// dest, src
#define OP_ROTR   	0x10	// dest, src

//Family: Comparison
#define OP_CMP    	0x11	// dest, src1, src2
#define OP_TST    	0x12	// dest, src
#define OP_CMPSET 	0x13	// dest, src, testsrc, testsrc
#define OP_TSTSET 	0x14	// dest, src, testsrc

//Family: Array ops
#define OP_INDEX  	0x15	// dest, src, index
#define OP_REPLACE	0x16	// dest, src, index, val
#define OP_ARRSIZE	0x17	// dest, src
#define OP_ARRBUILD	0x18	// instrsize, dest, src1, src2, …
#define OP_ARRSUBSET	0x19	// dest, src, index, length
#define OP_ARRINIT	0x1A	// dest, elem, length

//Family: Memory ops
#define OP_MOV    	0x1B	// dest, src
#define OP_SET    	0x1C	// dest, imm

//Family: String ops
#define OP_FLATTEN	0x1D	// dest, src
#define OP_UNFLATTEN	0x1E	// dest, err, src, type
#define OP_NUMTOSTRING	0x1F	// dest, src
#define OP_STRINGTONUM	0x20	// dest, offsetpast, src, offset, default
#define OP_STRCAT 	0x21	// instrsize, dest, src1, src2, …
#define OP_STRSUBSET	0x22	// dest, src, index, length
#define OP_STRTOBYTEARR	0x23	// dest, src
#define OP_BYTEARRTOSTR	0x24	// dest, src

//Family: Control flow
#define OP_JMP    	0x25	// offset
#define OP_BRCMP  	0x26	// offset, src1, src2
#define OP_BRTST  	0x27	// offset, src
#define OP_SYSCALL	0x28	// func, args
#define OP_STOP   	0x29	// stop?

//Family: Clump scheduling
#define OP_FINCLUMP	0x2A	// start, end
#define OP_FINCLUMPIMMED	0x2B	// clumpID
#define OP_ACQUIRE	0x2C	// mutexID
#define OP_RELEASE	0x2D	// mutexID
#define OP_SUBCALL	0x2E	// subroutine, callerID
#define OP_SUBRET 	0x2F	// callerID

//Family: IO ops
#define OP_SETIN  	0x30	// src, port, propid
#define OP_SETOUT 	0x31	// src, port, propid
#define OP_GETIN  	0x32	// dest, port, propid
#define OP_GETOUT 	0x33	// dest, port, propid

//Family: Timing
#define OP_WAIT   	0x34	// dest, src
#define OP_GETTICK	0x35	// dest

//Family: Math NEW
#define OP_SQRT   	0x36	// dest, src
#define OP_ABS    	0x37	// dest, src

// condition code definitions
#define OPCC1_LT   0x00
#define OPCC1_GT   0x01
#define OPCC1_LTEQ 0x02
#define OPCC1_GTEQ 0x03
#define OPCC1_EQ   0x04
#define OPCC1_NEQ  0x05



//
// short op definitions
//
#define USE_SHORT_OPS
#define	SHORT_OP_MOV	0
#define	SHORT_OP_ACQUIRE	1
#define	SHORT_OP_RELEASE	2
#define	SHORT_OP_SUBCALL	3

//
// short op mapping table
//
static UBYTE ShortOpMap[4] = 
{
	OP_MOV,
	OP_ACQUIRE,
	OP_RELEASE,
	OP_SUBCALL
};

#endif  // C_CMD_BYTECODES
