1 /* PDP-11 desciptor table for ACK target optimizer */
3 /* Tunable constants: */
11 /* useful addressing modes: */
13 ZERO {strcmp(VAL,"$00") == 0 };
14 ONE {strcmp(VAL,"$01") == 0 };
15 CONST {VAL[0] == '$' }; /* constant */
16 A,B {no_side_effects(VAL) };
18 REG {is_register(VAL) }; /* register */
19 SREG {is_scratchreg(VAL) }; /* scratch reg */
20 M_ONE {strcmp(VAL,"$-1") == 0 }; /* -1 */
21 LAB,L1,L2 {VAL[0] == 'I' }; /* label */
25 /* optimization patterns: */
27 add ZERO,A {carry_dead(REST)} -> ;
28 add ONE, X {carry_dead(REST)} -> inc X;
29 sub ONE, X {carry_dead(REST)} -> dec X;
34 tst (sp)+ : tst X -> mov X,(sp)+;
35 tst (sp)+ : mov X,-(sp) -> mov X,(sp);
36 mov A,X : tst A -> mov A,X;
37 mov X,A : tst A -> mov X,A;
39 /* register subsumption */
40 mov REG,A : ANY A,X -> mov REG,A : ANY REG,X;
41 mov REG,A : ANY *A -> mov REG,A : ANY *REG;
42 mov REG,A : ANY *A,X -> mov REG,A : ANY *REG,X;
43 mov REG,A : ANY X,*A -> mov REG,A : ANY X,*REG;
46 cmp SREG,M_ONE : jeq LAB -> inc SREG : jeq LAB;
47 cmp SREG,M_ONE : jne LAB -> inc SREG : jne LAB;
50 jeq L1 : jbr L2: labdef L1 -> jne L2 : labdef L1;
51 jge L1 : jbr L2: labdef L1 -> jlt L2 : labdef L1;
52 jgt L1 : jbr L2: labdef L1 -> jle L2 : labdef L1;
53 jlt L1 : jbr L2: labdef L1 -> jge L2 : labdef L1;
54 jle L1 : jbr L2: labdef L1 -> jgt L2 : labdef L1;
55 jne L1 : jbr L2: labdef L1 -> jeq L2 : labdef L1;
58 clr SREG : bisb X,SREG : tst SREG : jeq LAB
60 clr SREG : bisb X,SREG : tst SREG : jne LAB
65 /* auxiliary routines: */
67 int no_side_effects(s)
73 case '\0': return TRUE;
74 case '-': if (*s == '(') return FALSE; break;
75 case ')': if (*s == '+') return FALSE; break;
84 return *s++ == 'r' && *s >= '0' && *s <= '5';
90 return *s++ == 'r' && (*s == '0' || *s == '1' || *s == '3');
97 case 'a': /* adc and adcb */
98 return *s++ != 'd' || *s != 'c';
99 case 'b': /* bcc, bcs, bhi, bhis, blo, blos */
100 return *s != 'c' && *s != 'h' &&
101 (*s++ != 'l' || *s != 'o');
102 case 's': /* sbc and sbcb */
103 return *s++ != 'b' || *s != 'c';