#help_index "Compiler/Internal"
//Intermediate compiler codes
#define IS_0_ARG		0
#define IS_1_ARG		1
#define IS_2_ARG		2
#define IS_V_ARG		3 //Variable Arg Count

#define IST_NULL		0
#define IST_DEREF 		1
#define IST_ASSIGN		2
#define IST_CMP 		3
 
class CIntermediateStruct
{
	U8		 arg_count, res_count, type;
	Bool	 fpop, not_const, pad[3];
	U8		*name;
};

#define IC_END					0x00
#define IC_NOP1 				0x01
#define IC_END_EXP				0x02
#define IC_NOP2 				0x03
#define IC_LABEL				0x04
#define IC_CALL_START 			0x05
#define IC_CALL_END 			0x06
#define IC_CALL_END2			0x07
#define IC_RETURN_VAL 			0x08
#define IC_RETURN_VAL2			0x09
#define IC_IMM_I64				0x0A
#define IC_IMM_F64				0x0B
#define IC_STR_CONST			0x0C
#define IC_ABS_ADDR 			0x0D
#define IC_ADDR_IMPORT			0x0E
#define IC_HEAP_GLOBAL			0x0F
#define IC_SIZEOF 				0x10
#define IC_TYPE 				0x11
#define IC_GET_LABEL			0x12
#define IC_RBP					0x13
#define IC_REG					0x14
#define IC_FS 					0x15
#define IC_MOV_FS 				0x16
#define IC_GS 					0x17
#define IC_MOV_GS 				0x18

#define IC_LEA					0x19
#define IC_MOV					0x1A

#define IC_TO_I64 				0x1B
#define IC_TO_F64 				0x1C
#define IC_TO_BOOL				0x1D
#define IC_TOUPPER				0x1E
#define IC_HOLYC_TYPECAST 		0x1F

#define IC_ADDR 				0x20
#define IC_COM					0x21
#define IC_NOT					0x22
#define IC_UNARY_MINUS			0x23

#define IC_DEREF				0x24
#define IC_DEREF_PP 			0x25
#define IC_DEREF_MM 			0x26
#define IC__PP					0x27
#define IC__MM					0x28
#define IC_PP_					0x29
#define IC_MM_					0x2A

#define IC_SHL					0x2B
#define IC_SHR					0x2C
#define IC_SHL_CONST			0x2D
#define IC_SHR_CONST			0x2E
#define IC_POWER				0x2F

#define IC_MUL					0x30
#define IC_DIV					0x31
#define IC_MOD					0x32

#define IC_AND					0x33

#define IC_OR 					0x34
#define IC_XOR					0x35

#define IC_ADD					0x36
#define IC_SUB					0x37
#define IC_ADD_CONST			0x38
#define IC_SUB_CONST			0x39

#define IC_EQU_EQU				0x3A
#define IC_NOT_EQU				0x3B
#define IC_LESS 				0x3C
#define IC_GREATER_EQU			0x3D
#define IC_GREATER				0x3E
#define IC_LESS_EQU 			0x3F
#define IC_PUSH_CMP 			0x40

#define IC_AND_AND				0x41

#define IC_OR_OR				0x42
#define IC_XOR_XOR				0x43

#define IC_ASSIGN 				0x44
#define IC_ASSIGN_PP			0x45
#define IC_ASSIGN_MM			0x46

#define IC_SHL_EQU				0x47
#define IC_SHR_EQU				0x48
#define IC_MUL_EQU				0x49
#define IC_DIV_EQU				0x4A
#define IC_MOD_EQU				0x4B
#define IC_AND_EQU				0x4C
#define IC_OR_EQU 				0x4D
#define IC_XOR_EQU				0x4E
#define IC_ADD_EQU				0x4F
#define IC_SUB_EQU				0x50

#define IC_JMP					0x51
#define IC_SUB_CALL 			0x52
#define IC_SWITCH 				0x53
#define IC_NOBOUND_SWITCH 		0x54

#define IC_ADD_RSP				0x55
#define IC_ADD_RSP1 			0x56
#define IC_ENTER				0x57
#define IC_PUSH_REGS			0x58
#define IC_POP_REGS 			0x59
#define IC_LEAVE				0x5A
#define IC_RET					0x5B

#define IC_CALL 				0x5C
#define IC_CALL_INDIRECT		0x5D
#define IC_CALL_INDIRECT2 		0x5E
#define IC_CALL_IMPORT			0x5F
#define IC_CALL_EXTERN			0x60

#define IC_ASM					0x61
#define IC_PUSH 				0x62
#define IC_POP					0x63

#define IC_CLFLUSH				0x64
#define IC_INVLPG 				0x65

#define IC_IN_U8				0x66
#define IC_IN_U16 				0x67
#define IC_IN_U32 				0x68
#define IC_OUT_U8 				0x69
#define IC_OUT_U16				0x6A
#define IC_OUT_U32				0x6B

#define IC_RFLAGS_GET 			0x6C
#define IC_CARRY				0x6D
#define IC_RFLAGS_SET 			0x6E
#define IC_RAX_GET				0x6F
#define IC_RAX_SET				0x70
#define IC_RBP_GET				0x71
#define IC_RBP_SET				0x72
#define IC_RSP_GET				0x73
#define IC_RSP_SET				0x74
#define IC_RIP					0x75

#define IC_RDTSC				0x76

#define IC_BT 					0x77
#define IC_BTS					0x78
#define IC_BTR					0x79
#define IC_BTC					0x7A
#define IC_LBTS 				0x7B
#define IC_LBTR 				0x7C
#define IC_LBTC 				0x7D
#define IC_BSF					0x7E
#define IC_BSR					0x7F

#define IC_QUEUE_INIT 			0x80
#define IC_QUEUE_INSERT 		0x81
#define IC_QUEUE_INSERT_REV 	0x82
#define IC_QUEUE_REMOVE 		0x83

#define IC_STRLEN 				0x84

#define IC_BR_ZERO				0x85
#define IC_BR_NOT_ZERO			0x86
#define IC_BR_CARRY 			0x87
#define IC_BR_NOT_CARRY 		0x88

#define IC_BR_EQU_EQU 			0x89
#define IC_BR_NOT_EQU 			0x8A
#define IC_BR_LESS				0x8B
#define IC_BR_GREATER_EQU 		0x8C
#define IC_BR_GREATER 			0x8D
#define IC_BR_LESS_EQU			0x8E

#define IC_BR_EQU_EQU2			0x8F
#define IC_BR_NOT_EQU2			0x90
#define IC_BR_LESS2 			0x91
#define IC_BR_GREATER_EQU2		0x92
#define IC_BR_GREATER2			0x93
#define IC_BR_LESS_EQU2 		0x94

#define IC_BR_AND_ZERO			0x95
#define IC_BR_AND_NOT_ZERO		0x96
#define IC_BR_MM_ZERO 			0x97
#define IC_BR_MM_NOT_ZERO 		0x98
#define IC_BR_AND_AND_ZERO		0x99
#define IC_BR_AND_AND_NOT_ZERO	0x9A
#define IC_BR_OR_OR_ZERO		0x9B
#define IC_BR_OR_OR_NOT_ZERO	0x9C

#define IC_BR_BT				0x9D
#define IC_BR_BTS 				0x9E
#define IC_BR_BTR 				0x9F
#define IC_BR_BTC 				0xA0
#define IC_BR_NOT_BT			0xA1
#define IC_BR_NOT_BTS 			0xA2
#define IC_BR_NOT_BTR 			0xA3
#define IC_BR_NOT_BTC 			0xA4

#define IC_SWAP_U8				0xA5
#define IC_SWAP_U16 			0xA6
#define IC_SWAP_U32 			0xA7
#define IC_SWAP_I64 			0xA8

#define IC_ABS_I64				0xA9
#define IC_SIGN_I64 			0xAA
#define IC_MIN_I64				0xAB
#define IC_MIN_U64				0xAC
#define IC_MAX_I64				0xAD
#define IC_MAX_U64				0xAE
#define IC_MOD_U64				0xAF
#define IC_SQR_I64				0xB0
#define IC_SQR_U64				0xB1
#define IC_SQR					0xB2
#define IC_ABS					0xB3
#define IC_SQRT 				0xB4
#define IC_SIN					0xB5
#define IC_COS					0xB6
#define IC_TAN					0xB7
#define IC_ATAN 				0xB8
#define IC_POPCNT 				0xB9
#define IC_ICS_NUM				0xBA

#define KW_INCLUDE		0
#define KW_DEFINE 		1
#define KW_UNION		2
#define KW_CATCH		3
#define KW_CLASS		4
#define KW_TRY			5
#define KW_IF 			6
#define KW_ELSE 		7
#define KW_FOR			8
#define KW_WHILE		9
#define KW_EXTERN 		10
#define KW__EXTERN		11
#define KW_RETURN 		12
#define KW_SIZEOF 		13
#define KW__INTERN		14
#define KW_DO 			15
#define KW_ASM			16
#define KW_GOTO 		17
#define KW_EXE			18
#define KW_BREAK		19
#define KW_SWITCH 		20
#define KW_START		21
#define KW_END			22
#define KW_CASE 		23
#define KW_DEFAULT		24
#define KW_PUBLIC 		25
#define KW_OFFSET 		26
#define KW_IMPORT 		27
#define KW__IMPORT		28
#define KW_IFDEF		29
#define KW_IFNDEF 		30
#define KW_IFAOT		31
#define KW_IFJIT		32
#define KW_ENDIF		33
#define KW_ASSERT 		34
#define KW_REG			35
#define KW_NOREG		36
#define KW_LASTCLASS	37
#define KW_NO_WARN		38
#define KW_HELP_INDEX 	39
#define KW_HELP_FILE	40
#define KW_STATIC 		41
#define KW_LOCK 		42
#define KW_DEFINED		43
#define KW_INTERRUPT	44
#define KW_HASERRCODE 	45
#define KW_ARGPOP 		46
#define KW_NOARGPOP 	47

#define AKW_ALIGN 		64
#define AKW_ORG 		65
#define AKW_I0			66
#define AKW_I8			67
#define AKW_I16 		68
#define AKW_I32 		69
#define AKW_I64 		70
#define AKW_U0			71
#define AKW_U8			72
#define AKW_U16 		73
#define AKW_U32 		74
#define AKW_U64 		75
#define AKW_F64 		76
#define AKW_DU8 		77
#define AKW_DU16		78
#define AKW_DU32		79
#define AKW_DU64		80
#define AKW_DUP 		81
#define AKW_USE16 		82
#define AKW_USE32 		83
#define AKW_USE64 		84
#define AKW_IMPORT		85
#define AKW_LIST		86
#define AKW_NOLIST		87
#define AKW_BINFILE 	88
#define KW_KWS_NUM		89

#define CMP_TEMPLATE_INC			0x00
#define CMP_TEMPLATE_DEC			0x01
#define CMP_TEMPLATE_MOD			0x02
#define CMP_TEMPLATE_LESS 			0x03
#define CMP_TEMPLATE_GREATER		0x04
#define CMP_TEMPLATE_LESS_EQU 		0x05
#define CMP_TEMPLATE_GREATER_EQU	0x06
#define CMP_TEMPLATE_STRLEN 		0x07
#define CMP_TEMPLATE_RDTSC			0x08
#define CMP_TEMPLATE_SIGN_I64 		0x09
#define CMP_TEMPLATE_FSTP 			0x0A
#define CMP_TEMPLATE_FLD			0x0B
#define CMP_TEMPLATE_SQR			0x0C
#define CMP_TEMPLATE_ABS			0x0D
#define CMP_TEMPLATE_SQRT 			0x0E
#define CMP_TEMPLATE_SIN			0x0F
#define CMP_TEMPLATE_COS			0x10
#define CMP_TEMPLATE_TAN			0x11
#define CMP_TEMPLATE_ATAN 			0x12

#define ASSOCF_LEFT 	1
#define ASSOCF_RIGHT	2
#define ASSOC_MASK		3

#define PREC_NULL 			0x00
#define PREC_TERM 			0x04
#define PREC_UNARY_POST 	0x08
#define PREC_UNARY_PRE		0x0C
#define PREC_EXP			0x10
#define PREC_MUL			0x14
#define PREC_AND			0x18
#define PREC_XOR			0x1C
#define PREC_OR 			0x20
#define PREC_ADD			0x24
#define PREC_CMP			0x28
#define PREC_CMP2 			0x2C
#define PREC_AND_AND		0x30
#define PREC_XOR_XOR		0x34
#define PREC_OR_OR			0x38
#define PREC_ASSIGN 		0x3C

#define PREC_MAX			0x40

//Function/static/public flags
#define FSF_PUBLIC			0x01
#define FSF_ASM 			0x02
#define FSF_STATIC			0x04
#define FSF__ 				0x08
#define FSF_INTERRUPT 		(1 << Ff_INTERRUPT)
#define FSF_HASERRCODE		(1 << Ff_HASERRCODE)
#define FSF_ARGPOP			(1 << Ff_ARGPOP)
#define FSF_NOARGPOP		(1 << Ff_NOARGPOP)
#define FSG_FUN_FLAGS1		(FSF_INTERRUPT | FSF_HASERRCODE | FSF_ARGPOP | FSF_NOARGPOP)
#define FSG_FUN_FLAGS2		(FSG_FUN_FLAGS1 | FSF_PUBLIC)

//Byte 0
#define PRS0_NULL 		0x000000
#define PRS0__EXTERN	0x000001
#define PRS0__INTERN	0x000002
#define PRS0__IMPORT	0x000003
#define PRS0_EXTERN 	0x000004
#define PRS0_IMPORT 	0x000005
#define PRS0_TYPECAST 	0x000006

//Byte 1
#define PRS1B_NULL				0
#define PRS1_NULL 				0x000000
#define PRS1B_LOCAL_VAR 		1
#define PRS1_LOCAL_VAR			0x000100
#define PRS1B_FUN_ARG 			2
#define PRS1_FUN_ARG			0x000200
#define PRS1B_CLASS 			3
#define PRS1_CLASS				0x000300
#define PRS1B_STATIC_LOCAL_VAR	4
#define PRS1_STATIC_LOCAL_VAR 	0x000400
#define PRS1B__EXTERN_IMPORT	5
#define PRS1_NOT_REALLY__EXTERN 0x000500

#define PRSF_UNION	0x010000

class COptReg
{
	I64			 offset;
	CMemberList	*m;
};

#define CMPF_ASM_BLK		1
#define CMPF_ONE_ASM_INS	2
#define CMPF_LEX_FIRST		4
#define CMPF_PRS_SEMICOLON	8

#help_index ""
