Added
authorceriel <none@none>
Sat, 23 Nov 1991 15:04:01 +0000 (15:04 +0000)
committerceriel <none@none>
Sat, 23 Nov 1991 15:04:01 +0000 (15:04 +0000)
mach/sparc/top/.distr [new file with mode: 0644]
mach/sparc/top/table [new file with mode: 0644]

diff --git a/mach/sparc/top/.distr b/mach/sparc/top/.distr
new file mode 100644 (file)
index 0000000..ecbe2e6
--- /dev/null
@@ -0,0 +1 @@
+table
diff --git a/mach/sparc/top/table b/mach/sparc/top/table
new file mode 100644 (file)
index 0000000..5ce7c03
--- /dev/null
@@ -0,0 +1,121 @@
+/* sparc desciptor table for ACK target optimizer */
+
+MAXOP 3;
+OPC_TERMINATOR '\t';
+
+%%;
+
+/* useful addressing modes-> */
+
+NUM,NUM1,NUM2  {is_number(VAL)                 };
+REG            {VAL[0] == '%'                  };
+A,B,X,Y,Z      {TRUE                           };
+
+%%;
+
+/* optimization patterns-> */
+/* tricky because we cannot optimize an instruction that lives in a delay slot */
+
+/* usage of delay slot: */
+
+ANY X,Y,Z : st REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y,Z : call A : st REG,B ;
+ANY X,Y : st REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y : call A : st REG,B ;
+ANY X : st REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X : call A : st REG,B ;
+ANY X,Y,Z : mov REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y,Z : call A : mov REG,B ;
+ANY X,Y : mov REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y : call A : mov REG,B ;
+ANY X : mov REG,B : call A : nop {no_delay(ANY)}
+                                       ->      ANY X : call A : mov REG,B ;
+ANY X,Y,Z : st REG,B : b A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y,Z : b A : st REG,B ;
+ANY X,Y : st REG,B : b A : nop {no_delay(ANY)}
+                                       ->      ANY X,Y : b A : st REG,B ;
+ANY X : st REG,B : b A : nop {no_delay(ANY)}
+                                       ->      ANY X : b A : st REG,B ;
+
+/* inc/dec: */
+
+ANY X,Y,Z : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
+                                       ->      ANY X,Y,Z ;
+ANY X,Y : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
+                                       ->      ANY X,Y ;
+ANY X : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
+                                       ->      ANY X ;
+ANY X,Y,Z : inc 0,REG {no_delay(ANY)}  ->      ANY X,Y,Z ;
+ANY X,Y : inc 0,REG {no_delay(ANY)}    ->      ANY X,Y ;
+ANY X : inc 0,REG {no_delay(ANY)}      ->      ANY X ;
+ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
+                                       ->      ANY X,Y,Z : inc NUM2,REG ;
+ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
+                                       ->      ANY X,Y : inc NUM2,REG ;
+ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && bigger(NUM,NUM1,NUM2)}
+                                       ->      ANY X : inc NUM2,REG ;
+ANY X,Y,Z : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
+                                       ->      ANY X,Y,Z : dec NUM2,REG ;
+ANY X,Y : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
+                                       ->      ANY X,Y : dec NUM2,REG ;
+ANY X : inc NUM,REG : dec NUM1,REG {no_delay(ANY) && smaller(NUM,NUM1,NUM2)}
+                                       ->      ANY X : dec NUM2,REG ;
+
+/* misc: */
+
+ANY X,Y,Z : ld A,REG : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X,Y,Z : ld A,REG : mov REG,REG1 ;
+ANY X,Y : ld A,REG : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X,Y : ld A,REG : mov REG,REG1 ;
+ANY X : ld A,REG : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X : ld A,REG : mov REG,REG1 ;
+ANY X,Y,Z : st REG,A : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X,Y,Z : st REG,A : mov REG,REG1 ;
+ANY X,Y : st REG,A : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X,Y : st REG,A : mov REG,REG1 ;
+ANY X : st REG,A : ld A,REG1 {no_delay(ANY)}
+                                       ->      ANY X : st REG,A : mov REG,REG1 ;
+
+%%;
+
+/* auxiliary routines: */
+
+int is_number(s)
+       register char *s;
+{
+       while (*s != '\0') {
+               if (*s < '0' || *s++ > '9') return FALSE;
+       }
+       return TRUE;
+}
+
+int bigger(s,s1,s2)
+       char    *s,*s1,*s2;
+{
+       int     n = atoi(s),n1 = atoi(s1);
+
+       if (n >= n1) {
+               sprintf(s2,"%d",n-n1);
+               return TRUE;
+       }
+       return FALSE;
+}
+
+int smaller(s,s1,s2)
+       char    *s,*s1,*s2;
+{
+       int     n = atoi(s),n1 = atoi(s1);
+
+       if (n < n1) {
+               sprintf(s2,"%d",n1-n);
+               return TRUE;
+       }
+       return FALSE;
+}
+
+int no_delay(s)
+       char    *s;
+{
+       s[0] != 'b' && s[0] != 'j' && s[0] != 'r' &&
+       s[1] != 'b' && strcmp(s,"call");
+}