From 9ce1fe4656b6239c566e6cb1425c7cf93cadaf88 Mon Sep 17 00:00:00 2001 From: Tom St Denis Date: Fri, 18 Nov 2005 05:16:25 +0000 Subject: [PATCH] added tomsfastmath-0.07 --- changes.txt | 5 ++ demo/test.c | 8 +-- doc/tfm.pdf | Bin 124995 -> 125127 bytes fp_montgomery_reduce.c | 30 ++++---- fp_mul.c | 32 ++++----- fp_mul_comba.c | 10 +-- fp_sqr.c | 25 ++++--- fp_sqr_comba.c | 58 +++++++-------- makefile | 17 +++-- makefile.shared | 6 +- pre_gen/mpi.c | 155 ++++++++++++++++++++--------------------- tfm.dvi | Bin 51616 -> 51624 bytes tfm.h | 12 +++- tfm.log | 4 +- tfm.tex | 2 +- 15 files changed, 190 insertions(+), 174 deletions(-) diff --git a/changes.txt b/changes.txt index 4fab275..bc2b6e8 100644 --- a/changes.txt +++ b/changes.txt @@ -1,3 +1,8 @@ +November 18th, 2005 +0.07 -- Fixes to fp_mul and fp_sqr to clean up the handling of the defines, fix to tfm.h to also clear up the prototypes. + -- Updates to build and run on a IBM PPC 405 [using GCC 3.4.4] + -- Made the "make" command renamable in the build system + October 31st, 2005 0.06 -- fixed fp_mul() and fp_sqr() to trim digits when overflows would occur. Produces numerically inprecise results (e.g. the lower FP_SIZE digits) but shouldn't segfault at least ;-) diff --git a/demo/test.c b/demo/test.c index d79759c..e8f89ff 100644 --- a/demo/test.c +++ b/demo/test.c @@ -23,7 +23,7 @@ static ulong64 TIMFUNC (void) { #if defined __GNUC__ #if defined(INTEL_CC) - ulong64 a; + ulong64 a; asm ("rdtsc":"=A"(a)); return a; #elif defined(__i386__) || defined(__x86_64__) @@ -31,9 +31,9 @@ static ulong64 TIMFUNC (void) __asm__ __volatile__ ("rdtsc\nmovl %%eax,%0\nmovl %%edx,4+%0\n"::"m"(a):"%eax","%edx"); return a; #elif defined(TFM_PPC32) - unsigned long a; - __asm__ __volatile__ ("mftb %0":"=r"(a)); - return a; + unsigned long a, b; + __asm__ __volatile__ ("mftbu %1 \nmftb %0\n":"=r"(a), "=r"(b)); + return (((ulong64)b) << 32ULL) | ((ulong64)a); #else /* gcc-IA64 version */ unsigned long result; __asm__ __volatile__("mov %0=ar.itc" : "=r"(result) :: "memory"); diff --git a/doc/tfm.pdf b/doc/tfm.pdf index 1f6b759183b48335fa7832777872a97549bb70d7..03fd3d1dc07306260670a0b9242f5f8069d13916 100644 GIT binary patch delta 46237 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 C8-xk~ delta 46099 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 S8z3bjp!O%?=2p;DB>I1Lfvn2_ diff --git a/fp_montgomery_reduce.c b/fp_montgomery_reduce.c index b0c2305..1d1a76e 100644 --- a/fp_montgomery_reduce.c +++ b/fp_montgomery_reduce.c @@ -259,24 +259,24 @@ asm( \ #define INNERMUL \ asm( \ - " mullw r16,%3,%4 \n\t" \ - " mulhwu r17,%3,%4 \n\t" \ - " addc r16,r16,%0 \n\t" \ - " addze r17,r17 \n\t" \ - " lwz r18,%1 \n\t" \ - " addc r16,r16,r18 \n\t" \ - " addze %0,r17 \n\t" \ - " stw r16,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c[0]):"r16", "r17", "r18","%cc"); + " mullw 16,%3,%4 \n\t" \ + " mulhwu 17,%3,%4 \n\t" \ + " addc 16,16,%0 \n\t" \ + " addze 17,17 \n\t" \ + " lwz 18,%1 \n\t" \ + " addc 16,16,18 \n\t" \ + " addze %0,17 \n\t" \ + " stw 16,%1 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm; #define PROPCARRY \ asm( \ - " lwz r16,%1 \n\t" \ - " addc r16,r16,%0 \n\t" \ - " stw r16,%1 \n\t" \ - " xor %0,%0,%0 \n\t" \ - " addze %0,%0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r16","%cc"); + " lwz 16,%1 \n\t" \ + " addc 16,16,%0 \n\t" \ + " stw 16,%1 \n\t" \ + " xor %0,%0,%0 \n\t" \ + " addze %0,%0 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); /******************************************************************/ #else diff --git a/fp_mul.c b/fp_mul.c index a8b42da..79d52c1 100644 --- a/fp_mul.c +++ b/fp_mul.c @@ -34,28 +34,28 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) #ifdef TFM_SMALL_SET if (y <= 16) { fp_mul_comba_small(A,B,C); -#elif defined(TFM_HUGE) - if (0) { 1; -#endif + return; + } +#endif #if defined(TFM_MUL32) - } else if (y <= 32) { + if (yy >= 24 && y <= 32) { fp_mul_comba32(A,B,C); + return; + } #endif #if defined(TFM_MUL48) - } else if (y <= 48) { + if (yy >= 40 && y <= 48) { fp_mul_comba48(A,B,C); -#endif -#if defined(TFM_MUL64) - } else if (y <= 64) { - fp_mul_comba64(A,B,C); -#endif -#if !defined(TFM_HUGE) && !defined(TFM_SMALL_SET) - { -#else - } else { -#endif - fp_mul_comba(A,B,C); + return; } +#endif +#if defined(TFM_MUL64) + if (yy >= 56 && y <= 64) { + fp_mul_comba64(A,B,C); + return; + } +#endif + fp_mul_comba(A,B,C); } else { /* do the karatsuba action diff --git a/fp_mul_comba.c b/fp_mul_comba.c index 8aa99cc..4032cc1 100644 --- a/fp_mul_comba.c +++ b/fp_mul_comba.c @@ -179,12 +179,12 @@ asm( \ /* untested: will mulhwu change the flags? Docs say no */ #define MULADD(i, j) \ asm( \ - " mullw r16,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%7 \n\t" \ - " adde %1,%1,r16 \n\t" \ + " mullw 16,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%7 \n\t" \ + " adde %1,%1,16 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16"); +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16"); #else /* ISO C code */ diff --git a/fp_sqr.c b/fp_sqr.c index c95fe7b..b3c8191 100644 --- a/fp_sqr.c +++ b/fp_sqr.c @@ -27,29 +27,28 @@ void fp_sqr(fp_int *A, fp_int *B) #if defined(TFM_SMALL_SET) if (y <= 16) { fp_sqr_comba_small(A,B); -#elif defined(TFM_HUGE) - if (0) { 1; + return; + } #endif #if defined(TFM_SQR32) - } else if (y <= 32) { + if (y <= 32) { fp_sqr_comba32(A,B); + return; + } #endif #if defined(TFM_SQR48) - } else if (y <= 48) { + if (y <= 48) { fp_sqr_comba48(A,B); + return; + } #endif #if defined(TFM_SQR64) - } else if (y <= 64) { + if (y <= 64) { fp_sqr_comba64(A,B); -#endif -#if !defined(TFM_SMALL_SET) && !defined(TFM_HUGE) - { -#else - } else { -#endif - fp_sqr_comba(A, B); + return; } - +#endif + fp_sqr_comba(A, B); } else { /* do the karatsuba action diff --git a/fp_sqr_comba.c b/fp_sqr_comba.c index 443f910..57f2804 100644 --- a/fp_sqr_comba.c +++ b/fp_sqr_comba.c @@ -303,7 +303,7 @@ asm( \ /* PPC32 */ -#define COMBA_START \ +#define COMBA_START #define CLEAR_CARRY \ c0 = c1 = c2 = 0; @@ -317,30 +317,30 @@ asm( \ #define CARRY_FORWARD \ do { c0 = c1; c1 = c2; c2 = 0; } while (0); -#define COMBA_FINI \ +#define COMBA_FINI /* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ - " mullw r16,%6,%6 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%6 \n\t" \ - " adde %1,%1,r16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r16","%cc"); +#define SQRADD(i, j) \ +asm( \ + " mullw 16,%6,%6 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%6 \n\t" \ + " adde %1,%1,16 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc"); /* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ - " mullw r16,%6,%7 \n\t" \ - " mulhwu r17,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " adde %1,%1,r17 \n\t" \ - " addze %2,%2 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " adde %1,%1,r17 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16", "r17","%cc"); +#define SQRADD2(i, j) \ +asm( \ + " mullw 16,%6,%7 \n\t" \ + " mulhwu 17,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " adde %1,%1,17 \n\t" \ + " addze %2,%2 \n\t" \ + " addc %0,%0,16 \n\t" \ + " adde %1,%1,17 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc"); #define SQRADDSC(i, j) \ asm( \ @@ -349,14 +349,14 @@ asm( \ " xor %2,%2,%2 \n\t" \ :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc"); -#define SQRADDAC(i, j) \ -asm( \ - " mullw r16,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%7 \n\t" \ - " adde %1,%1,r16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r16", "%cc"); +#define SQRADDAC(i, j) \ +asm( \ + " mullw 16,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%7 \n\t" \ + " adde %1,%1,16 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc"); #define SQRADDDB \ asm( \ diff --git a/makefile b/makefile index b74b0bb..0c752cd 100644 --- a/makefile +++ b/makefile @@ -1,10 +1,14 @@ #makefile for TomsFastMath # # -VERSION=0.06 +VERSION=0.07 CFLAGS += -Wall -W -Wshadow -I./ +ifndef MAKE + MAKE=make +endif + ifndef IGNORE_SPEED CFLAGS += -O3 -funroll-all-loops @@ -85,7 +89,7 @@ install: $(LIBNAME) install -g $(GROUP) -o $(USER) $(HEADERS) $(DESTDIR)$(INCPATH) mtest/mtest: mtest/mtest.c - cd mtest ; CFLAGS="$(CFLAGS) -I../" make mtest + cd mtest ; CFLAGS="$(CFLAGS) -I../" MAKE=${MAKE} ${MAKE} mtest test: $(LIBNAME) demo/test.o mtest/mtest $(CC) $(CFLAGS) demo/test.o $(LIBNAME) $(PROF) -o test @@ -128,7 +132,7 @@ clean: rm -f `find . -type f | grep "[.]dpi" | xargs` rm -rf `find . -type d | grep "[.]libs" | xargs` rm -f tfm.aux tfm.dvi tfm.idx tfm.ilg tfm.ind tfm.lof tfm.log tfm.toc - cd mtest ; make clean + cd mtest ; MAKE=${MAKE} ${MAKE} clean no_oops: clean cd .. ; cvs commit @@ -140,8 +144,9 @@ zipup: no_oops docs clean cd .. ; rm -rf tfm* tomsfastmath-$(VERSION) ; mkdir tomsfastmath-$(VERSION) ; \ cp -R ./tomsfastmath/* ./tomsfastmath-$(VERSION)/ ; \ tar -c tomsfastmath-$(VERSION)/* | bzip2 -9vvc > tfm-$(VERSION).tar.bz2 ; \ - zip -9r tfm-$(VERSION).zip tomsfastmath-$(VERSION)/* + zip -9r tfm-$(VERSION).zip tomsfastmath-$(VERSION)/* ; \ + mv -f tfm* ~ ; rm -rf tomsfastmath-$(VERSION) # $Source: /cvs/libtom/tomsfastmath/makefile,v $ -# $Revision: 1.19 $ -# $Date: 2005/08/25 23:53:40 $ +# $Revision: 1.23 $ +# $Date: 2005/11/18 06:13:57 $ diff --git a/makefile.shared b/makefile.shared index 2ccac42..2b65798 100644 --- a/makefile.shared +++ b/makefile.shared @@ -1,7 +1,7 @@ #makefile for TomsFastMath # # -VERSION=0:6 +VERSION=0:7 CC=libtool --mode=compile gcc @@ -104,6 +104,6 @@ stest: $(LIBNAME) demo/stest.o $(CC) $(CFLAGS) demo/stest.o $(LIBNAME_S) -o stest # $Source: /cvs/libtom/tomsfastmath/makefile.shared,v $ -# $Revision: 1.7 $ -# $Date: 2005/10/06 23:31:17 $ +# $Revision: 1.8 $ +# $Date: 2005/10/31 17:26:00 $ diff --git a/pre_gen/mpi.c b/pre_gen/mpi.c index 4a8a033..c541024 100644 --- a/pre_gen/mpi.c +++ b/pre_gen/mpi.c @@ -1951,24 +1951,24 @@ asm( \ #define INNERMUL \ asm( \ - " mullw r16,%3,%4 \n\t" \ - " mulhwu r17,%3,%4 \n\t" \ - " addc r16,r16,%0 \n\t" \ - " addze r17,r17 \n\t" \ - " lwz r18,%1 \n\t" \ - " addc r16,r16,r18 \n\t" \ - " addze %0,r17 \n\t" \ - " stw r16,%1 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(*tmpm++),"1"(_c[0]):"r16", "r17", "r18","%cc"); + " mullw 16,%3,%4 \n\t" \ + " mulhwu 17,%3,%4 \n\t" \ + " addc 16,16,%0 \n\t" \ + " addze 17,17 \n\t" \ + " lwz 18,%1 \n\t" \ + " addc 16,16,18 \n\t" \ + " addze %0,17 \n\t" \ + " stw 16,%1 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"r"(mu),"r"(tmpm[0]),"1"(_c[0]):"16", "17", "18","%cc"); ++tmpm; #define PROPCARRY \ asm( \ - " lwz r16,%1 \n\t" \ - " addc r16,r16,%0 \n\t" \ - " stw r16,%1 \n\t" \ - " xor %0,%0,%0 \n\t" \ - " addze %0,%0 \n\t" \ -:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"r16","%cc"); + " lwz 16,%1 \n\t" \ + " addc 16,16,%0 \n\t" \ + " stw 16,%1 \n\t" \ + " xor %0,%0,%0 \n\t" \ + " addze %0,%0 \n\t" \ +:"=r"(cy),"=m"(_c[0]):"0"(cy),"1"(_c[0]):"16","%cc"); /******************************************************************/ #else @@ -2169,28 +2169,28 @@ void fp_mul(fp_int *A, fp_int *B, fp_int *C) #ifdef TFM_SMALL_SET if (y <= 16) { fp_mul_comba_small(A,B,C); -#elif defined(TFM_HUGE) - if (0) { 1; -#endif + return; + } +#endif #if defined(TFM_MUL32) - } else if (y <= 32) { + if (yy >= 24 && y <= 32) { fp_mul_comba32(A,B,C); + return; + } #endif #if defined(TFM_MUL48) - } else if (y <= 48) { + if (yy >= 40 && y <= 48) { fp_mul_comba48(A,B,C); -#endif -#if defined(TFM_MUL64) - } else if (y <= 64) { - fp_mul_comba64(A,B,C); -#endif -#if !defined(TFM_HUGE) && !defined(TFM_SMALL_SET) - { -#else - } else { -#endif - fp_mul_comba(A,B,C); + return; } +#endif +#if defined(TFM_MUL64) + if (yy >= 56 && y <= 64) { + fp_mul_comba64(A,B,C); + return; + } +#endif + fp_mul_comba(A,B,C); } else { /* do the karatsuba action @@ -2596,12 +2596,12 @@ asm( \ /* untested: will mulhwu change the flags? Docs say no */ #define MULADD(i, j) \ asm( \ - " mullw r16,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%7 \n\t" \ - " adde %1,%1,r16 \n\t" \ + " mullw 16,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%7 \n\t" \ + " adde %1,%1,16 \n\t" \ " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16"); +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16"); #else /* ISO C code */ @@ -5740,29 +5740,28 @@ void fp_sqr(fp_int *A, fp_int *B) #if defined(TFM_SMALL_SET) if (y <= 16) { fp_sqr_comba_small(A,B); -#elif defined(TFM_HUGE) - if (0) { 1; + return; + } #endif #if defined(TFM_SQR32) - } else if (y <= 32) { + if (y <= 32) { fp_sqr_comba32(A,B); + return; + } #endif #if defined(TFM_SQR48) - } else if (y <= 48) { + if (y <= 48) { fp_sqr_comba48(A,B); + return; + } #endif #if defined(TFM_SQR64) - } else if (y <= 64) { + if (y <= 64) { fp_sqr_comba64(A,B); -#endif -#if !defined(TFM_SMALL_SET) && !defined(TFM_HUGE) - { -#else - } else { -#endif - fp_sqr_comba(A, B); + return; } - +#endif + fp_sqr_comba(A, B); } else { /* do the karatsuba action @@ -6150,7 +6149,7 @@ asm( \ /* PPC32 */ -#define COMBA_START \ +#define COMBA_START #define CLEAR_CARRY \ c0 = c1 = c2 = 0; @@ -6164,30 +6163,30 @@ asm( \ #define CARRY_FORWARD \ do { c0 = c1; c1 = c2; c2 = 0; } while (0); -#define COMBA_FINI \ +#define COMBA_FINI /* multiplies point i and j, updates carry "c1" and digit c2 */ -#define SQRADD(i, j) \ -asm( \ - " mullw r16,%6,%6 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%6 \n\t" \ - " adde %1,%1,r16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"r16","%cc"); +#define SQRADD(i, j) \ +asm( \ + " mullw 16,%6,%6 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%6 \n\t" \ + " adde %1,%1,16 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i):"16","%cc"); /* for squaring some of the terms are doubled... */ -#define SQRADD2(i, j) \ -asm( \ - " mullw r16,%6,%7 \n\t" \ - " mulhwu r17,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " adde %1,%1,r17 \n\t" \ - " addze %2,%2 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " adde %1,%1,r17 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"r16", "r17","%cc"); +#define SQRADD2(i, j) \ +asm( \ + " mullw 16,%6,%7 \n\t" \ + " mulhwu 17,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " adde %1,%1,17 \n\t" \ + " addze %2,%2 \n\t" \ + " addc %0,%0,16 \n\t" \ + " adde %1,%1,17 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(c0), "=r"(c1), "=r"(c2):"0"(c0), "1"(c1), "2"(c2), "r"(i), "r"(j):"16", "17","%cc"); #define SQRADDSC(i, j) \ asm( \ @@ -6196,14 +6195,14 @@ asm( \ " xor %2,%2,%2 \n\t" \ :"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i),"r"(j) : "%cc"); -#define SQRADDAC(i, j) \ -asm( \ - " mullw r16,%6,%7 \n\t" \ - " addc %0,%0,r16 \n\t" \ - " mulhwu r16,%6,%7 \n\t" \ - " adde %1,%1,r16 \n\t" \ - " addze %2,%2 \n\t" \ -:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"r16", "%cc"); +#define SQRADDAC(i, j) \ +asm( \ + " mullw 16,%6,%7 \n\t" \ + " addc %0,%0,16 \n\t" \ + " mulhwu 16,%6,%7 \n\t" \ + " adde %1,%1,16 \n\t" \ + " addze %2,%2 \n\t" \ +:"=r"(sc0), "=r"(sc1), "=r"(sc2):"0"(sc0), "1"(sc1), "2"(sc2), "r"(i), "r"(j):"16", "%cc"); #define SQRADDDB \ asm( \ diff --git a/tfm.dvi b/tfm.dvi index 1b76490eaade3bd3f756b95e226f09bc0a539ee2..7d552eba74aafeb62252ae998f1ede20998bea3d 100644 GIT binary patch delta 389 zcmZ25nR&%z<_U^?hI)n;Rt9E>Z)uE=3!(spPay$q%g6%JJc_K>YAdm z$*H-MlO_cBr4~(Nezn5TLT9p(fr05{!9>%|LQE3OjKY%>7N|`Quo9W9>&!R#-CpU< zeXO;LOsve4^AoKmzww8N6{yc(V|)r%$`=O_&e7v!Vtfcx=`neqK{2BrOu^n?2CP<_J@ky2 z81KMjCa+86n;fMsG5JrT@nk+j4MtC}qC&&H9E_}RMO93Eo6D{0IhZW}0;N4RJ2;o| zFdl6A6{_lU2m$4P3d9sHd-)6u7vf;N0T!*B{)~fB z5F|Rep+t1^f(7C1jK*LY;}!EbfG&i|@NT@!#kgSe!`&ws8P|hNxv