Pristine Ack-5.5
[Ack-5.5.git] / mach / sparc / top / table
1 /* sparc desciptor table for ACK target optimizer */
2
3 MAXOP 3;
4 OPC_TERMINATOR '\t';
5
6 %%;
7
8 /* useful addressing modes-> */
9
10 NUM,NUM1,NUM2   {is_number(VAL)                 };
11 REG             {VAL[0] == '%'                  };
12 A,B,X,Y,Z       {TRUE                           };
13 REG_NO_O7       {VAL[0] == '%' && (VAL[1] != 'o' || VAL[2] != '7')};
14 NO_O7           {no_o7(VAL)                     };
15
16 %%;
17
18 /* optimization patterns-> */
19 /* tricky because we cannot optimize an instruction that lives in a delay slot */
20
21 /* usage of delay slot: */
22
23 ANY X,Y,Z : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
24                                         ->      ANY X,Y,Z : call A : st REG_NO_O7,NO_O7 ;
25 ANY X,Y : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
26                                         ->      ANY X,Y : call A : st REG_NO_O7,NO_O7 ;
27 ANY X : st REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
28                                         ->      ANY X : call A : st REG_NO_O7,NO_O7 ;
29 ANY X,Y,Z : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
30                                         ->      ANY X,Y,Z : call A : mov REG_NO_O7,NO_O7 ;
31 ANY X,Y : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
32                                         ->      ANY X,Y : call A : mov REG_NO_O7,NO_O7 ;
33 ANY X : mov REG_NO_O7,NO_O7 : call A : nop {no_delay(ANY)}
34                                         ->      ANY X : call A : mov REG_NO_O7,NO_O7 ;
35 ANY X,Y,Z : st REG,B : b A : nop {no_delay(ANY)}
36                                         ->      ANY X,Y,Z : b A : st REG,B ;
37 ANY X,Y : st REG,B : b A : nop {no_delay(ANY)}
38                                         ->      ANY X,Y : b A : st REG,B ;
39 ANY X : st REG,B : b A : nop {no_delay(ANY)}
40                                         ->      ANY X : b A : st REG,B ;
41
42 /* inc/dec: */
43
44 ANY X,Y,Z : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
45                                         ->      ANY X,Y,Z ;
46 ANY X,Y : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
47                                         ->      ANY X,Y ;
48 ANY X : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
49                                         ->      ANY X ;
50 ANY X,Y,Z : inc 0,REG {no_delay(ANY)}   ->      ANY X,Y,Z ;
51 ANY X,Y : inc 0,REG {no_delay(ANY)}     ->      ANY X,Y ;
52 ANY X : inc 0,REG {no_delay(ANY)}       ->      ANY X ;
53 ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
54                                         ->      ANY X,Y,Z : inc NUM2,REG ;
55 ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
56                                         ->      ANY X,Y : inc NUM2,REG ;
57 ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
58                                         ->      ANY X : inc NUM2,REG ;
59 ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
60                                         ->      ANY X,Y,Z : dec NUM2,REG ;
61 ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
62                                         ->      ANY X,Y : dec NUM2,REG ;
63 ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
64                                         ->      ANY X : dec NUM2,REG ;
65
66 /* misc: */
67
68 ANY X,Y,Z : ld A,REG : ld A,REG1 {no_delay(ANY)}
69                                         ->      ANY X,Y,Z : ld A,REG : mov REG,REG1 ;
70 ANY X,Y : ld A,REG : ld A,REG1 {no_delay(ANY)}
71                                         ->      ANY X,Y : ld A,REG : mov REG,REG1 ;
72 ANY X : ld A,REG : ld A,REG1 {no_delay(ANY)}
73                                         ->      ANY X : ld A,REG : mov REG,REG1 ;
74 ANY X,Y,Z : st REG,A : ld A,REG1 {no_delay(ANY)}
75                                         ->      ANY X,Y,Z : st REG,A : mov REG,REG1 ;
76 ANY X,Y : st REG,A : ld A,REG1 {no_delay(ANY)}
77                                         ->      ANY X,Y : st REG,A : mov REG,REG1 ;
78 ANY X : st REG,A : ld A,REG1 {no_delay(ANY)}
79                                         ->      ANY X : st REG,A : mov REG,REG1 ;
80
81 %%;
82
83 /* auxiliary routines: */
84
85 int is_number(s)
86         register char *s;
87 {
88         while (*s != '\0') {
89                 if (*s < '0' || *s++ > '9') return FALSE;
90         }
91         return TRUE;
92 }
93
94 int bigger(s,s1,s2)
95         char    *s,*s1,*s2;
96 {
97         int     n = atoi(s),n1 = atoi(s1);
98
99         if (n >= n1) {
100                 sprintf(s2,"%d",n-n1);
101                 return TRUE;
102         }
103         return FALSE;
104 }
105
106 int smaller(s,s1,s2)
107         char    *s,*s1,*s2;
108 {
109         int     n = atoi(s),n1 = atoi(s1);
110
111         if (n < n1) {
112                 sprintf(s2,"%d",n1-n);
113                 return TRUE;
114         }
115         return FALSE;
116 }
117
118 int no_delay(s)
119         char    *s;
120 {
121         return s[0] != 'b' && s[0] != 'j' && s[0] != 'r' &&
122         s[1] != 'b' && s[0] != 'c';
123 }
124
125 int no_o7(s)
126         char    *s;
127 {
128         for (;;) {
129                 while (*s && *s != '%') s++;
130                 if (*s) {
131                         if (*++s == 'o') {
132                                 if (*++s == '7') return FALSE;
133                         }
134                 }
135                 else break;
136         }
137         return TRUE;
138 }