From: Armin R. <ar...@us...> - 2003-09-23 15:44:06
|
Update of /cvsroot/psyco/psyco/c/ivm/prolog In directory sc8-pr-cvs1:/tmp/cvs-serv8380/c/ivm/prolog Modified Files: Makefile ccode.pl insns.pl optimize.pl samelines.py vm.pl vmwriter.pl Log Message: more work on ivm -- WARNING, still in progres Index: Makefile =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/Makefile,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** Makefile 5 Sep 2003 21:42:12 -0000 1.2 --- Makefile 23 Sep 2003 15:43:57 -0000 1.3 *************** *** 13,17 **** GENERATED = insns-switch.i insns-threaded.i insns-igen.i insns-igen-h.i \ insns-table.py ! # insns-threaded-rel.i --- 13,18 ---- GENERATED = insns-switch.i insns-threaded.i insns-igen.i insns-igen-h.i \ insns-table.py ! # insns-threaded-rel.i ! TEMP = optimize.tmp *************** *** 19,48 **** clean: ! -rm $(GENERATED) default: $(addsuffix .default,$(GENERATED) mode_combine.pl) ! %-switch.i: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(modes, switch)" -t halt > $@ ! ! %-threaded-rel.i: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(modes, threaded(relative))" -t halt > $@ ! ! %-threaded.i: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(modes, threaded(absolute))" -t halt > $@ ! ! %-immed.i: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(modes, single([immed(int)]))" -t halt > $@ ! ! %-igen.i: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(insns, functions('DEFINEFN '))" -t halt > $@ - %-igen-h.i: %.pl $(VMWRITER) - pl -f $< -g "main_emit(insns, headers('EXTERNFN '))" -t halt > $@ ! %-table.py: %.pl $(VMWRITER) ! pl -f $< -g "main_emit(pytable)" -t halt > $@ %.default: % cp $< $@ --- 20,58 ---- clean: ! rm -f $(GENERATED) $(TEMP) default: $(addsuffix .default,$(GENERATED) mode_combine.pl) + minimal: empty_mode_combine all ! empty_mode_combine: ! -rm mode_combine.pl ! touch mode_combine.pl ! $(GENERATED): insns.pl $(VMWRITER) ! pl -f insns.pl -g main_emit -t halt %.default: % cp $< $@ + + #%-switch.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(modes, switch)" -t halt > $@ + # + #%-threaded-rel.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(modes, threaded(relative))" -t halt > $@ + # + #%-threaded.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(modes, threaded(absolute))" -t halt > $@ + # + #%-immed.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(modes, single([immed(int)]))" -t halt > $@ + # + #%-igen.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(insns, functions('DEFINEFN '))" -t halt > $@ + # + #%-igen-h.i: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(insns, headers('EXTERNFN '))" -t halt > $@ + # + #%-table.py: %.pl $(VMWRITER) + # pl -f $< -g "main_emit(pytable)" -t halt > $@ Index: ccode.pl =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/ccode.pl,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** ccode.pl 19 Sep 2003 11:28:19 -0000 1.2 --- ccode.pl 23 Sep 2003 15:43:57 -0000 1.3 *************** *** 262,263 **** --- 262,274 ---- code_simplify1(Code1, Code2), !. + + + trivial_c_arg(Term) :- var(Term). + trivial_c_arg(Term) :- Term =.. [_]. + + trivial_c_op(X=Y) :- trivial_c_arg(X), trivial_c_arg(Y). + trivial_c_op(extra_assert(_)). + + codecost(block_locals(_, L), Cost) :- + closelist(L, FlatL), + countsuccesses((member(X, FlatL), \+trivial_c_op(X)), Cost). Index: insns.pl =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/insns.pl,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** insns.pl 19 Sep 2003 11:28:19 -0000 1.2 --- insns.pl 23 Sep 2003 15:43:57 -0000 1.3 *************** *** 5,19 **** unary_insn(not). unary_insn(inv). ! unary_insn(nego, '-'). ! overflow_flag(nego). ! unary_insn(abso). ! overflow_flag(abso). ! binary_insn(addo, '+'). ! overflow_flag(addo). ! binary_insn(subo, '-'). ! overflow_flag(subo). ! binary_insn(mulo, '*'). ! overflow_flag(mulo). binary_insn(or). binary_insn(and). --- 5,20 ---- unary_insn(not). unary_insn(inv). ! unary_insn(neg_o, '-'). ! overflow_flag(neg_o). ! unary_insn(abs_o). ! overflow_flag(abs_o). ! binary_insn(add, '+'). ! binary_insn(add_o, '+'). ! overflow_flag(add_o). ! binary_insn(sub_o, '-'). ! overflow_flag(sub_o). ! binary_insn(mul_o, '*'). ! overflow_flag(mul_o). binary_insn(or). binary_insn(and). *************** *** 22,31 **** binary_insn(lshift, '<<'). binary_insn(rshift, '>>'). ! insn(urshift, [], [out(0)=(unsigned(in(1))>>in(0))], [stack(2->1)]). ! insn(cmpeq, [], [out(0)=(in(1)=:=in(0))], [stack(2->1)]). ! insn(cmplt, [], [out(0)=(in(1) < in(0))], [stack(2->1)]). ! insn(cmpltu, [], [out(0)=(unsigned(in(1)) < unsigned(in(0)))], [stack(2->1)]). ! insn(pop, [], [], [stack(pop(0))]). % note: this is the same as s_pop(0) %insn(pop2nd, [], [], [stack(pop(1))]). insn(settos, [s], [], [stack(settos), nonchainable]). --- 23,33 ---- binary_insn(lshift, '<<'). binary_insn(rshift, '>>'). ! insn(urshift, [], [out(0)=(unsigned(in(1))>>in(0))], [stack(2->1)]). ! insn(cmpeq, [], [setflag=(in(1)=:=in(0))], [flag(set), stack(2->0)]). ! insn(cmplt, [], [setflag=(in(1) < in(0))], [flag(set), stack(2->0)]). ! insn(cmpltu, [], [setflag=(unsigned(in(1)) < unsigned(in(0)))], ! [flag(set), stack(2->0)]). ! %insn(pop, [], [], [stack(pop(0))]). % note: this is the same as s_pop(0) %insn(pop2nd, [], [], [stack(pop(1))]). insn(settos, [s], [], [stack(settos), nonchainable]). *************** *** 37,46 **** insn(ref_push, [i], [out(0) = addr(stack_nth(arg(0)-stkshft))], [stack(push)]). insn(stackgrow, [], [impl_stackgrow('VM_EXTRA_STACK_SIZE')], []). insn(assertdepth, [i], [comment('debugging assertion')], []). ! insn(jcondnear,[b], [impl_jcond(in(0), nextip+arg(0))], ! [stack(pop), nonchainable]). ! insn(jcondfar, [l], [impl_jcond(in(0), arg(0))], [stack(pop), nonchainable]). ! insn(jumpfar, [l], [impl_jump(arg(0))], [nonchainable]). insn(cbuild1, [l], [impl_cbuild1(arg(0))], [nonchainable]). --- 39,52 ---- insn(ref_push, [i], [out(0) = addr(stack_nth(arg(0)-stkshft))], [stack(push)]). insn(stackgrow, [], [impl_stackgrow('VM_EXTRA_STACK_SIZE')], []). + insn(assertdepth, [i], [comment('debugging assertion')], []). + insn(dynamicfreq, [l], [impl_dynamicfreq], [nonchainable]). ! insn(flag_push, [], [out(0)=flag], [stack(push), flag(get)]). ! insn(flag_pop, [], [setflag=in(0)], [stack(pop), flag(set)]). ! insn(flag_forget, [],[], [flag(get), suffixonly]). ! insn(jcondnear,[b], [impl_jcond(flag, nextip+arg(0))],[nonchainable,flag(get)]). ! insn(jcondfar, [l], [impl_jcond(flag, arg(0))], [nonchainable,flag(get)]). ! insn(jumpfar, [l], [impl_jump(arg(0))], [nonchainable]). insn(cbuild1, [l], [impl_cbuild1(arg(0))], [nonchainable]). *************** *** 61,68 **** insn(decrefnz, [l], [impl_decrefnz(arg(0))], []). ! insn(exitframe, [], [impl_exitframe(in(2), in(1), in(0))], [stack(3->0)]). ! insn(ret, [s], [impl_ret(in(0))], [stack(settos), nonchainable]). ! insn(retval, [], [retval=in(0)], [stack(pop)]). ! insn(pushretval,[], [out(0)=retval], [stack(push)]). insn(pyenter, [l], [impl_pyenter(arg(0))], []). % enter a Python sub-function --- 67,74 ---- insn(decrefnz, [l], [impl_decrefnz(arg(0))], []). ! insn(exitframe, [], [impl_exitframe(in(2), in(1), in(0))], [stack(3->0)]). ! insn(ret, [s], [impl_ret(in(0))], [stack(settos), nonchainable]). ! insn(retval, [], [retval=in(0)], [stack(pop)]). ! insn(pushretval,[], [out(0)=retval], [stack(push)]). insn(pyenter, [l], [impl_pyenter(arg(0))], []). % enter a Python sub-function *************** *** 83,88 **** string_to_atom(SInsn, CallInsn). ! insn(checkdict, [l,l,l,l,l], [impl_checkdict(arg(0), arg(1), arg(2), ! arg(3), arg(4))], [nonchainable]). --- 89,94 ---- string_to_atom(SInsn, CallInsn). ! insn(checkdict, [l,l,l,l], [setflag=impl_checkdict(arg(0), arg(1), arg(2), ! arg(3))], [flag(set)]). Index: optimize.pl =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/optimize.pl,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** optimize.pl 5 Sep 2003 21:42:12 -0000 1.3 --- optimize.pl 23 Sep 2003 15:43:57 -0000 1.4 *************** *** 1,6 **** :- consult(insns). :- dynamic psycodump/1, stackpush/2. ! :- dynamic frequency/2, bestmodes/1, dynsubmodes/2, residualfreq/2. ! :- dynamic rfhash/1. --- 1,6 ---- :- consult(insns). :- dynamic psycodump/1, stackpush/2. ! :- dynamic frequency/2, subfrequency/3, bestmodes/1, removefreq/2. ! :- index(subfrequency(1,1,0)). *************** *** 15,18 **** --- 15,22 ---- read(Filename), seen, + loaddumpfile(Filename). + + loaddumpfile(Filename) :- + write('loading '), write(Filename), write('...'), nl, see(Filename), load_rec, *************** *** 20,24 **** measure(MaxLength) :- ! tell(pipe('python samelines.py "frequency(%s, %d)." > optimize.tmp')), ( L1 = [_,_|_], --- 24,29 ---- measure(MaxLength) :- ! write('measuring code sequence frequencies...'), nl, ! tell(pipe('python samelines.py "frequency(\'%s\', %d)." > optimize.tmp')), ( L1 = [_,_|_], *************** *** 27,34 **** write(L), nl, fail ! ) ; told, retractall(frequency(_,_)), ! loadmeasures. loadmeasures :- --- 32,49 ---- write(L), nl, fail ! ; ! told, ! write('measuring subsequence frequencies...'), nl, ! tell(pipe('python samelines.py "subfrequency(\'%s\', %d)." >> optimize.tmp')), ! ( ! L1 = [_,_|_], ! gcodesubslice(SubG, G, MaxLength), ! write(SubG), write('\', \''), write(G), nl, ! fail ! ; told, retractall(frequency(_,_)), ! retractall(subfrequency(_,_,_)), ! loadmeasures)). loadmeasures :- *************** *** 43,53 **** MaxLen is HighestOpcode - NbBaseOpcodes, retractall(bestmodes(_)), ! retractall(dynsubmodes(_,_)), ! retractall(residualfreq(_,_)), ! retractall(rfhash(_)), allranks(AllRanks), workcostsrec(MaxLen, AllRanks). - show :- bestmodes(X), --- 58,65 ---- MaxLen is HighestOpcode - NbBaseOpcodes, retractall(bestmodes(_)), ! retractall(removefreq(_,_)), allranks(AllRanks), workcostsrec(MaxLen, AllRanks). show :- bestmodes(X), *************** *** 56,59 **** --- 68,75 ---- true. + emitmodes(HighestOpcode) :- + buildcosts(HighestOpcode), + emitmodes. + emitmodes :- initial_stack(InitialStack), *************** *** 63,67 **** ( enumerate(bestmodes(Mode), Opcode, FirstOpcode), ! write(mode_combine(Mode)), write('. % '), write(Opcode), --- 79,84 ---- ( enumerate(bestmodes(Mode), Opcode, FirstOpcode), ! atom_to_term(Mode, RealMode), ! write(mode_combine(RealMode)), write('. % '), write(Opcode), *************** *** 78,81 **** --- 95,102 ---- % joinlist(basemodes, L1, L2). + :- det(atom_to_term/2). + atom_to_term(Atom, Term) :- + atom_to_term(Atom, Term, []). + load_rec :- read(Term), *************** *** 89,106 **** codeslice(L1, MaxLength) :- psycodump(L), ! subchainable(L, L1, MaxLength). ! subchainable(L, L1, MaxLength) :- ! subchainable1(L, L1, MaxLength). ! subchainable([_|Tail], L1, MaxLength) :- ! subchainable(Tail, L1, MaxLength). ! subchainable1([X|_], [X], _). ! subchainable1([X1,X2|Xs], [X1,X2|Ys], MaxLength) :- ! MaxLength > 1, ! X1 =.. [Insn | _], ! chainable(Insn), N is MaxLength-1, ! subchainable1([X2|Xs], [X2|Ys], N). generalize(L, G) :- --- 110,159 ---- codeslice(L1, MaxLength) :- psycodump(L), ! subslice(L, L1, MaxLength). ! subslice(L, L1, MaxLength) :- ! subslice1(L, L1, MaxLength). ! subslice([_|Tail], L1, MaxLength) :- ! subslice(Tail, L1, MaxLength). ! subslice1(_, [], _). ! subslice1([X|Xs], [X|Ys], MaxLength) :- ! MaxLength > 0, N is MaxLength-1, ! subslice1(Xs, Ys, N). ! ! gcodesubslice(SubG, G, MaxLength) :- ! psycodump(L), ! findall(Gs, bagof(G1, L0^L1^L2^(between(2, MaxLength, Len), ! length(L1, Len), ! append(L0, L1, L2, L), ! generalize(L1, G1)), ! Gs), ! ByLength), ! % ByLength = [[2-slice, ...], [3-slice, ...], ... [MaxLength-slice, ...]] ! write(ByLength), nl, ! triangle_lt(ByLength, SubG, G). ! ! triangle_lt([BaseLine | ExtraLines], A, B) :- ! nth0(I, BaseLine, A), ! I1 is I-1, ! triangle_cut(ExtraLines, I1, I, B). ! triangle_lt([_ | ExtraLines], A, B) :- ! triangle_lt(ExtraLines, A, B). ! ! triangle_cut([Line1 | _], Min, Max, B) :- ! triangle_cutline(Line1, Min, Max, 0, B). ! triangle_cut([_ | Lines], Min, Max, B) :- ! Min1 is Min-1, ! triangle_cut(Lines, Min1, Max, B). ! ! triangle_cutline([Head|Tail], Min, Max, N, B) :- ! N =< Max, ! ( ! (Min =< N, Head = B) ! ; ! N1 is N+1, ! triangle_cutline(Tail, Min, Max, N1, B)). ! generalize(L, G) :- *************** *** 125,140 **** !. ! :- det(typicalexample/2). ! typicalexample(Term1, Term2) :- ! Term1 =.. [Insn | Args1], ! maplist(typicalexample_arg, Args1, Args2), ! Term2 =.. [Insn | Args2]. ! ! typicalexample_arg(char, 100). ! typicalexample_arg(int, 1000000). ! typicalexample_arg(indirect(code_t), 100). ! typicalexample_arg(indirect(word_t), 1000000). ! typicalexample_arg(_:B, B). ! typicalexample_arg(N, N) :- integer(N). --- 178,193 ---- !. ! %:- det(typicalexample/2). ! %typicalexample(Term1, Term2) :- ! % Term1 =.. [Insn | Args1], ! % maplist(typicalexample_arg, Args1, Args2), ! % Term2 =.. [Insn | Args2]. ! % ! %typicalexample_arg(char, 100). ! %typicalexample_arg(int, 1000000). ! %typicalexample_arg(indirect(code_t), 100). ! %typicalexample_arg(indirect(word_t), 1000000). ! %typicalexample_arg(_:B, B). ! %typicalexample_arg(N, N) :- integer(N). *************** *** 144,156 **** chainlist(complexity, Subterms, S, Q). - trivial_c_arg(Term) :- var(Term). - trivial_c_arg(Term) :- Term =.. [_]. - - trivial_c_op(X=Y) :- trivial_c_arg(X), trivial_c_arg(Y). - - codecost(block_locals(_, L), Cost) :- - closelist(L, FlatL), - countsuccesses((member(X, FlatL), \+trivial_c_op(X)), Cost). - modecost(Mode, Cost) :- mode_operate(Mode, Code), --- 197,200 ---- *************** *** 159,163 **** moderank(Mode, Freq, Rank) :- ! modecost(Mode, Cost), Rank is Freq/Cost. --- 203,208 ---- moderank(Mode, Freq, Rank) :- ! atom_to_term(Mode, RealMode), ! modecost(RealMode, Cost), Rank is Freq/Cost. *************** *** 165,174 **** highestrank([], Best, Best). highestrank([R1 | Tail], R2, R3) :- ! R1 = rank(Mode, _, Rank1), R2 = rank(_, _, Rank2), Rank1 > Rank2, ! hash_term(Mode, Hash), ! ((rfhash(Hash), residualfreq(Mode, Freq1m)) -> \+ bestmodes(Mode), moderank(Mode, Freq1m, Rank1m), %(Rank1m > Rank2 -> true ; --- 210,219 ---- highestrank([], Best, Best). highestrank([R1 | Tail], R2, R3) :- ! R1 = rank(Mode, Freq1, Rank1), R2 = rank(_, _, Rank2), Rank1 > Rank2, ! (removefreq(Mode, Freq1r) -> \+ bestmodes(Mode), + Freq1m is Freq1 - Freq1r, moderank(Mode, Freq1m, Rank1m), %(Rank1m > Rank2 -> true ; *************** *** 234,253 **** %forklist1([], []). ! :- det(buildnextbest/1). ! buildnextbest(AllRanks) :- highestrank(AllRanks, rank(_, _, -1), rank(FullBestMode, _, _)), ! BestMode = [_, _ | _], ( ! append(BestMode, _, FullBestMode), \+ bestmodes(BestMode), selectnextbest(AllRanks, BestMode), fail ! ) ; ! true. ! :- det(selectnextbest/1). selectnextbest(AllRanks, BestMode) :- ! CurrentBest = rank(BestMode, _, BestRank), memberchk(CurrentBest, AllRanks), write('selecting '), --- 279,306 ---- %forklist1([], []). + initialsection(SubMode, Mode) :- + atom_to_term(Mode, RealMode), + RealSubMode = [_, _ | _], + append(RealSubMode, [_|_], RealMode), + term_to_atom(RealSubMode, SubMode). ! :- det(buildnextbest/2). ! buildnextbest(AllRanks, Exhausted) :- highestrank(AllRanks, rank(_, _, -1), rank(FullBestMode, _, _)), ! (var(FullBestMode) -> ! Exhausted = true ! ; ! Exhausted = false, ( ! (initialsection(BestMode, FullBestMode) ; BestMode = FullBestMode), \+ bestmodes(BestMode), selectnextbest(AllRanks, BestMode), fail ! ; ! true)). ! :- det(selectnextbest/2). selectnextbest(AllRanks, BestMode) :- ! CurrentBest = rank(BestMode, BestFreq, BestRank), memberchk(CurrentBest, AllRanks), write('selecting '), *************** *** 255,298 **** nl, assertz(bestmodes(BestMode)), ! (residualfreq(BestMode, ResidualFreq) -> moderank(BestMode, ResidualFreq, EffectiveRank) ; EffectiveRank = BestRank ), recorda(lasteffectiverank, EffectiveRank), - ignore(assertfreqtree(BestMode)), % rebuild the frequency tree below BestMode ! setof(SubMode, dynsubmodes(SubMode, BestMode), SubModes), ! maplist(retractresidualfreq, SubModes), ! maplist(assertresidualfreq(AllRanks), SubModes, _). ! assertfreqtree(Mode) :- ! \+ dynsubmodes(_, Mode), ! maplist(typicalexample, Mode, Insns), ! SubInsns = [_, _ | _], ! append(_, SubInsns, _, Insns), ! generalize(SubInsns, SubMode), ! assert(dynsubmodes(SubMode, Mode)), fail. ! :- det(retractresidualfreq/1). ! retractresidualfreq(Mode) :- ! retractall(residualfreq(Mode, _)). ! :- det(assertresidualfreq/3). ! assertresidualfreq(_, SubMode, Freq) :- ! residualfreq(SubMode, Freq), !. ! assertresidualfreq(AllRanks, SubMode, ResidualFreq) :- ! findall(Mode, (bestmodes(Mode), ! dynsubmodes(SubMode,Mode), ! Mode\=SubMode), SuperModes), ! maplist(assertresidualfreq(AllRanks), SuperModes, SuperFreqs), ! memberchk(rank(SubMode, Freq, _), AllRanks), ! chainlist(int_sub, SuperFreqs, Freq, ResidualFreq), ! assert(residualfreq(SubMode, ResidualFreq)), ! hash_term(SubMode, Hash), ! assert(rfhash(Hash)). ! int_sub(B, A, C) :- ! C is A-B. --- 308,349 ---- nl, assertz(bestmodes(BestMode)), ! (removefreq(BestMode, Freqr) -> ! ResidualFreq is BestFreq-Freqr, moderank(BestMode, ResidualFreq, EffectiveRank) ; EffectiveRank = BestRank ), recorda(lasteffectiverank, EffectiveRank), % rebuild the frequency tree below BestMode ! assertresidualfreq(BestMode), ! ignore(rebuildfreqtree(BestMode)). ! rebuildfreqtree(BestMode) :- ! subfrequency(SubMode, BestMode, _), ! assertresidualfreq(SubMode), fail. ! %assertfreqtree(Mode) :- ! % \+ dynsubmodes(_, Mode), ! % maplist(typicalexample, Mode, Insns), ! % SubInsns = [_, _ | _], ! % append(_, SubInsns, _, Insns), ! % generalize(SubInsns, SubMode), ! % assert(dynsubmodes(SubMode, Mode)), ! % fail. ! :- det(assertresidualfreq/1). ! assertresidualfreq(SubMode) :- ! findall(Freq, (subfrequency(SubMode,Mode,Freq), ! bestmodes(Mode)), SuperFreqs), ! list_max(SuperFreqs, 0, SuperFreq), ! setfreqr(SubMode, SuperFreq). ! setfreqr(M, Fr) :- ! retractall(removefreq(M, _)), ! assert(removefreq(M, Fr)). ! ! list_max([H|T], Accum, Max) :- ! H > Accum -> list_max(T, H, Max) ; list_max(T, Accum, Max). ! list_max([], Max, Max). *************** *** 303,321 **** % moderank(Mode, Freq, Rank). ! killoldranks :- recorded(lasteffectiverank, LimitRank), !, ! setof(Mode, oldkillable(LimitRank, Mode), DiscardModes), nl, maplist(oldkill, DiscardModes). ! oldkillable(LimitRank, (Mode, Rank, LimitRank)) :- bestmodes(Mode), ! residualfreq(Mode, Freq), moderank(Mode, Freq, Rank), ! %write(x(Mode, Rank, LimitRank)), nl, Rank < LimitRank, % cannot kill an initial segment of another mode ! append(Mode, [_|_], LongerMode), ! \+ bestmodes(LongerMode). oldkill((Mode, Rank, LimitRank)) :- --- 354,376 ---- % moderank(Mode, Freq, Rank). ! residualfreq(AllRanks, Mode, Freq) :- ! removefreq(Mode, Freqr), ! memberchk(rank(Mode, TotalFreq, _), AllRanks), ! Freq is TotalFreq-Freqr. ! ! killoldranks(AllRanks) :- recorded(lasteffectiverank, LimitRank), !, ! setof(Mode, oldkillable(AllRanks, LimitRank, Mode), DiscardModes), nl, maplist(oldkill, DiscardModes). ! oldkillable(AllRanks, LimitRank, (Mode, Rank, LimitRank)) :- bestmodes(Mode), ! residualfreq(AllRanks, Mode, Freq), moderank(Mode, Freq, Rank), ! %write(x(LimitRank, Mode, Rank)), nl, Rank < LimitRank, % cannot kill an initial segment of another mode ! \+ (bestmodes(LongerMode), initialsection(Mode, LongerMode)). oldkill((Mode, Rank, LimitRank)) :- *************** *** 335,344 **** !, repeat, ! \+ killoldranks, !, workcostpostprocess(MaxLen, AllRanks). workcostsrec(MaxLen, AllRanks) :- ! buildnextbest(AllRanks), ! workcostsrec(MaxLen, AllRanks). workcostpostprocess(MaxLen, AllRanks) :- --- 390,403 ---- !, repeat, ! \+ killoldranks(AllRanks), !, workcostpostprocess(MaxLen, AllRanks). workcostsrec(MaxLen, AllRanks) :- ! buildnextbest(AllRanks, Exhausted), ! (Exhausted = true -> ! write('all instruction sequences have been selected.'), ! nl ! ; ! workcostsrec(MaxLen, AllRanks)). workcostpostprocess(MaxLen, AllRanks) :- *************** *** 350,353 **** --- 409,415 ---- (Len > MaxLen -> last(LastMode, Modes), + write(' unselecting '), + write(LastMode), + nl, retract(bestmodes(LastMode)), workcostpostprocess(MaxLen, AllRanks) *************** *** 360,363 **** --- 422,426 ---- recorded(allranks, AllRanks), !. allranks(AllRanks) :- + write('computing ranks...'), nl, findall(R, (R=rank(Mode, Freq, Rank), frequency(Mode, Freq), *************** *** 395,398 **** --- 458,469 ---- % closelist(Result, Result). + remotecontrol :- + read(Term), + Term \= end_of_file, + !, + Term, + remotecontrol. + remotecontrol. + setup :- *************** *** 402,407 **** assert(stackpush(Insn, P)), fail ! ) ; ! true. :- setup. --- 473,478 ---- assert(stackpush(Insn, P)), fail ! ; ! true). :- setup. Index: samelines.py =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/samelines.py,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** samelines.py 4 Sep 2003 16:56:56 -0000 1.1 --- samelines.py 23 Sep 2003 15:43:57 -0000 1.2 *************** *** 1,9 **** # ! # Trivial script that searches for identical lines in stdin. # stdout report is formatted according to sys.argv[1]. # ! import sys ! def samelines(infile, outfile, format, verbose=1): lines = {} total = 0 --- 1,12 ---- # ! # Search for identical lines in stdin. Line starting with "<number>*" ! # are assumed to be repeated that number of times. # stdout report is formatted according to sys.argv[1]. # ! import sys, re ! re1 = re.compile(r"([0-9]+)[*](.*)") ! ! def samelines(infile, outfile, format, verbose=1, minimum=2): lines = {} total = 0 *************** *** 15,26 **** print >> sys.stderr, '%d lines, %d without duplicates...' % ( total, len(lines)) ! total += 10000 ! verbose = 10000 if line.endswith('\n'): line = line[:-1] ! lines[line] = lines.get(line, 0) + 1 finally: ! for line_count in lines.iteritems(): ! print >> outfile, format % line_count if __name__ == '__main__': --- 18,36 ---- print >> sys.stderr, '%d lines, %d without duplicates...' % ( total, len(lines)) ! total += 5000 ! verbose = 5000 if line.endswith('\n'): line = line[:-1] ! match = re1.match(line) ! if match: ! count = int(match.group(1)) ! line = match.group(2) ! else: ! count = 1 ! lines[line] = lines.get(line, 0) + count finally: ! for line, count in lines.iteritems(): ! if count >= minimum: ! print >> outfile, format % (line, count) if __name__ == '__main__': Index: vm.pl =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/vm.pl,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** vm.pl 3 Sep 2003 20:42:11 -0000 1.2 --- vm.pl 23 Sep 2003 15:43:57 -0000 1.3 *************** *** 123,172 **** binary_insn(Name, Name) :- binary_insn(Name). ! overflow_code(Name, Args, Ovf) :- overflow_flag(Name), !, Op =.. [macro_args | Args], ! Ovf = [flag=ovf_check(Name, Op)]. ! overflow_code(_, _, []). ! build_simple_insn(Name, COp, Code, N, Args) :- ! (overflow_flag(Name) -> ! N=2, ! OvfOp =.. [macro_args | Args], ! Code = [out(1) = Op, ! out(0) = ovf_check(Name, OvfOp)] ! ; ! N=1, ! Code = [out(0) = Op] ! ), ! Op =.. [COp | Args]. ! insn(Name, [], Code, [stack(1->N)]) :- unary_insn(Name, COp), atom(COp), ! build_simple_insn(Name, COp, Code, N, [in(0)]). ! insn(Name, [], Code, [stack(2->N)]) :- binary_insn(Name, COp), atom(COp), ! build_simple_insn(Name, COp, Code, N, [in(1), in(0)]). ! ! insn(Name, [], Code, [stack(1->N)]) :- ! unary_insn(Name, COp), ! is_list(COp), ! length(COp, N), ! build_insn(COp, [in(0)], Code). ! ! insn(Name, [], Code, [stack(2->N)]) :- ! binary_insn(Name, COp), ! is_list(COp), ! length(COp, N), ! build_insn(COp, [in(1), in(0)], Code). ! build_insn([COp1|Tail], CArgs, [out(TN) = Op | CodeTail]) :- ! Op =.. [COp1 | CArgs], ! length(Tail, TN), ! build_insn(Tail, CArgs, CodeTail). ! build_insn([], _, []). --- 123,165 ---- binary_insn(Name, Name) :- binary_insn(Name). ! overflow_code(Name, Args, Ovf, [flag(set)]) :- overflow_flag(Name), !, Op =.. [macro_args | Args], ! Ovf = [setflag=ovf_check(Name, Op)]. ! overflow_code(_, _, [], []). ! build_simple_insn(Name, COp, Code, Args, Opts) :- ! Code = [out(0) = Op | OvfCode], ! Op =.. [COp | Args], ! overflow_code(Name, Args, OvfCode, Opts). ! insn(Name, [], Code, [stack(1->1)|Opts]) :- unary_insn(Name, COp), atom(COp), ! build_simple_insn(Name, COp, Code, [in(0)], Opts). ! insn(Name, [], Code, [stack(2->1)|Opts]) :- binary_insn(Name, COp), atom(COp), ! build_simple_insn(Name, COp, Code, [in(1), in(0)], Opts). ! %insn(Name, [], Code, [stack(1->N)]) :- ! % unary_insn(Name, COp), ! % is_list(COp), ! % length(COp, N), ! % build_insn(COp, [in(0)], Code). ! % ! %insn(Name, [], Code, [stack(2->N)]) :- ! % binary_insn(Name, COp), ! % is_list(COp), ! % length(COp, N), ! % build_insn(COp, [in(1), in(0)], Code). ! % ! %build_insn([COp1|Tail], CArgs, [out(TN) = Op | CodeTail]) :- ! % Op =.. [COp1 | CArgs], ! % length(Tail, TN), ! % build_insn(Tail, CArgs, CodeTail). ! %build_insn([], _, []). *************** *** 316,323 **** insn_operate_stack(Insn, OldStack, NewStack, dummy). ! map_operate(OldStack, _, _, in(N), Item) :- !, stack_nth(OldStack, N, Item). ! map_operate(_, NewStack, _, out(N), Item) :- !, stack_nth(NewStack, N, Item). ! map_operate(_, _, InputArgs, arg(N), Item) :- !, nth0(N, InputArgs, Item). ! map_operate(OldStack, _, _, stkshft, N) :- !, stack_depth(OldStack, N). map_operate(P1, P2, P3, Compound, Item) :- Compound =.. [Functor|Args], --- 309,329 ---- insn_operate_stack(Insn, OldStack, NewStack, dummy). ! :- det(insn_operate_flag/3). ! insn_operate_flag(Insn, OldFlag, NewFlag) :- ! insn(Insn, _, _, Options), ! (memberchk(flag(Mode), Options) -> ! (Mode = set -> ! true ! ; ! NewFlag = consumed) ! ; ! NewFlag = OldFlag). ! ! map_operate((OldStack,_), _, _, in(N), Item) :- !, stack_nth(OldStack, N, Item). ! map_operate(_, (NewStack,_), _, out(N), Item) :- !, stack_nth(NewStack, N, Item). ! map_operate(_, _, InputArgs, arg(N), Item) :- !, nth0(N, InputArgs, Item). ! map_operate((OldStack,_), _, _, stkshft, N) :- !, stack_depth(OldStack, N). ! map_operate((_,OldFlag), _, _, flag, OldFlag) :- !. ! map_operate(_, (_,NewFlag), _, setflag, NewFlag) :- !. map_operate(P1, P2, P3, Compound, Item) :- Compound =.. [Functor|Args], *************** *** 336,342 **** :- det(insn_operate_code/5). ! insn_operate_code(Insn, OldStack, NewStack, InputArgs, Code) :- insn(Insn, _, CodeTemplate, _), ! maplist(map_operate_top(OldStack, NewStack, InputArgs), CodeTemplate, Code). --- 342,348 ---- :- det(insn_operate_code/5). ! insn_operate_code(Insn, OldState, NewState, InputArgs, Code) :- insn(Insn, _, CodeTemplate, _), ! maplist(map_operate_top(OldState, NewState, InputArgs), CodeTemplate, Code). *************** *** 378,383 **** :- det(mode_operate1/3). ! mode_operate1(Mode, (Stack1, InitU1, CodeL1), ! (Stack2, InitU2, CodeL2)) :- Mode =.. [Insn|CondList], insn(Insn, Args, _, _), --- 384,389 ---- :- det(mode_operate1/3). ! mode_operate1(Mode, (Stack1, Flag1, InitU1, CodeL1), ! (Stack2, Flag2, InitU2, CodeL2)) :- Mode =.. [Insn|CondList], insn(Insn, Args, _, _), *************** *** 385,389 **** maplist(load_initexpr(Stack1), Args, CondList, InitArgs, UseArgs), insn_operate_stack(Insn, Stack1, Stack2, extra(CondList, UseArgs)), ! insn_operate_code(Insn, Stack1, Stack2, UseArgs, Code), append(InitU1, InitUnif, InitU2), append(CodeL1, Code, CodeL2). --- 391,396 ---- maplist(load_initexpr(Stack1), Args, CondList, InitArgs, UseArgs), insn_operate_stack(Insn, Stack1, Stack2, extra(CondList, UseArgs)), ! insn_operate_flag(Insn, Flag1, Flag2), ! insn_operate_code(Insn, (Stack1, Flag1), (Stack2, Flag2), UseArgs, Code), append(InitU1, InitUnif, InitU2), append(CodeL1, Code, CodeL2). *************** *** 393,401 **** initial_stack(OldStack), chainlist(mode_operate1, Mode, ! (OldStack, [], []), (NewStack, U1, C3)), ! mode_unify(NewStack, OldStack, C4), append(U1, C3, C4, CodeBlock1), code_simplify(CodeBlock1, CodeBlock). % stack_unify(+CurrentStack, +TargetStack, -UnificationsList1, -2, -StackShift) stack_unify(slice(E1), slice(E2), [], [], StackShift) :- --- 400,414 ---- initial_stack(OldStack), chainlist(mode_operate1, Mode, ! (OldStack, flag, [], []), (NewStack, NewFlag, U1, C3)), ! mode_unify((NewStack, NewFlag), (OldStack, flag), C4), append(U1, C3, C4, CodeBlock1), code_simplify(CodeBlock1, CodeBlock). + mode_nonclobber_flag(Mode) :- + initial_stack(OldStack), + chainlist(mode_operate1, Mode, + (OldStack, _, [], []), (_, NewFlag, _, _)), + var(NewFlag). + % stack_unify(+CurrentStack, +TargetStack, -UnificationsList1, -2, -StackShift) stack_unify(slice(E1), slice(E2), [], [], StackShift) :- *************** *** 425,438 **** UnifList2 = [Dest=Temp | UnifL2]). ! mode_unify(S1, S2, Code) :- stack_unify(S1, S2, UnifList1, UnifList2, StackShift), reverse(UnifList2, UnifList2r), (StackShift > 0 -> ! CodeL4 = [stack_shift_pos(StackShift)] ; (StackShift < 0 -> ! CodeL4 = [stack_shift(StackShift)] ; ! CodeL4 = [])), append(UnifList1, UnifList2r, CodeL4, Code). --- 438,456 ---- UnifList2 = [Dest=Temp | UnifL2]). ! :- det(mode_unify/3). ! mode_unify((S1,F1), (S2,F2), Code) :- stack_unify(S1, S2, UnifList1, UnifList2, StackShift), reverse(UnifList2, UnifList2r), (StackShift > 0 -> ! CodeL4 = [stack_shift_pos(StackShift)|CodeTail] ; (StackShift < 0 -> ! CodeL4 = [stack_shift(StackShift)|CodeTail] ; ! CodeL4 = CodeTail)), ! (var(F1) -> ! CodeTail = [F2=F1] ! ; ! CodeTail = []), append(UnifList1, UnifList2r, CodeL4, Code). *************** *** 519,526 **** insn_defbody(Insn, block(DeclCode, BodyCode)) :- insn(Insn, Args, _, Options), enumerate_list(Args, NumberedArgs, 1, _), maplist(insn_inputargname, NumberedArgs, ArgNames), joinlist(insn_preparearg, Args, ArgNames, InputArgs, DeclCode), ! BodyCode = [switch('LATEST_OPCODE', Cases) | RegularBodyCode], findall(Code, insn_combination(InputArgs, Insn, Code), Cases), initial_stack(InitialStack), --- 537,549 ---- insn_defbody(Insn, block(DeclCode, BodyCode)) :- insn(Insn, Args, _, Options), + %(memberchk(flag(get), Options) -> + % BodyCode = [extra_assert('FLAG_NONCLOBBERING'('LATEST_OPCODE')) | + % MainBodyCode] + %; + MainBodyCode = BodyCode, enumerate_list(Args, NumberedArgs, 1, _), maplist(insn_inputargname, NumberedArgs, ArgNames), joinlist(insn_preparearg, Args, ArgNames, InputArgs, DeclCode), ! MainBodyCode = [switch('LATEST_OPCODE', Cases) | RegularBodyCode], findall(Code, insn_combination(InputArgs, Insn, Code), Cases), initial_stack(InitialStack), Index: vmwriter.pl =================================================================== RCS file: /cvsroot/psyco/psyco/c/ivm/prolog/vmwriter.pl,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** vmwriter.pl 3 Sep 2003 19:57:57 -0000 1.1 --- vmwriter.pl 23 Sep 2003 15:43:57 -0000 1.2 *************** *** 12,17 **** write('continue;\n\n'), fail ! ) ; ! true. --- 12,17 ---- write('continue;\n\n'), fail ! ; ! true). *************** *** 74,78 **** insn_define(Insn, Name, MacroArgList, Body), atom_concat('INSN_', Name, MacroName), ! (Body=block([],[emit(opcode,Op),setlatesteopcode(Op)|return(_)]) -> % macro only SingleInstr = emit(macro_opcode, Op), --- 74,78 ---- insn_define(Insn, Name, MacroArgList, Body), atom_concat('INSN_', Name, MacroName), ! (Body=block([],[emit(opcode,Op),setlatestopcode(Op)|return(_)]) -> % macro only SingleInstr = emit(macro_opcode, Op), *************** *** 111,118 **** nl), fail ! ) ; ! true. main_emit(insns, functions(Prefix)) :- ( insn_definition(_, _, FunctionName, FunctionArgList, Body, _), --- 111,126 ---- nl), fail ! ; ! true). main_emit(insns, functions(Prefix)) :- + %write('#define FLAG_NONCLOBBERING(op) ( \\'), nl, + %( + % enumerate(insn_mode(M), Opcode, 1), + % mode_nonclobber_flag(M), + % write('\t(op)=='), write(Opcode), write(' || \\\n'), + % fail + %; + %write('\t0)\n'), ( insn_definition(_, _, FunctionName, FunctionArgList, Body, _), *************** *** 127,132 **** FunctionArgList, Body))), fail ! ) ; ! true. % write the instruction table in Python --- 135,140 ---- FunctionArgList, Body))), fail ! ; ! true). % write the instruction table in Python *************** *** 200,204 **** objdump_mode(Opcode, M), fail ! ) ; write('}'), nl, --- 208,212 ---- objdump_mode(Opcode, M), fail ! ; write('}'), nl, *************** *** 210,214 **** format(' ~d: ~d,\n', [Opcode, P]), fail ! ) ; write('}'), nl, --- 218,222 ---- format(' ~d: ~d,\n', [Opcode, P]), fail ! ; write('}'), nl, *************** *** 220,224 **** format(' ~d: 1,\n', [Opcode]), fail ! ) ; write('}'), ! nl. --- 228,241 ---- format(' ~d: 1,\n', [Opcode]), fail ! ; write('}'), ! nl))). ! ! ! % generate all files ! main_emit :- ! tell('insns-igen-h.i'), main_emit(insns, headers('EXTERNFN ')), told, ! tell('insns-igen.i'), main_emit(insns, functions('DEFINEFN ')), told, ! tell('insns-threaded.i'), main_emit(modes, threaded(absolute)), told, ! tell('insns-switch.i'), main_emit(modes, switch), told, ! tell('insns-table.py'), main_emit(pytable), told. |