/* * reorganize an expression for optimal constant grouping. */ static void fold_const(ENODE **node) { ENODE *ep; int64_t i; ep = *node; if( ep == 0 ) return; if( ep->nodetype == en_add ) { if( ep->p[0]->nodetype == en_icon ) { ep->p[0]->i += xfold(ep->p[1]); return; } else if( ep->p[1]->nodetype == en_icon ) { ep->p[1]->i += xfold(ep->p[0]); return; } } else if( ep->nodetype == en_sub ) { if( ep->p[0]->nodetype == en_icon ) { ep->p[0]->i -= xfold(ep->p[1]); return; } else if( ep->p[1]->nodetype == en_icon ) { ep->p[1]->i -= xfold(ep->p[0]); // ??? other order ??? xfold - p[1] return; } } i = xfold(ep); if( i != 0 ) { ep = makeinode(en_icon,i); ep->etype = (*node)->etype; ep->tp = (*node)->tp; ep = makenode(en_add,ep,*node); ep->etype = (*node)->etype; ep->tp = (*node)->tp; *node = ep; } }
/* * reorganize an expression for optimal constant grouping. */ void fold_const(ENODE **node) { ENODE *ep; __int64 i; ep = *node; if( ep == 0 ) return; if( ep->nodetype == en_add ) { if( ep->p[0]->nodetype == en_icon ) { ep->p[0]->i += xfold(ep->p[1]); return; } else if( ep->p[1]->nodetype == en_icon ) { ep->p[1]->i += xfold(ep->p[0]); return; } } else if( ep->nodetype == en_sub ) { if( ep->p[0]->nodetype == en_icon ) { ep->p[0]->i -= xfold(ep->p[1]); return; } else if( ep->p[1]->nodetype == en_icon ) { ep->p[1]->i -= xfold(ep->p[0]); return; } } i = xfold(ep); if( i != 0 ) { ep = makeinode(en_icon,i); ep = makenode(en_add,ep,*node); *node = ep; } }
/* * make a direct reference to an immediate value. */ AMODE *make_direct(int64_t i) { return make_offset(makeinode(en_icon,i)); }