Add support for ADM64. From Werner Dittmann.
authorWerner Koch <wk@gnupg.org>
Tue, 13 Mar 2007 11:39:11 +0000 (11:39 +0000)
committerWerner Koch <wk@gnupg.org>
Tue, 13 Mar 2007 11:39:11 +0000 (11:39 +0000)
Cosmetic changes.

19 files changed:
AUTHORS
NEWS
TODO
cipher/random.c
cipher/test-getrusage.c
mpi/ChangeLog
mpi/amd64/distfiles [new file with mode: 0644]
mpi/amd64/mpih-add1.S [new file with mode: 0644]
mpi/amd64/mpih-lshift.S [new file with mode: 0644]
mpi/amd64/mpih-mul1.S [new file with mode: 0644]
mpi/amd64/mpih-mul2.S [new file with mode: 0644]
mpi/amd64/mpih-mul3.S [new file with mode: 0644]
mpi/amd64/mpih-rshift.S [new file with mode: 0644]
mpi/amd64/mpih-sub1.S [new file with mode: 0644]
mpi/config.links
tests/ChangeLog
tests/Makefile.am
tests/basic.c
tests/mpitests.c [new file with mode: 0644]

diff --git a/AUTHORS b/AUTHORS
index e421b56..0c0185d 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -80,6 +80,11 @@ perky@freebsd.org
 (SEED cipher)
 
 
+LIBGCRYPT       Werner Dittmann  ** pending **
+werner.dittmann@t-online.de
+(mpi/amd64, tests/mpitests.c)
+
+
 
 More credits
 ============
diff --git a/NEWS b/NEWS
index 4e4a641..1ece257 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -37,6 +37,8 @@ Noteworthy changes in version 1.3.0 (unreleased)
 
  * 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.
diff --git a/TODO b/TODO
index c867e6f..f2bfe62 100644 (file)
--- a/TODO
+++ b/TODO
@@ -78,5 +78,5 @@ What's left to do                                 -*- outline -*-
 * 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.
 
index 5453124..f673f3b 100644 (file)
@@ -221,6 +221,7 @@ _gcry_random_initialize (int full)
     initialize ();
 }
 
+
 void
 _gcry_random_dump_stats()
 {
@@ -235,6 +236,7 @@ _gcry_random_dump_stats()
                    rndstats.ngetbytes2, rndstats.getbytes2 );
 }
 
+
 void
 _gcry_secure_random_alloc()
 {
@@ -1055,6 +1057,7 @@ getfnc_fast_random_poll (void))( void (*)(const void*, size_t, int), int)
 }
 
 
+
 static void
 do_fast_random_poll (void)
 {
@@ -1111,11 +1114,10 @@ do_fast_random_poll (void)
 # 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 );
index 87a404d..479eaab 100644 (file)
@@ -45,5 +45,61 @@ main (int argc, char **argv)
   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 );
+   }
+*/
+
+
index dc6556d..1915360 100644 (file)
@@ -1,3 +1,10 @@
+2007-03-13  Werner Dittmann <Werner.Dittmann@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@g10code.com>
 
        * mpi-pow.c (gcry_mpi_powm): Remove unused var ESIGN.
diff --git a/mpi/amd64/distfiles b/mpi/amd64/distfiles
new file mode 100644 (file)
index 0000000..8e9fcfd
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-add1.S b/mpi/amd64/mpih-add1.S
new file mode 100644 (file)
index 0000000..f0ec89c
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-lshift.S b/mpi/amd64/mpih-lshift.S
new file mode 100644 (file)
index 0000000..e87dd1a
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-mul1.S b/mpi/amd64/mpih-mul1.S
new file mode 100644 (file)
index 0000000..54b0ab4
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-mul2.S b/mpi/amd64/mpih-mul2.S
new file mode 100644 (file)
index 0000000..1180f76
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-mul3.S b/mpi/amd64/mpih-mul3.S
new file mode 100644 (file)
index 0000000..4d458a7
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-rshift.S b/mpi/amd64/mpih-rshift.S
new file mode 100644 (file)
index 0000000..4cfc8f6
--- /dev/null
@@ -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
diff --git a/mpi/amd64/mpih-sub1.S b/mpi/amd64/mpih-sub1.S
new file mode 100644 (file)
index 0000000..b3609b0
--- /dev/null
@@ -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
index 6ea80b3..6f9eef3 100644 (file)
@@ -110,6 +110,11 @@ case "${target}" in
        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"
index f781162..7dc83fe 100644 (file)
@@ -1,3 +1,12 @@
+2007-03-13  Werner Koch  <wk@g10code.com>
+
+       * mpitests.c: Reformatted to GNU standards.
+       (main): Add options --verbose and --debug for future use.
+
+2007-03-13  Werner Dittmann <Werner.Dittmann@t-online.de>  (wk)
+
+       * mpitests.c: New.
+
 2007-02-23  Werner Koch  <wk@g10code.com>
 
        * Makefile.am (TEST): Run benchmark as last. 
index b13e16b..1c89290 100644 (file)
@@ -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. 
index de4adea..22498e5 100644 (file)
@@ -1961,5 +1961,6 @@ main (int argc, char **argv)
 
   if (verbose)
     fprintf (stderr, "\nAll tests completed. Errors: %i\n", error_count);
+
   return error_count ? 1 : 0;
 }
diff --git a/tests/mpitests.c b/tests/mpitests.c
new file mode 100644 (file)
index 0000000..d508da7
--- /dev/null
@@ -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;
+}
+