set.c 2.9 KB

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