Update for single buffer rather that queues
This commit is contained in:
parent
6614384f3c
commit
f5681a4234
1 changed files with 68 additions and 33 deletions
101
doc/nopt.doc
101
doc/nopt.doc
|
@ -24,7 +24,7 @@ module interface but with routine names of the form
|
|||
.BI C_ xxx
|
||||
replaced by names like
|
||||
.BI O_ xxx.
|
||||
Furthermore there is also routine
|
||||
Furthermore there is also no routine
|
||||
.I O_getid
|
||||
and no variable
|
||||
.I O_tmpdir
|
||||
|
@ -288,6 +288,37 @@ the insertpart mechanism in the
|
|||
.I EM_OPT
|
||||
) module.
|
||||
The removal of dead code is performed by the global optimizer.
|
||||
Various
|
||||
.I ext_functions
|
||||
available in the old tables are no longer available as they rely on
|
||||
information that is not available to the current program.
|
||||
These are the
|
||||
.I notreg
|
||||
and the
|
||||
.I rom
|
||||
functions.
|
||||
The previous optimizer allowed the use of
|
||||
.I LLP,
|
||||
.I LEP,
|
||||
.I SLP
|
||||
and
|
||||
.I SEP
|
||||
in patterns. For example
|
||||
.I LLP
|
||||
stood for either
|
||||
.I lol
|
||||
if the pointer size was the same as the word size, or for
|
||||
.I ldl
|
||||
if the pointer size was twice the word size.
|
||||
In the current optimizer it is necessary to include two patterns for each
|
||||
such single pattern in the old table. For example for a pattern containing
|
||||
.I LLP
|
||||
there would be one pattern with
|
||||
.I lol
|
||||
and with a global restriction of the form
|
||||
.I p=w
|
||||
and another pattern with ldl and a global restriction of the form
|
||||
.I p=2*w.
|
||||
|
||||
.NH
|
||||
The Parser
|
||||
|
@ -303,7 +334,7 @@ Lex sources file defining form of tokens in table.
|
|||
.IP initlex.c 15
|
||||
Uses the data in the library
|
||||
.I em_data.a
|
||||
to initialize the lexical analyser to recognize EM instruction mnemonics.
|
||||
to initialize the lexical analyzer to recognize EM instruction mnemonics.
|
||||
.IP outputdfa.c 15
|
||||
Routines to output the dfa when it has been constructed. It outputs the files
|
||||
.I dfa.c
|
||||
|
@ -375,6 +406,10 @@ queue containing instructions that match the current prefix, and a
|
|||
.I backup
|
||||
queue of instructions that have been backed up over and need to be reparsed
|
||||
for further pattern matches.
|
||||
These three queues are maintained in a single fixed size buffer as explained
|
||||
in more detail in the next section.
|
||||
Also, after a successful match, a replacement queue is constructed.
|
||||
|
||||
|
||||
.LP
|
||||
If no errors are detected by the parser in the tables it output the following
|
||||
|
@ -422,7 +457,7 @@ patterns at all then the dfa routine is called to flush any current queued
|
|||
output and the the output
|
||||
.BI C_ xxx
|
||||
routine is called. If the EM instruction does appear in a pattern then the
|
||||
instruction data structure is allocated, (from the free list), its fields
|
||||
instruction data structure fields are
|
||||
initialized and it is added onto the end of the pattern queue.
|
||||
The dfa routines are then called to attempted to make a transition.
|
||||
This file is input to the
|
||||
|
@ -464,10 +499,10 @@ the backup queue is empty.
|
|||
.IP mkstrct.c 10
|
||||
contains routines to build the data structure from the input
|
||||
.BI C_ xxx
|
||||
routines and place the structure on the pattern queue. These routines are not
|
||||
required in the stand alone optimizer.
|
||||
routines and place the structure on the pattern queue. These routines are also
|
||||
used to build the data structures when a replacement is constructed.
|
||||
.IP aux.c 10
|
||||
routines to implement the functions used in the rules.
|
||||
routines to implement the external functions used in the pattern table.
|
||||
|
||||
.LP
|
||||
The following files are also used in building the module library:
|
||||
|
@ -491,42 +526,42 @@ EM instructions. It is also processed by
|
|||
.NH
|
||||
Miscellaneous Issues
|
||||
.LP
|
||||
The output and backup queues are maintained on fixed length arrays
|
||||
of pointers the the
|
||||
The output, pattern and backup queues are maintained in fixed length array,
|
||||
.I OO_buffer
|
||||
allocated of size
|
||||
.I MAXBUFFER
|
||||
(a constant declared in nopt.h) at run time.
|
||||
It consists of an array of the
|
||||
.I e_instr
|
||||
data structure used by the
|
||||
.I READ_EM(3)
|
||||
module.
|
||||
The size of these queues are fixed in size according to the
|
||||
values of
|
||||
.I MAXOUTPUT
|
||||
At any time the pointers
|
||||
.I OO_patternqueue
|
||||
and
|
||||
.I MAXBACKUP
|
||||
defined in the file
|
||||
.I nopt.c.
|
||||
The size of the pattern queue is set to the length of the maximum pattern
|
||||
length by the tables output by the parser.
|
||||
The space for the structures are initially obtained by calls to
|
||||
.I Malloc
|
||||
(from the
|
||||
.I alloc(3)
|
||||
module),
|
||||
and freed when the output queue or patterns queue is cleared. These freed
|
||||
structures are collected on the free list and reused to avoid the overheads
|
||||
of repeated calls to
|
||||
.I malloc
|
||||
.I OO_nxtpatt
|
||||
point to the beginning and end of the current pattern prefix that corresponds
|
||||
to the current state. Any instructions on the backup queue are between
|
||||
.I OO_nxtpatt
|
||||
and
|
||||
.I free.
|
||||
.I OO_endbackup.
|
||||
If there are no instructions on the backup queue then
|
||||
.I OO_endbackup
|
||||
will be 0 (zero).
|
||||
The size of the replacement queue is set to the length of the maximum
|
||||
replacement length by the tables output by the parser.
|
||||
|
||||
.LP
|
||||
The fixed size of the output and pattern queues causes no difficulty in
|
||||
The fixed size of the buffer causes no difficulty in
|
||||
practice and can only result in some potential optimizations being missed.
|
||||
When the output queue fills it is simply prematurely flushed and backups
|
||||
when the backup queue is fill are simply ignored. A possible improvement
|
||||
would be to flush only part of the output queue when it fills. It should
|
||||
be noted that it is not possible to statically determine the maximum possible
|
||||
size for these queues as they need to be unbounded in the worst case. A
|
||||
study of the rule
|
||||
When space for a new instruction is required and the buffer is full the
|
||||
routine
|
||||
.I OO_halfflush
|
||||
is called to flush half the buffer and move all the data structures left.
|
||||
It should be noted that it is not possible to statically determine the
|
||||
maximum possible size for these queues as they need to be unbounded in
|
||||
the worst case.
|
||||
A study of the rule
|
||||
.DS
|
||||
.I
|
||||
inc dec :
|
||||
|
|
Loading…
Reference in a new issue