Switched to GPLv3.
[gnupg.git] / mpi / power / mpih-add1.S
1 /* IBM POWER add_n -- Add two limb vectors of equal, non-zero length.
2  *
3  *      Copyright (C) 1992, 1994, 1996, 1999 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 # INPUT PARAMETERS
26 # res_ptr       r3
27 # s1_ptr        r4
28 # s2_ptr        r5
29 # size          r6
30  */
31
32         .toc
33         .extern mpihelp_add_n[DS]
34         .extern .mpihelp_add_n
35 .csect [PR]
36         .align 2
37         .globl mpihelp_add_n
38         .globl .mpihelp_add_n
39         .csect mpihelp_add_n[DS]
40 mpihelp_add_n:
41         .long .mpihelp_add_n, TOC[tc0], 0
42         .csect [PR]
43 .mpihelp_add_n:
44         andil.  10,6,1          # odd or even number of limbs?
45         l       8,0(4)          # load least significant s1 limb
46         l       0,0(5)          # load least significant s2 limb
47         cal     3,-4(3)         # offset res_ptr, it's updated before it's used
48         sri     10,6,1          # count for unrolled loop
49         a       7,0,8           # add least significant limbs, set cy
50         mtctr   10              # copy count into CTR
51         beq     0,Leven         # branch if even # of limbs (# of limbs >= 2)
52
53 # We have an odd # of limbs.  Add the first limbs separately.
54         cmpi    1,10,0          # is count for unrolled loop zero?
55         bne     1,L1            # branch if not
56         st      7,4(3)
57         aze     3,10            # use the fact that r10 is zero...
58         br                      # return
59
60 # We added least significant limbs.  Now reload the next limbs to enter loop.
61 L1:     lu      8,4(4)          # load s1 limb and update s1_ptr
62         lu      0,4(5)          # load s2 limb and update s2_ptr
63         stu     7,4(3)
64         ae      7,0,8           # add limbs, set cy
65 Leven:  lu      9,4(4)          # load s1 limb and update s1_ptr
66         lu      10,4(5)         # load s2 limb and update s2_ptr
67         bdz     Lend            # If done, skip loop
68
69 Loop:   lu      8,4(4)          # load s1 limb and update s1_ptr
70         lu      0,4(5)          # load s2 limb and update s2_ptr
71         ae      11,9,10         # add previous limbs with cy, set cy
72         stu     7,4(3)          #
73         lu      9,4(4)          # load s1 limb and update s1_ptr
74         lu      10,4(5)         # load s2 limb and update s2_ptr
75         ae      7,0,8           # add previous limbs with cy, set cy
76         stu     11,4(3)         #
77         bdn     Loop            # decrement CTR and loop back
78
79 Lend:   ae      11,9,10         # add limbs with cy, set cy
80         st      7,4(3)          #
81         st      11,8(3)         #
82         lil     3,0             # load cy into ...
83         aze     3,3             # ... return value register
84         br
85