ceriel 32 anni fa
parent
commit
6824718e04
2 ha cambiato i file con 122 aggiunte e 0 eliminazioni
  1. 1 0
      mach/sparc/top/.distr
  2. 121 0
      mach/sparc/top/table

+ 1 - 0
mach/sparc/top/.distr

@@ -0,0 +1 @@
+table

+ 121 - 0
mach/sparc/top/table

@@ -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");
+}