version 1.43, 2003/08/22 07:12:49 |
version 1.44, 2003/08/22 08:32:51 |
|
|
/* $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 ) |