Bill Allombert on Sun, 26 Nov 2006 01:26:12 +0100 |
[Date Prev] [Date Next] [Thread Prev] [Thread Next] [Date Index] [Thread Index]
Re: New GP evaluator release 2.4.1.compile-5 |
On Sat, Nov 25, 2006 at 09:07:51PM +0100, Bill Allombert wrote: > The part that I might want to change is the bytecode format. > I lack experience about the various trade-off involved and whether > it is worth the trouble to store opcodes on a single byte instead > of four. Please find a patch that implement that. With this patch, closures look that way ["opcodes",Vecsmall([operand]),[data]] It seems a little faster and allow the 1.6MB script cubic-map.gp (by F. Villegas, http://www.ma.utexas.edu/users/villegas/cnt/cubic-map.gp) to be read with 8MB of stack instead of 12MB. Cheers, Bill.
Index: parigp3/src/language/compile.c =================================================================== --- parigp3.orig/src/language/compile.c 2006-11-25 16:59:48.000000000 +0100 +++ parigp3/src/language/compile.c 2006-11-25 23:36:11.000000000 +0100 @@ -26,8 +26,9 @@ ** ** ***************************************************************************/ -static THREAD gp2c_stack s_opcode, s_data; -static THREAD long *opcode; +static THREAD gp2c_stack s_opcode, s_operand, s_data; +static THREAD char *opcode; +static THREAD long *operand; static THREAD GEN *data; static THREAD long offset=-1; @@ -35,6 +36,7 @@ pari_init_compiler(void) { stack_init(&s_opcode,sizeof(*opcode),(void **)&opcode); + stack_init(&s_operand,sizeof(*operand),(void **)&operand); stack_init(&s_data,sizeof(*data),(void **)&data); } @@ -52,16 +54,24 @@ { long lop =s_opcode.n+1-sop; long ldat=s_data.n+1-sdat; - GEN cl=cgetg(3,t_VEC); + GEN cl=cgetg(4,t_VEC); + char *s; long i; - gel(cl,1) = cgetg(lop, t_VECSMALL); - gel(cl,2) = cgetg(ldat, t_VEC); + gel(cl,1) = cgetg(nchar2nlong(lop)+1, t_STR); + gel(cl,2) = cgetg(lop, t_VECSMALL); + gel(cl,3) = cgetg(ldat, t_VEC); + s=GSTR(gel(cl,1))-1; for(i=1;i<lop;i++) - mael(cl, 1, i) = opcode[i+sop-1]; + { + s[i] = opcode[i+sop-1]; + mael(cl, 2, i) = operand[i+sop-1]; + } + s[i]=0; s_opcode.n=sop; + s_operand.n=sop; for(i=1;i<ldat;i++) { - gmael(cl, 2, i) = gcopy(data[i+sdat-1]); + gmael(cl, 3, i) = gcopy(data[i+sdat-1]); gunclone(data[i+sdat-1]); } s_data.n=sdat; @@ -73,9 +83,9 @@ op_push(op_code o, long x) { long n=stack_new(&s_opcode); - long m=stack_new(&s_opcode); + long m=stack_new(&s_operand); opcode[n]=o; - opcode[m]=x; + operand[m]=x; } static long Index: parigp3/src/language/eval.c =================================================================== --- parigp3.orig/src/language/eval.c 2006-11-25 16:59:48.000000000 +0100 +++ parigp3/src/language/eval.c 2006-11-26 00:05:53.000000000 +0100 @@ -431,13 +431,14 @@ { gp_pointer ptrs[16]; long rp=0; - GEN code=gel(C,1); - GEN data=gel(C,2); + char *code=GSTR(gel(C,1))-1; + GEN oper=gel(C,2); + GEN data=gel(C,3); long pc, j; - for(pc=1;pc<lg(code);pc+=2) + for(pc=1;pc<lg(oper);pc++) { op_code opcode=(op_code) code[pc]; - long operand=code[pc+1]; + long operand=oper[pc]; entree *ep; if (sp>1000) pari_err(talker,"evaluator stack exhausted"); switch(opcode) @@ -944,15 +945,24 @@ void closure_disassemble(GEN C) { - GEN code; + char * code; + GEN oper; long i; - if (typ(C)!=t_VEC || lg(C)!=3 || typ(C[1])!=t_VECSMALL) + if (typ(C)==t_STR) + { + entree *ep=fetch_entry(GSTR(C),strlen(GSTR(C))); + if (ep->valence!=EpUSER) + pari_err(typeer,"disassemble"); + C=(GEN)ep->value; + } + if (typ(C)!=t_VEC || lg(C)!=4 || typ(C[1])!=t_STR || typ(C[2])!=t_VECSMALL) pari_err(typeer,"disassemble"); - code=gel(C,1); - for(i=1;i<lg(code);i+=2) + code=GSTR(gel(C,1))-1; + oper=gel(C,2); + for(i=1;i<lg(oper);i++) { op_code opcode=(op_code) code[i]; - long operand=code[i+1]; + long operand=oper[i]; entree *ep; pariprintf("%05ld\t",i); switch(opcode) Index: parigp3/src/language/opcode.h =================================================================== --- parigp3.orig/src/language/opcode.h 2006-11-25 16:59:48.000000000 +0100 +++ parigp3/src/language/opcode.h 2006-11-25 23:35:29.000000000 +0100 @@ -16,7 +16,7 @@ typedef enum {Gvoid, Gsmall, Gvec, Gvar, Ggen} Gtype; -typedef enum {OCpushlong,OCpushgen,OCpushreal,OCpushstoi, +typedef enum {OCpushlong='A',OCpushgen,OCpushreal,OCpushstoi, OCpushvalue,OCpushvar, OCpop, OCstoi,OCitos,OCtostr,OCvarn,OCpolx,