diff --git a/bin/mkpeep.pike b/bin/mkpeep.pike index 50aff846427d5b4e70d49bf0ee1d44d1c65defe6..9d96a001d7b7bceb122ebb062108e546cfa46f6a 100755 --- a/bin/mkpeep.pike +++ b/bin/mkpeep.pike @@ -1,6 +1,6 @@ #!/usr/local/bin/pike -/* $Id: mkpeep.pike,v 1.7 1998/04/01 00:47:18 hubbe Exp $ */ +/* $Id: mkpeep.pike,v 1.8 1998/04/27 09:53:47 hubbe Exp $ */ import Simulate; @@ -283,6 +283,7 @@ void dump2(mixed *data,int ind) } write(sprintf("%*n{\n",ind)); ind+=2; +#if 0 if(sizeof(d[1])) { @@ -329,8 +330,25 @@ void dump2(mixed *data,int ind) write(sprintf("%*ndebug();\n",ind)); } write(sprintf("%*nfifo_len+=%d;\n",ind,q+JUMPBACK)); - write(sprintf("%*ncontinue;\n",ind)); +#else + + write("%*ndo_optimization(%d,\n",ind,d[2]); + + for(i=0;i<sizeof(d[1]);i++) + { + if(i+1<sizeof(d[1]) && d[1][i+1][0]=='(') + { + string tmp=d[1][i+1]; + write("%*n 2,%s,%s,\n",ind,d[1][i],treat(tmp[1..strlen(tmp)-2])); + i++; + }else{ + write("%*n 1,%s,\n",ind,d[1][i]); + } + } + write("%*n 0);\n",ind); +#endif + write(sprintf("%*ncontinue;\n",ind)); ind-=2; write(sprintf("%*n}\n",ind,test)); } diff --git a/src/peep.c b/src/peep.c index 3da51755f60033700edd1c9ff6601093c6181925..66ceeb7f23de6bf9b7ceb7e091d078093f598b76 100644 --- a/src/peep.c +++ b/src/peep.c @@ -12,7 +12,7 @@ #include "peep.h" #include "dmalloc.h" -RCSID("$Id: peep.c,v 1.21 1998/04/01 00:47:48 hubbe Exp $"); +RCSID("$Id: peep.c,v 1.22 1998/04/27 09:54:16 hubbe Exp $"); struct p_instr_s { @@ -373,7 +373,6 @@ int insopt2(int f, int cl, struct pike_string *cf) return insopt(f,0,cl, cf); } - static void debug(void) { if(fifo_len > (long)instrbuf.s.len / (long)sizeof(p_instr)) @@ -393,7 +392,7 @@ static void debug(void) } -static p_instr *instr(int offset) +static INLINE p_instr *instr(int offset) { p_instr *p; @@ -414,7 +413,7 @@ static p_instr *instr(int offset) } } -static int opcode(int offset) +static INLINE int opcode(int offset) { p_instr *a; a=instr(offset); @@ -422,7 +421,7 @@ static int opcode(int offset) return -1; } -static int argument(int offset) +static INLINE int argument(int offset) { p_instr *a; a=instr(offset); @@ -469,6 +468,47 @@ static void pop_n_opcodes(int n) eye+=n; } +static void do_optimization(int topop, ...) +{ + va_list arglist; + struct pike_string *cf; + int q=-1; + INT32 cl=instr(0)->line; + copy_shared_string(cf,instr(0)->file); + pop_n_opcodes(topop); + va_start(arglist, topop); + + while(1) + { + q++; + switch(va_arg(arglist, int)) + { + case 0: + break; + case 1: + { + int i=va_arg(arglist, int); + insopt2(i,cl,cf); + continue; + } + case 2: + { + int i=va_arg(arglist, int); + int j=va_arg(arglist, int); + insopt(i,j,cl,cf); + continue; + } + } + break; + } + + va_end(arglist); + fifo_len+=q; + free_string(cf); + debug(); + fifo_len+=q + 3; +} + static void asm_opt(void) {