V10/cmd/spitbol/optmov.spt
-IN80
-TITLE OPTIMISE OUT REDUNDANT MOV OPS FROM MACRO SOURCE
-STITL PREAMBLE
*
* This Spitbol program is a quick&dirty pass over the
* translated Minimal source (MACRO-32) to remove the
* unneeded MOVL instructions. The unneeded MOVL instructions are
* those which move into a register or memory location, and are
* immediately followed by an unlabelled opcode ***L2 that can
* be converted into ***L3 form, that is operating on the same register
*
* This is not recommended, as the ***L3 form seems to be slower!
*
* Steve Duff August 1980
*
-STITL INITIALIZATION
&STLIMIT = 10000000; &TRIM = 1; &ANCHOR = 1
ARITHOPCODES = 'ADDL2' | 'SUBL2' | 'MULL2' | 'DIVL2' |
+ 'BISL2' | 'BICL2' | 'XORL2'
OPTRANS = TABLE(19)
OPTRANS['ADDL2'] = 'ADDL3'; OPTRANS['SUBL2'] = 'SUBL3'
OPTRANS['MULL2'] = 'MULL3'; OPTRANS['DIVL2'] = 'DIVL3'
OPTRANS['BISL2'] = 'BISL3'; OPTRANS['BICL2'] = 'BICL3'
OPTRANS['XORL2'] = 'XORL3'
SB = SPAN(' ')
LABEL = LEN(5) '::'
OPTPATT = ((LABEL | '') SB) . LAB 'MOVL' SB BREAK(',') . OP1 LEN(1)
+ (BREAK(' ') | REM) . OP2
ARITHPATT = SB ARITHOPCODES . OPCODE SB BREAK(',') . OP1A LEN(1)
+ *OP2 ((SB | RPOS(0)) REM) . COMMENT
TERMINAL = 'Enter name of file (including extension).'
FILENAME = TERMINAL
INPUT(.INFILE,1,FILENAME) :F(END)
OUTPUT(.OUTFILE,2,FILENAME)
LOOP
CARD1 = INFILE :F(EXIT)
CARD1 ANY(';') :S(FLUSH1)
CARD1 OPTPATT :F(FLUSH1)
CARD2 = INFILE :F(HUH)
CARD2 ARITHPATT :F(FLUSH2)
OP2 ('-' | (RTAB(1) '+')) :S(FLUSH2)
TERMINAL = CARD1; TERMINAL = CARD2
OUTFILE = LAB OPTRANS[OPCODE] ' ' OP1A ',' OP1 ',' OP2 COMMENT
TERMINAL = OUTFILE
TERMINAL =
COUNT = COUNT + 1
:(LOOP)
FLUSH1 OUTFILE = CARD1 :(LOOP)
FLUSH2 OUTFILE = CARD1
OUTFILE = CARD2 :(LOOP)
EXIT TERMINAL = COUNT + 0 ' MOVL OPCODES REMOVED.'
END