123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154 |
- /*
- * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
- * See the copyright notice in the ACK home directory, in the file "Copyright".
- */
- #ifndef NORCSID
- static char rcsid[]= "$Id$";
- #endif
- #include "param.h"
- #include "property.h"
- #include "set.h"
- #include "token.h"
- #include "lookup.h"
- #include "reg.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);
- }
- static
- checksize(s)
- register set_p s;
- {
- register int i;
- register int size = -1;
- s->set_size = 0;
- for (i = 1; i <= nregs; i++) {
- if (BIT(s->set_val, i)) {
- register int sz = l_regs[i].ri_size;
- if (size == -1) size = sz;
- else if (size != sz) return;
- }
- }
- for (i = 1; i <= ntokens; i++) {
- if (BIT(s->set_val, i+nregs)) {
- register int sz = l_tokens[i]->tk_size;
- if (size == -1) size = sz;
- else if (size != sz) return;
- }
- }
- if (size != -1) s->set_size = size;
- }
- set_t setproduct(s1,s2) set_t s1,s2; {
- set_t result;
- register i;
- for(i=0;i<SETSIZE;i++)
- result.set_val[i] = s1.set_val[i] & s2.set_val[i];
- checksize(&result);
- 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;
- for(i=0;i<SETSIZE;i++)
- result.set_val[i] = s1.set_val[i] & ~ s2.set_val[i];
- /* make sure that we don't loose the lowest bit of the set, which
- indicates that it contains registers
- */
- for (i=1;i <= nregs; i++) {
- if (BIT(result.set_val, i)) {
- BIS(result.set_val,0);
- break;
- }
- }
- checksize(&result);
- return(result);
- }
|