sha512-c64xplus.pl 12 KB

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