=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/nd.c,v retrieving revision 1.34 retrieving revision 1.37 diff -u -p -r1.34 -r1.37 --- OpenXM_contrib2/asir2000/engine/nd.c 2003/08/20 06:06:07 1.34 +++ OpenXM_contrib2/asir2000/engine/nd.c 2003/08/20 08:38:20 1.37 @@ -1,4 +1,4 @@ -/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.33 2003/08/19 05:29:11 noro Exp $ */ +/* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.36 2003/08/20 07:55:45 noro Exp $ */ #include "ca.h" #include "inline.h" @@ -288,7 +288,7 @@ INLINE int nd_length(ND p) } } -int ndl_reducible(unsigned int *d1,unsigned int *d2) +INLINE int ndl_reducible(unsigned int *d1,unsigned int *d2) { unsigned int u1,u2; int i,j; @@ -372,7 +372,7 @@ void ndl_dehomogenize(unsigned int *d) h = (d[1]>>((nd_epw-1)*nd_bpe))&nd_mask0; for ( i = 1; i <= nd_wpd; i++ ) d[i] = ((d[i]<>((nd_epw-1)*nd_bpe))&nd_mask0):0); + |(i+1<=nd_wpd?((d[i+1]>>((nd_epw-1)*nd_bpe))&nd_mask0):0); TD(d) -= h; } } else @@ -505,12 +505,11 @@ INLINE void ndl_copy(unsigned int *d1,unsigned int *d2 } } -/* XXX : TD is not added */ - INLINE void ndl_add(unsigned int *d1,unsigned int *d2,unsigned int *d) { int i; + TD(d) = TD(d1)+TD(d2); switch ( nd_wpd ) { case 1: d[1] = d1[1]+d2[1]; @@ -2078,7 +2077,7 @@ void dltondl(int n,DL dl,unsigned int *r) int i; d = dl->d; - bzero(r,(nd_wpd+1)*sizeof(unsigned int)); + for ( i = 0; i <= nd_wpd; i++ ) r[i] = 0; if ( nd_isrlex ) for ( i = 0; i < n; i++ ) r[(n-1-i)/nd_epw+1] |= (d[i]<<((nd_epw-((n-1-i)%nd_epw)-1)*nd_bpe)); @@ -2409,7 +2408,8 @@ unsigned int *dp_compute_bound(DP p) d1 = (unsigned int *)ALLOCA(nd_nvar*sizeof(unsigned int)); d2 = (unsigned int *)ALLOCA(nd_nvar*sizeof(unsigned int)); m = BDY(p); - bcopy(DL(m)->d,d1,nd_nvar*sizeof(unsigned int)); + d = DL(m)->d; + for ( i = 0; i < nd_nvar; i++ ) d1[i] = d[i]; for ( m = NEXT(BDY(p)); m; m = NEXT(m) ) { d = DL(m)->d; for ( i = 0; i < nd_nvar; i++ ) @@ -2418,8 +2418,8 @@ unsigned int *dp_compute_bound(DP p) } l = (nd_nvar+31); t = (unsigned int *)MALLOC_ATOMIC(l*sizeof(unsigned int)); - bzero(t,l*sizeof(unsigned int)); - bcopy(d1,t,nd_nvar*sizeof(unsigned int)); + for ( i = 0; i < nd_nvar; i++ ) t[i] = d1[i]; + for ( ; i < l; i++ ) t[i] = 0; return t; } @@ -2433,16 +2433,17 @@ unsigned int *nd_compute_bound(ND p) return 0; d1 = (unsigned int *)ALLOCA(nd_wpd*sizeof(unsigned int)); d2 = (unsigned int *)ALLOCA(nd_wpd*sizeof(unsigned int)); - bcopy(HDL(p),d1,nd_wpd*sizeof(unsigned int)); + ndl_copy(HDL(p),d1); for ( m = NEXT(BDY(p)); m; m = NEXT(m) ) { ndl_lcm(DL(m),d1,d2); t = d1; d1 = d2; d2 = t; } l = nd_nvar+31; t = (unsigned int *)MALLOC_ATOMIC(l*sizeof(unsigned int)); - bzero(t,l*sizeof(unsigned int)); + for ( i = 0; i < l; i++ ) t[i] = 0; for ( i = 0; i < nd_nvar; i++ ) t[i] = (d1[i/nd_epw+1]>>((nd_epw-(i%nd_epw)-1)*nd_bpe))&nd_mask0; + for ( ; i < l; i++ ) t[i] = 0; return t; } @@ -2470,10 +2471,11 @@ void nd_setup_parameters() { ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) { - int i,obpe,oadv; + int i,obpe,oadv,h; NM prev_nm_free_list; RHist mr0,mr; RHist r; + RHist *old_red; ND_pairs s0,s,t,prev_ndp_free_list; obpe = nd_bpe; @@ -2502,16 +2504,24 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) SG(s) = SG(t); ndl_dup(obpe,LCM(t),LCM(s)); } + + old_red = (RHist *)ALLOCA(REDTAB_LEN*sizeof(RHist)); for ( i = 0; i < REDTAB_LEN; i++ ) { - for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { - NEXTRHist(mr0,mr); + old_red[i] = nd_red[i]; + nd_red[i] = 0; + } + for ( i = 0; i < REDTAB_LEN; i++ ) + for ( r = old_red[i]; r; r = NEXT(r) ) { + NEWRHist(mr); mr->index = r->index; SG(mr) = SG(r); ndl_dup(obpe,DL(r),DL(mr)); + h = ndl_hash_value(DL(mr)); + NEXT(mr) = nd_red[h]; + nd_red[h] = mr; } - if ( mr0 ) NEXT(mr) = 0; - nd_red[i] = mr0; - } + for ( i = 0; i < REDTAB_LEN; i++ ) old_red[i] = 0; + old_red = 0; for ( i = 0; i < nd_psn; i++ ) { NEWRHist(r); SG(r) = SG(nd_psh[i]); ndl_dup(obpe,DL(nd_psh[i]),DL(r)); @@ -2526,10 +2536,11 @@ ND_pairs nd_reconstruct(int mod,int trace,ND_pairs d) void nd_reconstruct_direct(int mod,NDV *ps,int len) { - int i,obpe,oadv; + int i,obpe,oadv,h; NM prev_nm_free_list; RHist mr0,mr; RHist r; + RHist *old_red; ND_pairs s0,s,t,prev_ndp_free_list; obpe = nd_bpe; @@ -2547,16 +2558,23 @@ void nd_reconstruct_direct(int mod,NDV *ps,int len) _nm_free_list = 0; _ndp_free_list = 0; if ( mod != 0 ) for ( i = len-1; i >= 0; i-- ) ndv_realloc(ps[i],obpe,oadv); + old_red = (RHist *)ALLOCA(REDTAB_LEN*sizeof(RHist)); for ( i = 0; i < REDTAB_LEN; i++ ) { - for ( mr0 = 0, r = nd_red[i]; r; r = NEXT(r) ) { - NEXTRHist(mr0,mr); + old_red[i] = nd_red[i]; + nd_red[i] = 0; + } + for ( i = 0; i < REDTAB_LEN; i++ ) + for ( r = old_red[i]; r; r = NEXT(r) ) { + NEWRHist(mr); mr->index = r->index; SG(mr) = SG(r); ndl_dup(obpe,DL(r),DL(mr)); + h = ndl_hash_value(DL(mr)); + NEXT(mr) = nd_red[h]; + nd_red[h] = mr; } - if ( mr0 ) NEXT(mr) = 0; - nd_red[i] = mr0; - } + for ( i = 0; i < REDTAB_LEN; i++ ) old_red[i] = 0; + old_red = 0; prev_nm_free_list = 0; prev_ndp_free_list = 0; GC_gcollect(); @@ -2704,7 +2722,6 @@ ND ndv_mul_nm(int mod,NDV p,NM m0) c1 = CM(m); DMAR(c1,c,0,mod,c2); CM(mr) = c2; - TD(DL(mr)) = TD(DL(m))+td; ndl_add(DL(m),d,DL(mr)); } } else { @@ -2712,7 +2729,6 @@ ND ndv_mul_nm(int mod,NDV p,NM m0) for ( i = 0; i < len; i++, NMV_ADV(m) ) { NEXTNM(mr0,mr); mulq(CQ(m),q,&CQ(mr)); - TD(DL(mr)) = TD(DL(m))+td; ndl_add(DL(m),d,DL(mr)); } }