#include "compiler/IroSubable.h" #include "compiler/IroLinearForm.h" #include "compiler/IroPropagate.h" #include "compiler/IroUtil.h" #include "compiler/enode.h" #include "compiler/objects.h" #include "compiler/types.h" static Boolean IsSubableOp[MAXEXPR]; void IRO_InitializeIsSubableOpArray(void) { int i; for (i = 0; i < MAXEXPR; i++) IsSubableOp[i] = 0; IsSubableOp[EPOSTINC] = 0; IsSubableOp[EPOSTDEC] = 0; IsSubableOp[EPREINC] = 0; IsSubableOp[EPREDEC] = 0; IsSubableOp[EINDIRECT] = 0; IsSubableOp[EMONMIN] = 1; IsSubableOp[EBINNOT] = 1; IsSubableOp[ELOGNOT] = 1; IsSubableOp[EFORCELOAD] = 0; IsSubableOp[EMUL] = 1; IsSubableOp[EMULV] = 1; IsSubableOp[EDIV] = 1; IsSubableOp[EMODULO] = 1; IsSubableOp[EADDV] = 1; IsSubableOp[ESUBV] = 1; IsSubableOp[EADD] = 1; IsSubableOp[ESUB] = 1; IsSubableOp[ESHL] = 1; IsSubableOp[ESHR] = 1; IsSubableOp[ELESS] = 0; IsSubableOp[EGREATER] = 0; IsSubableOp[ELESSEQU] = 0; IsSubableOp[EGREATEREQU] = 0; IsSubableOp[EEQU] = 0; IsSubableOp[ENOTEQU] = 0; IsSubableOp[EAND] = 1; IsSubableOp[EXOR] = 1; IsSubableOp[EOR] = 1; IsSubableOp[ELAND] = 0; IsSubableOp[ELOR] = 0; IsSubableOp[EASS] = 0; IsSubableOp[EMULASS] = 0; IsSubableOp[EDIVASS] = 0; IsSubableOp[EMODASS] = 0; IsSubableOp[EADDASS] = 0; IsSubableOp[ESUBASS] = 0; IsSubableOp[ESHLASS] = 0; IsSubableOp[ESHRASS] = 0; IsSubableOp[EANDASS] = 0; IsSubableOp[EXORASS] = 0; IsSubableOp[EORASS] = 0; IsSubableOp[ECOMMA] = 0; IsSubableOp[EPMODULO] = 0; IsSubableOp[EROTL] = 0; IsSubableOp[EROTR] = 0; IsSubableOp[EBCLR] = 0; IsSubableOp[EBTST] = 0; IsSubableOp[EBSET] = 0; IsSubableOp[ETYPCON] = 0; IsSubableOp[EBITFIELD] = 0; IsSubableOp[EINTCONST] = 0; IsSubableOp[EFLOATCONST] = 0; IsSubableOp[ESTRINGCONST] = 0; IsSubableOp[ECOND] = 0; IsSubableOp[EFUNCCALL] = 0; IsSubableOp[EFUNCCALLP] = 0; IsSubableOp[EOBJREF] = 0; IsSubableOp[EMFPOINTER] = 0; IsSubableOp[ENULLCHECK] = 0; IsSubableOp[EPRECOMP] = 0; IsSubableOp[ETEMP] = 0; IsSubableOp[EARGOBJ] = 0; IsSubableOp[ELOCOBJ] = 0; IsSubableOp[ELABEL] = 0; IsSubableOp[ESETCONST] = 0; IsSubableOp[ENEWEXCEPTION] = 0; IsSubableOp[ENEWEXCEPTIONARRAY] = 0; IsSubableOp[EOBJLIST] = 0; IsSubableOp[EMEMBER] = 0; IsSubableOp[ETEMPLDEP] = 0; IsSubableOp[EINSTRUCTION] = 0; IsSubableOp[EDEFINE] = 0; IsSubableOp[EREUSE] = 0; IsSubableOp[EASSBLK] = 0; IsSubableOp[EVECTOR128CONST] = 0; IsSubableOp[ECONDASS] = 0; } static int IsSubscript(IROLinear *nd) { return 0; } Boolean IRO_IsSubableExpression(IROLinear *nd) { Object *varobj; Boolean result; switch (nd->type) { case IROLinearOp2Arg: if (nd->nodetype == EADD || nd->nodetype == ESUB) { if ( IRO_IsConstant(nd->u.diadic.right) && (varobj = IRO_IsVariable(nd->u.diadic.left)) && varobj->datatype == DLOCAL && varobj->u.var.info && !varobj->u.var.info->noregister) return 0; } result = IsSubableOp[nd->nodetype] && !IsSubscript(nd); return result; case IROLinearOp1Arg: if (IsSubableOp[nd->nodetype] && !IsSubscript(nd)) return 1; if (nd->nodetype == EINDIRECT && !(nd->flags & IROLF_Assigned)) { if (nd->flags & IROLF_Ind) { nd = nd->u.monadic; if (nd->type == IROLinearOperand && nd->u.node->type == EOBJREF && nd->u.node->data.objref->datatype == DLOCAL && nd->u.node->data.objref->u.var.info && !nd->u.node->data.objref->u.var.info->noregister ) return 0; return 1; } if (IRO_IsVariable(nd) && IRO_IsRegable(nd->u.monadic->u.node->data.objref)) return 0; return 1; } else if (nd->nodetype == ETYPCON && IS_TYPE_INT(nd->rtype) && nd->rtype->size >= nd->u.monadic->rtype->size) { return 1; } else { return 0; } case IROLinearOperand: default: return 0; } } Boolean IRO_IsVectorTempCandidate(IROLinear *nd) { return ( nd->type == IROLinearOp1Arg || nd->type == IROLinearOp2Arg || nd->type == IROLinearOp3Arg || nd->type == IROLinearOperand || nd->type == IROLinearFunccall ) && ( (nd->flags & IROLF_LoopInvariant) && !(nd->flags & IROLF_Ind) ); }