1 /* sparc desciptor table for ACK target optimizer */
8 /* useful addressing modes-> */
10 NUM,NUM1,NUM2 {is_number(VAL) };
13 REG_NO_O7 {VAL[0] == '%' && (VAL[1] != 'o' || VAL[2] != '7')};
18 /* optimization patterns-> */
19 /* tricky because we cannot optimize an instruction that lives in a delay slot */
21 /* usage of delay slot: */
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 ;
44 ANY X,Y,Z : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
46 ANY X,Y : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
48 ANY X : inc NUM,REG : dec NUM,REG {no_delay(ANY)}
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 ;
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 ;
83 /* auxiliary routines: */
89 if (*s < '0' || *s++ > '9') return FALSE;
97 int n = atoi(s),n1 = atoi(s1);
100 sprintf(s2,"%d",n-n1);
109 int n = atoi(s),n1 = atoi(s1);
112 sprintf(s2,"%d",n1-n);
121 return s[0] != 'b' && s[0] != 'j' && s[0] != 'r' &&
122 s[1] != 'b' && s[0] != 'c';
129 while (*s && *s != '%') s++;
132 if (*++s == '7') return FALSE;