V10/cmd/spitbol/vaxpo1.spt

-title VAXPO1: VAX Peephole Optimizer 1 - Eliminate Redundant TSTLs
-in80
*
*	VAXPO1 removes redundant TSTL instructions of an operand
*	modified by the previous instruction.
*
	&anchor	= 1
	&stlimit = 10000000
*
*	Set up patterns to rip apart statements.
*
	tab	= substr( &alphabet,10,1 )
	sep	= tab ' '
	letters	= 'abcdefghijklmnopqrstuvwxyz23'
	label	= break( ':' ) ':' | ''
	eos	= span( sep ) | '#' | rpos( 0 )
	fmtop	= label span( sep ) 
+			span( letters ) . op  span( sep )
+			( break( sep '#' ) | rem ) . dst  eos
	tstpat	= span( sep ) 'tstl' span( sep ) *dst 
+			(eos rem) . cmnt
*
*	Read in opcodes of instructions that set the condition codes
*
	optbl	= table()
oploop	line	= input
	line	? '+'				:s(oploopx)
	line	? break( sep ) . op span( sep ) rem . n
	optbl[op] = +n				:(oploop)
oploopx
*
*	Set up i/o associations.
*
	infile	= input
	input( .in,0,infile )
	terminal = 'Input file: ' infile
	terminal =
	outfile	= input
	output( .out,1,outfile )
	terminal = 'Output file ' outfile
	terminal =
	logfile	= input
	output( .output,2,logfile )
	terminal = 'Log file: ' logfile
*
*	Check next line for possibly preceding a redunant TSTL.
*
optloop	line	= in				:f(eof)
	leq( substr( line,1,1 ),'#' )		:s(write)
optl1	line	? fmtop				:f(write)
	differ( n = optbl[op] )			:f(write)
	dst	? *eq( n,2 ) break( ',' ) len( 1 ) =
	dst	? *eq( n,3 ) break( ',' ) len( 1 ) =
	out	= line
*
*	Dst contains destination operand from previous instruction.
*	So, check now for a TSTL of that operand.
*
	line	= in				:f(eof)
	line	? tstpat			:f(optl1)
	output	= tab out
	opt	= opt + 1
	output	= '#--->' tab line
	line	= in cmnt
	output	= tab line
	output	=
*
write	out	= line				:(optloop)
*
eof	output	= opt ' redundant TSTL instructions removed'
end
addl2	2
ashl	3
bicl2	2
bisl2	2
decl	1
incl	1
movl	2
subl2	2
xorl2	2
+
spitv35.src
spitv35.serr
opttsts