peephole.pl

loading
details
attribute value
description
owner Johannes Waldmann
uploaded 2017-08-17 03:45:08.0
disk size 10.12 KB
downloadable true
type
attribute value
name no_type
processor id 1
description this is the default benchmark type for rejected benchmarks and benchmarks that are not associated with a type.
owning community none
loading contents
%query: peephole_opt(i,o).

%------------------------------------------------------------------------------
%	Benchmark Program - SB-Prolog "peephole" optimizer
%
%	Author: 
%	Date: 
%
%	To run: peephole_opt(In,Out).
%------------------------------------------------------------------------------
% exported: peephole_opt/2, with mode < ++, - >

%:- entry(peephole_opt(g,f)).

peephole_opt(Pil, OptPil) :-
		popt1(Pil, Pil1),
		popt2(Pil1, Pil2),
		popt3(Pil2,Pil3),
		popt4(Pil3,_N,OptPil).

popt1([], []).
popt1([Inst|Rest], Pil1) :- popt11(Inst, Rest, Pil1).
popt1([Inst|Rest], Pil1) :- not(popt11(Inst,Rest,Pil)), 
			    Pil1 = [Inst|Pil], popt1(Rest,Pil).

popt11(puttvar(T,R), [getstr(S,R)|PilRest], [putstr(S,T)|OptPilRest]) :-
		popt1a(PilRest, OptPilRest).
popt11(movreg(T,R), [getstr(S,R)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [getstr(S,T)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),getstr(S,R)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(movreg(T,R), [puttbreg(R)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [puttbreg(T)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),puttbreg(R)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(movreg(T,R), [addreg(R,S)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [addreg(T,S)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),addreg(R,S)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(movreg(T,R), [subreg(R,S)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [subreg(T,S)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),subreg(R,S)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(movreg(T,R), [mulreg(R,S)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [mulreg(T,S)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),mulreg(R,S)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(movreg(T,R), [divreg(R,S)|PilRest], OptInstList) :-
		((peep_chk(PilRest,R),
		  OptInstList = [divreg(T,S)|OptPilRest]
		 ) ;
		 (not(peep_chk(PilRest,R)),
		  OptInstList = [movreg(T,R),divreg(R,S)|OptPilRest]
		 )
		),
		popt1(PilRest, OptPilRest).
popt11(putpvar(V,R), [getpval(V,R)|PilRest], [putpvar(V,R)|OptPilRest]) :-
		popt1(PilRest, OptPilRest).
popt11(putpval(V,R), [getstr(Str,R)|PilRest], [getstrv(Str,V)|OptPilRest]) :-
		not(Str = ('.',2)),		/* to enable list opt */
		popt1(PilRest, OptPilRest).
popt11(putpvar(V,R), [getstr(Str,R)|PilRest], [putstrv(Str,V)|OptPilRest]) :-
		not(Str = ('.',2)),		/* to enable list opt */
		popt1a(PilRest, OptPilRest).
popt11(gettval(R,R), PRest,OptPRest) :- popt1(PRest, OptPRest).
popt11(movreg(R,R), PRest,OptPRest) :- popt1(PRest, OptPRest).
popt11(jump(L), [label(L)|PRest],  [label(L)|OptPRest]) :-
		popt1(PRest,OptPRest).
popt11(jump(Addr), [jump(_N)|PRest],  [jump(Addr)|OptPRest]) :-
		popt1(PRest,OptPRest).
popt11(jumpz(_N,L), [label(L)|PRest],  [label(L)|OptPRest]) :-
		popt1(PRest,OptPRest).
popt11(jumpnz(_N,L), [label(L)|PRest],  [label(L)|OptPRest]) :-
		popt1(PRest,OptPRest).
popt11(jumplt(_N,L), [label(L)|PRest],  [label(L)|OptPRest]) :-
popout

content may be truncated. 'popout' for larger text window.

actions get anonymous link download benchmark