set.c 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. /*
  2. * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
  3. * See the copyright notice in the ACK home directory, in the file "Copyright".
  4. */
  5. #ifndef NORCSID
  6. static char rcsid[]= "$Id$";
  7. #endif
  8. #include "param.h"
  9. #include "property.h"
  10. #include "set.h"
  11. #include "token.h"
  12. #include "lookup.h"
  13. #include "reg.h"
  14. #include <cgg_cg.h>
  15. #include "extern.h"
  16. extern set_t l_sets[];
  17. setlookup(s) set_t s; {
  18. register set_p p;
  19. register i;
  20. int setno;
  21. for(p=l_sets;p<&l_sets[nsets];p++) {
  22. if (p->set_size != s.set_size)
  23. continue;
  24. for (i=0;i<SETSIZE;i++)
  25. if (p->set_val[i] != s.set_val[i])
  26. goto cont;
  27. return(p-l_sets);
  28. cont:;
  29. }
  30. setno = NEXT(nsets,MAXSETS,"Sets");
  31. l_sets[setno] = s;
  32. return(setno);
  33. }
  34. make_std_sets() {
  35. set_t s;
  36. register i;
  37. for(i=0;i<SETSIZE;i++)
  38. s.set_val[i]=0;
  39. for(i=0;i<nregs+ntokens;i++)
  40. BIS(s.set_val,i);
  41. s.set_size = 0;
  42. allsetno = setlookup(s);
  43. n_set("ALL",allsetno);
  44. }
  45. set_t emptyset;
  46. set_t ident_to_set(name) char *name; {
  47. register symbol *sy_p;
  48. register i;
  49. register struct propinfo *pp;
  50. int bitno;
  51. set_t result;
  52. sy_p = lookup(name,symany,mustexist);
  53. switch(sy_p->sy_type) {
  54. default:
  55. error("%s is wrong kind of symbol",name);
  56. return(emptyset);
  57. case symprop:
  58. pp = &l_props[sy_p->sy_value.syv_propno];
  59. result.set_size = pp->pr_size;
  60. for (i=0;i<SZOFSET(MAXREGS);i++)
  61. result.set_val[i] = pp->pr_regset[i];
  62. BIS(result.set_val,0);
  63. for (;i<SETSIZE;i++)
  64. result.set_val[i] = 0;
  65. break;
  66. case symtok:
  67. bitno = sy_p->sy_value.syv_tokno+nregs;
  68. for (i=0;i<SETSIZE;i++)
  69. result.set_val[i] = 0;
  70. BIS(result.set_val,bitno);
  71. result.set_size = l_tokens[sy_p->sy_value.syv_tokno]->tk_size;
  72. break;
  73. case symset:
  74. return(l_sets[sy_p->sy_value.syv_setno]);
  75. }
  76. return(result);
  77. }
  78. static
  79. checksize(s)
  80. register set_p s;
  81. {
  82. register int i;
  83. register int size = -1;
  84. s->set_size = 0;
  85. for (i = 1; i <= nregs; i++) {
  86. if (BIT(s->set_val, i)) {
  87. register int sz = l_regs[i].ri_size;
  88. if (size == -1) size = sz;
  89. else if (size != sz) return;
  90. }
  91. }
  92. for (i = 1; i <= ntokens; i++) {
  93. if (BIT(s->set_val, i+nregs)) {
  94. register int sz = l_tokens[i]->tk_size;
  95. if (size == -1) size = sz;
  96. else if (size != sz) return;
  97. }
  98. }
  99. if (size != -1) s->set_size = size;
  100. }
  101. set_t setproduct(s1,s2) set_t s1,s2; {
  102. set_t result;
  103. register i;
  104. for(i=0;i<SETSIZE;i++)
  105. result.set_val[i] = s1.set_val[i] & s2.set_val[i];
  106. checksize(&result);
  107. return(result);
  108. }
  109. set_t setsum(s1,s2) set_t s1,s2; {
  110. set_t result;
  111. register i;
  112. if (s1.set_size == s2.set_size)
  113. result.set_size = s1.set_size;
  114. else
  115. result.set_size = 0;
  116. for(i=0;i<SETSIZE;i++)
  117. result.set_val[i] = s1.set_val[i] | s2.set_val[i];
  118. return(result);
  119. }
  120. set_t setdiff(s1,s2) set_t s1,s2; {
  121. set_t result;
  122. register i;
  123. for(i=0;i<SETSIZE;i++)
  124. result.set_val[i] = s1.set_val[i] & ~ s2.set_val[i];
  125. /* make sure that we don't loose the lowest bit of the set, which
  126. indicates that it contains registers
  127. */
  128. for (i=1;i <= nregs; i++) {
  129. if (BIT(result.set_val, i)) {
  130. BIS(result.set_val,0);
  131. break;
  132. }
  133. }
  134. checksize(&result);
  135. return(result);
  136. }