Adapted to typesetter and added a reference for LLgen.
This commit is contained in:
		
							parent
							
								
									fcaf1a73b4
								
							
						
					
					
						commit
						19477f95a9
					
				
					 1 changed files with 101 additions and 33 deletions
				
			
		
							
								
								
									
										134
									
								
								doc/top/top.n
									
										
									
									
									
								
							
							
						
						
									
										134
									
								
								doc/top/top.n
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -1,8 +1,4 @@
 | 
			
		|||
.ND
 | 
			
		||||
.pl 11.7i
 | 
			
		||||
.ll 80m
 | 
			
		||||
.nr LL 80m
 | 
			
		||||
.nr tl 78m
 | 
			
		||||
.tr ~
 | 
			
		||||
.ds >. .
 | 
			
		||||
.TL
 | 
			
		||||
| 
						 | 
				
			
			@ -82,6 +78,7 @@ machine-dependent description table (see figure 1.).
 | 
			
		|||
So the major part of the code of a target optimizer is
 | 
			
		||||
shared among all target optimizers.
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
                                       |-------------------------|
 | 
			
		||||
| 
						 | 
				
			
			@ -95,6 +92,7 @@ table     |                 |          |                         |
 | 
			
		|||
          |-----------------|          |-------------------------|
 | 
			
		||||
   
 | 
			
		||||
                                              target optimizer
 | 
			
		||||
.ft R
 | 
			
		||||
   
 | 
			
		||||
    Figure 1: Generation of a target optimizer.
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -163,22 +161,26 @@ ANY matches every instruction mnemonic.
 | 
			
		|||
.nf
 | 
			
		||||
 | 
			
		||||
Examples of mnemonic descriptions:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
        add
 | 
			
		||||
        sub.l
 | 
			
		||||
        mulw3
 | 
			
		||||
        ANY
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
.PP
 | 
			
		||||
An operand can also be described by a string constant.
 | 
			
		||||
.nf
 | 
			
		||||
 | 
			
		||||
Examples:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
       (sp)+
 | 
			
		||||
       r5
 | 
			
		||||
       -4(r6)
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
Alternatively, it can be described by means of a \fIvariable name\fR.
 | 
			
		||||
Variables have values which are strings.
 | 
			
		||||
| 
						 | 
				
			
			@ -187,22 +189,27 @@ Each such declaration defines the name of a variable and
 | 
			
		|||
a \fIrestriction\fR to which its value is subjected.
 | 
			
		||||
.nf
 | 
			
		||||
Example of variable declarations:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
      CONST       { VAL[0] == '$' };
 | 
			
		||||
      REG         { VAL[0] == 'r' && VAL[1] >= '0' && VAL[1] <= '3' &&
 | 
			
		||||
                    VAL[2] == '\\0' };
 | 
			
		||||
      X           { TRUE };
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
The keyword VAL denotes the value of the variable, which is
 | 
			
		||||
a null-terminated string.
 | 
			
		||||
An operand description given via a variable name matches an
 | 
			
		||||
actual operand if the actual operand obeys the associated restriction.
 | 
			
		||||
.nf
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
     CONST  matches   $1, $-5, $foo etc.
 | 
			
		||||
     REG    matches   r0, r1, r2 and r3
 | 
			
		||||
     X      matches   anything
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
The restriction (between curly braces) may be any legal "C"
 | 
			
		||||
.[
 | 
			
		||||
| 
						 | 
				
			
			@ -214,9 +221,11 @@ These procedures must be added to the table after the patterns.
 | 
			
		|||
.nf
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
     FERMAT_NUMBER    { VAL[0] == '$' && is_fermat_number(&VAL[1]) };
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
An operand can also be described by a mixture of a string constant
 | 
			
		||||
and a variable name.
 | 
			
		||||
| 
						 | 
				
			
			@ -226,9 +235,11 @@ The most general form allowed is:
 | 
			
		|||
       string_constant1 variable_name string_constant2
 | 
			
		||||
 | 
			
		||||
Example:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
       (REG)+  matches  (r0)+, (r1)+, (r2)+ and (r3)+
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
Any of the three components may be omitted,
 | 
			
		||||
so the first two forms are just special cases of the general form.
 | 
			
		||||
| 
						 | 
				
			
			@ -254,17 +265,23 @@ the optional constraint C is satisfied, i.e. it evaluates to TRUE.
 | 
			
		|||
.LP
 | 
			
		||||
.nf
 | 
			
		||||
The pattern:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
      dec REG : move.b CONST,(REG)
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
matches:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
      dec r0 : move.b $4,(r0)
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
but not:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
      dec r0 : move.b $4,(r1)
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
(as the variable REG matches two different strings).
 | 
			
		||||
.fi
 | 
			
		||||
If a pattern containing different registers must be described,
 | 
			
		||||
| 
						 | 
				
			
			@ -272,10 +289,12 @@ extra names for a register should be declared, all sharing
 | 
			
		|||
the same restriction.
 | 
			
		||||
.nf
 | 
			
		||||
Example:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
     REG1,REG2  { VAL[0] == 'r' &&  .....  };
 | 
			
		||||
 | 
			
		||||
     addl3 REG1,REG1,REG2 : subl2 REG2,REG1
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
.PP
 | 
			
		||||
The optional constraint is an auxiliary "C" expression (just like
 | 
			
		||||
| 
						 | 
				
			
			@ -283,14 +302,18 @@ the parameter restrictions).
 | 
			
		|||
The expression may refer to the variables and to ANY.
 | 
			
		||||
.nf
 | 
			
		||||
Example:
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
    move REG1,REG2    { REG1[1] == REG2[1] + 1 }
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
matches
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
    move r1,r0
 | 
			
		||||
    move r2,r1
 | 
			
		||||
    move r3,r2
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
.PP
 | 
			
		||||
The replacement part of a (pattern,replacement) table entry
 | 
			
		||||
| 
						 | 
				
			
			@ -311,10 +334,13 @@ Vax examples
 | 
			
		|||
.PP
 | 
			
		||||
Suppose the table contains the following declarations:
 | 
			
		||||
.nf
 | 
			
		||||
 | 
			
		||||
.ft 5
 | 
			
		||||
         X, LOG        { TRUE };
 | 
			
		||||
         LAB           { VAL[0] == 'L' };   /* e.g. L0017 */
 | 
			
		||||
         A             { no_side_effects(VAL) };
 | 
			
		||||
         NUM           { is_number(VAL) };
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
The procedure "no_side_effects" checks if its argument
 | 
			
		||||
| 
						 | 
				
			
			@ -324,23 +350,29 @@ These procedures must be supplied by the table-writer and must be
 | 
			
		|||
included in the table.
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  addl3 X,A,A    -> addl2 X,A;
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  addl3 X,A,A    -> addl2 X,A;
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
This entry changes a 3-operand instruction into a cheaper  2-operand
 | 
			
		||||
instruction.
 | 
			
		||||
An optimization like:
 | 
			
		||||
.nf
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
        addl3 r0,(r2)+,(r2)+   -> addl2 r0,(r2)+
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
is illegal, as r2 should be incremented twice.
 | 
			
		||||
Hence the second argument is required to
 | 
			
		||||
be side-effect free.
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  addw2 $-NUM,X  -> subw2 $NUM,X;
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  addw2 $-NUM,X  -> subw2 $NUM,X;
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
An instruction like "subw2 $5,r0" is cheaper
 | 
			
		||||
| 
						 | 
				
			
			@ -349,18 +381,22 @@ because constants in the range 0 to 63 are represented
 | 
			
		|||
very efficiently on the Vax.
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  bitw $NUM,A : jneq LAB
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  bitw $NUM,A : jneq LAB
 | 
			
		||||
                { is_poweroftwo(NUM,LOG) }  -> jbs $LOG,A,LAB;
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
A "bitw x,y" sets the condition codes to the bitwise "and" of
 | 
			
		||||
x and y.
 | 
			
		||||
A "jbs n,x,l" branches to l if bit n of x is set.
 | 
			
		||||
So, for example, the following transformation is possible:
 | 
			
		||||
.nf
 | 
			
		||||
.ft 5
 | 
			
		||||
 | 
			
		||||
      bitw $32,r0 : jneq L0017 ->  jbs $5,r0,L0017
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.fi
 | 
			
		||||
The user-defined  procedure "is_poweroftwo" checks if its first argument is
 | 
			
		||||
a power of 2 and, if so, sets its second argument to the logarithm
 | 
			
		||||
| 
						 | 
				
			
			@ -373,18 +409,23 @@ PDP-11 examples
 | 
			
		|||
.PP
 | 
			
		||||
Suppose we have the following declarations:
 | 
			
		||||
.nf
 | 
			
		||||
 | 
			
		||||
.ft 5
 | 
			
		||||
         X             { TRUE };
 | 
			
		||||
         A             { no_side_effects(VAL) };
 | 
			
		||||
         L1, L2        { VAL[0] == 'I' };
 | 
			
		||||
         REG           { VAL[0] == 'r' && VAL[1] >= '0' && VAL[1] <= '5' &&
 | 
			
		||||
                         VAL[2] == '\\0' };
 | 
			
		||||
 | 
			
		||||
.ft P
 | 
			
		||||
.fi
 | 
			
		||||
The implementation of "no_side_effects" may of course
 | 
			
		||||
differ for the PDP-11 and the Vax.
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  mov REG,A : ANY A,X  ->  mov REG,A : ANY REG,X ;
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  mov REG,A : ANY A,X  ->  mov REG,A : ANY REG,X ;
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
This entry implements register subsumption.
 | 
			
		||||
| 
						 | 
				
			
			@ -392,7 +433,9 @@ If A and REG hold the same value (which is true after "mov REG,A")
 | 
			
		|||
and A is used as source (first) operand, it is cheaper to use REG instead.
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  jeq L1 : jbr L2 : labdef L1  ->  jne L2 : labdef L1;
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  jeq L1 : jbr L2 : labdef L1  ->  jne L2 : labdef L1;
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
The "jeq L1" is a "skip over an unconditional jump". "labdef L1"
 | 
			
		||||
| 
						 | 
				
			
			@ -401,7 +444,9 @@ As the target optimizer has to know how such a definition
 | 
			
		|||
looks like, this must be expressed in the table (see Appendix A).
 | 
			
		||||
.PP
 | 
			
		||||
.nf
 | 
			
		||||
\fIentry:\fR  add $01,X { carry_dead(REST) }  -> inc X;
 | 
			
		||||
.ft 5
 | 
			
		||||
\fIentry:\fP  add $01,X { carry_dead(REST) }  -> inc X;
 | 
			
		||||
.ft R
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
On the PDP-11, an add-one is not equivalent to an increment.
 | 
			
		||||
| 
						 | 
				
			
			@ -440,24 +485,32 @@ backwards,
 | 
			
		|||
as it is possible that instructions that were rejected earlier now do match.
 | 
			
		||||
For example, consider the following patterns:
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
cmp $0, X           -> tst X ;
 | 
			
		||||
mov REG,X : tst X   -> move REG.X ;   /* redundant test */
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
If the input is:
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
mov r0,foo : cmp $0,foo
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
then the first instruction is initially rejected.
 | 
			
		||||
However, after the transformation
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
cmp $0,foo   ->  tst foo
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
the following optimization is possible:
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
mov r0,foo : tst foo  ->  mov r0,foo
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
.PP
 | 
			
		||||
The window is implemented a a \fIqueue\fR.
 | 
			
		||||
The window is implemented as a \fIqueue\fR.
 | 
			
		||||
Matching takes place at the head of the queue.
 | 
			
		||||
New instructions are added at the tail.
 | 
			
		||||
If the window is moved forwards, the instruction at the head
 | 
			
		||||
| 
						 | 
				
			
			@ -619,7 +672,10 @@ These two files are compiled together with some machine-independent
 | 
			
		|||
files to produce a target optimizer.
 | 
			
		||||
.PP
 | 
			
		||||
Topgen is implemented using 
 | 
			
		||||
the LL(1) parser generator system LLgen,
 | 
			
		||||
the LL(1) parser generator system LLgen ,
 | 
			
		||||
.[
 | 
			
		||||
jacobs topics parser generation
 | 
			
		||||
.]
 | 
			
		||||
a powerful tool of the Amsterdam Compiler Kit.
 | 
			
		||||
This system provides a flexible way of describing the syntax of the tables.
 | 
			
		||||
The syntactical description of the table format included
 | 
			
		||||
| 
						 | 
				
			
			@ -646,13 +702,14 @@ optimizer description table format.
 | 
			
		|||
This appendix is intended for table-writers.
 | 
			
		||||
We use syntax rules for the description of the table format.
 | 
			
		||||
The following notation is used:
 | 
			
		||||
.nf
 | 
			
		||||
      { a }      zero or more of a
 | 
			
		||||
      [ a ]      zero or one of a
 | 
			
		||||
      a b        a followed by b
 | 
			
		||||
      a | b      a or b
 | 
			
		||||
 | 
			
		||||
.fi
 | 
			
		||||
.TS
 | 
			
		||||
center;
 | 
			
		||||
l l.
 | 
			
		||||
{ a }	zero or more of a
 | 
			
		||||
[ a ]	zero or one of a
 | 
			
		||||
a b	a followed by b
 | 
			
		||||
a | b	a or b
 | 
			
		||||
.TE
 | 
			
		||||
Terminals are given in quotes, as in ';'.
 | 
			
		||||
.PP
 | 
			
		||||
The table may contain white space and comment at all reasonable places.
 | 
			
		||||
| 
						 | 
				
			
			@ -661,35 +718,40 @@ Identifiers are sequences of letters, digits and the underscore ('_'),
 | 
			
		|||
beginning with a letter.
 | 
			
		||||
.PP
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
table   ->   {parameter_line} '%%;' {variable_declaration} '%%;'
 | 
			
		||||
             {entry} '%%;' user_routines.
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
A table consists of four sections, containing machine-dependent
 | 
			
		||||
constants, variable declarations, pattern rules and
 | 
			
		||||
user-supplied subroutines.
 | 
			
		||||
.PP
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
parameter_line ->  identifier value ';' .
 | 
			
		||||
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
A parameter line defines some attributes of the target machines
 | 
			
		||||
assembly code.
 | 
			
		||||
For unspecified parameters default values apply.
 | 
			
		||||
The names of the parameters and the corresponding defaults
 | 
			
		||||
are shown in table 1.
 | 
			
		||||
.DS
 | 
			
		||||
       OPC_TERMINATOR       ' '
 | 
			
		||||
       OP_SEPARATOR         ','
 | 
			
		||||
       LABEL_STARTER        'I'
 | 
			
		||||
       LABEL_TERMINATOR     ':'
 | 
			
		||||
       MAXOP                  2
 | 
			
		||||
       MAXOPLEN              25
 | 
			
		||||
       MAX_OPC_LEN           10
 | 
			
		||||
       MAXVARLEN             25
 | 
			
		||||
       MAXLINELEN           100
 | 
			
		||||
 | 
			
		||||
       table 1: parameter names and defaults
 | 
			
		||||
.TS
 | 
			
		||||
center;
 | 
			
		||||
l l.
 | 
			
		||||
OPC_TERMINATOR	' '
 | 
			
		||||
OP_SEPARATOR	','
 | 
			
		||||
LABEL_STARTER	'I'
 | 
			
		||||
LABEL_TERMINATOR	':'
 | 
			
		||||
MAXOP	2
 | 
			
		||||
MAXOPLEN	25
 | 
			
		||||
MAX_OPC_LEN	10
 | 
			
		||||
MAXVARLEN	25
 | 
			
		||||
MAXLINELEN	100
 | 
			
		||||
.TE
 | 
			
		||||
.ce 1
 | 
			
		||||
table 1: parameter names and defaults
 | 
			
		||||
.DE
 | 
			
		||||
The OPC_TERMINATOR is the character that separates the instruction
 | 
			
		||||
mnemonic from the first operand (if any).
 | 
			
		||||
| 
						 | 
				
			
			@ -717,9 +779,11 @@ the line is not optimized.
 | 
			
		|||
Optimization does, however, proceed with the rest of the input.
 | 
			
		||||
.PP
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
variable_declaration  -> identifier {',' identifier} restriction ';' .
 | 
			
		||||
 | 
			
		||||
restriction           ->  '{' anything '}' .
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
A variable declaration declares one or more string variables
 | 
			
		||||
that may be used in the patterns and in the replacements.
 | 
			
		||||
| 
						 | 
				
			
			@ -739,6 +803,7 @@ Inside the expression, the name VAL stands for the part of the actual
 | 
			
		|||
The expression may contain calls to procedures that are defined in the
 | 
			
		||||
user-routines section.
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
entry             ->  pattern '->' replacement ';' .
 | 
			
		||||
 | 
			
		||||
pattern           ->  instruction_descr
 | 
			
		||||
| 
						 | 
				
			
			@ -760,6 +825,7 @@ operand_descr     -> [ string_constant ]
 | 
			
		|||
variable_name     -> identifier .
 | 
			
		||||
 | 
			
		||||
opcode            -> anything .
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
The symbol 'white' stands for white space (space or tab).
 | 
			
		||||
An opcode can be any string not containing the special
 | 
			
		||||
| 
						 | 
				
			
			@ -783,7 +849,9 @@ which contains the mnemonic of the first instruction of the
 | 
			
		|||
rest of the input. (REST is a null-string if this mnemonic can
 | 
			
		||||
not be determined).
 | 
			
		||||
.DS
 | 
			
		||||
.ft 5
 | 
			
		||||
user_routines -> anything .
 | 
			
		||||
.ft R
 | 
			
		||||
.DE
 | 
			
		||||
The remainder of the table consists of user-defined subroutines.
 | 
			
		||||
.bp
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue