=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/engine/N.c,v retrieving revision 1.5 retrieving revision 1.10 diff -u -p -r1.5 -r1.10 --- OpenXM_contrib2/asir2000/engine/N.c 2001/10/09 01:36:10 1.5 +++ OpenXM_contrib2/asir2000/engine/N.c 2009/03/02 16:28:30 1.10 @@ -45,12 +45,12 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/engine/N.c,v 1.4 2000/12/21 02:51:45 murao Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/engine/N.c,v 1.9 2007/09/15 10:17:08 noro Exp $ */ #include "ca.h" #include "base.h" -#if defined(VISUAL) || defined(i386) +#if defined(_M_IX86) || defined(i386) void addn(N n1,N n2,N *nr) { unsigned int *m1,*m2,*mr; @@ -71,7 +71,7 @@ void addn(N n1,N n2,N *nr) } *nr = r = NALLOC(d1 + 1); INITRC(r); mr = BD(r); -#if defined(VISUAL) +#if defined(_M_IX86) __asm { push esi push edi @@ -98,6 +98,7 @@ void addn(N n1,N n2,N *nr) } #else asm volatile("\ + pushl %%ebx;\ movl %1,%%esi;\ movl %2,%%edi;\ movl %3,%%ebx;\ @@ -115,10 +116,11 @@ void addn(N n1,N n2,N *nr) jnz Lstart_addn;\ movl $0,%%eax;\ adcl %%eax,%%eax;\ - movl %%eax,%0"\ + movl %%eax,%0;\ + popl %%ebx"\ :"=m"(c)\ :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\ - :"eax","ebx","ecx","edx","esi","edi"); + :"eax","ecx","edx","esi","edi"); #endif for ( i = d2, m1 += d2, mr += d2; (i < d1) && c ; i++ ) { tmp = *m1++ + c; @@ -175,7 +177,7 @@ int subn(N n1,N n2,N *nr) } *nr = r = NALLOC(d1); INITRC(r); mr = BD(r); -#if defined(VISUAL) +#if defined(_M_IX86) __asm { push esi push edi @@ -202,6 +204,7 @@ int subn(N n1,N n2,N *nr) } #else asm volatile("\ + pushl %%ebx;\ movl %1,%%esi;\ movl %2,%%edi;\ movl %3,%%ebx;\ @@ -219,10 +222,11 @@ int subn(N n1,N n2,N *nr) jnz Lstart_subn;\ movl $0,%%eax;\ adcl %%eax,%%eax;\ - movl %%eax,%0"\ + movl %%eax,%0;\ + popl %%ebx"\ :"=m"(br)\ :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\ - :"eax","ebx","ecx","edx","esi","edi"); + :"eax","ecx","edx","esi","edi"); #endif for ( i = d2, m1 += d2, mr += d2; (i < d1) && br; i++ ) { t = *m1++; @@ -257,7 +261,7 @@ void _addn(N n1,N n2,N nr) } mr = BD(nr); -#if defined(VISUAL) +#if defined(_M_IX86) __asm { push esi push edi @@ -284,6 +288,7 @@ void _addn(N n1,N n2,N nr) } #else asm volatile("\ + pushl %%ebx;\ movl %1,%%esi;\ movl %2,%%edi;\ movl %3,%%ebx;\ @@ -301,10 +306,11 @@ void _addn(N n1,N n2,N nr) jnz Lstart__addn;\ movl $0,%%eax;\ adcl %%eax,%%eax;\ - movl %%eax,%0"\ + movl %%eax,%0;\ + popl %%ebx"\ :"=m"(c)\ :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\ - :"eax","ebx","ecx","edx","esi","edi"); + :"eax","ecx","edx","esi","edi"); #endif for ( i = d2, m1 += d2, mr += d2; (i < d1) && c ; i++ ) { tmp = *m1++ + c; @@ -360,7 +366,7 @@ int _subn(N n1,N n2,N nr) } mr = BD(nr); -#if defined(VISUAL) +#if defined(_M_IX86) __asm { push esi push edi @@ -387,6 +393,7 @@ int _subn(N n1,N n2,N nr) } #else asm volatile("\ + pushl %%ebx;\ movl %1,%%esi;\ movl %2,%%edi;\ movl %3,%%ebx;\ @@ -404,10 +411,11 @@ int _subn(N n1,N n2,N nr) jnz Lstart__subn;\ movl $0,%%eax;\ adcl %%eax,%%eax;\ - movl %%eax,%0"\ + movl %%eax,%0;\ + popl %%ebx"\ :"=m"(br)\ :"m"(m1),"m"(m2),"m"(mr),"m"(d2)\ - :"eax","ebx","ecx","edx","esi","edi"); + :"eax","ecx","edx","esi","edi"); #endif for ( i = d2, m1 += d2, mr += d2; (i < d1) && br; i++ ) { t = *m1++; @@ -670,6 +678,15 @@ extern int igcd_algorithm; void gcdEuclidn(), gcdn_HMEXT(); +void lcmn(N n1,N n2,N *nr) +{ + N g,t; + + gcdn(n1,n2,&g); + divsn(n1,g,&t); + muln(t,n2,nr); +} + void gcdn(N n1,N n2,N *nr) { if ( !igcd_algorithm ) @@ -927,13 +944,17 @@ void freen(N n) free(n); } +/* accepts Z */ int n_bits(N n) { - unsigned int l,i,t; + unsigned int i,t; + int l; if ( !n ) return 0; - l = PL(n); t = BD(n)[l-1]; + l = PL(n); + if ( l < 0 ) l = -l; + t = BD(n)[l-1]; for ( i = 0; t; t>>=1, i++); return i + (l-1)*BSH; }