123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- .sp 1.5i
- .de CL
- .ft R
- c\\$1
- .ft 5
- \fIcode statement-\\$1
- .ft 5
- \fBbra *\fRexit_label
- .ft 5
- ..
- .NH
- Translation of Pascal to EM code
- .nh
- .LP
- .sp
- A short description of the translation of Pascal constructs to EM code is
- given in the following paragraphs. The EM instructions and Pascal terminal
- symbols are printed in \fBboldface\fR. A sentence in \fIitalics\fR is a
- description of a group of EM (pseudo)instructions.
- .sp
- .NH 2
- Global Variables
- .LP
- .sp
- For every global variable, a \fBbss\fR block is reserved. To enhance the
- readability of the EM-code generated, the variable-identifier is used as
- a data label to address the block.
- .sp
- .NH 2
- Expressions
- .LP
- .sp
- Operands are always evaluated, so the execution of
- .br
- .ti +3m
- \fBif\fR ( p <> nil ) \fBand\fR ( p^.value <> 0 ) \fBthen\fR .....
- .br
- might cause a run-time error, if p is equal to nil.
- .LP
- The left-hand operand of a dyadic operator is almost always evaluated before
- the right-hand side. Peculiar evaluations exist for the following cases:
- .sp
- the expression: set1 <= set2, is evaluated as follows :
- .nf
- - evaluate set2
- - evaluate set1
- - compute set2+set1
- - test set2 and set2+set1 for equality
- .fi
- .sp
- the expression: set1 >= set2, is evaluated as follows :
- .nf
- - evaluate set1
- - evaluate set2
- - compute set1+set2
- - test set1 and set1+set2 for equality
- .fi
- .sp
- Where allowed, according to the standard, constant integral expressions are
- compile-time evaluated while an effort is made to report overflow on target
- machine basis. The integral expressions are evaluated in the type \fIarith\fR.
- The size of an arith is assumed to be at least the size of the integer type
- on the target machine. If the target machine's integer size is less than the
- size of an arith, overflow can be detected at compile-time. However, the
- following call to the standard procedure new, \fInew(p, 3+5)\fR, is illegal,
- because the second parameter is not a constant according to the grammar.
- .sp
- Constant floating expressions are not compile-time evaluated, because the
- precision on the target machine and the precision on the machine on which the
- compiler runs could be different. The boolean expression \fI(1.0 + 1.0) = 2.0\fR
- could evaluate to false.
- .sp
- .NH 2
- Statements
- .NH 3
- Assignment Statement
- \fRPASCAL :
- .ti +3m
- \f5(variable-access | function-identifier) \fB:=\f5 expression
- \fREM :
- .nf
- .in +3m
- .ft I
- evaluate expression
- store in variable-access or function-identifier
- .ft R
- .in -3m
- .fi
- In case of a function-identifier, a hidden temporary variable is used to
- keep the function result.
- .bp
- .NH 3
- Goto Statement
- \fRPASCAL :
- .ti +3m
- \fBGOTO\f5 label
- \fREM :
- .in +3m
- Two cases can be distinguished :
- .br
- - local goto,
- .ti +2m
- in which a \fBbra\fR is generated.
- - non-local goto,
- .in +2m
- .ll -1i
- a goto_descriptor is build, containing the ProgramCounter of the instruction
- jumped to and an offset in the target procedure frame which contains the
- value of the StackPointer after the jump. The code for the jump itself is to
- load the address of the goto_descriptor, followed by a push of the LocalBase
- of the target procedure and a \fBcal\fR $_gto. A message is generated to
- indicate that a procedure or function contains a statement which is the
- target of a non-local goto.
- .ll +1i
- .in -2m
- .in -3m
- .sp 2
- .NH 3
- If Statement
- \fRPASCAL :
- .in +3m
- .ft 5
- \fBIF\f5 boolean-expression \fBTHEN\f5 statement
- .in -3m
- \fREM :
- .nf
- .in +3m
- \fIevaluation boolean-expression
- \fBzeq \fR*exit_label
- \fIcode statement
- \fRexit_label
- .in -3m
- .fi
- .sp 2
- \fRPASCAL :
- .in +3m
- .ft 5
- \fBIF\f5 boolean-expression \fBTHEN\f5 statement-1 \fBELSE\f5 statement-2
- .in -3m
- \fREM :
- .nf
- .in +3m
- \fIevaluation boolean-expression
- \fBzeq \fR*else_label
- \fIcode statement-1
- \fBbra \fR*exit_label
- \fRelse_label
- \fIcode statement-2
- \fRexit_label
- .in -3m
- .fi
- .sp 2
- .NH 3
- Repeat Statement
- \fRPASCAL :
- .in +3m
- .ft 5
- \fBREPEAT\f5 statement-sequence \fBUNTIL\f5 boolean-expression
- .in -3m
- \fREM :
- .nf
- .in +3m
- \fRrepeat_label
- \fIcode statement-sequence
- \fIevaluation boolean-expression
- \fBzeq\fR *repeat_label
- .in -3m
- .fi
- .bp
- .NH 3
- While Statement
- \fRPASCAL :
- .in +3m
- .ft 5
- \fBWHILE\f5 boolean-expression \fBDO\f5 statement
- .in -3m
- \fREM :
- .nf
- .in +3m
- \fRwhile_label
- \fIevaluation boolean-expression
- \fBzeq\fR *exit_label
- \fIcode statement
- \fBbra\fR *while_label
- \fRexit_label
- .in -3m
- .fi
- .sp 2
- .NH 3
- Case Statement
- .LP
- .sp
- The case-statement is implemented using the \fBcsa\fR and \fBcsb\fR
- instructions.
- \fRPASCAL :
- .in +3m
- \fBCASE\f5 case-expression \fBOF\f5
- .in +5m
- case-constant-list-1 \fB:\f5 statement-1 \fB;\f5
- .br
- case-constant-list-2 \fB:\f5 statement-2 \fB;\f5
- .br
- \&.
- .br
- \&.
- .br
- case-constant-list-n \fB:\f5 statement-n [\fB;\f5]
- .in -5m
- \fBEND\fR
- .in -3m
- .sp 2
- .LP
- .ll -1i
- The \fBcsa\fR instruction is used if the range of the case-expression
- value is dense, i.e.
- .br
- .ti +3m
- \f5( upperbound \- lowerbound ) / number_of_cases\fR
- .br
- is less than the constant DENSITY, defined in the file \fIdensity.h\fR.
- If the range is sparse, a \fBcsb\fR instruction is used.
- .ll +1i
- \fREM :
- .nf
- .in +3m
- \fIevaluation case-expression
- \fBbra\fR *l1
- .CL 1
- .CL 2
- .
- .
- .CL n
- .ft R
- \&.case_descriptor
- .ft 5
- \fIgeneration case_descriptor
- \fRl1
- .ft 5
- \fBlae\fR .case_descriptor
- .ft 5
- \fBcsa\fR size of (case-expression)
- \fRexit_label
- .in -3m
- .fi
- .bp
- .NH 3
- For Statement
- \fRPASCAL :
- .in +3m
- .ft 5
- \fBFOR\f5 control-variable \fB:=\f5 initial-value (\fBTO\f5 | \fBDOWNTO\f5) final-value \fBDO\f5 statement
- .ft R
- .in -3m
- The initial-value and final-value are evaluated at the beginning of the loop.
- If the values are not constant, they are evaluated once and stored in a
- temporary.
- EM :
- .nf
- .in +3m
- \fIload initial-value
- \fIload final-value
- \fBbgt\fR exit-label (* DOWNTO : \fBblt\fI exit-label\fR *)
- \fIload initial-value
- \fRl1
- \fIstore in control-variable
- \fIcode statement
- \fIload control-variable
- \fBdup\fI control-variable
- \fIload final-value
- \fBbeq\fR exit_label
- \fBinc\fI control-variable\fR (* DOWNTO : \fBdec\fI control-variable\fR *)
- \fBbra *\fRl1
- \fRexit_label
- .in -3m
- .fi
- Note: testing must be done before incrementing(decrementing) the
- control-variable,
- .br
- \h'\w'Note: 'u'because wraparound could occur, which could lead to an infinite
- loop.
- .sp 2
- .NH 3
- With Statement
- \fRPASCAL :
- .ti +3m
- \fBWITH\f5 record-variable-list \fBDO\f5 statement
- .ft R
- The statement
- .ti +3m
- \fBWITH\fR r\s-3\d1\u\s0, r\s-3\d2\u\s0, ..., r\s-3\dn\u\s0 \fBDO\f5 statement
- .ft R
- is equivalent to
- .in +3m
- \fBWITH\fR r\s-3\d1\u\s0 \fBDO\fR
- \fBWITH\fR r\s-3\d2\u\s0 \fBDO\fR
- ...
- \fBWITH\fR r\s-3\dn\u\s0 \fBDO\f5 statement
- .ft R
- .in -3m
- The translation of
- .ti +3m
- \fBWITH\fR r\s-3\d1\u\s0 \fBDO\f5 statement
- .br
- .ft R
- is
- .nf
- .in +3m
- \fIpush address of r\s-3\d1\u\s0
- \fIstore address in temporary
- \fIcode statement
- .in -3m
- .fi
- .ft R
- An occurrence of a field is translated into:
- .in +3m
- \fIload temporary
- .br
- \fIadd field-offset
- .in -3m
- .bp
- .NH 2
- Procedure and Function Calls
- .ft R
- In general, the call
- .ti +5m
- p(a\s-3\d1\u\s0, a\s-3\d2\u\s0, ...., a\s-3\dn\u\s0)
- .br
- is translated into the sequence:
- .in +5m
- .nf
- \fIevaluate a\s-3\dn\u\s0
- \&.
- \&.
- \fIevaluate a\s-3\d2\u\s0
- \fIevaluate a\s-3\d1\u\s0
- \fIpush localbase
- \fBcal\fR $p
- \fIpop parameters
- .ft R
- .fi
- .in -5m
- i.e. the order of evaluation and binding of the actual-parameters is from
- right to left. In general, a copy of the actual-parameter is made when the
- formal-parameter is a value-parameter. If the formal-parameter is a
- variable-parameter, a pointer to the actual-parameter is pushed.
- In case of a function call, a \fBlfr\fR is generated, which pushes the
- function result on top of the stack.
- .sp 2
- .NH 2
- Register Messages
- .ft R
- A register message can be generated to indicate that a local variable is never
- referenced indirectly. This implies that a register can be used for a variable.
- We distinguish the following classes, given in decreasing priority:
- \(bu control-variable and final-value of a for-statement
- .br
- .ti +5m
- to speed up testing, and execution of the body of the for-statement
- .sp
- \(bu record-variable of a with-statement
- .br
- .ti +5m
- to improve the field selection of a record
- .sp
- \(bu remaining local variables and parameters
- .sp 2
- .NH 2
- Compile-time optimizations
- .ft R
- The only optimization that is performed is the evaluation of constant
- integral expressions. The optimization of constructs like
- .ti +5m
- \fBif\f5 false \fBthen\f5 statement\fR,
- .br
- is left to either the peephole optimizer, or a global optimizer.
|