119 lines
2.3 KiB
C
119 lines
2.3 KiB
C
|
#ifndef NORCSID
|
||
|
static char rcsid[]= "$Header$";
|
||
|
#endif
|
||
|
|
||
|
#include "param.h"
|
||
|
#include "property.h"
|
||
|
#include "set.h"
|
||
|
#include "token.h"
|
||
|
#include "lookup.h"
|
||
|
#include <cgg_cg.h>
|
||
|
#include "extern.h"
|
||
|
|
||
|
extern set_t l_sets[];
|
||
|
|
||
|
setlookup(s) set_t s; {
|
||
|
register set_p p;
|
||
|
register i;
|
||
|
int setno;
|
||
|
|
||
|
for(p=l_sets;p<&l_sets[nsets];p++) {
|
||
|
if (p->set_size != s.set_size)
|
||
|
continue;
|
||
|
for (i=0;i<SETSIZE;i++)
|
||
|
if (p->set_val[i] != s.set_val[i])
|
||
|
goto cont;
|
||
|
return(p-l_sets);
|
||
|
cont:;
|
||
|
}
|
||
|
setno = NEXT(nsets,MAXSETS,"Sets");
|
||
|
l_sets[setno] = s;
|
||
|
return(setno);
|
||
|
}
|
||
|
|
||
|
make_std_sets() {
|
||
|
set_t s;
|
||
|
register i;
|
||
|
|
||
|
for(i=0;i<SETSIZE;i++)
|
||
|
s.set_val[i]=0;
|
||
|
for(i=0;i<nregs+ntokens;i++)
|
||
|
BIS(s.set_val,i);
|
||
|
s.set_size = 0;
|
||
|
allsetno = setlookup(s);
|
||
|
n_set("ALL",allsetno);
|
||
|
}
|
||
|
|
||
|
set_t emptyset;
|
||
|
|
||
|
set_t ident_to_set(name) char *name; {
|
||
|
register symbol *sy_p;
|
||
|
register i;
|
||
|
register struct propinfo *pp;
|
||
|
int bitno;
|
||
|
set_t result;
|
||
|
|
||
|
sy_p = lookup(name,symany,mustexist);
|
||
|
switch(sy_p->sy_type) {
|
||
|
default:
|
||
|
error("%s is wrong kind of symbol",name);
|
||
|
return(emptyset);
|
||
|
case symprop:
|
||
|
pp = &l_props[sy_p->sy_value.syv_propno];
|
||
|
result.set_size = pp->pr_size;
|
||
|
for (i=0;i<SZOFSET(MAXREGS);i++)
|
||
|
result.set_val[i] = pp->pr_regset[i];
|
||
|
BIS(result.set_val,0);
|
||
|
for (;i<SETSIZE;i++)
|
||
|
result.set_val[i] = 0;
|
||
|
break;
|
||
|
case symtok:
|
||
|
bitno = sy_p->sy_value.syv_tokno+nregs;
|
||
|
for (i=0;i<SETSIZE;i++)
|
||
|
result.set_val[i] = 0;
|
||
|
BIS(result.set_val,bitno);
|
||
|
result.set_size = l_tokens[sy_p->sy_value.syv_tokno]->tk_size;
|
||
|
break;
|
||
|
case symset:
|
||
|
return(l_sets[sy_p->sy_value.syv_setno]);
|
||
|
}
|
||
|
return(result);
|
||
|
}
|
||
|
|
||
|
set_t setproduct(s1,s2) set_t s1,s2; {
|
||
|
set_t result;
|
||
|
register i;
|
||
|
|
||
|
if ((result.set_size=s1.set_size)==0)
|
||
|
result.set_size = s2.set_size;
|
||
|
for(i=0;i<SETSIZE;i++)
|
||
|
result.set_val[i] = s1.set_val[i] & s2.set_val[i];
|
||
|
return(result);
|
||
|
}
|
||
|
|
||
|
set_t setsum(s1,s2) set_t s1,s2; {
|
||
|
set_t result;
|
||
|
register i;
|
||
|
|
||
|
if (s1.set_size == s2.set_size)
|
||
|
result.set_size = s1.set_size;
|
||
|
else
|
||
|
result.set_size = 0;
|
||
|
for(i=0;i<SETSIZE;i++)
|
||
|
result.set_val[i] = s1.set_val[i] | s2.set_val[i];
|
||
|
return(result);
|
||
|
}
|
||
|
|
||
|
set_t setdiff(s1,s2) set_t s1,s2; {
|
||
|
set_t result;
|
||
|
register i;
|
||
|
|
||
|
if (s1.set_size == s2.set_size)
|
||
|
result.set_size = s1.set_size;
|
||
|
else
|
||
|
result.set_size = 0;
|
||
|
for(i=0;i<SETSIZE;i++)
|
||
|
result.set_val[i] = s1.set_val[i] & ~ s2.set_val[i];
|
||
|
return(result);
|
||
|
}
|