1#ifndef __ASSEMBLER__
2# define __ASSEMBLER__ 1
3#endif
4#include "crypto/sparc_arch.h"
5
6#ifdef __arch64__
7.register %g2,#scratch
8.register %g3,#scratch
9#endif
10
11.section  ".text",#alloc,#execinstr
12
13#ifdef __PIC__
14SPARC_PIC_THUNK(%g1)
15#endif
16
17.globl    ossl_md5_block_asm_data_order
18.align    32
19ossl_md5_block_asm_data_order:
20          SPARC_LOAD_ADDRESS_LEAF(OPENSSL_sparcv9cap_P,%g1,%g5)
21          ld        [%g1+4],%g1                   ! OPENSSL_sparcv9cap_P[1]
22
23          andcc     %g1, CFR_MD5, %g0
24          be        .Lsoftware
25          nop
26
27          mov       4, %g1
28          andcc     %o1, 0x7, %g0
29          lda       [%o0 + %g0]0x88, %f0                    ! load context
30          lda       [%o0 + %g1]0x88, %f1
31          add       %o0, 8, %o0
32          lda       [%o0 + %g0]0x88, %f2
33          lda       [%o0 + %g1]0x88, %f3
34          bne,pn    %icc, .Lhwunaligned
35          sub       %o0, 8, %o0
36
37.Lhw_loop:
38          ldd       [%o1 + 0x00], %f8
39          ldd       [%o1 + 0x08], %f10
40          ldd       [%o1 + 0x10], %f12
41          ldd       [%o1 + 0x18], %f14
42          ldd       [%o1 + 0x20], %f16
43          ldd       [%o1 + 0x28], %f18
44          ldd       [%o1 + 0x30], %f20
45          subcc     %o2, 1, %o2                   ! done yet?
46          ldd       [%o1 + 0x38], %f22
47          add       %o1, 0x40, %o1
48          prefetch [%o1 + 63], 20
49
50          .word     0x81b02800                    ! MD5
51
52          bne,pt    SIZE_T_CC, .Lhw_loop
53          nop
54
55.Lhwfinish:
56          sta       %f0, [%o0 + %g0]0x88          ! store context
57          sta       %f1, [%o0 + %g1]0x88
58          add       %o0, 8, %o0
59          sta       %f2, [%o0 + %g0]0x88
60          sta       %f3, [%o0 + %g1]0x88
61          retl
62          nop
63
64.align    8
65.Lhwunaligned:
66          .word     0x93b24300 !alignaddr         %o1,%g0,%o1
67
68          ldd       [%o1 + 0x00], %f10
69.Lhwunaligned_loop:
70          ldd       [%o1 + 0x08], %f12
71          ldd       [%o1 + 0x10], %f14
72          ldd       [%o1 + 0x18], %f16
73          ldd       [%o1 + 0x20], %f18
74          ldd       [%o1 + 0x28], %f20
75          ldd       [%o1 + 0x30], %f22
76          ldd       [%o1 + 0x38], %f24
77          subcc     %o2, 1, %o2                   ! done yet?
78          ldd       [%o1 + 0x40], %f26
79          add       %o1, 0x40, %o1
80          prefetch [%o1 + 63], 20
81
82          .word     0x91b2890c !faligndata        %f10,%f12,%f8
83          .word     0x95b3090e !faligndata        %f12,%f14,%f10
84          .word     0x99b38910 !faligndata        %f14,%f16,%f12
85          .word     0x9db40912 !faligndata        %f16,%f18,%f14
86          .word     0xa1b48914 !faligndata        %f18,%f20,%f16
87          .word     0xa5b50916 !faligndata        %f20,%f22,%f18
88          .word     0xa9b58918 !faligndata        %f22,%f24,%f20
89          .word     0xadb6091a !faligndata        %f24,%f26,%f22
90
91          .word     0x81b02800                    ! MD5
92
93          bne,pt    SIZE_T_CC, .Lhwunaligned_loop
94          .word     0x95b68f9a !for     %f26,%f26,%f10      ! %f10=%f26
95
96          ba        .Lhwfinish
97          nop
98
99.align    16
100.Lsoftware:
101          save      %sp,-STACK_FRAME,%sp
102
103          rd        %asi,%l7
104          wr        %g0,0x88,%asi                 ! ASI_PRIMARY_LITTLE
105          and       %i1,7,%i3
106          andn      %i1,7,%i1
107
108          sll       %i3,3,%i3           ! *=8
109          mov       56,%i5
110          ld        [%i0+0],%l0
111          sub       %i5,%i3,%i5
112          ld        [%i0+4],%l1
113          and       %i5,32,%i4
114          add       %i5,8,%i5
115          ld        [%i0+8],%l2
116          sub       %i5,%i4,%i5         ! shr+shl1+shl2==64
117          ld        [%i0+12],%l3
118          nop
119
120.Loop:
121           cmp      %i3,0                         ! was inp aligned?
122          ldxa      [%i1+0]%asi,%o0     ! load little-endian input
123          ldxa      [%i1+8]%asi,%o1
124          ldxa      [%i1+16]%asi,%o2
125          ldxa      [%i1+24]%asi,%o3
126          ldxa      [%i1+32]%asi,%o4
127           sllx     %l0,32,%g4                    ! pack A,B
128          ldxa      [%i1+40]%asi,%o5
129           sllx     %l2,32,%g5                    ! pack C,D
130          ldxa      [%i1+48]%asi,%o7
131           or       %l1,%g4,%g4
132          ldxa      [%i1+56]%asi,%g1
133           or       %l3,%g5,%g5
134          bnz,a,pn  %icc,.+8
135          ldxa      [%i1+64]%asi,%g2
136
137          srlx      %o0,%i3,%o0         ! align X[0]
138          sllx      %o1,%i4,%g3
139           sethi    %hi(3614090360),%l5
140          sllx      %g3,%i5,%g3
141           or       %l5,%lo(3614090360),%l5
142          or        %g3,%o0,%o0
143           xor      %l2,%l3,%l4
144           add      %o0,%l5,%l5                   ! X[0]+K[0]
145           srlx     %o0,32,%g3                    ! extract X[1]
146          and       %l1,%l4,%l4                   ! round 0
147          add       %l5,%l0,%l0
148          xor       %l3,%l4,%l4
149           sethi    %hi(3905402710),%l5
150          add       %l4,%l0,%l0
151           or       %l5,%lo(3905402710),%l5
152          sll       %l0,7,%l6
153           add      %g3,%l5,%l5                   ! X[1]+K[1]
154          srl       %l0,32-7,%l0
155          add       %l1,%l6,%l6
156           xor       %l1,%l2,%l4
157          add       %l6,%l0,%l0
158           srlx     %o1,%i3,%o1         ! align X[2]
159          and       %l0,%l4,%l4                   ! round 1
160           sllx     %o2,%i4,%g3
161          add       %l5,%l3,%l3
162           sllx     %g3,%i5,%g3
163          xor       %l2,%l4,%l4
164           or       %g3,%o1,%o1
165           sethi    %hi(606105819),%l5
166          add       %l4,%l3,%l3
167           or       %l5,%lo(606105819),%l5
168          sll       %l3,12,%l6
169           add      %o1,%l5,%l5                   ! X[2]+K[2]
170          srl       %l3,32-12,%l3
171          add       %l0,%l6,%l6
172           xor       %l0,%l1,%l4
173          add       %l6,%l3,%l3
174           srlx     %o1,32,%g3                    ! extract X[3]
175          and       %l3,%l4,%l4                   ! round 2
176          add       %l5,%l2,%l2
177          xor       %l1,%l4,%l4
178           sethi    %hi(3250441966),%l5
179          add       %l4,%l2,%l2
180           or       %l5,%lo(3250441966),%l5
181          sll       %l2,17,%l6
182           add      %g3,%l5,%l5                   ! X[3]+K[3]
183          srl       %l2,32-17,%l2
184          add       %l3,%l6,%l6
185           xor       %l3,%l0,%l4
186          add       %l6,%l2,%l2
187           srlx     %o2,%i3,%o2         ! align X[4]
188          and       %l2,%l4,%l4                   ! round 3
189           sllx     %o3,%i4,%g3
190          add       %l5,%l1,%l1
191           sllx     %g3,%i5,%g3
192          xor       %l0,%l4,%l4
193           or       %g3,%o2,%o2
194           sethi    %hi(4118548399),%l5
195          add       %l4,%l1,%l1
196           or       %l5,%lo(4118548399),%l5
197          sll       %l1,22,%l6
198           add      %o2,%l5,%l5                   ! X[4]+K[4]
199          srl       %l1,32-22,%l1
200          add       %l2,%l6,%l6
201           xor       %l2,%l3,%l4
202          add       %l6,%l1,%l1
203           srlx     %o2,32,%g3                    ! extract X[5]
204          and       %l1,%l4,%l4                   ! round 4
205          add       %l5,%l0,%l0
206          xor       %l3,%l4,%l4
207           sethi    %hi(1200080426),%l5
208          add       %l4,%l0,%l0
209           or       %l5,%lo(1200080426),%l5
210          sll       %l0,7,%l6
211           add      %g3,%l5,%l5                   ! X[5]+K[5]
212          srl       %l0,32-7,%l0
213          add       %l1,%l6,%l6
214           xor       %l1,%l2,%l4
215          add       %l6,%l0,%l0
216           srlx     %o3,%i3,%o3         ! align X[6]
217          and       %l0,%l4,%l4                   ! round 5
218           sllx     %o4,%i4,%g3
219          add       %l5,%l3,%l3
220           sllx     %g3,%i5,%g3
221          xor       %l2,%l4,%l4
222           or       %g3,%o3,%o3
223           sethi    %hi(2821735955),%l5
224          add       %l4,%l3,%l3
225           or       %l5,%lo(2821735955),%l5
226          sll       %l3,12,%l6
227           add      %o3,%l5,%l5                   ! X[6]+K[6]
228          srl       %l3,32-12,%l3
229          add       %l0,%l6,%l6
230           xor       %l0,%l1,%l4
231          add       %l6,%l3,%l3
232           srlx     %o3,32,%g3                    ! extract X[7]
233          and       %l3,%l4,%l4                   ! round 6
234          add       %l5,%l2,%l2
235          xor       %l1,%l4,%l4
236           sethi    %hi(4249261313),%l5
237          add       %l4,%l2,%l2
238           or       %l5,%lo(4249261313),%l5
239          sll       %l2,17,%l6
240           add      %g3,%l5,%l5                   ! X[7]+K[7]
241          srl       %l2,32-17,%l2
242          add       %l3,%l6,%l6
243           xor       %l3,%l0,%l4
244          add       %l6,%l2,%l2
245           srlx     %o4,%i3,%o4         ! align X[8]
246          and       %l2,%l4,%l4                   ! round 7
247           sllx     %o5,%i4,%g3
248          add       %l5,%l1,%l1
249           sllx     %g3,%i5,%g3
250          xor       %l0,%l4,%l4
251           or       %g3,%o4,%o4
252           sethi    %hi(1770035416),%l5
253          add       %l4,%l1,%l1
254           or       %l5,%lo(1770035416),%l5
255          sll       %l1,22,%l6
256           add      %o4,%l5,%l5                   ! X[8]+K[8]
257          srl       %l1,32-22,%l1
258          add       %l2,%l6,%l6
259           xor       %l2,%l3,%l4
260          add       %l6,%l1,%l1
261           srlx     %o4,32,%g3                    ! extract X[9]
262          and       %l1,%l4,%l4                   ! round 8
263          add       %l5,%l0,%l0
264          xor       %l3,%l4,%l4
265           sethi    %hi(2336552879),%l5
266          add       %l4,%l0,%l0
267           or       %l5,%lo(2336552879),%l5
268          sll       %l0,7,%l6
269           add      %g3,%l5,%l5                   ! X[9]+K[9]
270          srl       %l0,32-7,%l0
271          add       %l1,%l6,%l6
272           xor       %l1,%l2,%l4
273          add       %l6,%l0,%l0
274           srlx     %o5,%i3,%o5         ! align X[10]
275          and       %l0,%l4,%l4                   ! round 9
276           sllx     %o7,%i4,%g3
277          add       %l5,%l3,%l3
278           sllx     %g3,%i5,%g3
279          xor       %l2,%l4,%l4
280           or       %g3,%o5,%o5
281           sethi    %hi(4294925233),%l5
282          add       %l4,%l3,%l3
283           or       %l5,%lo(4294925233),%l5
284          sll       %l3,12,%l6
285           add      %o5,%l5,%l5                   ! X[10]+K[10]
286          srl       %l3,32-12,%l3
287          add       %l0,%l6,%l6
288           xor       %l0,%l1,%l4
289          add       %l6,%l3,%l3
290           srlx     %o5,32,%g3                    ! extract X[11]
291          and       %l3,%l4,%l4                   ! round 10
292          add       %l5,%l2,%l2
293          xor       %l1,%l4,%l4
294           sethi    %hi(2304563134),%l5
295          add       %l4,%l2,%l2
296           or       %l5,%lo(2304563134),%l5
297          sll       %l2,17,%l6
298           add      %g3,%l5,%l5                   ! X[11]+K[11]
299          srl       %l2,32-17,%l2
300          add       %l3,%l6,%l6
301           xor       %l3,%l0,%l4
302          add       %l6,%l2,%l2
303           srlx     %o7,%i3,%o7         ! align X[12]
304          and       %l2,%l4,%l4                   ! round 11
305           sllx     %g1,%i4,%g3
306          add       %l5,%l1,%l1
307           sllx     %g3,%i5,%g3
308          xor       %l0,%l4,%l4
309           or       %g3,%o7,%o7
310           sethi    %hi(1804603682),%l5
311          add       %l4,%l1,%l1
312           or       %l5,%lo(1804603682),%l5
313          sll       %l1,22,%l6
314           add      %o7,%l5,%l5                   ! X[12]+K[12]
315          srl       %l1,32-22,%l1
316          add       %l2,%l6,%l6
317           xor       %l2,%l3,%l4
318          add       %l6,%l1,%l1
319           srlx     %o7,32,%g3                    ! extract X[13]
320          and       %l1,%l4,%l4                   ! round 12
321          add       %l5,%l0,%l0
322          xor       %l3,%l4,%l4
323           sethi    %hi(4254626195),%l5
324          add       %l4,%l0,%l0
325           or       %l5,%lo(4254626195),%l5
326          sll       %l0,7,%l6
327           add      %g3,%l5,%l5                   ! X[13]+K[13]
328          srl       %l0,32-7,%l0
329          add       %l1,%l6,%l6
330           xor       %l1,%l2,%l4
331          add       %l6,%l0,%l0
332           srlx     %g1,%i3,%g1         ! align X[14]
333          and       %l0,%l4,%l4                   ! round 13
334           sllx     %g2,%i4,%g3
335          add       %l5,%l3,%l3
336           sllx     %g3,%i5,%g3
337          xor       %l2,%l4,%l4
338           or       %g3,%g1,%g1
339           sethi    %hi(2792965006),%l5
340          add       %l4,%l3,%l3
341           or       %l5,%lo(2792965006),%l5
342          sll       %l3,12,%l6
343           add      %g1,%l5,%l5                   ! X[14]+K[14]
344          srl       %l3,32-12,%l3
345          add       %l0,%l6,%l6
346           xor       %l0,%l1,%l4
347          add       %l6,%l3,%l3
348           srlx     %g1,32,%g3                    ! extract X[15]
349          and       %l3,%l4,%l4                   ! round 14
350          add       %l5,%l2,%l2
351          xor       %l1,%l4,%l4
352           sethi    %hi(1236535329),%l5
353          add       %l4,%l2,%l2
354           or       %l5,%lo(1236535329),%l5
355          sll       %l2,17,%l6
356           add      %g3,%l5,%l5                   ! X[15]+K[15]
357          srl       %l2,32-17,%l2
358          add       %l3,%l6,%l6
359           xor       %l3,%l0,%l4
360          add       %l6,%l2,%l2
361           srlx     %o0,32,%g3                    ! extract X[1]
362          and       %l2,%l4,%l4                   ! round 15
363          add       %l5,%l1,%l1
364          xor       %l0,%l4,%l4
365           sethi    %hi(4129170786),%l5
366          add       %l4,%l1,%l1
367           or       %l5,%lo(4129170786),%l5
368          sll       %l1,22,%l6
369           add      %g3,%l5,%l5                   ! X[1]+K[16]
370          srl       %l1,32-22,%l1
371          add       %l2,%l6,%l6
372           andn      %l2,%l3,%l4
373          add       %l6,%l1,%l1
374          and       %l1,%l3,%l6                   ! round 16
375          add       %l5,%l0,%l0
376          or        %l6,%l4,%l4
377           sethi    %hi(3225465664),%l5
378          add       %l4,%l0,%l0
379           or       %l5,%lo(3225465664),%l5
380          sll       %l0,5,%l6
381           add      %o3,%l5,%l5                   ! X[6]+K[17]
382          srl       %l0,32-5,%l0
383          add       %l1,%l6,%l6
384           andn      %l1,%l2,%l4
385          add       %l6,%l0,%l0
386           srlx     %o5,32,%g3                    ! extract X[11]
387          and       %l0,%l2,%l6                   ! round 17
388          add       %l5,%l3,%l3
389          or        %l6,%l4,%l4
390           sethi    %hi(643717713),%l5
391          add       %l4,%l3,%l3
392           or       %l5,%lo(643717713),%l5
393          sll       %l3,9,%l6
394           add      %g3,%l5,%l5                   ! X[11]+K[18]
395          srl       %l3,32-9,%l3
396          add       %l0,%l6,%l6
397           andn      %l0,%l1,%l4
398          add       %l6,%l3,%l3
399          and       %l3,%l1,%l6                   ! round 18
400          add       %l5,%l2,%l2
401          or        %l6,%l4,%l4
402           sethi    %hi(3921069994),%l5
403          add       %l4,%l2,%l2
404           or       %l5,%lo(3921069994),%l5
405          sll       %l2,14,%l6
406           add      %o0,%l5,%l5                   ! X[0]+K[19]
407          srl       %l2,32-14,%l2
408          add       %l3,%l6,%l6
409           andn      %l3,%l0,%l4
410          add       %l6,%l2,%l2
411           srlx     %o2,32,%g3                    ! extract X[5]
412          and       %l2,%l0,%l6                   ! round 19
413          add       %l5,%l1,%l1
414          or        %l6,%l4,%l4
415           sethi    %hi(3593408605),%l5
416          add       %l4,%l1,%l1
417           or       %l5,%lo(3593408605),%l5
418          sll       %l1,20,%l6
419           add      %g3,%l5,%l5                   ! X[5]+K[20]
420          srl       %l1,32-20,%l1
421          add       %l2,%l6,%l6
422           andn      %l2,%l3,%l4
423          add       %l6,%l1,%l1
424          and       %l1,%l3,%l6                   ! round 20
425          add       %l5,%l0,%l0
426          or        %l6,%l4,%l4
427           sethi    %hi(38016083),%l5
428          add       %l4,%l0,%l0
429           or       %l5,%lo(38016083),%l5
430          sll       %l0,5,%l6
431           add      %o5,%l5,%l5                   ! X[10]+K[21]
432          srl       %l0,32-5,%l0
433          add       %l1,%l6,%l6
434           andn      %l1,%l2,%l4
435          add       %l6,%l0,%l0
436           srlx     %g1,32,%g3                    ! extract X[15]
437          and       %l0,%l2,%l6                   ! round 21
438          add       %l5,%l3,%l3
439          or        %l6,%l4,%l4
440           sethi    %hi(3634488961),%l5
441          add       %l4,%l3,%l3
442           or       %l5,%lo(3634488961),%l5
443          sll       %l3,9,%l6
444           add      %g3,%l5,%l5                   ! X[15]+K[22]
445          srl       %l3,32-9,%l3
446          add       %l0,%l6,%l6
447           andn      %l0,%l1,%l4
448          add       %l6,%l3,%l3
449          and       %l3,%l1,%l6                   ! round 22
450          add       %l5,%l2,%l2
451          or        %l6,%l4,%l4
452           sethi    %hi(3889429448),%l5
453          add       %l4,%l2,%l2
454           or       %l5,%lo(3889429448),%l5
455          sll       %l2,14,%l6
456           add      %o2,%l5,%l5                   ! X[4]+K[23]
457          srl       %l2,32-14,%l2
458          add       %l3,%l6,%l6
459           andn      %l3,%l0,%l4
460          add       %l6,%l2,%l2
461           srlx     %o4,32,%g3                    ! extract X[9]
462          and       %l2,%l0,%l6                   ! round 23
463          add       %l5,%l1,%l1
464          or        %l6,%l4,%l4
465           sethi    %hi(568446438),%l5
466          add       %l4,%l1,%l1
467           or       %l5,%lo(568446438),%l5
468          sll       %l1,20,%l6
469           add      %g3,%l5,%l5                   ! X[9]+K[24]
470          srl       %l1,32-20,%l1
471          add       %l2,%l6,%l6
472           andn      %l2,%l3,%l4
473          add       %l6,%l1,%l1
474          and       %l1,%l3,%l6                   ! round 24
475          add       %l5,%l0,%l0
476          or        %l6,%l4,%l4
477           sethi    %hi(3275163606),%l5
478          add       %l4,%l0,%l0
479           or       %l5,%lo(3275163606),%l5
480          sll       %l0,5,%l6
481           add      %g1,%l5,%l5                   ! X[14]+K[25]
482          srl       %l0,32-5,%l0
483          add       %l1,%l6,%l6
484           andn      %l1,%l2,%l4
485          add       %l6,%l0,%l0
486           srlx     %o1,32,%g3                    ! extract X[3]
487          and       %l0,%l2,%l6                   ! round 25
488          add       %l5,%l3,%l3
489          or        %l6,%l4,%l4
490           sethi    %hi(4107603335),%l5
491          add       %l4,%l3,%l3
492           or       %l5,%lo(4107603335),%l5
493          sll       %l3,9,%l6
494           add      %g3,%l5,%l5                   ! X[3]+K[26]
495          srl       %l3,32-9,%l3
496          add       %l0,%l6,%l6
497           andn      %l0,%l1,%l4
498          add       %l6,%l3,%l3
499          and       %l3,%l1,%l6                   ! round 26
500          add       %l5,%l2,%l2
501          or        %l6,%l4,%l4
502           sethi    %hi(1163531501),%l5
503          add       %l4,%l2,%l2
504           or       %l5,%lo(1163531501),%l5
505          sll       %l2,14,%l6
506           add      %o4,%l5,%l5                   ! X[8]+K[27]
507          srl       %l2,32-14,%l2
508          add       %l3,%l6,%l6
509           andn      %l3,%l0,%l4
510          add       %l6,%l2,%l2
511           srlx     %o7,32,%g3                    ! extract X[13]
512          and       %l2,%l0,%l6                   ! round 27
513          add       %l5,%l1,%l1
514          or        %l6,%l4,%l4
515           sethi    %hi(2850285829),%l5
516          add       %l4,%l1,%l1
517           or       %l5,%lo(2850285829),%l5
518          sll       %l1,20,%l6
519           add      %g3,%l5,%l5                   ! X[13]+K[28]
520          srl       %l1,32-20,%l1
521          add       %l2,%l6,%l6
522           andn      %l2,%l3,%l4
523          add       %l6,%l1,%l1
524          and       %l1,%l3,%l6                   ! round 28
525          add       %l5,%l0,%l0
526          or        %l6,%l4,%l4
527           sethi    %hi(4243563512),%l5
528          add       %l4,%l0,%l0
529           or       %l5,%lo(4243563512),%l5
530          sll       %l0,5,%l6
531           add      %o1,%l5,%l5                   ! X[2]+K[29]
532          srl       %l0,32-5,%l0
533          add       %l1,%l6,%l6
534           andn      %l1,%l2,%l4
535          add       %l6,%l0,%l0
536           srlx     %o3,32,%g3                    ! extract X[7]
537          and       %l0,%l2,%l6                   ! round 29
538          add       %l5,%l3,%l3
539          or        %l6,%l4,%l4
540           sethi    %hi(1735328473),%l5
541          add       %l4,%l3,%l3
542           or       %l5,%lo(1735328473),%l5
543          sll       %l3,9,%l6
544           add      %g3,%l5,%l5                   ! X[7]+K[30]
545          srl       %l3,32-9,%l3
546          add       %l0,%l6,%l6
547           andn      %l0,%l1,%l4
548          add       %l6,%l3,%l3
549          and       %l3,%l1,%l6                   ! round 30
550          add       %l5,%l2,%l2
551          or        %l6,%l4,%l4
552           sethi    %hi(2368359562),%l5
553          add       %l4,%l2,%l2
554           or       %l5,%lo(2368359562),%l5
555          sll       %l2,14,%l6
556           add      %o7,%l5,%l5                   ! X[12]+K[31]
557          srl       %l2,32-14,%l2
558          add       %l3,%l6,%l6
559           andn      %l3,%l0,%l4
560          add       %l6,%l2,%l2
561           srlx     %o2,32,%g3                    ! extract X[5]
562          and       %l2,%l0,%l6                   ! round 31
563          add       %l5,%l1,%l1
564          or        %l6,%l4,%l4
565           sethi    %hi(4294588738),%l5
566          add       %l4,%l1,%l1
567           or       %l5,%lo(4294588738),%l5
568          sll       %l1,20,%l6
569           add      %g3,%l5,%l5                   ! X[5]+K[32]
570          srl       %l1,32-20,%l1
571          add       %l2,%l6,%l6
572           xor       %l2,%l3,%l4
573          add       %l6,%l1,%l1
574          add       %l5,%l0,%l0                   ! round 32
575          xor       %l1,%l4,%l4
576           sethi    %hi(2272392833),%l5
577          add       %l4,%l0,%l0
578           or       %l5,%lo(2272392833),%l5
579          sll       %l0,4,%l6
580           add      %o4,%l5,%l5                   ! X[8]+K[33]
581          srl       %l0,32-4,%l0
582          add       %l1,%l6,%l6
583           xor       %l1,%l2,%l4
584          add       %l6,%l0,%l0
585           srlx     %o5,32,%g3                    ! extract X[11]
586          add       %l5,%l3,%l3                   ! round 33
587          xor       %l0,%l4,%l4
588           sethi    %hi(1839030562),%l5
589          add       %l4,%l3,%l3
590           or       %l5,%lo(1839030562),%l5
591          sll       %l3,11,%l6
592           add      %g3,%l5,%l5                   ! X[11]+K[34]
593          srl       %l3,32-11,%l3
594          add       %l0,%l6,%l6
595           xor       %l0,%l1,%l4
596          add       %l6,%l3,%l3
597          add       %l5,%l2,%l2                   ! round 34
598          xor       %l3,%l4,%l4
599           sethi    %hi(4259657740),%l5
600          add       %l4,%l2,%l2
601           or       %l5,%lo(4259657740),%l5
602          sll       %l2,16,%l6
603           add      %g1,%l5,%l5                   ! X[14]+K[35]
604          srl       %l2,32-16,%l2
605          add       %l3,%l6,%l6
606           xor       %l3,%l0,%l4
607          add       %l6,%l2,%l2
608           srlx     %o0,32,%g3                    ! extract X[1]
609          add       %l5,%l1,%l1                   ! round 35
610          xor       %l2,%l4,%l4
611           sethi    %hi(2763975236),%l5
612          add       %l4,%l1,%l1
613           or       %l5,%lo(2763975236),%l5
614          sll       %l1,23,%l6
615           add      %g3,%l5,%l5                   ! X[1]+K[36]
616          srl       %l1,32-23,%l1
617          add       %l2,%l6,%l6
618           xor       %l2,%l3,%l4
619          add       %l6,%l1,%l1
620          add       %l5,%l0,%l0                   ! round 36
621          xor       %l1,%l4,%l4
622           sethi    %hi(1272893353),%l5
623          add       %l4,%l0,%l0
624           or       %l5,%lo(1272893353),%l5
625          sll       %l0,4,%l6
626           add      %o2,%l5,%l5                   ! X[4]+K[37]
627          srl       %l0,32-4,%l0
628          add       %l1,%l6,%l6
629           xor       %l1,%l2,%l4
630          add       %l6,%l0,%l0
631           srlx     %o3,32,%g3                    ! extract X[7]
632          add       %l5,%l3,%l3                   ! round 37
633          xor       %l0,%l4,%l4
634           sethi    %hi(4139469664),%l5
635          add       %l4,%l3,%l3
636           or       %l5,%lo(4139469664),%l5
637          sll       %l3,11,%l6
638           add      %g3,%l5,%l5                   ! X[7]+K[38]
639          srl       %l3,32-11,%l3
640          add       %l0,%l6,%l6
641           xor       %l0,%l1,%l4
642          add       %l6,%l3,%l3
643          add       %l5,%l2,%l2                   ! round 38
644          xor       %l3,%l4,%l4
645           sethi    %hi(3200236656),%l5
646          add       %l4,%l2,%l2
647           or       %l5,%lo(3200236656),%l5
648          sll       %l2,16,%l6
649           add      %o5,%l5,%l5                   ! X[10]+K[39]
650          srl       %l2,32-16,%l2
651          add       %l3,%l6,%l6
652           xor       %l3,%l0,%l4
653          add       %l6,%l2,%l2
654           srlx     %o7,32,%g3                    ! extract X[13]
655          add       %l5,%l1,%l1                   ! round 39
656          xor       %l2,%l4,%l4
657           sethi    %hi(681279174),%l5
658          add       %l4,%l1,%l1
659           or       %l5,%lo(681279174),%l5
660          sll       %l1,23,%l6
661           add      %g3,%l5,%l5                   ! X[13]+K[40]
662          srl       %l1,32-23,%l1
663          add       %l2,%l6,%l6
664           xor       %l2,%l3,%l4
665          add       %l6,%l1,%l1
666          add       %l5,%l0,%l0                   ! round 40
667          xor       %l1,%l4,%l4
668           sethi    %hi(3936430074),%l5
669          add       %l4,%l0,%l0
670           or       %l5,%lo(3936430074),%l5
671          sll       %l0,4,%l6
672           add      %o0,%l5,%l5                   ! X[0]+K[41]
673          srl       %l0,32-4,%l0
674          add       %l1,%l6,%l6
675           xor       %l1,%l2,%l4
676          add       %l6,%l0,%l0
677           srlx     %o1,32,%g3                    ! extract X[3]
678          add       %l5,%l3,%l3                   ! round 41
679          xor       %l0,%l4,%l4
680           sethi    %hi(3572445317),%l5
681          add       %l4,%l3,%l3
682           or       %l5,%lo(3572445317),%l5
683          sll       %l3,11,%l6
684           add      %g3,%l5,%l5                   ! X[3]+K[42]
685          srl       %l3,32-11,%l3
686          add       %l0,%l6,%l6
687           xor       %l0,%l1,%l4
688          add       %l6,%l3,%l3
689          add       %l5,%l2,%l2                   ! round 42
690          xor       %l3,%l4,%l4
691           sethi    %hi(76029189),%l5
692          add       %l4,%l2,%l2
693           or       %l5,%lo(76029189),%l5
694          sll       %l2,16,%l6
695           add      %o3,%l5,%l5                   ! X[6]+K[43]
696          srl       %l2,32-16,%l2
697          add       %l3,%l6,%l6
698           xor       %l3,%l0,%l4
699          add       %l6,%l2,%l2
700           srlx     %o4,32,%g3                    ! extract X[9]
701          add       %l5,%l1,%l1                   ! round 43
702          xor       %l2,%l4,%l4
703           sethi    %hi(3654602809),%l5
704          add       %l4,%l1,%l1
705           or       %l5,%lo(3654602809),%l5
706          sll       %l1,23,%l6
707           add      %g3,%l5,%l5                   ! X[9]+K[44]
708          srl       %l1,32-23,%l1
709          add       %l2,%l6,%l6
710           xor       %l2,%l3,%l4
711          add       %l6,%l1,%l1
712          add       %l5,%l0,%l0                   ! round 44
713          xor       %l1,%l4,%l4
714           sethi    %hi(3873151461),%l5
715          add       %l4,%l0,%l0
716           or       %l5,%lo(3873151461),%l5
717          sll       %l0,4,%l6
718           add      %o7,%l5,%l5                   ! X[12]+K[45]
719          srl       %l0,32-4,%l0
720          add       %l1,%l6,%l6
721           xor       %l1,%l2,%l4
722          add       %l6,%l0,%l0
723           srlx     %g1,32,%g3                    ! extract X[15]
724          add       %l5,%l3,%l3                   ! round 45
725          xor       %l0,%l4,%l4
726           sethi    %hi(530742520),%l5
727          add       %l4,%l3,%l3
728           or       %l5,%lo(530742520),%l5
729          sll       %l3,11,%l6
730           add      %g3,%l5,%l5                   ! X[15]+K[46]
731          srl       %l3,32-11,%l3
732          add       %l0,%l6,%l6
733           xor       %l0,%l1,%l4
734          add       %l6,%l3,%l3
735          add       %l5,%l2,%l2                   ! round 46
736          xor       %l3,%l4,%l4
737           sethi    %hi(3299628645),%l5
738          add       %l4,%l2,%l2
739           or       %l5,%lo(3299628645),%l5
740          sll       %l2,16,%l6
741           add      %o1,%l5,%l5                   ! X[2]+K[47]
742          srl       %l2,32-16,%l2
743          add       %l3,%l6,%l6
744           xor       %l3,%l0,%l4
745          add       %l6,%l2,%l2
746          add       %l5,%l1,%l1                   ! round 47
747          xor       %l2,%l4,%l4
748           sethi    %hi(4096336452),%l5
749          add       %l4,%l1,%l1
750           or       %l5,%lo(4096336452),%l5
751          sll       %l1,23,%l6
752           add      %o0,%l5,%l5                   ! X[0]+K[48]
753          srl       %l1,32-23,%l1
754          add       %l2,%l6,%l6
755           xor       %l2,%l3,%l4
756          add       %l6,%l1,%l1
757          add       %l5,%l0,%l0                   ! round 48
758           srlx     %o3,32,%g3                    ! extract X[7]
759          orn       %l1,%l3,%l4
760           sethi    %hi(1126891415),%l5
761          xor       %l2,%l4,%l4
762           or       %l5,%lo(1126891415),%l5
763          add       %l4,%l0,%l0
764          sll       %l0,6,%l6
765           add      %g3,%l5,%l5                   ! X[7]+K[49]
766          srl       %l0,32-6,%l0
767          add       %l1,%l6,%l6
768          add       %l6,%l0,%l0
769          add       %l5,%l3,%l3                   ! round 49
770          orn       %l0,%l2,%l4
771           sethi    %hi(2878612391),%l5
772          xor       %l1,%l4,%l4
773           or       %l5,%lo(2878612391),%l5
774          add       %l4,%l3,%l3
775          sll       %l3,10,%l6
776           add      %g1,%l5,%l5                   ! X[14]+K[50]
777          srl       %l3,32-10,%l3
778          add       %l0,%l6,%l6
779          add       %l6,%l3,%l3
780          add       %l5,%l2,%l2                   ! round 50
781           srlx     %o2,32,%g3                    ! extract X[5]
782          orn       %l3,%l1,%l4
783           sethi    %hi(4237533241),%l5
784          xor       %l0,%l4,%l4
785           or       %l5,%lo(4237533241),%l5
786          add       %l4,%l2,%l2
787          sll       %l2,15,%l6
788           add      %g3,%l5,%l5                   ! X[5]+K[51]
789          srl       %l2,32-15,%l2
790          add       %l3,%l6,%l6
791          add       %l6,%l2,%l2
792          add       %l5,%l1,%l1                   ! round 51
793          orn       %l2,%l0,%l4
794           sethi    %hi(1700485571),%l5
795          xor       %l3,%l4,%l4
796           or       %l5,%lo(1700485571),%l5
797          add       %l4,%l1,%l1
798          sll       %l1,21,%l6
799           add      %o7,%l5,%l5                   ! X[12]+K[52]
800          srl       %l1,32-21,%l1
801          add       %l2,%l6,%l6
802          add       %l6,%l1,%l1
803          add       %l5,%l0,%l0                   ! round 52
804           srlx     %o1,32,%g3                    ! extract X[3]
805          orn       %l1,%l3,%l4
806           sethi    %hi(2399980690),%l5
807          xor       %l2,%l4,%l4
808           or       %l5,%lo(2399980690),%l5
809          add       %l4,%l0,%l0
810          sll       %l0,6,%l6
811           add      %g3,%l5,%l5                   ! X[3]+K[53]
812          srl       %l0,32-6,%l0
813          add       %l1,%l6,%l6
814          add       %l6,%l0,%l0
815          add       %l5,%l3,%l3                   ! round 53
816          orn       %l0,%l2,%l4
817           sethi    %hi(4293915773),%l5
818          xor       %l1,%l4,%l4
819           or       %l5,%lo(4293915773),%l5
820          add       %l4,%l3,%l3
821          sll       %l3,10,%l6
822           add      %o5,%l5,%l5                   ! X[10]+K[54]
823          srl       %l3,32-10,%l3
824          add       %l0,%l6,%l6
825          add       %l6,%l3,%l3
826          add       %l5,%l2,%l2                   ! round 54
827           srlx     %o0,32,%g3                    ! extract X[1]
828          orn       %l3,%l1,%l4
829           sethi    %hi(2240044497),%l5
830          xor       %l0,%l4,%l4
831           or       %l5,%lo(2240044497),%l5
832          add       %l4,%l2,%l2
833          sll       %l2,15,%l6
834           add      %g3,%l5,%l5                   ! X[1]+K[55]
835          srl       %l2,32-15,%l2
836          add       %l3,%l6,%l6
837          add       %l6,%l2,%l2
838          add       %l5,%l1,%l1                   ! round 55
839          orn       %l2,%l0,%l4
840           sethi    %hi(1873313359),%l5
841          xor       %l3,%l4,%l4
842           or       %l5,%lo(1873313359),%l5
843          add       %l4,%l1,%l1
844          sll       %l1,21,%l6
845           add      %o4,%l5,%l5                   ! X[8]+K[56]
846          srl       %l1,32-21,%l1
847          add       %l2,%l6,%l6
848          add       %l6,%l1,%l1
849          add       %l5,%l0,%l0                   ! round 56
850           srlx     %g1,32,%g3                    ! extract X[15]
851          orn       %l1,%l3,%l4
852           sethi    %hi(4264355552),%l5
853          xor       %l2,%l4,%l4
854           or       %l5,%lo(4264355552),%l5
855          add       %l4,%l0,%l0
856          sll       %l0,6,%l6
857           add      %g3,%l5,%l5                   ! X[15]+K[57]
858          srl       %l0,32-6,%l0
859          add       %l1,%l6,%l6
860          add       %l6,%l0,%l0
861          add       %l5,%l3,%l3                   ! round 57
862          orn       %l0,%l2,%l4
863           sethi    %hi(2734768916),%l5
864          xor       %l1,%l4,%l4
865           or       %l5,%lo(2734768916),%l5
866          add       %l4,%l3,%l3
867          sll       %l3,10,%l6
868           add      %o3,%l5,%l5                   ! X[6]+K[58]
869          srl       %l3,32-10,%l3
870          add       %l0,%l6,%l6
871          add       %l6,%l3,%l3
872          add       %l5,%l2,%l2                   ! round 58
873           srlx     %o7,32,%g3                    ! extract X[13]
874          orn       %l3,%l1,%l4
875           sethi    %hi(1309151649),%l5
876          xor       %l0,%l4,%l4
877           or       %l5,%lo(1309151649),%l5
878          add       %l4,%l2,%l2
879          sll       %l2,15,%l6
880           add      %g3,%l5,%l5                   ! X[13]+K[59]
881          srl       %l2,32-15,%l2
882          add       %l3,%l6,%l6
883          add       %l6,%l2,%l2
884          add       %l5,%l1,%l1                   ! round 59
885          orn       %l2,%l0,%l4
886           sethi    %hi(4149444226),%l5
887          xor       %l3,%l4,%l4
888           or       %l5,%lo(4149444226),%l5
889          add       %l4,%l1,%l1
890          sll       %l1,21,%l6
891           add      %o2,%l5,%l5                   ! X[4]+K[60]
892          srl       %l1,32-21,%l1
893          add       %l2,%l6,%l6
894          add       %l6,%l1,%l1
895          add       %l5,%l0,%l0                   ! round 60
896           srlx     %o5,32,%g3                    ! extract X[11]
897          orn       %l1,%l3,%l4
898           sethi    %hi(3174756917),%l5
899          xor       %l2,%l4,%l4
900           or       %l5,%lo(3174756917),%l5
901          add       %l4,%l0,%l0
902          sll       %l0,6,%l6
903           add      %g3,%l5,%l5                   ! X[11]+K[61]
904          srl       %l0,32-6,%l0
905          add       %l1,%l6,%l6
906          add       %l6,%l0,%l0
907          add       %l5,%l3,%l3                   ! round 61
908          orn       %l0,%l2,%l4
909           sethi    %hi(718787259),%l5
910          xor       %l1,%l4,%l4
911           or       %l5,%lo(718787259),%l5
912          add       %l4,%l3,%l3
913          sll       %l3,10,%l6
914           add      %o1,%l5,%l5                   ! X[2]+K[62]
915          srl       %l3,32-10,%l3
916          add       %l0,%l6,%l6
917          add       %l6,%l3,%l3
918          add       %l5,%l2,%l2                   ! round 62
919           srlx     %o4,32,%g3                    ! extract X[9]
920          orn       %l3,%l1,%l4
921           sethi    %hi(3951481745),%l5
922          xor       %l0,%l4,%l4
923           or       %l5,%lo(3951481745),%l5
924          add       %l4,%l2,%l2
925          sll       %l2,15,%l6
926           add      %g3,%l5,%l5                   ! X[9]+K[63]
927          srl       %l2,32-15,%l2
928          add       %l3,%l6,%l6
929          add       %l6,%l2,%l2
930          add       %l5,%l1,%l1                   ! round 63
931          orn       %l2,%l0,%l4
932           sethi    %hi(0),%l5
933          xor       %l3,%l4,%l4
934           or       %l5,%lo(0),%l5
935          add       %l4,%l1,%l1
936          sll       %l1,21,%l6
937           add      %o0,%l5,%l5                   ! X[0]+K[64]
938          srl       %l1,32-21,%l1
939          add       %l2,%l6,%l6
940          add       %l6,%l1,%l1
941          srlx      %g4,32,%l4                    ! unpack A,B,C,D and accumulate
942          add       %i1,64,%i1                    ! advance inp
943          srlx      %g5,32,%l5
944          add       %l4,%l0,%l0
945          subcc     %i2,1,%i2           ! done yet?
946          add       %g4,%l1,%l1
947          add       %l5,%l2,%l2
948          add       %g5,%l3,%l3
949          srl       %l1,0,%l1                     ! clruw   %l1
950          bne       SIZE_T_CC,.Loop
951          srl       %l3,0,%l3                     ! clruw   %l3
952
953          st        %l0,[%i0+0]                   ! write out ctx
954          st        %l1,[%i0+4]
955          st        %l2,[%i0+8]
956          st        %l3,[%i0+12]
957
958          wr        %g0,%l7,%asi
959          ret
960          restore
961.type     ossl_md5_block_asm_data_order,#function
962.size     ossl_md5_block_asm_data_order,(.-ossl_md5_block_asm_data_order)
963
964.asciz    "MD5 block transform for SPARCv9, CRYPTOGAMS by <appro@openssl.org>"
965.align    4
966