Switched to GPLv3.
[gnupg.git] / mpi / sparc32v8 / mpih-mul2.S
1 /* SPARC v8 __mpn_addmul_1 -- Multiply a limb vector with a limb and
2  *                            add the result to a second limb vector.
3  *
4  *      Copyright (C) 1992, 1993, 1994, 1995, 1998, 
5  *                    2001 Free Software Foundation, Inc.
6  *       
7  * This file is part of GnuPG.
8  *
9  * GnuPG is free software; you can redistribute it and/or modify
10  * it under the terms of the GNU General Public License as published by
11  * the Free Software Foundation; either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * GnuPG 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 General Public License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program; if not, see <http://www.gnu.org/licenses/>.
21  *
22  * Note: This code is heavily based on the GNU MP Library.
23  *       Actually it's the same code with only minor changes in the
24  *       way the data is stored; this is to support the abstraction
25  *       of an optional secure memory allocation which may be used
26  *       to avoid revealing of sensitive data due to paging etc.
27  *       The GNU MP Library itself is published under the LGPL;
28  *       however I decided to publish this code under the plain GPL.
29  */
30
31
32
33 ! INPUT PARAMETERS
34 ! res_ptr       o0
35 ! s1_ptr        o1
36 ! size          o2
37 ! s2_limb       o3
38
39 #include "sysdep.h"
40
41 .text
42         .align 4
43         .global C_SYMBOL_NAME(mpihelp_addmul_1)
44 C_SYMBOL_NAME(mpihelp_addmul_1):
45         orcc    %g0,%g0,%g2
46         ld      [%o1+0],%o4     ! 1
47
48         sll     %o2,4,%g1
49         and     %g1,(4-1)<<4,%g1
50 #if PIC
51         mov     %o7,%g4                 ! Save return address register
52         call    1f
53         add     %o7,LL-1f,%g3
54 1:      mov     %g4,%o7                 ! Restore return address register
55 #else
56         sethi   %hi(LL),%g3
57         or      %g3,%lo(LL),%g3
58 #endif
59         jmp     %g3+%g1
60         nop
61 LL:
62 LL00:   add     %o0,-4,%o0
63         b       Loop00          /* 4, 8, 12, ... */
64         add     %o1,-4,%o1
65         nop
66 LL01:   b       Loop01          /* 1, 5, 9, ... */
67         nop
68         nop
69         nop
70 LL10:   add     %o0,-12,%o0     /* 2, 6, 10, ... */
71         b       Loop10
72         add     %o1,4,%o1
73         nop
74 LL11:   add     %o0,-8,%o0      /* 3, 7, 11, ... */
75         b       Loop11
76         add     %o1,-8,%o1
77         nop
78
79 1:      addcc   %g3,%g2,%g3     ! 1
80         ld      [%o1+4],%o4     ! 2
81         rd      %y,%g2          ! 1
82         addx    %g0,%g2,%g2
83         ld      [%o0+0],%g1     ! 2
84         addcc   %g1,%g3,%g3
85         st      %g3,[%o0+0]     ! 1
86 Loop00: umul    %o4,%o3,%g3     ! 2
87         ld      [%o0+4],%g1     ! 2
88         addxcc  %g3,%g2,%g3     ! 2
89         ld      [%o1+8],%o4     ! 3
90         rd      %y,%g2          ! 2
91         addx    %g0,%g2,%g2
92         nop
93         addcc   %g1,%g3,%g3
94         st      %g3,[%o0+4]     ! 2
95 Loop11: umul    %o4,%o3,%g3     ! 3
96         addxcc  %g3,%g2,%g3     ! 3
97         ld      [%o1+12],%o4    ! 4
98         rd      %y,%g2          ! 3
99         add     %o1,16,%o1
100         addx    %g0,%g2,%g2
101         ld      [%o0+8],%g1     ! 2
102         addcc   %g1,%g3,%g3
103         st      %g3,[%o0+8]     ! 3
104 Loop10: umul    %o4,%o3,%g3     ! 4
105         addxcc  %g3,%g2,%g3     ! 4
106         ld      [%o1+0],%o4     ! 1
107         rd      %y,%g2          ! 4
108         addx    %g0,%g2,%g2
109         ld      [%o0+12],%g1    ! 2
110         addcc   %g1,%g3,%g3
111         st      %g3,[%o0+12]    ! 4
112         add     %o0,16,%o0
113         addx    %g0,%g2,%g2
114 Loop01: addcc   %o2,-4,%o2
115         bg      1b
116         umul    %o4,%o3,%g3     ! 1
117
118         addcc   %g3,%g2,%g3     ! 4
119         rd      %y,%g2          ! 4
120         addx    %g0,%g2,%g2
121         ld      [%o0+0],%g1     ! 2
122         addcc   %g1,%g3,%g3
123         st      %g3,[%o0+0]     ! 4
124         addx    %g0,%g2,%o0
125
126         retl
127          nop
128
129
130 !       umul, ld, addxcc, rd, st
131
132 !       umul, ld, addxcc, rd, ld, addcc, st, addx
133