Pristine Ack-5.5
[Ack-5.5.git] / mach / proto / cg / equiv.c
1 #ifndef NORCSID
2 static char rcsid[] = "$Id: equiv.c,v 2.4 1994/06/24 13:23:29 ceriel Exp $";
3 #endif
4
5 #include "assert.h"
6 #include "equiv.h"
7 #include "param.h"
8 #include "tables.h"
9 #include "types.h"
10 #include <cg_pattern.h>
11 #include "data.h"
12 #include "result.h"
13 #include "extern.h"
14
15 /*
16  * (c) copyright 1987 by the Vrije Universiteit, Amsterdam, The Netherlands.
17  * See the copyright notice in the ACK home directory, in the file "Copyright".
18  *
19  * Author: Hans van Staveren
20  */
21
22 extern string myalloc();
23
24 int rar[MAXCREG];
25 rl_p *lar;
26 int maxindex;
27 int regclass[NREGS];
28 struct perm *perms;
29
30 struct perm *
31 tuples(regls,nregneeded) rl_p *regls; {
32         int class=0;
33         register i,j;
34
35         /*
36          * First compute equivalence classes of registers.
37          */
38
39         for (i=0;i<NREGS;i++) {
40                 regclass[i] = class++;
41                 if (getrefcount(i, FALSE) == 0) {
42                         for (j=0;j<i;j++) {
43                                 if (eqregclass(i,j) &&
44                                     eqtoken(&machregs[i].r_contents,
45                                             &machregs[j].r_contents)) {
46                                         regclass[i] = regclass[j];
47                                         break;
48                                 }
49                         }
50                 }
51         }
52
53         /*
54          * Now create tuples through a recursive function
55          */
56
57         maxindex = nregneeded;
58         lar = regls;
59         perms = 0;
60         permute(0);
61         return(perms);
62 }
63
64 permute(index) {
65         register struct perm *pp;
66         register rl_p rlp;
67         register i,j;
68
69         if (index == maxindex) {
70                 for (pp=perms; pp != 0; pp=pp->p_next) {
71                         for (i=0; i<maxindex; i++)
72                                 if (regclass[rar[i]] != regclass[pp->p_rar[i]])
73                                         goto diff;
74                         for (i=0; i<maxindex; i++)
75                                 for (j=0; j<i; j++)
76                                         if (clash(rar[i],rar[j]) !=
77                                             clash(pp->p_rar[i],pp->p_rar[j]))
78                                                 goto diff;
79                         return;
80                     diff: ;
81                 }
82                 pp = (struct perm *) myalloc(sizeof ( *pp ));
83                 pp->p_next = perms;
84                 for (i=0; i<maxindex; i++)
85                         pp->p_rar[i] = rar[i];
86                 perms = pp;
87         } else {
88                 rlp=lar[index];
89                 for (i=rlp->rl_n-1; i>=0; i--) {
90                         rar[index] = rlp->rl_list[i];
91                         permute(index+1);
92                 }
93         }
94 }