[svn] gcry - r1217 - in trunk: . cipher mpi mpi/amd64 tests

svn author wk cvs at cvs.gnupg.org
Tue Mar 13 12:39:12 CET 2007


Author: wk
Date: 2007-03-13 12:39:11 +0100 (Tue, 13 Mar 2007)
New Revision: 1217

Added:
   trunk/mpi/amd64/
   trunk/mpi/amd64/distfiles
   trunk/mpi/amd64/mpih-add1.S
   trunk/mpi/amd64/mpih-lshift.S
   trunk/mpi/amd64/mpih-mul1.S
   trunk/mpi/amd64/mpih-mul2.S
   trunk/mpi/amd64/mpih-mul3.S
   trunk/mpi/amd64/mpih-rshift.S
   trunk/mpi/amd64/mpih-sub1.S
   trunk/tests/mpitests.c
Modified:
   trunk/AUTHORS
   trunk/NEWS
   trunk/TODO
   trunk/cipher/random.c
   trunk/cipher/test-getrusage.c
   trunk/mpi/ChangeLog
   trunk/mpi/config.links
   trunk/tests/ChangeLog
   trunk/tests/Makefile.am
   trunk/tests/basic.c
Log:
Add support for ADM64.  From Werner Dittmann.
Cosmetic changes.


Modified: trunk/AUTHORS
===================================================================
--- trunk/AUTHORS	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/AUTHORS	2007-03-13 11:39:11 UTC (rev 1217)
@@ -80,7 +80,12 @@
 (SEED cipher)
 
 
+LIBGCRYPT       Werner Dittmann  ** pending **
+werner.dittmann at t-online.de
+(mpi/amd64, tests/mpitests.c)
 
+
+
 More credits
 ============
 The ATH implementation (src/ath*) has been taken from GPGME and

Modified: trunk/NEWS
===================================================================
--- trunk/NEWS	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/NEWS	2007-03-13 11:39:11 UTC (rev 1217)
@@ -37,6 +37,8 @@
 
  * Support for Microsoft Windows OSes.
 
+ * Assembler support for the AMD64 architecture.
+
  * Minor changes to some function declarations.  Buffer arguments are
    now typed as void pointer.  This should not affect any compilation.
    Fixed two bugs in return values and clarified documentation.

Modified: trunk/TODO
===================================================================
--- trunk/TODO	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/TODO	2007-03-13 11:39:11 UTC (rev 1217)
@@ -78,5 +78,5 @@
 * Tests
   We need a lot more tests.  Lets keep an ever growing list here.
 ** Write tests for the progress function
+** mpitests does no real checks yet.
 
-

Modified: trunk/cipher/random.c
===================================================================
--- trunk/cipher/random.c	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/cipher/random.c	2007-03-13 11:39:11 UTC (rev 1217)
@@ -221,6 +221,7 @@
     initialize ();
 }
 
+
 void
 _gcry_random_dump_stats()
 {
@@ -235,6 +236,7 @@
 		    rndstats.ngetbytes2, rndstats.getbytes2 );
 }
 
+
 void
 _gcry_secure_random_alloc()
 {
@@ -1055,6 +1057,7 @@
 }
 
 
+
 static void
 do_fast_random_poll (void)
 {
@@ -1111,11 +1114,10 @@
 # ifdef RUSAGE_SELF
   {	
     struct rusage buf;
-    /* QNX/Neutrino does return ENOSYS - so we just ignore it and
-     * add whatever is in buf.  In a chroot environment it might not
-     * work at all (i.e. because /proc/ is not accessible), so we better 
-     * ugnore all error codes and hope for the best
-     */
+    /* QNX/Neutrino does return ENOSYS - so we just ignore it and add
+       whatever is in buf.  In a chroot environment it might not work
+       at all (i.e. because /proc/ is not accessible), so we better
+       ignore all error codes and hope for the best. */
     getrusage (RUSAGE_SELF, &buf );
     add_randomness( &buf, sizeof buf, 1 );
     memset( &buf, 0, sizeof buf );

Modified: trunk/cipher/test-getrusage.c
===================================================================
--- trunk/cipher/test-getrusage.c	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/cipher/test-getrusage.c	2007-03-13 11:39:11 UTC (rev 1217)
@@ -45,5 +45,61 @@
   printf ("ru_nvcsw   = %ld\n", buf.ru_nvcsw    );
   printf ("ru_nivcsw  = %ld\n", buf.ru_nivcsw   );
 
+  fprintf (stderr, "ru_utime   ru_stime   ru_minflt  ru_nccsw  ru_nivcsw\n");
+  fprintf (stderr, "%ld.%06ld  %ld.%06ld  %5ld       %5ld      %5ld\n");
+
+
   return 0;
 }
+
+
+/* Codesnippet for debugging in random.c. */
+#if 0
+static void
+collect_rusage_stats (struct rusage *rb)
+{
+  static int idx;
+  static struct rusage buf[100];
+  
+  if (!rb)
+    {
+      int i;
+
+      fprintf (stderr, "ru_utime   ru_stime   ru_minflt  ru_nvcsw  ru_nivcsw\n");
+      for (i=0; i < idx; i++)
+        fprintf (stderr, "%ld.%06ld   %ld.%06ld %5ld       %5ld      %5ld\n",
+                 buf[i].ru_utime.tv_sec, buf[i].ru_utime.tv_usec, 
+                 buf[i].ru_stime.tv_sec, buf[i].ru_stime.tv_usec, 
+                 buf[i].ru_minflt, 
+                 buf[i].ru_nvcsw,
+                 buf[i].ru_nivcsw);
+    }      
+  else if (idx < DIM(buf))
+    {
+      buf[idx++] = *rb;
+    }
+}
+#endif
+/*
+ void
+ _gcry_random_dump_stats()
+ {
+@@ -233,8 +261,11 @@
+                  rndstats.naddbytes, rndstats.addbytes,
+        rndstats.mixkey, rndstats.ngetbytes1, rndstats.getbytes1,
+                    rndstats.ngetbytes2, rndstats.getbytes2 );
++
++    collect_rusage_stats (NULL);
+ }
+
+========
+
+     getrusage (RUSAGE_SELF, &buf );
++    collect_rusage_stats (&buf);
+     add_randomness( &buf, sizeof buf, 1 );
+     memset( &buf, 0, sizeof buf );
+   }
+ 
+*/
+
+

Modified: trunk/mpi/ChangeLog
===================================================================
--- trunk/mpi/ChangeLog	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/ChangeLog	2007-03-13 11:39:11 UTC (rev 1217)
@@ -1,3 +1,10 @@
+2007-03-13  Werner Dittmann <Werner.Dittmann at t-online.de>  (wk)
+
+	* amd64/mpih-add1.S, amd64/mpih-add1.S, amd64/mpih-lshift.S
+	* amd64/mpih-mul1.S, amd64/mpih-mul2.S, amd64/mpih-mul3.S
+	* amd64/mpih-rshift.S, amd64/mpih-sub1.S: New.
+	* config.links:  Add case for x86_64.
+
 2007-02-23  Werner Koch  <wk at g10code.com>
 
 	* mpi-pow.c (gcry_mpi_powm): Remove unused var ESIGN.

Added: trunk/mpi/amd64/distfiles
===================================================================
--- trunk/mpi/amd64/distfiles	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/distfiles	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,8 @@
+distfiles
+mpih-add1.S
+mpih-lshift.S
+mpih-mul1.S
+mpih-mul2.S
+mpih-mul3.S
+mpih-rshift.S
+mpih-sub1.S

Added: trunk/mpi/amd64/mpih-add1.S
===================================================================
--- trunk/mpi/amd64/mpih-add1.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-add1.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,63 @@
+/* AMD64 (x86_64) add_n -- Add two limb vectors of the same length > 0 and store
+ *		   sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  _gcry_mpih_add_n( mpi_ptr_t res_ptr,	rdi
+ *		   mpi_ptr_t s1_ptr,		rsi
+ *		   mpi_ptr_t s2_ptr,		rdx
+ *		   mpi_size_t size)		rcx
+ */
+
+.text
+	.globl C_SYMBOL_NAME(_gcry_mpih_add_n)
+C_SYMBOL_NAME(_gcry_mpih_add_n:)
+	leaq	(%rsi,%rcx,8), %rsi
+	leaq	(%rdi,%rcx,8), %rdi
+	leaq	(%rdx,%rcx,8), %rdx
+	negq	%rcx
+	xorl	%eax, %eax		/* clear cy */
+
+	ALIGN(4)			/* minimal alignment for claimed speed */
+.Loop:	movq	(%rsi,%rcx,8), %rax
+	movq	(%rdx,%rcx,8), %r10
+	adcq	%r10, %rax
+	movq	%rax, (%rdi,%rcx,8)
+	incq	%rcx
+	jne	.Loop
+
+	movq	%rcx, %rax		/* zero %rax */
+	adcq	%rax, %rax
+	ret
+	
\ No newline at end of file

Added: trunk/mpi/amd64/mpih-lshift.S
===================================================================
--- trunk/mpi/amd64/mpih-lshift.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-lshift.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,77 @@
+/* AMD64 (x86_64) lshift -- Left shift a limb vector and store
+ *		  result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_lshift( mpi_ptr_t wp,	rdi
+ *		   mpi_ptr_t up,	rsi
+ *		   mpi_size_t usize,	rdx
+ *		   unsigned cnt)	rcx
+ */
+
+.text
+	.globl C_SYMBOL_NAME(_gcry_mpih_lshift)
+C_SYMBOL_NAME(_gcry_mpih_lshift:)
+	movq	-8(%rsi,%rdx,8), %mm7
+	movd	%ecx, %mm1
+	movl	$64, %eax
+	subl	%ecx, %eax
+	movd	%eax, %mm0
+	movq	%mm7, %mm3
+	psrlq	%mm0, %mm7
+	movd	%mm7, %rax
+	subq	$2, %rdx
+	jl	.Lendo
+
+	ALIGN(4)			/* minimal alignment for claimed speed */
+.Loop:	movq	(%rsi,%rdx,8), %mm6
+	movq	%mm6, %mm2
+	psrlq	%mm0, %mm6
+	psllq	%mm1, %mm3
+	por	%mm6, %mm3
+	movq	%mm3, 8(%rdi,%rdx,8)
+	je	.Lende
+	movq	-8(%rsi,%rdx,8), %mm7
+	movq	%mm7, %mm3
+	psrlq	%mm0, %mm7
+	psllq	%mm1, %mm2
+	por	%mm7, %mm2
+	movq	%mm2, (%rdi,%rdx,8)
+	subq	$2, %rdx
+	jge	.Loop
+
+.Lendo:	movq	%mm3, %mm2
+.Lende:	psllq	%mm1, %mm2
+	movq	%mm2, (%rdi)
+	emms
+	ret

Added: trunk/mpi/amd64/mpih-mul1.S
===================================================================
--- trunk/mpi/amd64/mpih-mul1.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-mul1.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,65 @@
+/* AMD64 mul_1 -- Multiply a limb vector with a limb and store
+ *			 the result in a second limb vector.
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_mul_1( mpi_ptr_t res_ptr,	(rdi)
+ *		  mpi_ptr_t s1_ptr,	(rsi)
+ *		  mpi_size_t s1_size,	(rdx)
+ *		  mpi_limb_t s2_limb)	(rcx)
+ */
+
+
+	TEXT
+	ALIGN(5)
+	.byte	0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+
+	GLOBL	C_SYMBOL_NAME(_gcry_mpih_mul_1)
+C_SYMBOL_NAME(_gcry_mpih_mul_1:)
+
+	movq	%rdx, %r11
+	leaq	(%rsi,%rdx,8), %rsi
+	leaq	(%rdi,%rdx,8), %rdi
+	negq	%r11
+	xorl	%r8d, %r8d
+
+.Loop:	movq	(%rsi,%r11,8), %rax
+	mulq	%rcx
+	addq	%r8, %rax
+	movl	$0, %r8d
+	adcq	%rdx, %r8
+	movq	%rax, (%rdi,%r11,8)
+	incq	%r11
+	jne	.Loop
+
+	movq	%r8, %rax
+	ret

Added: trunk/mpi/amd64/mpih-mul2.S
===================================================================
--- trunk/mpi/amd64/mpih-mul2.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-mul2.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,107 @@
+/* AMD64 addmul2 -- Multiply a limb vector with a limb and add
+ *		      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_addmul_2( mpi_ptr_t res_ptr,      (sp + 4)
+ *		     mpi_ptr_t s1_ptr,	     (sp + 8)
+ *		     mpi_size_t s1_size,     (sp + 12)
+ *		     mpi_limb_t s2_limb)     (sp + 16)
+ */
+
+	/* i80386 addmul_1 -- Multiply a limb vector with a limb and add
+ *		      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998,
+ *                    2001, 2002 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_addmul_1( mpi_ptr_t res_ptr,   (rdi)
+ *		     mpi_ptr_t s1_ptr,	     (rsi)
+ *		     mpi_size_t s1_size,     (rdx)
+ *		     mpi_limb_t s2_limb)     (rcx)
+ */
+	TEXT
+	GLOBL	C_SYMBOL_NAME(_gcry_mpih_addmul_1)
+C_SYMBOL_NAME(_gcry_mpih_addmul_1:)
+	movq	%rdx, %r11
+	leaq	(%rsi,%rdx,8), %rsi
+	leaq	(%rdi,%rdx,8), %rdi
+	negq	%r11
+	xorl	%r8d, %r8d
+	xorl	%r10d, %r10d
+
+	ALIGN(3)			/* minimal alignment for claimed speed */
+.Loop:	movq	(%rsi,%r11,8), %rax
+	mulq	%rcx
+	addq	(%rdi,%r11,8), %rax
+	adcq	%r10, %rdx
+	addq	%r8, %rax
+	movq	%r10, %r8
+	movq	%rax, (%rdi,%r11,8)
+	adcq	%rdx, %r8
+	incq	%r11
+	jne	.Loop
+
+	movq	%r8, %rax
+	ret

Added: trunk/mpi/amd64/mpih-mul3.S
===================================================================
--- trunk/mpi/amd64/mpih-mul3.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-mul3.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,66 @@
+/* AMD64 submul_1 -- Multiply a limb vector with a limb and add
+ *		      the result to a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_submul_1( mpi_ptr_t res_ptr,   (rdi)
+ *		     mpi_ptr_t s1_ptr,	     (rsi)
+ *		     mpi_size_t s1_size,     (rdx)
+ *		     mpi_limb_t s2_limb)     (rcx)
+ */
+	TEXT
+	GLOBL	C_SYMBOL_NAME(_gcry_mpih_submul_1)
+C_SYMBOL_NAME(_gcry_mpih_submul_1:)
+
+	movq	%rdx, %r11
+	leaq	(%rsi,%r11,8), %rsi
+	leaq	(%rdi,%r11,8), %rdi
+	negq	%r11
+	xorl	%r8d, %r8d
+
+	ALIGN(3)			/* minimal alignment for claimed speed */
+.Loop:	movq	(%rsi,%r11,8), %rax
+	movq	(%rdi,%r11,8), %r10
+	mulq	%rcx
+	subq	%r8, %r10
+	movl	$0, %r8d
+	adcl	%r8d, %r8d
+	subq	%rax, %r10
+	adcq	%rdx, %r8
+	movq	%r10, (%rdi,%r11,8)
+	incq	%r11
+	jne	.Loop
+
+	movq	%r8, %rax
+	ret

Added: trunk/mpi/amd64/mpih-rshift.S
===================================================================
--- trunk/mpi/amd64/mpih-rshift.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-rshift.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,80 @@
+/* AMD64 (x86_64) rshift -- Right shift a limb vector and store
+ *		  result in a second limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+/*******************
+ * mpi_limb_t
+ * _gcry_mpih_rshift( mpi_ptr_t wp,	rdi
+ *		   mpi_ptr_t up,	rsi
+ *		   mpi_size_t usize,	rdx
+ *		   unsigned cnt)	rcx
+ */
+
+.text
+	.globl C_SYMBOL_NAME(_gcry_mpih_rshift)
+C_SYMBOL_NAME(_gcry_mpih_rshift:)
+	movq	(%rsi), %mm7
+	movd	%ecx, %mm1
+	movl	$64, %eax
+	subl	%ecx, %eax
+	movd	%eax, %mm0
+	movq	%mm7, %mm3
+	psllq	%mm0, %mm7
+	movd	%mm7, %rax
+	leaq	(%rsi,%rdx,8), %rsi
+	leaq	(%rdi,%rdx,8), %rdi
+	negq	%rdx
+	addq	$2, %rdx
+	jg	.Lendo
+
+	ALIGN(8)			/* minimal alignment for claimed speed */
+.Loop:	movq	-8(%rsi,%rdx,8), %mm6
+	movq	%mm6, %mm2
+	psllq	%mm0, %mm6
+	psrlq	%mm1, %mm3
+	por	%mm6, %mm3
+	movq	%mm3, -16(%rdi,%rdx,8)
+	je	.Lende
+	movq	(%rsi,%rdx,8), %mm7
+	movq	%mm7, %mm3
+	psllq	%mm0, %mm7
+	psrlq	%mm1, %mm2
+	por	%mm7, %mm2
+	movq	%mm2, -8(%rdi,%rdx,8)
+	addq	$2, %rdx
+	jle	.Loop
+
+.Lendo:	movq	%mm3, %mm2
+.Lende:	psrlq	%mm1, %mm2
+	movq	%mm2, -8(%rdi)
+	emms
+	ret

Added: trunk/mpi/amd64/mpih-sub1.S
===================================================================
--- trunk/mpi/amd64/mpih-sub1.S	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/amd64/mpih-sub1.S	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,61 @@
+/* AMD64 (x86_64) sub_n -- Subtract two limb vectors of the same length > 0 and store
+ *		   sum in a third limb vector.
+ *
+ *      Copyright (C) 1992, 1994, 1995, 1998, 
+ *                    2001, 2002, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
+ *
+ * Note: This code is heavily based on the GNU MP Library.
+ *	 Actually it's the same code with only minor changes in the
+ *	 way the data is stored; this is to support the abstraction
+ *	 of an optional secure memory allocation which may be used
+ *	 to avoid revealing of sensitive data due to paging etc.
+ */
+
+
+#include "sysdep.h"
+#include "asm-syntax.h"
+
+
+/*******************
+ *  mpi_limb_t
+ *  _gcry_mpih_sub_n( mpi_ptr_t res_ptr,	rdi
+ *		   mpi_ptr_t s1_ptr,		rsi
+ *		   mpi_ptr_t s2_ptr,		rdx
+ *		   mpi_size_t size)		rcx
+ */
+.text
+	.globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
+C_SYMBOL_NAME(_gcry_mpih_sub_n:)
+	leaq	(%rsi,%rcx,8), %rsi
+	leaq	(%rdi,%rcx,8), %rdi
+	leaq	(%rdx,%rcx,8), %rdx
+	negq	%rcx
+	xorl	%eax, %eax		/* clear cy */
+
+	ALIGN(4)			/* minimal alignment for claimed speed */
+.Loop:	movq	(%rsi,%rcx,8), %rax
+	movq	(%rdx,%rcx,8), %r10
+	sbbq	%r10, %rax
+	movq	%rax, (%rdi,%rcx,8)
+	incq	%rcx
+	jne	.Loop
+
+	movq	%rcx, %rax		/* zero %rax */
+	adcq	%rax, %rax
+	ret

Modified: trunk/mpi/config.links
===================================================================
--- trunk/mpi/config.links	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/mpi/config.links	2007-03-13 11:39:11 UTC (rev 1217)
@@ -110,6 +110,11 @@
 	cat  $srcdir/mpi/i386/syntax.h	    >>./mpi/asm-syntax.h
 	path="i586 i386"
 	;;
+    x86_64-*-*)
+	echo '#define ELF_SYNTAX' >>./mpi/asm-syntax.h
+	cat  $srcdir/mpi/i386/syntax.h	    >>./mpi/asm-syntax.h
+	path="amd64"
+	;;
     alpha*-*-*)
 	echo '/* configured for alpha */' >>./mpi/asm-syntax.h
 	path="alpha"

Modified: trunk/tests/ChangeLog
===================================================================
--- trunk/tests/ChangeLog	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/tests/ChangeLog	2007-03-13 11:39:11 UTC (rev 1217)
@@ -1,3 +1,12 @@
+2007-03-13  Werner Koch  <wk at g10code.com>
+
+	* mpitests.c: Reformatted to GNU standards.
+	(main): Add options --verbose and --debug for future use.
+
+2007-03-13  Werner Dittmann <Werner.Dittmann at t-online.de>  (wk)
+
+	* mpitests.c: New.
+
 2007-02-23  Werner Koch  <wk at g10code.com>
 
 	* Makefile.am (TEST): Run benchmark as last. 

Modified: trunk/tests/Makefile.am
===================================================================
--- trunk/tests/Makefile.am	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/tests/Makefile.am	2007-03-13 11:39:11 UTC (rev 1217)
@@ -19,7 +19,7 @@
 ## Process this file with automake to produce Makefile.in
 
 TESTS = t-mpi-bit prime register ac ac-schemes ac-data basic \
-        tsexp keygen pubkey hmac keygrip
+        mpitests tsexp keygen pubkey hmac keygrip
 
 # pkbench uses mmap for no good reason.  Needs to be fixed.  Code for
 # this can be found in libksba/tests. 

Modified: trunk/tests/basic.c
===================================================================
--- trunk/tests/basic.c	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/tests/basic.c	2007-03-13 11:39:11 UTC (rev 1217)
@@ -1961,5 +1961,6 @@
 
   if (verbose)
     fprintf (stderr, "\nAll tests completed. Errors: %i\n", error_count);
+
   return error_count ? 1 : 0;
 }

Added: trunk/tests/mpitests.c
===================================================================
--- trunk/tests/mpitests.c	2007-02-23 17:47:56 UTC (rev 1216)
+++ trunk/tests/mpitests.c	2007-03-13 11:39:11 UTC (rev 1217)
@@ -0,0 +1,181 @@
+/* mpitests.c  -  basic mpi tests
+ *	Copyright (C) 2001, 2002, 2003, 2006 Free Software Foundation, Inc.
+ *
+ * This file is part of Libgcrypt.
+ *
+ * Libgcrypt is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * Libgcrypt is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+ * USA. 
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+
+#include "../src/gcrypt.h"
+
+
+static int verbose;
+static int debug;
+
+
+/* Set up some test patterns */
+
+/* 48 bytes with value 1: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
+unsigned char ones[] = {
+  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
+  0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
+};
+
+/* 48 bytes with value 2: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
+unsigned char twos[] = {
+  0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+  0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02,
+  0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02
+};
+
+/* 48 bytes with value 3: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
+unsigned char threes[] = {
+  0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+  0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03,
+  0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03
+};
+
+/* 48 bytes with value 0x80: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
+unsigned char eighties[] = {
+  0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+  0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80,
+  0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80
+};
+
+/* 48 bytes with value 0xff: this results in 8 limbs for 64bit limbs, 16limb for 32 bit limbs */
+unsigned char manyff[] = {
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+  0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff
+};
+
+
+
+static int 
+test_add (void)
+{
+  gcry_mpi_t one;
+  gcry_mpi_t two;
+  gcry_mpi_t ff;
+  gcry_mpi_t result;
+  unsigned char* pc;
+  
+  gcry_mpi_scan(&one, GCRYMPI_FMT_USG, ones, sizeof(ones), NULL);
+  gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
+  gcry_mpi_scan(&ff, GCRYMPI_FMT_USG, manyff, sizeof(manyff), NULL);
+  result = gcry_mpi_new(0);
+  
+  gcry_mpi_add(result, one, two);
+  gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
+  if (verbose)
+    printf("Result of one plus two:\n%s\n", pc);
+  gcry_free(pc);
+
+  gcry_mpi_add(result, ff, one);
+  gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
+  if (verbose)
+    printf("Result of ff plus one:\n%s\n", pc);
+  gcry_free(pc);
+  
+  gcry_mpi_release(one);
+  gcry_mpi_release(two);
+  gcry_mpi_release(ff);
+  gcry_mpi_release(result);
+  return 1;
+}
+
+
+static int 
+test_sub (void)
+{
+  gcry_mpi_t one;
+  gcry_mpi_t two;
+  gcry_mpi_t result;
+  unsigned char* pc;
+  
+  gcry_mpi_scan(&one, GCRYMPI_FMT_USG, ones, sizeof(ones), NULL);
+  gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
+  result = gcry_mpi_new(0);
+  gcry_mpi_sub(result, two, one);
+  
+  gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
+  if (verbose)
+    printf("Result of two minus one:\n%s\n", pc);
+  gcry_free(pc);
+  
+  gcry_mpi_release(one);
+  gcry_mpi_release(two);
+  gcry_mpi_release(result);
+  return 1;
+}
+
+
+static int 
+test_mul (void)
+{
+  gcry_mpi_t two;
+  gcry_mpi_t three;
+  gcry_mpi_t result;
+  unsigned char* pc;
+  
+  gcry_mpi_scan(&two, GCRYMPI_FMT_USG, twos, sizeof(twos), NULL);
+  gcry_mpi_scan(&three, GCRYMPI_FMT_USG, threes, sizeof(threes), NULL);
+  result = gcry_mpi_new(0);
+  gcry_mpi_mul(result, two, three);
+  
+  gcry_mpi_aprint(GCRYMPI_FMT_HEX, &pc, NULL, result);
+  if (verbose)
+    printf("Result of two mul three:\n%s\n", pc);
+  gcry_free(pc);
+  
+  gcry_mpi_release(two);
+  gcry_mpi_release(three);
+  gcry_mpi_release(result);
+  return 1;
+}
+
+
+int 
+main (int argc, char* argv[])
+{
+  if (argc > 1 && !strcmp (argv[1], "--verbose"))
+    verbose = 1;
+  else if (argc > 1 && !strcmp (argv[1], "--debug"))
+    verbose = debug = 1;
+
+  if (!gcry_check_version (GCRYPT_VERSION))
+    {
+      fputs ("version mismatch\n", stderr);
+      exit (1);
+    }
+  gcry_control(GCRYCTL_DISABLE_SECMEM);
+
+  test_add ();
+  test_sub ();
+  test_mul ();
+
+  return 0;
+}
+




More information about the Gnupg-commits mailing list