1#! /usr/bin/env perl
2# Copyright 2012-2020 The OpenSSL Project Authors. All Rights Reserved.
3#
4# Licensed under the OpenSSL license (the "License").  You may not use
5# this file except in compliance with the License.  You can obtain a copy
6# in the file LICENSE in the source distribution or at
7# https://www.openssl.org/source/license.html
8
9#
10# ====================================================================
11# Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
12# project. The module is, however, dual licensed under OpenSSL and
13# CRYPTOGAMS licenses depending on where you obtain it. For further
14# details see http://www.openssl.org/~appro/cryptogams/.
15# ====================================================================
16#
17# SHA512 for C64x+.
18#
19# January 2012
20#
21# Performance is 19 cycles per processed byte. Compared to block
22# transform function from sha512.c compiled with cl6x with -mv6400+
23# -o2 -DOPENSSL_SMALL_FOOTPRINT it's almost 7x faster and 2x smaller.
24# Loop unroll won't make it, this implementation, any faster, because
25# it's effectively dominated by SHRU||SHL pairs and you can't schedule
26# more of them.
27#
28# !!! Note that this module uses AMR, which means that all interrupt
29# service routines are expected to preserve it and for own well-being
30# zero it upon entry.
31
32while (($output=shift) && ($output!~/\w[\w\-]*\.\w+$/)) {}
33open STDOUT,">$output";
34
35($CTXA,$INP,$NUM) = ("A4","B4","A6");            # arguments
36 $K512="A3";
37
38($Ahi,$Actxhi,$Bhi,$Bctxhi,$Chi,$Cctxhi,$Dhi,$Dctxhi,
39 $Ehi,$Ectxhi,$Fhi,$Fctxhi,$Ghi,$Gctxhi,$Hhi,$Hctxhi)=map("A$_",(16..31));
40($Alo,$Actxlo,$Blo,$Bctxlo,$Clo,$Cctxlo,$Dlo,$Dctxlo,
41 $Elo,$Ectxlo,$Flo,$Fctxlo,$Glo,$Gctxlo,$Hlo,$Hctxlo)=map("B$_",(16..31));
42
43($S1hi,$CHhi,$S0hi,$t0hi)=map("A$_",(10..13));
44($S1lo,$CHlo,$S0lo,$t0lo)=map("B$_",(10..13));
45($T1hi,         $T2hi)=         ("A6","A7");
46($T1lo,$T1carry,$T2lo,$T2carry)=("B6","B7","B8","B9");
47($Khi,$Klo)=("A9","A8");
48($MAJhi,$MAJlo)=($T2hi,$T2lo);
49($t1hi,$t1lo)=($Khi,"B2");
50 $CTXB=$t1lo;
51
52($Xihi,$Xilo)=("A5","B5");			# circular/ring buffer
53
54$code.=<<___;
55	.text
56
57	.if	.ASSEMBLER_VERSION<7000000
58	.asg	0,__TI_EABI__
59	.endif
60	.if	__TI_EABI__
61	.nocmp
62	.asg	sha512_block_data_order,_sha512_block_data_order
63	.endif
64
65	.asg	B3,RA
66	.asg	A15,FP
67	.asg	B15,SP
68
69	.if	.BIG_ENDIAN
70	.asg	$Khi,KHI
71	.asg	$Klo,KLO
72	.else
73	.asg	$Khi,KLO
74	.asg	$Klo,KHI
75	.endif
76
77	.global	_sha512_block_data_order
78_sha512_block_data_order:
79__sha512_block:
80	.asmfunc stack_usage(40+128)
81	MV	$NUM,A0				; reassign $NUM
82||	MVK	-128,B0
83  [!A0]	BNOP	RA				; if ($NUM==0) return;
84|| [A0]	STW	FP,*SP--(40)			; save frame pointer
85|| [A0]	MV	SP,FP
86   [A0]	STDW	B13:B12,*SP[4]
87|| [A0]	MVK	0x00404,B1
88   [A0]	STDW	B11:B10,*SP[3]
89|| [A0]	STDW	A13:A12,*FP[-3]
90|| [A0]	MVKH	0x60000,B1
91   [A0]	STDW	A11:A10,*SP[1]
92|| [A0]	MVC	B1,AMR				; setup circular addressing
93|| [A0]	ADD	B0,SP,SP			; alloca(128)
94	.if	__TI_EABI__
95   [A0]	AND	B0,SP,SP			; align stack at 128 bytes
96|| [A0]	ADDKPC	__sha512_block,B1
97|| [A0]	MVKL	\$PCR_OFFSET(K512,__sha512_block),$K512
98   [A0]	MVKH	\$PCR_OFFSET(K512,__sha512_block),$K512
99|| [A0]	SUBAW	SP,2,SP				; reserve two words above buffer
100	.else
101   [A0]	AND	B0,SP,SP			; align stack at 128 bytes
102|| [A0]	ADDKPC	__sha512_block,B1
103|| [A0]	MVKL	(K512-__sha512_block),$K512
104   [A0]	MVKH	(K512-__sha512_block),$K512
105|| [A0]	SUBAW	SP,2,SP				; reserve two words above buffer
106	.endif
107	ADDAW	SP,3,$Xilo
108	ADDAW	SP,2,$Xihi
109
110||	MV	$CTXA,$CTXB
111	LDW	*${CTXA}[0^.LITTLE_ENDIAN],$Ahi	; load ctx
112||	LDW	*${CTXB}[1^.LITTLE_ENDIAN],$Alo
113||	ADD	B1,$K512,$K512
114	LDW	*${CTXA}[2^.LITTLE_ENDIAN],$Bhi
115||	LDW	*${CTXB}[3^.LITTLE_ENDIAN],$Blo
116	LDW	*${CTXA}[4^.LITTLE_ENDIAN],$Chi
117||	LDW	*${CTXB}[5^.LITTLE_ENDIAN],$Clo
118	LDW	*${CTXA}[6^.LITTLE_ENDIAN],$Dhi
119||	LDW	*${CTXB}[7^.LITTLE_ENDIAN],$Dlo
120	LDW	*${CTXA}[8^.LITTLE_ENDIAN],$Ehi
121||	LDW	*${CTXB}[9^.LITTLE_ENDIAN],$Elo
122	LDW	*${CTXA}[10^.LITTLE_ENDIAN],$Fhi
123||	LDW	*${CTXB}[11^.LITTLE_ENDIAN],$Flo
124	LDW	*${CTXA}[12^.LITTLE_ENDIAN],$Ghi
125||	LDW	*${CTXB}[13^.LITTLE_ENDIAN],$Glo
126	LDW	*${CTXA}[14^.LITTLE_ENDIAN],$Hhi
127||	LDW	*${CTXB}[15^.LITTLE_ENDIAN],$Hlo
128
129	LDNDW	*$INP++,B11:B10			; pre-fetch input
130	LDDW	*$K512++,$Khi:$Klo		; pre-fetch K512[0]
131outerloop?:
132	MVK	15,B0				; loop counters
133||	MVK	64,B1
134||	SUB	A0,1,A0
135	MV	$Ahi,$Actxhi
136||	MV	$Alo,$Actxlo
137||	MV	$Bhi,$Bctxhi
138||	MV	$Blo,$Bctxlo
139||	MV	$Chi,$Cctxhi
140||	MV	$Clo,$Cctxlo
141||	MVD	$Dhi,$Dctxhi
142||	MVD	$Dlo,$Dctxlo
143	MV	$Ehi,$Ectxhi
144||	MV	$Elo,$Ectxlo
145||	MV	$Fhi,$Fctxhi
146||	MV	$Flo,$Fctxlo
147||	MV	$Ghi,$Gctxhi
148||	MV	$Glo,$Gctxlo
149||	MVD	$Hhi,$Hctxhi
150||	MVD	$Hlo,$Hctxlo
151loop0_15?:
152	.if	.BIG_ENDIAN
153	MV	B11,$T1hi
154||	MV	B10,$T1lo
155	.else
156	SWAP4	B10,$T1hi
157||	SWAP4	B11,$T1lo
158	SWAP2	$T1hi,$T1hi
159||	SWAP2	$T1lo,$T1lo
160	.endif
161loop16_79?:
162	STW	$T1hi,*$Xihi++[2]
163||	STW	$T1lo,*$Xilo++[2]			; X[i] = T1
164||	ADD	$Hhi,$T1hi,$T1hi
165||	ADDU	$Hlo,$T1lo,$T1carry:$T1lo		; T1 += h
166||	SHRU	$Ehi,14,$S1hi
167||	SHL	$Ehi,32-14,$S1lo
168	XOR	$Fhi,$Ghi,$CHhi
169||	XOR	$Flo,$Glo,$CHlo
170||	ADD	KHI,$T1hi,$T1hi
171||	ADDU	KLO,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += K512[i]
172||	SHRU	$Elo,14,$t0lo
173||	SHL	$Elo,32-14,$t0hi
174	XOR	$t0hi,$S1hi,$S1hi
175||	XOR	$t0lo,$S1lo,$S1lo
176||	AND	$Ehi,$CHhi,$CHhi
177||	AND	$Elo,$CHlo,$CHlo
178||	ROTL	$Ghi,0,$Hhi
179||	ROTL	$Glo,0,$Hlo				; h = g
180||	SHRU	$Ehi,18,$t0hi
181||	SHL	$Ehi,32-18,$t0lo
182	XOR	$t0hi,$S1hi,$S1hi
183||	XOR	$t0lo,$S1lo,$S1lo
184||	XOR	$Ghi,$CHhi,$CHhi
185||	XOR	$Glo,$CHlo,$CHlo			; Ch(e,f,g) = ((f^g)&e)^g
186||	ROTL	$Fhi,0,$Ghi
187||	ROTL	$Flo,0,$Glo				; g = f
188||	SHRU	$Elo,18,$t0lo
189||	SHL	$Elo,32-18,$t0hi
190	XOR	$t0hi,$S1hi,$S1hi
191||	XOR	$t0lo,$S1lo,$S1lo
192||	OR	$Ahi,$Bhi,$MAJhi
193||	OR	$Alo,$Blo,$MAJlo
194||	ROTL	$Ehi,0,$Fhi
195||	ROTL	$Elo,0,$Flo				; f = e
196||	SHRU	$Ehi,41-32,$t0lo
197||	SHL	$Ehi,64-41,$t0hi
198	XOR	$t0hi,$S1hi,$S1hi
199||	XOR	$t0lo,$S1lo,$S1lo
200||	AND	$Chi,$MAJhi,$MAJhi
201||	AND	$Clo,$MAJlo,$MAJlo
202||	ROTL	$Dhi,0,$Ehi
203||	ROTL	$Dlo,0,$Elo				; e = d
204||	SHRU	$Elo,41-32,$t0hi
205||	SHL	$Elo,64-41,$t0lo
206	XOR	$t0hi,$S1hi,$S1hi
207||	XOR	$t0lo,$S1lo,$S1lo			; Sigma1(e)
208||	AND	$Ahi,$Bhi,$t1hi
209||	AND	$Alo,$Blo,$t1lo
210||	ROTL	$Chi,0,$Dhi
211||	ROTL	$Clo,0,$Dlo				; d = c
212||	SHRU	$Ahi,28,$S0hi
213||	SHL	$Ahi,32-28,$S0lo
214	OR	$t1hi,$MAJhi,$MAJhi
215||	OR	$t1lo,$MAJlo,$MAJlo			; Maj(a,b,c) = ((a|b)&c)|(a&b)
216||	ADD	$CHhi,$T1hi,$T1hi
217||	ADDU	$CHlo,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += Ch(e,f,g)
218||	ROTL	$Bhi,0,$Chi
219||	ROTL	$Blo,0,$Clo				; c = b
220||	SHRU	$Alo,28,$t0lo
221||	SHL	$Alo,32-28,$t0hi
222	XOR	$t0hi,$S0hi,$S0hi
223||	XOR	$t0lo,$S0lo,$S0lo
224||	ADD	$S1hi,$T1hi,$T1hi
225||	ADDU	$S1lo,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += Sigma1(e)
226||	ROTL	$Ahi,0,$Bhi
227||	ROTL	$Alo,0,$Blo				; b = a
228||	SHRU	$Ahi,34-32,$t0lo
229||	SHL	$Ahi,64-34,$t0hi
230	XOR	$t0hi,$S0hi,$S0hi
231||	XOR	$t0lo,$S0lo,$S0lo
232||	ADD	$MAJhi,$T1hi,$T2hi
233||	ADDU	$MAJlo,$T1carry:$T1lo,$T2carry:$T2lo	; T2 = T1+Maj(a,b,c)
234||	SHRU	$Alo,34-32,$t0hi
235||	SHL	$Alo,64-34,$t0lo
236	XOR	$t0hi,$S0hi,$S0hi
237||	XOR	$t0lo,$S0lo,$S0lo
238||	ADD	$Ehi,$T1hi,$T1hi
239||	ADDU	$Elo,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += e
240|| [B0]	BNOP	loop0_15?
241||	SHRU	$Ahi,39-32,$t0lo
242||	SHL	$Ahi,64-39,$t0hi
243	XOR	$t0hi,$S0hi,$S0hi
244||	XOR	$t0lo,$S0lo,$S0lo
245|| [B0]	LDNDW	*$INP++,B11:B10				; pre-fetch input
246||[!B1]	BNOP	break?
247||	SHRU	$Alo,39-32,$t0hi
248||	SHL	$Alo,64-39,$t0lo
249	XOR	$t0hi,$S0hi,$S0hi
250||	XOR	$t0lo,$S0lo,$S0lo			; Sigma0(a)
251||	ADD	$T1carry,$T1hi,$Ehi
252||	MV	$T1lo,$Elo				; e = T1
253||[!B0]	LDW	*${Xihi}[28],$T1hi
254||[!B0]	LDW	*${Xilo}[28],$T1lo			; X[i+14]
255	ADD	$S0hi,$T2hi,$T2hi
256||	ADDU	$S0lo,$T2carry:$T2lo,$T2carry:$T2lo	; T2 += Sigma0(a)
257|| [B1]	LDDW	*$K512++,$Khi:$Klo			; pre-fetch K512[i]
258	NOP						; avoid cross-path stall
259	ADD	$T2carry,$T2hi,$Ahi
260||	MV	$T2lo,$Alo				; a = T2
261|| [B0]	SUB	B0,1,B0
262;;===== branch to loop00_15? is taken here
263	NOP
264;;===== branch to break? is taken here
265	LDW	*${Xihi}[2],$T2hi
266||	LDW	*${Xilo}[2],$T2lo			; X[i+1]
267||	SHRU	$T1hi,19,$S1hi
268||	SHL	$T1hi,32-19,$S1lo
269	SHRU	$T1lo,19,$t0lo
270||	SHL	$T1lo,32-19,$t0hi
271	XOR	$t0hi,$S1hi,$S1hi
272||	XOR	$t0lo,$S1lo,$S1lo
273||	SHRU	$T1hi,61-32,$t0lo
274||	SHL	$T1hi,64-61,$t0hi
275	XOR	$t0hi,$S1hi,$S1hi
276||	XOR	$t0lo,$S1lo,$S1lo
277||	SHRU	$T1lo,61-32,$t0hi
278||	SHL	$T1lo,64-61,$t0lo
279	XOR	$t0hi,$S1hi,$S1hi
280||	XOR	$t0lo,$S1lo,$S1lo
281||	SHRU	$T1hi,6,$t0hi
282||	SHL	$T1hi,32-6,$t0lo
283	XOR	$t0hi,$S1hi,$S1hi
284||	XOR	$t0lo,$S1lo,$S1lo
285||	SHRU	$T1lo,6,$t0lo
286||	LDW	*${Xihi}[18],$T1hi
287||	LDW	*${Xilo}[18],$T1lo			; X[i+9]
288	XOR	$t0lo,$S1lo,$S1lo			; sigma1(Xi[i+14])
289
290||	LDW	*${Xihi}[0],$CHhi
291||	LDW	*${Xilo}[0],$CHlo			; X[i]
292||	SHRU	$T2hi,1,$S0hi
293||	SHL	$T2hi,32-1,$S0lo
294	SHRU	$T2lo,1,$t0lo
295||	SHL	$T2lo,32-1,$t0hi
296	XOR	$t0hi,$S0hi,$S0hi
297||	XOR	$t0lo,$S0lo,$S0lo
298||	SHRU	$T2hi,8,$t0hi
299||	SHL	$T2hi,32-8,$t0lo
300	XOR	$t0hi,$S0hi,$S0hi
301||	XOR	$t0lo,$S0lo,$S0lo
302||	SHRU	$T2lo,8,$t0lo
303||	SHL	$T2lo,32-8,$t0hi
304	XOR	$t0hi,$S0hi,$S0hi
305||	XOR	$t0lo,$S0lo,$S0lo
306||	ADD	$S1hi,$T1hi,$T1hi
307||	ADDU	$S1lo,$T1lo,$T1carry:$T1lo		; T1 = X[i+9]+sigma1()
308|| [B1]	BNOP	loop16_79?
309||	SHRU	$T2hi,7,$t0hi
310||	SHL	$T2hi,32-7,$t0lo
311	XOR	$t0hi,$S0hi,$S0hi
312||	XOR	$t0lo,$S0lo,$S0lo
313||	ADD	$CHhi,$T1hi,$T1hi
314||	ADDU	$CHlo,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += X[i]
315||	SHRU	$T2lo,7,$t0lo
316	XOR	$t0lo,$S0lo,$S0lo			; sigma0(Xi[i+1]
317
318	ADD	$S0hi,$T1hi,$T1hi
319||	ADDU	$S0lo,$T1carry:$T1lo,$T1carry:$T1lo	; T1 += sigma0()
320|| [B1]	SUB	B1,1,B1
321	NOP						; avoid cross-path stall
322	ADD	$T1carry,$T1hi,$T1hi
323;;===== branch to loop16_79? is taken here
324
325break?:
326	ADD	$Ahi,$Actxhi,$Ahi		; accumulate ctx
327||	ADDU	$Alo,$Actxlo,$Actxlo:$Alo
328|| [A0]	LDNDW	*$INP++,B11:B10			; pre-fetch input
329|| [A0]	ADDK	-640,$K512			; rewind pointer to K512
330	ADD	$Bhi,$Bctxhi,$Bhi
331||	ADDU	$Blo,$Bctxlo,$Bctxlo:$Blo
332|| [A0]	LDDW	*$K512++,$Khi:$Klo		; pre-fetch K512[0]
333	ADD	$Chi,$Cctxhi,$Chi
334||	ADDU	$Clo,$Cctxlo,$Cctxlo:$Clo
335||	ADD	$Actxlo,$Ahi,$Ahi
336||[!A0]	MV	$CTXA,$CTXB
337	ADD	$Dhi,$Dctxhi,$Dhi
338||	ADDU	$Dlo,$Dctxlo,$Dctxlo:$Dlo
339||	ADD	$Bctxlo,$Bhi,$Bhi
340||[!A0]	STW	$Ahi,*${CTXA}[0^.LITTLE_ENDIAN]	; save ctx
341||[!A0]	STW	$Alo,*${CTXB}[1^.LITTLE_ENDIAN]
342	ADD	$Ehi,$Ectxhi,$Ehi
343||	ADDU	$Elo,$Ectxlo,$Ectxlo:$Elo
344||	ADD	$Cctxlo,$Chi,$Chi
345|| [A0]	BNOP	outerloop?
346||[!A0]	STW	$Bhi,*${CTXA}[2^.LITTLE_ENDIAN]
347||[!A0]	STW	$Blo,*${CTXB}[3^.LITTLE_ENDIAN]
348	ADD	$Fhi,$Fctxhi,$Fhi
349||	ADDU	$Flo,$Fctxlo,$Fctxlo:$Flo
350||	ADD	$Dctxlo,$Dhi,$Dhi
351||[!A0]	STW	$Chi,*${CTXA}[4^.LITTLE_ENDIAN]
352||[!A0]	STW	$Clo,*${CTXB}[5^.LITTLE_ENDIAN]
353	ADD	$Ghi,$Gctxhi,$Ghi
354||	ADDU	$Glo,$Gctxlo,$Gctxlo:$Glo
355||	ADD	$Ectxlo,$Ehi,$Ehi
356||[!A0]	STW	$Dhi,*${CTXA}[6^.LITTLE_ENDIAN]
357||[!A0]	STW	$Dlo,*${CTXB}[7^.LITTLE_ENDIAN]
358	ADD	$Hhi,$Hctxhi,$Hhi
359||	ADDU	$Hlo,$Hctxlo,$Hctxlo:$Hlo
360||	ADD	$Fctxlo,$Fhi,$Fhi
361||[!A0]	STW	$Ehi,*${CTXA}[8^.LITTLE_ENDIAN]
362||[!A0]	STW	$Elo,*${CTXB}[9^.LITTLE_ENDIAN]
363	ADD	$Gctxlo,$Ghi,$Ghi
364||[!A0]	STW	$Fhi,*${CTXA}[10^.LITTLE_ENDIAN]
365||[!A0]	STW	$Flo,*${CTXB}[11^.LITTLE_ENDIAN]
366	ADD	$Hctxlo,$Hhi,$Hhi
367||[!A0]	STW	$Ghi,*${CTXA}[12^.LITTLE_ENDIAN]
368||[!A0]	STW	$Glo,*${CTXB}[13^.LITTLE_ENDIAN]
369;;===== branch to outerloop? is taken here
370
371	STW	$Hhi,*${CTXA}[14^.LITTLE_ENDIAN]
372||	STW	$Hlo,*${CTXB}[15^.LITTLE_ENDIAN]
373||	MVK	-40,B0
374	ADD	FP,B0,SP			; destroy circular buffer
375||	LDDW	*FP[-4],A11:A10
376	LDDW	*SP[2],A13:A12
377||	LDDW	*FP[-2],B11:B10
378	LDDW	*SP[4],B13:B12
379||	BNOP	RA
380	LDW	*++SP(40),FP			; restore frame pointer
381	MVK	0,B0
382	MVC	B0,AMR				; clear AMR
383	NOP	2				; wait till FP is committed
384	.endasmfunc
385
386	.if	__TI_EABI__
387	.sect	".text:sha_asm.const"
388	.else
389	.sect	".const:sha_asm"
390	.endif
391	.align	128
392K512:
393	.uword	0x428a2f98,0xd728ae22, 0x71374491,0x23ef65cd
394	.uword	0xb5c0fbcf,0xec4d3b2f, 0xe9b5dba5,0x8189dbbc
395	.uword	0x3956c25b,0xf348b538, 0x59f111f1,0xb605d019
396	.uword	0x923f82a4,0xaf194f9b, 0xab1c5ed5,0xda6d8118
397	.uword	0xd807aa98,0xa3030242, 0x12835b01,0x45706fbe
398	.uword	0x243185be,0x4ee4b28c, 0x550c7dc3,0xd5ffb4e2
399	.uword	0x72be5d74,0xf27b896f, 0x80deb1fe,0x3b1696b1
400	.uword	0x9bdc06a7,0x25c71235, 0xc19bf174,0xcf692694
401	.uword	0xe49b69c1,0x9ef14ad2, 0xefbe4786,0x384f25e3
402	.uword	0x0fc19dc6,0x8b8cd5b5, 0x240ca1cc,0x77ac9c65
403	.uword	0x2de92c6f,0x592b0275, 0x4a7484aa,0x6ea6e483
404	.uword	0x5cb0a9dc,0xbd41fbd4, 0x76f988da,0x831153b5
405	.uword	0x983e5152,0xee66dfab, 0xa831c66d,0x2db43210
406	.uword	0xb00327c8,0x98fb213f, 0xbf597fc7,0xbeef0ee4
407	.uword	0xc6e00bf3,0x3da88fc2, 0xd5a79147,0x930aa725
408	.uword	0x06ca6351,0xe003826f, 0x14292967,0x0a0e6e70
409	.uword	0x27b70a85,0x46d22ffc, 0x2e1b2138,0x5c26c926
410	.uword	0x4d2c6dfc,0x5ac42aed, 0x53380d13,0x9d95b3df
411	.uword	0x650a7354,0x8baf63de, 0x766a0abb,0x3c77b2a8
412	.uword	0x81c2c92e,0x47edaee6, 0x92722c85,0x1482353b
413	.uword	0xa2bfe8a1,0x4cf10364, 0xa81a664b,0xbc423001
414	.uword	0xc24b8b70,0xd0f89791, 0xc76c51a3,0x0654be30
415	.uword	0xd192e819,0xd6ef5218, 0xd6990624,0x5565a910
416	.uword	0xf40e3585,0x5771202a, 0x106aa070,0x32bbd1b8
417	.uword	0x19a4c116,0xb8d2d0c8, 0x1e376c08,0x5141ab53
418	.uword	0x2748774c,0xdf8eeb99, 0x34b0bcb5,0xe19b48a8
419	.uword	0x391c0cb3,0xc5c95a63, 0x4ed8aa4a,0xe3418acb
420	.uword	0x5b9cca4f,0x7763e373, 0x682e6ff3,0xd6b2b8a3
421	.uword	0x748f82ee,0x5defb2fc, 0x78a5636f,0x43172f60
422	.uword	0x84c87814,0xa1f0ab72, 0x8cc70208,0x1a6439ec
423	.uword	0x90befffa,0x23631e28, 0xa4506ceb,0xde82bde9
424	.uword	0xbef9a3f7,0xb2c67915, 0xc67178f2,0xe372532b
425	.uword	0xca273ece,0xea26619c, 0xd186b8c7,0x21c0c207
426	.uword	0xeada7dd6,0xcde0eb1e, 0xf57d4f7f,0xee6ed178
427	.uword	0x06f067aa,0x72176fba, 0x0a637dc5,0xa2c898a6
428	.uword	0x113f9804,0xbef90dae, 0x1b710b35,0x131c471b
429	.uword	0x28db77f5,0x23047d84, 0x32caab7b,0x40c72493
430	.uword	0x3c9ebe0a,0x15c9bebc, 0x431d67c4,0x9c100d4c
431	.uword	0x4cc5d4be,0xcb3e42b6, 0x597f299c,0xfc657e2a
432	.uword	0x5fcb6fab,0x3ad6faec, 0x6c44198c,0x4a475817
433	.cstring "SHA512 block transform for C64x+, CRYPTOGAMS by <appro\@openssl.org>"
434	.align	4
435___
436
437print $code;
438close STDOUT or die "error closing STDOUT: $!";
439