Switched to GPLv3.
[gnupg.git] / mpi / powerpc32 / mpih-mul2.S
1 /* PowerPC-32 addmul_1 -- Multiply a limb vector with a limb and add
2  *                        the result to a second limb vector.
3  * Copyright (C) 1993, 1994, 1995, 1997, 1998 Free Software Foundation, Inc.
4  *
5  * This file is part of GnuPG.
6  *
7  * GnuPG is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 3 of the License, or
10  * (at your option) any later version.
11  *
12  * GnuPG is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, see <http://www.gnu.org/licenses/>.
19  */
20
21 #include "sysdep.h"
22 #include "asm-syntax.h"
23
24
25 #ifndef USE_PPC_PATCHES
26
27 /*******************
28  * mpi_limb_t
29  * mpihelp_addmul_1( mpi_ptr_t res_ptr,      (r3)
30  *                   mpi_ptr_t s1_ptr,       (r4)
31  *                   mpi_size_t s1_size,     (r5)
32  *                   mpi_limb_t s2_limb)     (r6)
33  *
34  * This is a fairly straightforward implementation.  The timing of the PC601
35  * is hard to understand, so I will wait to optimize this until I have some
36  * hardware to play with.
37  *
38  * The code trivially generalizes to 64 bit limbs for the PC620.
39  */
40
41
42         .toc
43         .csect .mpihelp_addmul_1[PR]
44         .align 2
45         .globl mpihelp_addmul_1
46         .globl .mpihelp_addmul_1
47         .csect mpihelp_addmul_1[DS]
48 mpihelp_addmul_1:
49         .long .mpihelp_addmul_1[PR], TOC[tc0], 0
50         .csect .mpihelp_addmul_1[PR]
51 .mpihelp_addmul_1:
52         mtctr   5
53
54         lwz     0,0(4)
55         mullw   7,0,6
56         mulhwu  10,0,6
57         lwz     9,0(3)
58         addc    8,7,9
59         addi    3,3,-4
60         bdz     Lend
61
62 Loop:   lwzu    0,4(4)
63         stwu    8,4(3)
64         mullw   8,0,6
65         adde    7,8,10
66         mulhwu  10,0,6
67         lwz     9,4(3)
68         addze   10,10
69         addc    8,7,9
70         bdnz    Loop
71
72 Lend:   stw     8,4(3)
73         addze   3,10
74         blr
75
76 #else
77
78 /* mp_limb_t mpn_addmul_1 (mp_ptr res_ptr, mp_srcptr s1_ptr,
79                            mp_size_t s1_size, mp_limb_t s2_limb)
80    Calculate res+s1*s2 and put result back in res; return carry.  */
81 ENTRY(mpihelp_addmul_1)
82        mtctr   %r5
83
84        lwz     %r0,0(%r4)
85        mullw   %r7,%r0,%r6
86        mulhwu  %r10,%r0,%r6
87        lwz     %r9,0(%r3)
88        addc    %r8,%r7,%r9
89        addi    %r3,%r3,-4              /* adjust res_ptr */
90        bdz     1f
91
92 0:     lwzu    %r0,4(%r4)
93        stwu    %r8,4(%r3)
94        mullw   %r8,%r0,%r6
95        adde    %r7,%r8,%r10
96        mulhwu  %r10,%r0,%r6
97        lwz     %r9,4(%r3)
98        addze   %r10,%r10
99        addc    %r8,%r7,%r9
100        bdnz    0b
101
102 1:     stw     %r8,4(%r3)
103        addze   %r3,%r10
104        blr
105 END(mpihelp_addmul_1)
106 #endif