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
}
}
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.