From: David S. W. <dw...@us...> - 2008-01-30 16:03:02
|
Update of /cvsroot/xsb/XSB/emu In directory sc8-pr-cvs10.sourceforge.net:/tmp/cvs-serv2708 Modified Files: emuloop.c init_xsb.c inst_xsb.h subp.c xsb_inst_list.h Log Message: Added a new instruction for adding (or subtracting) small integers. This allows a somewhat more efficient compilation of arithmetic, for the common case of incrementing or decrementing a value. Index: emuloop.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/emuloop.c,v retrieving revision 1.181 retrieving revision 1.182 diff -u -r1.181 -r1.182 --- emuloop.c 3 Jan 2008 18:45:20 -0000 1.181 +++ emuloop.c 30 Jan 2008 16:03:03 -0000 1.182 @@ -1608,6 +1608,48 @@ ARITHPROC(+, "+"); XSB_End_Instr() + XSB_Start_Instr(addintfastasgn,_addintfastasgn) /*RRA*/ + /* takes 3 1-byte operands: + byte 1 is register or local variable (reg if byte3&2 is 0), + indicates target where sum will be assigned. + byte 2 is register or local variable (reg if byte3&1 is 0) + indicates first argument of sum. + byte 3 >> 2 is signed integer that is second argument of sum. + (Lowest 2 bits indicate reg or local var of 1st 2 args.) + */ + register Cell op1; register char op2int; register CPtr op3; + Op1(get_xax); + op2int = (char)(get_xxa); + Op3((Cell)get_axx); + ADVANCE_PC(size_xxx); + // printf("addintfastasgn: op1=%d, op2int=%d, op3=%d\n",(Integer)op1,(Integer)op2int,(Integer)op3); + if (op2int & 0x1) op1 = (Cell)(ereg -(Cell)op1); + else op1 = (Cell)(rreg + (Integer)op1); + if (op2int & 0x2) op3 = (CPtr)(ereg - (Cell)op3); + else op3 = (CPtr)(rreg + (Integer)op3); + op2int = op2int >> 2; + XSB_Deref(op1); + if (isinteger(op1)) { + Integer temp = int_val(op1) + op2int; + bld_oint(op3, temp); + } else if (isfloat(op1)) { + Float temp = float_val(op1) + (Float)op2int; + bld_boxedfloat(CTXTc op3, temp); + } else if (isboxedfloat(op1)) { + Float temp = boxedfloat_val(op1) + (Float)op2int; + bld_boxedfloat(CTXTc op3, temp); + } else if (isboxedinteger(op1)) { + Integer temp = boxedint_val(op1) + op2int; + bld_oint(op3, temp); + } else { + arithmetic_abort(CTXTc op2int, "+", op1); /* op2int must be wrong */ + } + XSB_End_Instr() + + XSB_Start_Instr(addintfastuni,_addintfastuni) /*RRA*/ + xsb_error("addintfastuni not implemented"); + XSB_End_Instr() + XSB_Start_Instr(subreg,_subreg) /* PRR */ Def3ops ARITHPROC(-, "-"); Index: init_xsb.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/init_xsb.c,v retrieving revision 1.141 retrieving revision 1.142 diff -u -r1.141 -r1.142 --- init_xsb.c 2 Jan 2008 19:47:43 -0000 1.141 +++ init_xsb.c 30 Jan 2008 16:03:03 -0000 1.142 @@ -1453,7 +1453,7 @@ if (new) { set_data(c_callloop_psc,ccall_mod_psc); env_type_set(c_callloop_psc, T_IMPORTED, T_ORDI, (xsbBool)new); - link_sym(c_callloop_psc, (Psc)flags[CURRENT_MODULE]); + link_sym(c_callloop_psc, global_mod); } Index: inst_xsb.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/inst_xsb.h,v retrieving revision 1.29 retrieving revision 1.30 diff -u -r1.29 -r1.30 --- inst_xsb.h 3 Jan 2008 18:45:20 -0000 1.29 +++ inst_xsb.h 30 Jan 2008 16:03:03 -0000 1.30 @@ -216,6 +216,8 @@ #define bldtval_putlist_bldnumcon 0x24 /* combined, same reg, 16-bit int */ #define bldtvar_list_numcon 0x25 /* combined, same reg, 16-bit int */ #define getkpvars 0x26 /* get k pvars, k>=2 */ +#define addintfastuni 0x2d /* add int to t/p var and unify with t/p var */ +#define addintfastasgn 0x2e /* add int to t/p var and assign to t/p var */ #define xorreg 0x2f #define getattv 0x30 Index: subp.c =================================================================== RCS file: /cvsroot/xsb/XSB/emu/subp.c,v retrieving revision 1.112 retrieving revision 1.113 diff -u -r1.112 -r1.113 --- subp.c 21 Dec 2007 10:41:40 -0000 1.112 +++ subp.c 30 Jan 2008 16:03:03 -0000 1.113 @@ -855,7 +855,7 @@ if (if_profiling) { if (asynint_val & PROFINT_MARK) { unhandled++; - if (!(unhandled % 10)) printf("Unhandled profile ints: %ld\n",unhandled); + if (!(unhandled % 500)) printf("Unhandled profile ints: %ld\n",unhandled); } asynint_val |= PROFINT_MARK; } Index: xsb_inst_list.h =================================================================== RCS file: /cvsroot/xsb/XSB/emu/xsb_inst_list.h,v retrieving revision 1.22 retrieving revision 1.23 diff -u -r1.22 -r1.23 --- xsb_inst_list.h 3 Jan 2008 18:45:20 -0000 1.22 +++ xsb_inst_list.h 30 Jan 2008 16:03:03 -0000 1.23 @@ -52,8 +52,8 @@ XSB_INST(0x2a, no_inst, _no_inst, PPP,X,X,X); XSB_INST(0x2b, no_inst, _no_inst, PPP,X,X,X); XSB_INST(0x2c, no_inst, _no_inst, PPP,X,X,X); -XSB_INST(0x2d, no_inst, _no_inst, PPP,X,X,X); -XSB_INST(0x2e, no_inst, _no_inst, PPP,X,X,X); +XSB_INST(0x2d, addintfastuni, _addintfastuni, RRR,X,X,X); +XSB_INST(0x2e, addintfastasgn, _addintfastasgn, RRR,X,X,X); XSB_INST(0x2f, xorreg, _xorreg, P,R,R,X); XSB_INST(0x30, getattv, _getattv, PP, R, X,X); |