=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2018/engine/init.c,v retrieving revision 1.1 retrieving revision 1.5 diff -u -p -r1.1 -r1.5 --- OpenXM_contrib2/asir2018/engine/init.c 2018/09/19 05:45:07 1.1 +++ OpenXM_contrib2/asir2018/engine/init.c 2019/06/04 07:11:23 1.5 @@ -45,7 +45,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM$ + * $OpenXM: OpenXM_contrib2/asir2018/engine/init.c,v 1.4 2018/10/01 05:49:06 noro Exp $ */ #include "ca.h" #include "parse.h" @@ -103,6 +103,8 @@ static int lprime_size; #if defined(INTERVAL) int zerorewrite = 0; +int zerorewriteCount = 0; +// N_Q, N_R, N_A, N_B, N4, N_IP, N_IDouble,N_IQ, N_IBF, N_C, N_M N_LM, N_GF2N, N_GFPN, N_GFS, N_GFSN, N_DA, N_GZ, N_GQ, N_PARIB void (*addnumt[])() = { addq, addreal, addalg, ADDBF, 0, additvp, additvd, 0, additvf, addcplx, addmi, addlm, addgf2n, addgfpn, addgfs, addgfsn, adddalg }; void (*subnumt[])() = { subq, subreal, subalg, SUBBF, 0, subitvp, subitvd, 0, subitvf, subcplx, submi, sublm, subgf2n, subgfpn, subgfs, subgfsn, subdalg }; void (*mulnumt[])() = { mulq, mulreal, mulalg, MULBF, 0, mulitvp, mulitvd, 0, mulitvf, mulcplx, mulmi, mullm, mulgf2n, mulgfpn, mulgfs, mulgfsn, muldalg }; @@ -111,6 +113,7 @@ void (*pwrnumt[])() = { pwrq, pwrreal, pwralg, PWRBF, void (*chsgnnumt[])() = { chsgnq, chsgnreal, chsgnalg, CHSGNBF, 0, chsgnitvp, chsgnitvd, 0, chsgnitvf, chsgncplx, chsgnmi, chsgnlm, chsgngf2n, chsgngfpn, chsgngfs , chsgngfsn, chsgndalg}; int (*cmpnumt[])() = { cmpq, cmpreal, cmpalg, CMPBF, 0, cmpitvp, cmpitvd, 0, cmpitvf, cmpcplx, cmpmi, cmplm, cmpgf2n, cmpgfpn, cmpgfs, cmpgfsn, cmpdalg }; #else +// N_Q, N_R, N_A, N_B, N_C, N_M, N_LM, N_GF2N, N_GFPN, N_GFS, N_GFSN, N_DA, N_GZ, N_GQ, N_PARIB void (*addnumt[])() = { addq, addreal, addalg, ADDBF, addcplx, addmi, addlm, addgf2n, addgfpn, addgfs, addgfsn, adddalg }; void (*subnumt[])() = { subq, subreal, subalg, SUBBF, subcplx, submi, sublm, subgf2n, subgfpn, subgfs, subgfsn, subdalg }; void (*mulnumt[])() = { mulq, mulreal, mulalg, MULBF, mulcplx, mulmi, mullm, mulgf2n, mulgfpn, mulgfs, mulgfsn, muldalg }; @@ -126,14 +129,14 @@ void init_lprime(); void nglob_init() { oONEUP2.w = 1; oONEUP2.b[0] = 1; - STOQ0(1,&oUNIQ); - STOQ0(2,&oTWOQ); - STOQ0(3,&oTHREEQ); - STOQ0(4,&oFOURQ); - STOQ0(5,&oFIVEQ); - STOQ0(6,&oSIXQ); - STOQ0(7,&oSEVENQ); - STOQ0(8,&oEIGHTQ); + STOZ0(1,&oUNIQ); + STOZ0(2,&oTWOQ); + STOZ0(3,&oTHREEQ); + STOZ0(4,&oFOURQ); + STOZ0(5,&oFIVEQ); + STOZ0(6,&oSIXQ); + STOZ0(7,&oSEVENQ); + STOZ0(8,&oEIGHTQ); STOLM0(1,&oUNILM); STOLM0(3,&oTHREELM); @@ -159,14 +162,12 @@ void nglob_init() { init_gmpq(); } -extern double GC_get_gctime(); double suspend_start; double suspended_time=0; void get_eg(struct oEGT *p) { - double gctime = GC_get_gctime(); - p->exectime = get_clock() - gctime - suspended_time; p->gctime = gctime; + p->exectime = get_clock()-suspended_time; p->gctime = 0; } void init_eg(struct oEGT *eg) @@ -177,12 +178,11 @@ void init_eg(struct oEGT *eg) void add_eg(struct oEGT *base,struct oEGT *start,struct oEGT *end) { base->exectime += end->exectime - start->exectime; - base->gctime += end->gctime - start->gctime; } void print_eg(char *item,struct oEGT *eg) { - printf("%s=(%.4g,%.4g)",item,eg->exectime,eg->gctime); + printf("%s=(%.4g)",item,eg->exectime); } void print_split_eg(struct oEGT *start,struct oEGT *end) @@ -190,7 +190,7 @@ void print_split_eg(struct oEGT *start,struct oEGT *en struct oEGT base; init_eg(&base); add_eg(&base,start,end); - printf("(%.4g,%.4g)",base.exectime,base.gctime); + printf("(%.4g)",base.exectime); } void print_split_e(struct oEGT *start,struct oEGT *end) @@ -252,6 +252,9 @@ void create_error(ERR *err,unsigned int serial,char *m MKERR(*err,list); } +static mp_limb_t *lprime64; +static int lprime64_size; + void init_lprime() { int s,i; @@ -261,9 +264,18 @@ void init_lprime() lprime_size = s/sizeof(int); for ( i = 0; i < lprime_size; i++ ) lprime[i] = lprime_init[lprime_size-i-1]; + +#if SIZEOF_LONG == 8 + s = sizeof(lprime64_init); + lprime64 = (mp_limb_t *)MALLOC_ATOMIC(s); + lprime64_size = s/sizeof(mp_limb_t); + for ( i = 0; i < lprime64_size; i++ ) + lprime64[i] = lprime64_init[lprime64_size-i-1]; +#endif } void create_new_lprimes(int); +void create_new_lprimes64(int); int get_lprime(int index) { @@ -272,6 +284,15 @@ int get_lprime(int index) return lprime[index]; } +#if SIZEOF_LONG == 8 +mp_limb_t get_lprime64(int index) +{ + if ( index >= lprime64_size ) + create_new_lprimes64(index); + return lprime64[index]; +} +#endif + void create_new_lprimes(int index) { int count,p,i,j,d; @@ -295,4 +316,33 @@ void create_new_lprimes(int index) } } lprime_size += count; +} + +mp_limb_t nextprime(mp_limb_t a) +{ + static FUNC f=0; + Z z,r; + + if ( f == 0 ) mkparif("nextprime",&f); + STOZ(a,z); + r = (Z)evalparif(f,mknode(1,z)); + return ZTOS(r); +} + +void create_new_lprimes64(int index) +{ + int count,j; + mp_limb_t p; + + if ( index < lprime64_size ) + return; + count = index-lprime64_size+1; + if ( count < 256 ) + count = 256; + lprime64 = (mp_limb_t *)GC_realloc(lprime64,(lprime64_size+count)*sizeof(mp_limb_t)); + for ( p = lprime64[lprime64_size-1], j = 0; j < count; j++ ) { + p = nextprime(p+1); + lprime64[lprime64_size+j] = p; + } + lprime64_size += count; }