%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]) :-
content may be truncated. 'popout' for larger text window.