MWCC/compiler_and_linker/unsorted/IroSubable.c

161 lines
4.8 KiB
C

#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)
);
}