Add support for ADM64. From Werner Dittmann.
[libgcrypt.git] / mpi / amd64 / mpih-sub1.S
1 /* AMD64 (x86_64) sub_n -- Subtract two limb vectors of the same length > 0 and store
2  *                 sum in a third limb vector.
3  *
4  *      Copyright (C) 1992, 1994, 1995, 1998, 
5  *                    2001, 2002, 2006 Free Software Foundation, Inc.
6  *
7  * This file is part of Libgcrypt.
8  *
9  * Libgcrypt is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU Lesser General Public License as
11  * published by the Free Software Foundation; either version 2.1 of
12  * the License, or (at your option) any later version.
13  *
14  * Libgcrypt is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17  * GNU Lesser General Public License for more details.
18  *
19  * You should have received a copy of the GNU Lesser General Public
20  * License along with this program; if not, write to the Free Software
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
22  *
23  * Note: This code is heavily based on the GNU MP Library.
24  *       Actually it's the same code with only minor changes in the
25  *       way the data is stored; this is to support the abstraction
26  *       of an optional secure memory allocation which may be used
27  *       to avoid revealing of sensitive data due to paging etc.
28  */
29
30
31 #include "sysdep.h"
32 #include "asm-syntax.h"
33
34
35 /*******************
36  *  mpi_limb_t
37  *  _gcry_mpih_sub_n( mpi_ptr_t res_ptr,        rdi
38  *                 mpi_ptr_t s1_ptr,            rsi
39  *                 mpi_ptr_t s2_ptr,            rdx
40  *                 mpi_size_t size)             rcx
41  */
42 .text
43         .globl C_SYMBOL_NAME(_gcry_mpih_sub_n)
44 C_SYMBOL_NAME(_gcry_mpih_sub_n:)
45         leaq    (%rsi,%rcx,8), %rsi
46         leaq    (%rdi,%rcx,8), %rdi
47         leaq    (%rdx,%rcx,8), %rdx
48         negq    %rcx
49         xorl    %eax, %eax              /* clear cy */
50
51         ALIGN(4)                        /* minimal alignment for claimed speed */
52 .Loop:  movq    (%rsi,%rcx,8), %rax
53         movq    (%rdx,%rcx,8), %r10
54         sbbq    %r10, %rax
55         movq    %rax, (%rdi,%rcx,8)
56         incq    %rcx
57         jne     .Loop
58
59         movq    %rcx, %rax              /* zero %rax */
60         adcq    %rax, %rax
61         ret