[BACK]Return to nd.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/nd.c between version 1.43 and 1.44

version 1.43, 2003/08/22 07:12:49 version 1.44, 2003/08/22 08:32:51
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.42 2003/08/21 08:20:06 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.43 2003/08/22 07:12:49 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "inline.h"  #include "inline.h"
Line 422  INLINE int ndl_reducible(unsigned int *d1,unsigned int
Line 422  INLINE int ndl_reducible(unsigned int *d1,unsigned int
         }          }
 }  }
   
 /* XXX : block order not supported */  
   
 void ndl_dehomogenize(unsigned int *d)  void ndl_dehomogenize(unsigned int *d)
 {  {
         unsigned int mask;          unsigned int mask;
         unsigned int h;          unsigned int h;
         int i,bits;          int i,bits;
   
         if ( nd_isrlex ) {          if ( nd_blockmask ) {
                 if ( nd_bpe == 32 ) {                  h = GET_EXP(d,nd_nvar-1);
                         h = d[nd_exporigin];                  TD(d) -= h;
                         for ( i = nd_exporigin+1; i < nd_wpd; i++ )                  d[nd_exporigin-1] -= h;
                                 d[i-1] = d[i];          } else {
                         d[i-1] = 0;                  if ( nd_isrlex ) {
                         TD(d) -= h;                          if ( nd_bpe == 32 ) {
                 } else {                                  h = d[nd_exporigin];
                         bits = nd_epw*nd_bpe;                                  for ( i = nd_exporigin+1; i < nd_wpd; i++ )
                         mask = bits==32?0xffffffff:((1<<(nd_epw*nd_bpe))-1);                                          d[i-1] = d[i];
                         h = (d[nd_exporigin]>>((nd_epw-1)*nd_bpe))&nd_mask0;                                  d[i-1] = 0;
                         for ( i = nd_exporigin; i < nd_wpd; i++ )                                  TD(d) -= h;
                                 d[i] = ((d[i]<<nd_bpe)&mask)                          } else {
                                         |(i+1<nd_wpd?((d[i+1]>>((nd_epw-1)*nd_bpe))&nd_mask0):0);                                  bits = nd_epw*nd_bpe;
                         TD(d) -= h;                                  mask = bits==32?0xffffffff:((1<<(nd_epw*nd_bpe))-1);
                 }                                  h = (d[nd_exporigin]>>((nd_epw-1)*nd_bpe))&nd_mask0;
         } else                                  for ( i = nd_exporigin; i < nd_wpd; i++ )
                 TD(d) -= ((d[(nd_nvar-1)/nd_epw+nd_exporigin]>>                                          d[i] = ((d[i]<<nd_bpe)&mask)
                         ((nd_epw-((nd_nvar-1)%nd_epw)-1)*nd_bpe))&((1<<nd_bpe)-1));                                                  |(i+1<nd_wpd?((d[i+1]>>((nd_epw-1)*nd_bpe))&nd_mask0):0);
                                   TD(d) -= h;
                           }
                   } else
                           TD(d) -= GET_EXP(d,nd_nvar-1);
           }
 }  }
   
 void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned int *d)  void ndl_lcm(unsigned int *d1,unsigned *d2,unsigned int *d)
Line 570  int ndl_block_compare(unsigned int *d1,unsigned int *d
Line 573  int ndl_block_compare(unsigned int *d1,unsigned int *d
 {  {
         int i,l,j,ord_o,ord_l;          int i,l,j,ord_o,ord_l;
         struct order_pair *op;          struct order_pair *op;
         unsigned int t1,t2;          unsigned int t1,t2,m;
         unsigned int *mask;          unsigned int *mask;
   
         l = nd_blockmask->n;          l = nd_blockmask->n;
Line 579  int ndl_block_compare(unsigned int *d1,unsigned int *d
Line 582  int ndl_block_compare(unsigned int *d1,unsigned int *d
                 mask = nd_blockmask->mask[j];                  mask = nd_blockmask->mask[j];
                 ord_o = op[j].order;                  ord_o = op[j].order;
                 if ( ord_o < 2 )                  if ( ord_o < 2 )
                         if ( d1[j+1] > d2[j+1] ) return 1;                          if ( (t1=d1[j+1]) > (t2=d2[j+1]) ) return 1;
                         else if ( d1[j+1] < d2[j+1] ) return -1;                          else if ( t1 < t2 ) return -1;
                 for ( i = nd_exporigin; i < nd_wpd; i++ ) {                  for ( i = nd_exporigin; i < nd_wpd; i++ ) {
                         t1 = d1[i]&mask[i];                          m = mask[i];
                         t2 = d2[i]&mask[i];                          t1 = d1[i]&m;
                           t2 = d2[i]&m;
                         if ( t1 > t2 )                          if ( t1 > t2 )
                                 return !ord_o ? -1 : 1;                                  return !ord_o ? -1 : 1;
                         else if ( t1 < t2 )                          else if ( t1 < t2 )

Legend:
Removed from v.1.43  
changed lines
  Added in v.1.44

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>