initial import
[glibc.git] / sysdeps / sparc / addmul_1.S
blob63e7db0ce216f7008998b9f0145300e2c4b1f6f2
1 ! SPARC __mpn_addmul_1 -- Multiply a limb vector with a limb and add
2 ! the result to a second limb vector.
4 ! Copyright (C) 1992, 1993, 1994 Free Software Foundation, Inc.
6 ! This file is part of the GNU MP Library.
8 ! The GNU MP Library is free software; you can redistribute it and/or modify
9 ! it under the terms of the GNU Library General Public License as published by
10 ! the Free Software Foundation; either version 2 of the License, or (at your
11 ! option) any later version.
13 ! The GNU MP Library is distributed in the hope that it will be useful, but
14 ! WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
15 ! or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Library General Public
16 ! License for more details.
18 ! You should have received a copy of the GNU Library General Public License
19 ! along with the GNU MP Library; see the file COPYING.LIB.  If not, write to
20 ! the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23 ! INPUT PARAMETERS
24 ! res_ptr       o0
25 ! s1_ptr        o1
26 ! size          o2
27 ! s2_limb       o3
29 #include "sysdep.h"
31 .text
32         .align 4
33         .global C_SYMBOL_NAME(__mpn_addmul_1)
34 C_SYMBOL_NAME(__mpn_addmul_1):
35         ! Make S1_PTR and RES_PTR point at the end of their blocks
36         ! and put (- 4 x SIZE) in index/loop counter.
37         sll     %o2,2,%o2
38         add     %o0,%o2,%o4     ! RES_PTR in o4 since o0 is retval
39         add     %o1,%o2,%o1
40         sub     %g0,%o2,%o2
42         cmp     %o3,0xfff
43         bgu     Large
44         nop
46         ld      [%o1+%o2],%o5
47         mov     0,%o0
48         b       L0
49          add    %o4,-4,%o4
50 Loop0:
51         addcc   %o5,%g1,%g1
52         ld      [%o1+%o2],%o5
53         addx    %o0,%g0,%o0
54         st      %g1,[%o4+%o2]
55 L0:     wr      %g0,%o3,%y
56         sra     %o5,31,%g2
57         and     %o3,%g2,%g2
58         andcc   %g1,0,%g1
59         mulscc  %g1,%o5,%g1
60         mulscc  %g1,%o5,%g1
61         mulscc  %g1,%o5,%g1
62         mulscc  %g1,%o5,%g1
63         mulscc  %g1,%o5,%g1
64         mulscc  %g1,%o5,%g1
65         mulscc  %g1,%o5,%g1
66         mulscc  %g1,%o5,%g1
67         mulscc  %g1,%o5,%g1
68         mulscc  %g1,%o5,%g1
69         mulscc  %g1,%o5,%g1
70         mulscc  %g1,%o5,%g1
71         mulscc  %g1,0,%g1
72         sra     %g1,20,%g4
73         sll     %g1,12,%g1
74         rd      %y,%g3
75         srl     %g3,20,%g3
76         or      %g1,%g3,%g1
78         addcc   %g1,%o0,%g1
79         addx    %g2,%g4,%o0     ! add sign-compensation and cy to hi limb
80         addcc   %o2,4,%o2       ! loop counter
81         bne     Loop0
82          ld     [%o4+%o2],%o5
84         addcc   %o5,%g1,%g1
85         addx    %o0,%g0,%o0
86         retl
87         st      %g1,[%o4+%o2]
90 Large:  ld      [%o1+%o2],%o5
91         mov     0,%o0
92         sra     %o3,31,%g4      ! g4 = mask of ones iff S2_LIMB < 0
93         b       L1
94          add    %o4,-4,%o4
95 Loop:
96         addcc   %o5,%g3,%g3
97         ld      [%o1+%o2],%o5
98         addx    %o0,%g0,%o0
99         st      %g3,[%o4+%o2]
100 L1:     wr      %g0,%o5,%y
101         and     %o5,%g4,%g2
102         andcc   %g0,%g0,%g1
103         mulscc  %g1,%o3,%g1
104         mulscc  %g1,%o3,%g1
105         mulscc  %g1,%o3,%g1
106         mulscc  %g1,%o3,%g1
107         mulscc  %g1,%o3,%g1
108         mulscc  %g1,%o3,%g1
109         mulscc  %g1,%o3,%g1
110         mulscc  %g1,%o3,%g1
111         mulscc  %g1,%o3,%g1
112         mulscc  %g1,%o3,%g1
113         mulscc  %g1,%o3,%g1
114         mulscc  %g1,%o3,%g1
115         mulscc  %g1,%o3,%g1
116         mulscc  %g1,%o3,%g1
117         mulscc  %g1,%o3,%g1
118         mulscc  %g1,%o3,%g1
119         mulscc  %g1,%o3,%g1
120         mulscc  %g1,%o3,%g1
121         mulscc  %g1,%o3,%g1
122         mulscc  %g1,%o3,%g1
123         mulscc  %g1,%o3,%g1
124         mulscc  %g1,%o3,%g1
125         mulscc  %g1,%o3,%g1
126         mulscc  %g1,%o3,%g1
127         mulscc  %g1,%o3,%g1
128         mulscc  %g1,%o3,%g1
129         mulscc  %g1,%o3,%g1
130         mulscc  %g1,%o3,%g1
131         mulscc  %g1,%o3,%g1
132         mulscc  %g1,%o3,%g1
133         mulscc  %g1,%o3,%g1
134         mulscc  %g1,%o3,%g1
135         mulscc  %g1,%g0,%g1
136         rd      %y,%g3
137         addcc   %g3,%o0,%g3
138         addx    %g2,%g1,%o0
139         addcc   %o2,4,%o2
140         bne     Loop
141          ld     [%o4+%o2],%o5
143         addcc   %o5,%g3,%g3
144         addx    %o0,%g0,%o0
145         retl
146         st      %g3,[%o4+%o2]