dclerr("must have upper bound in field spcification", "");
p
->frange
= mknode(TAROP
,OPPLUS
,mknode(TAROP
,OPMINUS
,
q
->upperb
, cpexpr(q
->lowerb
)),
p
->flbound
= mkconst(TYINT
,"1");
p
->frange
= simple(RVAL
,p
->frange
);
if(p
->frange
->tag
!= TCONST
)
dclerr("field range must be constant", "");
p
= mknode(TAROP
,OPSLASH
, p
, cpexpr(t
->frshift
));
p
= mkcall(builtin(TYINT
, "mod"), arg2(p
, cpexpr(t
->frange
)) );
p
= mknode(TAROP
,OPPLUS
, p
, cpexpr(t
->flbound
));
if(subt
==OPPLUS
|| subt
==OPMINUS
)
rp
= mknode(TAROP
,OPSTAR
,rp
,cpexpr(f
->frshift
));
rp
= mknode(TAROP
,subt
, extrfield(cpexpr(e
->leftp
)), rp
);
rp
= simple(RVAL
, mknode(TAROP
,OPMINUS
,rp
,cpexpr(f
->flbound
)) );
p
= mknode(TAROP
,OPSLASH
,cpexpr(lp
),cpexpr(f
->frange
));
p
= mknode(TAROP
,OPSTAR
,cpexpr(f
->frange
),p
);
rp
= mknode(TAROP
,OPPLUS
,p
,rp
);
rp
= mknode(TAROP
,OPSTAR
,cpexpr(f
->frshift
),rp
);
p
= mkcall(builtin(TYINT
,"mod"),
arg2(cpexpr(lp
),cpexpr(f
->frshift
)) );
rp
= mknode(TAROP
,OPPLUS
, p
,rp
);
p
= mknode(TAROP
,OPSLASH
,cpexpr(lp
),cpexpr(f
->frshift
));
p
= mkcall(builtin(TYINT
,"mod"),
arg2(p
, cpexpr(f
->frange
)) );
if( rp
->tag
!=TCONST
|| !equals(rp
->leftp
, "0") )
p
= mknode(TAROP
,OPMINUS
, p
, rp
);
rp
= mknode(TAROP
,OPSTAR
, cpexpr(f
->frshift
), p
);
rp
= mknode(TAROP
,OPMINUS
, cpexpr(lp
), rp
);
frexpr( simple(LVAL
, mknode(TASGNOP
,subt
,lp
,rp
) ));
return(extrfield(e
->leftp
));