HomeForumSourceResearchGuide
Sign in to contribute to source. how it works
Component util.compiler.HWI_Info by barry
expand copy to clipboardexpand
uses HWI
uses HWInstruction

component provides HWI_Info {

	int HWI_Info:getInstructionRegisterCount(int iid)
		{
		if (iid == HWI.OP_ID_SET_LINE_NUMBER
			|| iid == HWI.OP_ID_JMP
			)
			return 0
		
		if (iid == HWI.OP_ID_LOCALS
			|| iid == HWI.OP_ID_LOCALS_STORE
			|| iid == HWI.OP_ID_GLOBALS
			|| iid == HWI.OP_ID_PRIVATE_IVS
			|| iid == HWI.OP_ID_TRANSFERS
			|| iid == HWI.OP_ID_GET_LITERAL_PTR
			|| iid == HWI.OP_ID_INTINC
			|| iid == HWI.OP_ID_INTDEC
			|| iid == HWI.OP_ID_RETURN
			|| iid == HWI.OP_ID_RETURN_ORCHK
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_OBJECT
			|| iid == HWI.OP_ID_STACK_FRAME_PARAMS
			|| iid == HWI.OP_ID_STACK_FRAME_PARAMS_STORE
			|| iid == HWI.OP_ID_STACK_FRAME_LAUNCH_P
			|| iid == HWI.OP_ID_STACK_FRAME_LAUNCH_R
			|| iid == HWI.OP_ID_STACK_FRAME_LAUNCH_ASYNCH
			|| iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_P
			|| iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_R
			|| iid == HWI.OP_ID_NEW_DATA
			|| iid == HWI.OP_ID_ELEMENT_FINISH
			|| iid == HWI.OP_ID_NEW_OBJECT
			|| iid == HWI.OP_ID_NEW_OBJECT_ST
			|| iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT
			|| iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_ST
			|| iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_CHK
			|| iid == HWI.OP_ID_NULL
			|| iid == HWI.OP_ID_MACHINE
			|| iid == HWI.OP_ID_THREAD_THIS
			|| iid == HWI.OP_ID_MUTEX_LOCK
			|| iid == HWI.OP_ID_MUTEX_UNLOCK
			|| iid == HWI.OP_ID_PREP_EXCEPTION_THROW
			|| iid == HWI.OP_ID_EVO_RESUME_OBJECT
			|| iid == HWI.OP_ID_EVO_WAIT_FOR_OBJECT
			|| iid == HWI.OP_ID_EVO_WAIT_FOR_OBJECT_TH
			|| iid == HWI.OP_ID_GET_SELF_ID
			|| iid == HWI.OP_ID_SINK_EVENT
			|| iid == HWI.OP_ID_UNSINK_EVENT
			|| iid == HWI.OP_ID_EMIT_EVENT_ST
			|| iid == HWI.OP_ID_EMIT_EVENT_ST_ORCHK
			|| iid == HWI.OP_ID_GET_PR
			|| iid == HWI.OP_ID_TYPEOF_TYPE
			|| iid == HWI.OP_ID_SUPER_IDENTITY_CALL
			|| iid == HWI.OP_ID_IF
			|| iid == HWI.OP_ID_IFX
			|| iid == HWI.OP_ID_IFXN
			|| iid == HWI.OP_ID_DELINK
			|| iid == HWI.OP_ID_ISSET
			)
			return 1
		
		if (iid == HWI.OP_ID_ASSIGN
			|| iid == HWI.OP_ID_NEW_ARRAY_INIT
			|| iid == HWI.OP_ID_NEW_ARRAY_APPEND
			|| iid == HWI.OP_ID_ASSIGN_ARRAY
			|| iid == HWI.OP_ID_COPY
			|| iid == HWI.OP_ID_EQUAL_OBJECT_REFERENCE
			|| iid == HWI.OP_ID_GET_PTR
			|| iid == HWI.OP_ID_GET_REF
			|| iid == HWI.OP_ID_GET_PTR_HND
			|| iid == HWI.OP_ID_MEMBER_ACCESS
			|| iid == HWI.OP_ID_ASSIGN_DATA_ARRAY
			|| iid == HWI.OP_ID_ASSIGN_DATA_PRIMITIVE
			|| iid == HWI.OP_ID_ASSIGN_DATA_POINTER
			|| iid == HWI.OP_ID_PRIVATE_INTER_IVS
			|| iid == HWI.OP_ID_LNOT
			|| iid == HWI.OP_ID_BNOT
			|| iid == HWI.OP_ID_LENGTH
			|| iid == HWI.OP_ID_DTOH
			|| iid == HWI.OP_ID_HTOD
			|| iid == HWI.OP_ID_FORCE_STOP_OBJECT
			|| iid == HWI.OP_ID_DEC_FROM_INT
			|| iid == HWI.OP_ID_DEC_NEGATE
			|| iid == HWI.OP_ID_DEC_ROUND
			|| iid == HWI.OP_ID_HAS_TYPE
			|| iid == HWI.OP_ID_IMPLEMENTS
			|| iid == HWI.OP_ID_EMIT_EVENT
			|| iid == HWI.OP_ID_SERIAL
			|| iid == HWI.OP_ID_CLONE_DATA
			|| iid == HWI.OP_ID_NEW_ARRAY
			|| iid == HWI.OP_ID_NEW_ARRAY_MD
			|| iid == HWI.OP_ID_NEW_ARRAY_MD_INIT
			|| iid == HWI.OP_ID_CLONE_ARRAY
			|| iid == HWI.OP_ID_RCLONE
			|| iid == HWI.OP_ID_TYPEOF_VAR
			|| iid == HWI.OP_ID_NEW_DATA_FROM
			|| iid == HWI.OP_ID_GET_ARRAY_DIMENSIONS
			|| iid == HWI.OP_ID_SET_ARRAY_DIMENSIONS
			)
			return 2
		
		if (iid == HWI.OP_ID_ASSIGN_POINTER
			|| iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED
			|| iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK
			|| iid == HWI.OP_ID_GREATER_THAN
			|| iid == HWI.OP_ID_GREATER_THAN_EQ
			|| iid == HWI.OP_ID_EQUAL
			|| iid == HWI.OP_ID_EQUAL_POINTER
			|| iid == HWI.OP_ID_EQUAL_ARRAY
			|| iid == HWI.OP_ID_EQUAL_RECORD
			|| iid == HWI.OP_ID_VEQUAL
			|| iid == HWI.OP_ID_VGREATER_THAN
			|| iid == HWI.OP_ID_VGREATER_THAN_EQ
			|| iid == HWI.OP_ID_EVO_PAUSE_OBJECT
			|| iid == HWI.OP_ID_INTADD
			|| iid == HWI.OP_ID_INTSUB
			|| iid == HWI.OP_ID_INTMUL
			|| iid == HWI.OP_ID_INTDIV
			|| iid == HWI.OP_ID_INTMOD
			|| iid == HWI.OP_ID_INTMOD
			|| iid == HWI.OP_ID_AND
			|| iid == HWI.OP_ID_OR
			|| iid == HWI.OP_ID_XOR
			|| iid == HWI.OP_ID_LSHIFT
			|| iid == HWI.OP_ID_RSHIFT
			|| iid == HWI.OP_ID_DEC_ADD
			|| iid == HWI.OP_ID_DEC_SUB
			|| iid == HWI.OP_ID_INT_FROM_DEC
			|| iid == HWI.OP_ID_GET_INDEX_P
			|| iid == HWI.OP_ID_GET_INDEX_R
			|| iid == HWI.OP_ID_SUB_ARRAY_DIMENSION
			|| iid == HWI.OP_ID_VGET_INDEX
			|| iid == HWI.OP_ID_GET_INDEX_TO_ASSIGN
			|| iid == HWI.OP_ID_EVO_REWIRE_OBJECT
			|| iid == HWI.OP_ID_GET_FIELD
			|| iid == HWI.OP_ID_GET_FIELD_TO_ASSIGN
			|| iid == HWI.OP_ID_VASSIGN
			|| iid == HWI.OP_ID_GET_TYPEFIELD
			|| iid == HWI.OP_ID_NEW_ARRAY_FROM
			|| iid == HWI.OP_ID_NEW_ARRAY_INIT_FROM
			|| iid == HWI.OP_ID_NEW_DYN_OBJECT
			|| iid == HWI.OP_ID_NEW_DYN_OBJECT_CONSTRUCT
			|| iid == HWI.OP_ID_SERIAL_FIELD
			|| iid == HWI.OP_ID_GET_ARRAY_DIMENSION
			)
			return 3
		
		if (iid == HWI.OP_ID_DEC_RESCALE
			|| iid == HWI.OP_ID_DEC_MUL
			|| iid == HWI.OP_ID_DEC_DIV
			|| iid == HWI.OP_ID_DYNAMIC_CALL
			|| iid == HWI.OP_ID_SUB_ARRAY
			)
			return 4
		
		if (iid == HWI.OP_ID_CLEAR_REGISTER
			|| iid == HWI.OP_ID_PURGE_REGISTER
			|| iid == HWI.OP_ID_PURGE_REGISTER_DYNAMIC)
			return 1
		
		return 0
		}

	int HWI_Info:getEInfoCount(int iid)
		{
		if (iid == HWI.OP_ID_SET_LINE_NUMBER
			|| iid == HWI.OP_ID_GET_PTR
			|| iid == HWI.OP_ID_GET_PTR_HND
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_LOCAL
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_OBJECT
			|| iid == HWI.OP_ID_NEW_ARRAY
			|| iid == HWI.OP_ID_NEW_ARRAY_MD
			|| iid == HWI.OP_ID_NEW_DYN_OBJECT
			|| iid == HWI.OP_ID_SET_RETURN_ADDRESS
			|| iid == HWI.OP_ID_SET_EXIT_ADDRESS
			|| iid == HWI.OP_ID_PREP_EXCEPTION_THROW
			|| iid == HWI.OP_ID_HAS_TYPE
			|| iid == HWI.OP_ID_EMIT_EVENT_ST
			|| iid == HWI.OP_ID_TYPEOF_TYPE
			|| iid == HWI.OP_ID_NEW_DYN_OBJECT_CONSTRUCT
			|| iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK
			|| iid == HWI.OP_ID_ASSIGN_DATA_ARRAY
			|| iid == HWI.OP_ID_ASSIGN_DATA_PRIMITIVE
			|| iid == HWI.OP_ID_ASSIGN_DATA_POINTER
			|| iid == HWI.OP_ID_NEW_DATA
			|| iid == HWI.OP_ID_NEW_ARRAY_INIT
			|| iid == HWI.OP_ID_NEW_ARRAY_MD_INIT
			|| iid == HWI.OP_ID_RETURN
			|| iid == HWI.OP_ID_STACK_FRAME_PARAMS
			|| iid == HWI.OP_ID_STACK_FRAME_PARAMS_STORE
			|| iid == HWI.OP_ID_ISSET
			)
			return 1
		
		if (iid == HWI.OP_ID_GET_LITERAL_PTR
			|| iid == HWI.OP_ID_NEW_OBJECT
			|| iid == HWI.OP_ID_NEW_OBJECT_ST
			|| iid == HWI.OP_ID_SUPER_IDENTITY_CALL
			|| iid == HWI.OP_ID_EMIT_EVENT_ST_ORCHK
			|| iid == HWI.OP_ID_RETURN_ORCHK
			|| iid == HWI.OP_ID_GET_REF
			)
			return 2
		
		if (iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT
			|| iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_ST
			|| iid == HWI.OP_ID_SINK_EVENT
			|| iid == HWI.OP_ID_UNSINK_EVENT
			)
			return 3
		
		return 0
		}

	//does "n" iid use the register given back by its child (parameter) param_iid ?
	bool HWI_Info:opUsesRegister(int n_iid, int param_iid)
		{
		if ((param_iid == HWI.OP_ID_ASSIGN || param_iid == HWI.OP_ID_ASSIGN_POINTER || param_iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED || param_iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK) &&
			(n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_P
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_R
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_P
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_R
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_ASYNCH
			|| n_iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_CHK)
			)
			return false
		
		if (n_iid == HWI.OP_ID_ELEMENT_FINISH &&
			(param_iid == HWI.OP_ID_NEW_ARRAY_APPEND
				|| param_iid == HWI.OP_ID_ASSIGN
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_ARRAY
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_POINTER
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_PRIMITIVE)
			)
			return false
		
		int iid = param_iid
		
		if (iid == HWI.OP_ID_SET_LINE_NUMBER
			|| iid == HWI.OP_ID_JMP
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_LOCAL
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_OBJECT
			|| iid == HWI.OP_ID_SET_RETURN_ADDRESS
			|| iid == HWI.OP_ID_NOP
			|| iid == HWI.OP_ID_FRAME_QID
			|| iid == HWI.OP_ID_FRAME_QIK
			|| iid == HWI.OP_ID_CHECK_ABORT
			)
			return false
		
		return true
		}
	
	bool HWI_Info:instructionIncrementsRegister(int iid)
		{
		if (iid == HWI.OP_ID_SET_LINE_NUMBER
			|| iid == HWI.OP_ID_JMP
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_LOCAL
			|| iid == HWI.OP_ID_SET_RETURN_ADDRESS
			|| iid == HWI.OP_ID_NOP
			|| iid == HWI.OP_ID_FRAME_QID
			|| iid == HWI.OP_ID_FRAME_QIK
			|| iid == HWI.OP_ID_CHECK_ABORT
			)
			return false
		
		return true
		}

	bool HWI_Info:opIncrementsRegister(int n_iid, int param_iid)
		{
		int iid = param_iid
		
		if (iid == HWI.OP_ID_SET_LINE_NUMBER
			|| iid == HWI.OP_ID_JMP
			|| iid == HWI.OP_ID_STACK_FRAME_INIT_LOCAL
			|| iid == HWI.OP_ID_SET_RETURN_ADDRESS
			|| iid == HWI.OP_ID_NOP
			|| iid == HWI.OP_ID_FRAME_QID
			|| iid == HWI.OP_ID_FRAME_QIK
			|| iid == HWI.OP_ID_CHECK_ABORT
			)
			return false
		
		if ((param_iid == HWI.OP_ID_ASSIGN || param_iid == HWI.OP_ID_ASSIGN_POINTER || param_iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED || param_iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK) &&
			(n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_P
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_R
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_P
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_R
			|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_ASYNCH
			|| n_iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_CHK)
			)
			return false
		
		if (n_iid == HWI.OP_ID_ELEMENT_FINISH &&
			(param_iid == HWI.OP_ID_NEW_ARRAY_APPEND
				|| param_iid == HWI.OP_ID_ASSIGN
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED
				|| param_iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_ARRAY
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_POINTER
				|| param_iid == HWI.OP_ID_ASSIGN_DATA_PRIMITIVE)
			)
			return false
		
		return true
		}
	
	bool isGetRefR(int n_iid)
		{
		if (n_iid == HWI.OP_ID_GET_REF)
			{
			/*
			if (nt_supports(OP_ID_NT_LOCALS_GET_REF, optList, optListLen) && (n -> children -> next -> op -> si.instructionID == OP_ID_LOCALS_STORE || n -> children -> next -> op -> si.instructionID == OP_ID_LOCALS))
				{
				return false;
				}
			*/

			return true
			}

		return false
		}

	byte HWI_Info:getRegisterType(int n_iid, int paramNumber)
		{
		//note: this sometimes depends on other input types, hence having the full VINode, but mostly doesn't
		// - returning "true" means an "R" register is needed (reference-counted), otherwise a "P" register
		if (paramNumber == 0)
			{
			if (isGetRefR(n_iid)
				|| n_iid == HWI.OP_ID_ASSIGN_POINTER
				|| n_iid == HWI.OP_ID_ASSIGN_POINTER_UNCHECKED
				|| n_iid == HWI.OP_ID_ASSIGN_POINTER_ORCHK
				|| n_iid == HWI.OP_ID_GET_INDEX_R
				|| n_iid == HWI.OP_ID_SUB_ARRAY_DIMENSION
				|| n_iid == HWI.OP_ID_NEW_ARRAY
				|| n_iid == HWI.OP_ID_NEW_ARRAY_MD
				|| n_iid == HWI.OP_ID_NEW_ARRAY_MD_INIT
				|| n_iid == HWI.OP_ID_NEW_ARRAY_INIT
				|| n_iid == HWI.OP_ID_CLONE_ARRAY
				|| n_iid == HWI.OP_ID_NEW_DATA
				|| n_iid == HWI.OP_ID_CLONE_DATA
				|| n_iid == HWI.OP_ID_RCLONE
				|| n_iid == HWI.OP_ID_DELINK
				|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_R
				|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_ASYNCH
				|| n_iid == HWI.OP_ID_STACK_FRAME_LAUNCH_LIB_R
				
				|| n_iid == HWI.OP_ID_NEW_OBJECT
				|| n_iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT
				|| n_iid == HWI.OP_ID_NEW_OBJECT_ST
				|| n_iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_ST
				|| n_iid == HWI.OP_ID_NEW_DYN_OBJECT
				|| n_iid == HWI.OP_ID_NEW_DYN_OBJECT_CONSTRUCT
				|| n_iid == HWI.OP_ID_NEW_OBJECT_CONSTRUCT_CHK
				
				|| n_iid == HWI.OP_ID_EVO_REWIRE_OBJECT
				|| n_iid == HWI.OP_ID_SERIAL
				|| n_iid == HWI.OP_ID_SERIAL_FIELD
				|| n_iid == HWI.OP_ID_MACHINE
				|| n_iid == HWI.OP_ID_GET_SELF_ID
				|| n_iid == HWI.OP_ID_THREAD_THIS
				
				|| n_iid == HWI.OP_ID_NULL
				
				|| n_iid == HWI.OP_ID_TYPEOF_TYPE
				|| n_iid == HWI.OP_ID_TYPEOF_VAR
				
				|| n_iid == HWI.OP_ID_GET_ARRAY_DIMENSIONS
				
				|| n_iid == HWI.OP_ID_NEW_DATA_FROM
				|| n_iid == HWI.OP_ID_NEW_ARRAY_FROM
				|| n_iid == HWI.OP_ID_NEW_ARRAY_INIT_FROM
				
				|| n_iid == HWI.OP_ID_SUB_ARRAY
				)
				{
				return HWInstruction.REGISTER_TYPE_R
				}
				else if (n_iid == HWI.OP_ID_GET_FIELD
						|| n_iid == HWI.OP_ID_GET_FIELD_TO_ASSIGN
						|| n_iid == HWI.OP_ID_VASSIGN
						|| n_iid == HWI.OP_ID_VGET_INDEX
						|| n_iid == HWI.OP_ID_DYNAMIC_CALL)
				{
				return HWInstruction.REGISTER_TYPE_D
				}
				else if (n_iid == HWI.OP_ID_NEW_ARRAY_APPEND
						|| n_iid == HWI.OP_ID_ASSIGN_DATA_PRIMITIVE
						|| n_iid == HWI.OP_ID_ASSIGN_DATA_POINTER
						|| n_iid == HWI.OP_ID_ASSIGN_DATA_ARRAY)
				{
				return HWInstruction.REGISTER_TYPE_C
				}
			}
		
		return HWInstruction.REGISTER_TYPE_P
		}

	}
Revision history
To propose a new revision to this entity, use dana source put -uc your/new/version.dn -n util.compiler.HWI_Info -m "reason for update" -u yourUsername
Version 2 (this version) by barry
Notes for this version: Adds new instruction support for multi-dimensional array access.
Version 1 by barry