Sparc v8plus assembler.
[openssl.git] / crypto / bn / asm / x86w32.asm
1 ;       Static Name Aliases
2 ;
3         TITLE   bn_mulw.c
4         .386
5 F_TEXT  SEGMENT  WORD USE16 PUBLIC 'CODE'
6 F_TEXT  ENDS
7 _DATA   SEGMENT  WORD USE16 PUBLIC 'DATA'
8 _DATA   ENDS
9 _CONST  SEGMENT  WORD USE16 PUBLIC 'CONST'
10 _CONST  ENDS
11 _BSS    SEGMENT  WORD USE16 PUBLIC 'BSS'
12 _BSS    ENDS
13 DGROUP  GROUP   _CONST, _BSS, _DATA
14         ASSUME DS: DGROUP, SS: DGROUP
15 F_TEXT      SEGMENT
16         ASSUME  CS: F_TEXT
17         PUBLIC  _bn_mul_add_words
18 _bn_mul_add_words       PROC FAR
19 ; Line 58
20         push    bp
21         push    bx
22         push    esi
23         push    di
24         push    ds
25         push    es
26         mov     bp,sp
27 ;       w = 28
28 ;       num = 26
29 ;       ap = 22
30 ;       rp = 18
31         xor     esi,esi                 ;c=0;
32         mov     di,WORD PTR [bp+18]     ; load r
33         mov     ds,WORD PTR [bp+20]     ; load r
34         mov     bx,WORD PTR [bp+22]     ; load a
35         mov     es,WORD PTR [bp+24]     ; load a
36         mov     ecx,DWORD PTR [bp+28]   ; load w
37         mov     bp,WORD PTR [bp+26]     ; load num
38         shr     bp,1    ; div count by 4 and do groups of 4
39         shr     bp,1
40         je      $L555
41
42 $L546:
43         mov     eax,ecx
44         mul     DWORD PTR es:[bx]       ; w* *a
45         add     eax,DWORD PTR ds:[di]   ; + *r
46         adc     edx,0
47         adc     eax,esi
48         adc     edx,0
49         mov     DWORD PTR ds:[di],eax
50         mov     esi,edx
51         ;
52         mov     eax,ecx
53         mul     DWORD PTR es:[bx+4]     ; w* *a
54         add     eax,DWORD PTR ds:[di+4] ; + *r
55         adc     edx,0
56         adc     eax,esi
57         adc     edx,0
58         mov     DWORD PTR ds:[di+4],eax
59         mov     esi,edx
60         ;
61         mov     eax,ecx
62         mul     DWORD PTR es:[bx+8]     ; w* *a
63         add     eax,DWORD PTR ds:[di+8] ; + *r
64         adc     edx,0
65         adc     eax,esi
66         adc     edx,0
67         mov     DWORD PTR ds:[di+8],eax
68         mov     esi,edx
69         ;
70         mov     eax,ecx
71         mul     DWORD PTR es:[bx+12]    ; w* *a
72         add     eax,DWORD PTR ds:[di+12]        ; + *r
73         adc     edx,0
74         adc     eax,esi
75         adc     edx,0
76         mov     DWORD PTR ds:[di+12],eax
77         mov     esi,edx
78         ;
79         add     bx,16
80         add     di,16
81         ;
82         dec     bp
83         je      $L555
84         jmp     $L546
85 ;
86 ;
87 $L555:
88         mov     bp,sp
89         mov     bp,WORD PTR [bp+26]     ; load num
90         and     bp,3
91         dec     bp
92         js      $L547m
93
94         mov     eax,ecx
95         mul     DWORD PTR es:[bx]       ; w* *a
96         add     eax,DWORD PTR ds:[di]   ; + *r
97         adc     edx,0
98         adc     eax,esi
99         adc     edx,0
100         mov     DWORD PTR ds:[di],eax
101         mov     esi,edx
102         dec     bp
103         js      $L547m                  ; Note that we are now testing for -1
104         ;
105         mov     eax,ecx
106         mul     DWORD PTR es:[bx+4]     ; w* *a
107         add     eax,DWORD PTR ds:[di+4] ; + *r
108         adc     edx,0
109         adc     eax,esi
110         adc     edx,0
111         mov     DWORD PTR ds:[di+4],eax
112         mov     esi,edx
113         dec     bp
114         js      $L547m
115         ;
116         mov     eax,ecx
117         mul     DWORD PTR es:[bx+8]     ; w* *a
118         add     eax,DWORD PTR ds:[di+8] ; + *r
119         adc     edx,0
120         adc     eax,esi
121         adc     edx,0
122         mov     DWORD PTR ds:[di+8],eax
123         mov     esi,edx
124 $L547m:
125         mov     eax,esi
126         mov     edx,esi
127         shr     edx,16
128         pop     es
129         pop     ds
130         pop     di
131         pop     esi
132         pop     bx
133         pop     bp
134         ret     
135         nop     
136 _bn_mul_add_words       ENDP
137
138         PUBLIC  _bn_mul_words
139 _bn_mul_words   PROC FAR
140 ; Line 76
141         push    bp
142         push    bx
143         push    esi
144         push    di
145         push    ds
146         push    es
147         xor     esi,esi
148         mov     bp,sp
149         mov     di,WORD PTR [bp+18]     ; r
150         mov     ds,WORD PTR [bp+20]
151         mov     bx,WORD PTR [bp+22]     ; a
152         mov     es,WORD PTR [bp+24]
153         mov     ecx,DWORD PTR [bp+28]   ; w
154         mov     bp,WORD PTR [bp+26]     ; num 
155
156 $FC743:
157         mov     eax,ecx
158         mul     DWORD PTR es:[bx]
159         add     eax,esi
160         adc     edx,0
161         mov     DWORD PTR ds:[di],eax
162         mov     esi,edx
163         dec     bp
164         je      $L764
165         ;
166         mov     eax,ecx
167         mul     DWORD PTR es:[bx+4]
168         add     eax,esi
169         adc     edx,0
170         mov     DWORD PTR ds:[di+4],eax
171         mov     esi,edx
172         dec     bp
173         je      $L764
174         ;
175         mov     eax,ecx
176         mul     DWORD PTR es:[bx+8]
177         add     eax,esi
178         adc     edx,0
179         mov     DWORD PTR ds:[di+8],eax
180         mov     esi,edx
181         dec     bp
182         je      $L764
183         ;
184         mov     eax,ecx
185         mul     DWORD PTR es:[bx+12]
186         add     eax,esi
187         adc     edx,0
188         mov     DWORD PTR ds:[di+12],eax
189         mov     esi,edx
190         dec     bp
191         je      $L764
192         ;
193         add     bx,16
194         add     di,16
195         jmp     $FC743
196         nop
197 $L764:
198         mov     eax,esi
199         mov     edx,esi
200         shr     edx,16
201         pop     es
202         pop     ds
203         pop     di
204         pop     esi
205         pop     bx
206         pop     bp
207         ret     
208         nop     
209 _bn_mul_words   ENDP
210         PUBLIC  _bn_sqr_words
211 _bn_sqr_words   PROC FAR
212 ; Line 92
213         push    bp
214         push    bx
215         push    si
216         push    di
217         push    ds
218         push    es
219         mov     bp,sp
220         mov     si,WORD PTR [bp+16]
221         mov     ds,WORD PTR [bp+18]
222         mov     di,WORD PTR [bp+20]
223         mov     es,WORD PTR [bp+22]
224         mov     bx,WORD PTR [bp+24]
225
226         mov     bp,bx   ; save a memory lookup later
227         shr     bx,1    ; div count by 4 and do groups of 4
228         shr     bx,1
229         je      $L666
230
231 $L765:
232         mov     eax,DWORD PTR es:[di]
233         mul     eax
234         mov     DWORD PTR ds:[si],eax
235         mov     DWORD PTR ds:[si+4],edx
236         ;
237         mov     eax,DWORD PTR es:[di+4]
238         mul     eax
239         mov     DWORD PTR ds:[si+8],eax
240         mov     DWORD PTR ds:[si+12],edx
241         ;
242         mov     eax,DWORD PTR es:[di+8]
243         mul     eax
244         mov     DWORD PTR ds:[si+16],eax
245         mov     DWORD PTR ds:[si+20],edx
246         ;
247         mov     eax,DWORD PTR es:[di+12]
248         mul     eax
249         mov     DWORD PTR ds:[si+24],eax
250         mov     DWORD PTR ds:[si+28],edx
251         ;
252         add     di,16
253         add     si,32
254         dec     bx
255         je      $L666
256         jmp     $L765
257 $L666:
258         and     bp,3
259         dec     bp      ; The copied value of bx (num)
260         js      $L645
261         ;
262         mov     eax,DWORD PTR es:[di]
263         mul     eax
264         mov     DWORD PTR ds:[si],eax
265         mov     DWORD PTR ds:[si+4],edx
266         dec     bp
267         js      $L645
268         ;
269         mov     eax,DWORD PTR es:[di+4]
270         mul     eax
271         mov     DWORD PTR ds:[si+8],eax
272         mov     DWORD PTR ds:[si+12],edx
273         dec     bp
274         js      $L645
275         ;
276         mov     eax,DWORD PTR es:[di+8]
277         mul     eax
278         mov     DWORD PTR ds:[si+16],eax
279         mov     DWORD PTR ds:[si+20],edx
280 $L645:
281         pop     es
282         pop     ds
283         pop     di
284         pop     si
285         pop     bx
286         pop     bp
287         ret     
288 _bn_sqr_words   ENDP
289
290         PUBLIC  _bn_div64
291 _bn_div64       PROC FAR
292         push    bp
293         mov     bp,sp
294         mov     edx, DWORD PTR [bp+6]
295         mov     eax, DWORD PTR [bp+10]
296         div     DWORD PTR [bp+14]
297         mov     edx,eax
298         shr     edx,16
299         pop     bp
300         ret     
301 _bn_div64       ENDP
302
303         PUBLIC  _bn_add_words
304 _bn_add_words   PROC FAR
305 ; Line 58
306         push    bp
307         push    bx
308         push    esi
309         push    di
310         push    ds
311         push    es
312         mov     bp,sp
313 ;       w = 28
314 ;       num = 26
315 ;       ap = 22
316 ;       rp = 18
317         xor     esi,esi                 ;c=0;
318         mov     bx,WORD PTR [bp+18]     ; load low r
319         mov     si,WORD PTR [bp+22]     ; load a
320         mov     es,WORD PTR [bp+24]     ; load a
321         mov     di,WORD PTR [bp+26]     ; load b
322         mov     ds,WORD PTR [bp+28]     ; load b
323
324         mov     dx,WORD PTR [bp+30]     ; load num
325         xor     ecx,ecx
326         dec     dx
327         js      $L547a
328
329 $L5477:
330         mov     eax,DWORD PTR es:[si]   ; *a
331         add     eax,ecx
332         mov     ecx,0
333         adc     ecx,0
334         add     si,4                    ; a++
335         add     eax,DWORD PTR ds:[di]   ; + *b
336         adc     ecx,0
337         mov     ds,WORD PTR [bp+20]
338         add     di,4
339         mov     DWORD PTR ds:[bx],eax
340         mov     ds,WORD PTR [bp+28]
341         add     bx,4
342         dec     dx
343         js      $L547a                  ; Note that we are now testing for -1
344         jmp     $L5477
345         ;
346 $L547a:
347         mov     eax,ecx
348         mov     edx,ecx
349         shr     edx,16
350         pop     es
351         pop     ds
352         pop     di
353         pop     esi
354         pop     bx
355         pop     bp
356         ret     
357         nop     
358 _bn_add_words   ENDP
359 F_TEXT  ENDS
360 END