*** empty log message ***
This commit is contained in:
187
util/ncgg/iocc.c
Normal file
187
util/ncgg/iocc.c
Normal file
@@ -0,0 +1,187 @@
|
||||
#ifndef NORCSID
|
||||
static char rcsid[]= "$Header$";
|
||||
#endif
|
||||
|
||||
#include "assert.h"
|
||||
#include "param.h"
|
||||
#include "set.h"
|
||||
#include "expr.h"
|
||||
#include "lookup.h"
|
||||
#include "token.h"
|
||||
#include "property.h"
|
||||
#include "iocc.h"
|
||||
#include <cgg_cg.h>
|
||||
#include "regvar.h"
|
||||
#include "extern.h"
|
||||
|
||||
extern set_t l_sets[];
|
||||
|
||||
int narexpr;
|
||||
expr_t arexp[MAXATT];
|
||||
|
||||
expr_t iextoaddr();
|
||||
|
||||
iocc_t subr_iocc(tokarg,subreg) {
|
||||
inst_t insta;
|
||||
iocc_t result;
|
||||
register i;
|
||||
|
||||
insta.in_which = IN_COPY;
|
||||
insta.in_info[0] = tokarg;
|
||||
insta.in_info[1] = subreg;
|
||||
result.in_index = instalookup(insta,2);
|
||||
if (subreg==0)
|
||||
for (i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = l_sets[tokpatset[tokarg-1]].set_val[i];
|
||||
else {
|
||||
for (i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = 0;
|
||||
subregset(l_sets[tokpatset[tokarg-1]].set_val,subreg,result.in_set);
|
||||
}
|
||||
return(result);
|
||||
}
|
||||
|
||||
iocc_t tokm_iocc(tokarg,ident) char *ident; {
|
||||
iocc_t result;
|
||||
inst_t insta;
|
||||
register i;
|
||||
char app[100];
|
||||
int dummy;
|
||||
|
||||
sprintf(app,"%%%d.%s",tokarg,ident);
|
||||
for(i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = 0;
|
||||
insta.in_which = IN_MEMB;
|
||||
insta.in_info[0] = tokarg;
|
||||
insta.in_info[1] = 1+membset(tokpatset[tokarg-1],ident,result.in_set,
|
||||
app,TYPREG,&dummy);
|
||||
result.in_index = instalookup(insta,2);
|
||||
return(result);
|
||||
}
|
||||
|
||||
iocc_t ident_iocc(ident) char *ident; {
|
||||
iocc_t result;
|
||||
inst_t insta;
|
||||
register i;
|
||||
register symbol *sy_p;
|
||||
|
||||
for(i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = 0;
|
||||
insta.in_which = IN_RIDENT;
|
||||
sy_p = lookup(ident,symreg,mustexist);
|
||||
insta.in_info[0] = sy_p->sy_value.syv_regno;
|
||||
result.in_index = instalookup(insta,1);
|
||||
BIS(result.in_set,sy_p->sy_value.syv_regno);
|
||||
return(result);
|
||||
}
|
||||
|
||||
iocc_t all_iocc(all_no,subreg) {
|
||||
iocc_t result;
|
||||
inst_t insta;
|
||||
register i;
|
||||
set_t localset;
|
||||
register short *sp;
|
||||
|
||||
sp = l_props[allreg[all_no]].pr_regset;
|
||||
for (i=0;i<SETSIZE;i++)
|
||||
localset.set_val[i] = i<SZOFSET(MAXREGS) ? sp[i] : 0;
|
||||
for(i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = 0;
|
||||
insta.in_which = IN_ALLOC;
|
||||
insta.in_info[0] = all_no;
|
||||
insta.in_info[1] = subreg;
|
||||
subregset(localset.set_val,subreg,result.in_set);
|
||||
result.in_index = instalookup(insta,2);
|
||||
return(result);
|
||||
}
|
||||
|
||||
iocc_t descr_iocc(ident) char *ident; {
|
||||
iocc_t result;
|
||||
inst_t insta;
|
||||
register symbol *sy_p;
|
||||
register token_p tp;
|
||||
register i;
|
||||
int typerr;
|
||||
|
||||
for(i=0;i<SETSIZE;i++)
|
||||
result.in_set[i] = 0;
|
||||
sy_p = lookup(ident,symtok,mustexist);
|
||||
tp = l_tokens[sy_p->sy_value.syv_tokno];
|
||||
BIS(result.in_set,sy_p->sy_value.syv_tokno+nregs);
|
||||
insta.in_which = IN_DESCR;
|
||||
if (rvused&SL_REGVAR && strcmp(ident,"LOCAL")==0)
|
||||
insta.in_which = IN_S_DESCR;
|
||||
else if (rvused&DL_REGVAR && strcmp(ident,"DLOCAL")==0)
|
||||
insta.in_which = IN_D_DESCR;
|
||||
insta.in_info[0] = sy_p->sy_value.syv_tokno;
|
||||
for (i=0;i<MAXATT;i++) {
|
||||
if (tp->tk_att[i].ta_type == -3) {
|
||||
if (narexpr>i)
|
||||
error("token %s initialized with too many attributes",ident);
|
||||
break;
|
||||
}
|
||||
if (i>= narexpr) {
|
||||
error("token %s initialized with too few attributes",
|
||||
ident);
|
||||
break;
|
||||
}
|
||||
typerr = 0;
|
||||
switch(arexp[i].ex_typ) {
|
||||
default: assert(0);
|
||||
case TYPINT:
|
||||
if (tp->tk_att[i].ta_type != -1)
|
||||
if (tp->tk_att[i].ta_type == -2)
|
||||
arexp[i] = iextoaddr(arexp[i]);
|
||||
else
|
||||
typerr++;
|
||||
break;
|
||||
case TYPBOOL:
|
||||
typerr++; break;
|
||||
case TYPADDR:
|
||||
if (tp->tk_att[i].ta_type != -2)
|
||||
typerr++;
|
||||
break;
|
||||
case TYPREG:
|
||||
if (tp->tk_att[i].ta_type<0)
|
||||
typerr++;
|
||||
else if (!subset(arexp[i].ex_regset,
|
||||
l_props[tp->tk_att[i].ta_type].pr_regset,
|
||||
SZOFSET(MAXREGS)))
|
||||
typerr++;
|
||||
break;
|
||||
}
|
||||
if (typerr)
|
||||
error("Attribute %s.%s given wrong type of value",
|
||||
ident,tp->tk_att[i].ta_name);
|
||||
insta.in_info[i+1] = arexp[i].ex_index;
|
||||
}
|
||||
result.in_index = instalookup(insta,i+1);
|
||||
return(result);
|
||||
}
|
||||
|
||||
/* low level instance package */
|
||||
|
||||
int ninstances=1;
|
||||
inst_t l_instances[MAXINSTANCES];
|
||||
|
||||
instalookup(insta,filled) inst_t insta; {
|
||||
register i,j;
|
||||
|
||||
for (j=filled;j<=MAXATT;j++)
|
||||
insta.in_info[j] = 0;
|
||||
for (i=0;i<ninstances;i++) {
|
||||
if (insta.in_which != l_instances[i].in_which)
|
||||
continue;
|
||||
for(j=0;j<=MAXATT;j++)
|
||||
if (insta.in_info[j]!= l_instances[i].in_info[j])
|
||||
goto cont;
|
||||
return(i);
|
||||
cont:;
|
||||
}
|
||||
NEXT(ninstances,MAXINSTANCES,"Instances");
|
||||
l_instances[i] = insta;
|
||||
return(i);
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user