2
0

md5-aarch64.pl 50 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715
  1. #! /usr/bin/env perl
  2. # Copyright 2021-2023 The OpenSSL Project Authors. All Rights Reserved.
  3. #
  4. # Licensed under the Apache License 2.0 (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. # MD5 optimized for aarch64.
  9. use strict;
  10. my $code;
  11. #no warnings qw(uninitialized);
  12. # $output is the last argument if it looks like a file (it has an extension)
  13. # $flavour is the first argument if it doesn't look like a file
  14. my $output = $#ARGV >= 0 && $ARGV[$#ARGV] =~ m|\.\w+$| ? pop : undef;
  15. my $flavour = $#ARGV >= 0 && $ARGV[0] !~ m|\.| ? shift : undef;
  16. $0 =~ m/(.*[\/\\])[^\/\\]+$/; my $dir=$1; my $xlate;
  17. ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
  18. ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
  19. die "can't locate arm-xlate.pl";
  20. open OUT,"| \"$^X\" $xlate $flavour \"$output\""
  21. or die "can't call $xlate: $1";
  22. *STDOUT=*OUT;
  23. $code .= <<EOF;
  24. #include "arm_arch.h"
  25. .text
  26. .globl ossl_md5_block_asm_data_order
  27. .type ossl_md5_block_asm_data_order,\@function
  28. ossl_md5_block_asm_data_order:
  29. AARCH64_VALID_CALL_TARGET
  30. // Save all callee-saved registers
  31. stp x19,x20,[sp,#-80]!
  32. stp x21,x22,[sp,#16]
  33. stp x23,x24,[sp,#32]
  34. stp x25,x26,[sp,#48]
  35. stp x27,x28,[sp,#64]
  36. ldp w10, w11, [x0, #0] // Load MD5 state->A and state->B
  37. ldp w12, w13, [x0, #8] // Load MD5 state->C and state->D
  38. .align 5
  39. ossl_md5_blocks_loop:
  40. eor x17, x12, x13 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  41. and x16, x17, x11 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  42. ldp w15, w20, [x1] // Load 2 words of input data0 M[0],M[1]
  43. ldp w3, w21, [x1, #8] // Load 2 words of input data0 M[2],M[3]
  44. #ifdef __AARCH64EB__
  45. rev w15, w15
  46. rev w20, w20
  47. rev w3, w3
  48. rev w21, w21
  49. #endif
  50. eor x14, x16, x13 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  51. movz x9, #0xa478 // Load lower half of constant 0xd76aa478
  52. movk x9, #0xd76a, lsl #16 // Load upper half of constant 0xd76aa478
  53. add w8, w10, w15 // Add dest value
  54. add w7, w8, w9 // Add constant 0xd76aa478
  55. add w6, w7, w14 // Add aux function result
  56. ror w6, w6, #25 // Rotate left s=7 bits
  57. eor x5, x11, x12 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  58. add w4, w11, w6 // Add X parameter round 1 A=FF(A, B, C, D, 0xd76aa478, s=7, M[0])
  59. and x8, x5, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  60. eor x17, x8, x12 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  61. movz x16, #0xb756 // Load lower half of constant 0xe8c7b756
  62. movk x16, #0xe8c7, lsl #16 // Load upper half of constant 0xe8c7b756
  63. add w9, w13, w20 // Add dest value
  64. add w7, w9, w16 // Add constant 0xe8c7b756
  65. add w14, w7, w17 // Add aux function result
  66. ror w14, w14, #20 // Rotate left s=12 bits
  67. eor x6, x4, x11 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  68. add w5, w4, w14 // Add X parameter round 1 D=FF(D, A, B, C, 0xe8c7b756, s=12, M[1])
  69. and x8, x6, x5 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  70. eor x9, x8, x11 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  71. movz x16, #0x70db // Load lower half of constant 0x242070db
  72. movk x16, #0x2420, lsl #16 // Load upper half of constant 0x242070db
  73. add w7, w12, w3 // Add dest value
  74. add w17, w7, w16 // Add constant 0x242070db
  75. add w14, w17, w9 // Add aux function result
  76. ror w14, w14, #15 // Rotate left s=17 bits
  77. eor x6, x5, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  78. add w8, w5, w14 // Add X parameter round 1 C=FF(C, D, A, B, 0x242070db, s=17, M[2])
  79. and x7, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  80. eor x16, x7, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  81. movz x9, #0xceee // Load lower half of constant 0xc1bdceee
  82. movk x9, #0xc1bd, lsl #16 // Load upper half of constant 0xc1bdceee
  83. add w14, w11, w21 // Add dest value
  84. add w6, w14, w9 // Add constant 0xc1bdceee
  85. add w7, w6, w16 // Add aux function result
  86. ror w7, w7, #10 // Rotate left s=22 bits
  87. eor x17, x8, x5 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  88. add w9, w8, w7 // Add X parameter round 1 B=FF(B, C, D, A, 0xc1bdceee, s=22, M[3])
  89. ldp w14, w22, [x1, #16] // Load 2 words of input data0 M[4],M[5]
  90. ldp w7, w23, [x1, #24] // Load 2 words of input data0 M[6],M[7]
  91. #ifdef __AARCH64EB__
  92. rev w14, w14
  93. rev w22, w22
  94. rev w7, w7
  95. rev w23, w23
  96. #endif
  97. and x16, x17, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  98. eor x6, x16, x5 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  99. movz x16, #0xfaf // Load lower half of constant 0xf57c0faf
  100. movk x16, #0xf57c, lsl #16 // Load upper half of constant 0xf57c0faf
  101. add w17, w4, w14 // Add dest value
  102. add w16, w17, w16 // Add constant 0xf57c0faf
  103. add w4, w16, w6 // Add aux function result
  104. ror w4, w4, #25 // Rotate left s=7 bits
  105. eor x16, x9, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  106. add w17, w9, w4 // Add X parameter round 1 A=FF(A, B, C, D, 0xf57c0faf, s=7, M[4])
  107. and x16, x16, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  108. eor x6, x16, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  109. movz x4, #0xc62a // Load lower half of constant 0x4787c62a
  110. movk x4, #0x4787, lsl #16 // Load upper half of constant 0x4787c62a
  111. add w16, w5, w22 // Add dest value
  112. add w16, w16, w4 // Add constant 0x4787c62a
  113. add w5, w16, w6 // Add aux function result
  114. ror w5, w5, #20 // Rotate left s=12 bits
  115. eor x4, x17, x9 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  116. add w19, w17, w5 // Add X parameter round 1 D=FF(D, A, B, C, 0x4787c62a, s=12, M[5])
  117. and x6, x4, x19 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  118. eor x5, x6, x9 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  119. movz x4, #0x4613 // Load lower half of constant 0xa8304613
  120. movk x4, #0xa830, lsl #16 // Load upper half of constant 0xa8304613
  121. add w6, w8, w7 // Add dest value
  122. add w8, w6, w4 // Add constant 0xa8304613
  123. add w4, w8, w5 // Add aux function result
  124. ror w4, w4, #15 // Rotate left s=17 bits
  125. eor x6, x19, x17 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  126. add w8, w19, w4 // Add X parameter round 1 C=FF(C, D, A, B, 0xa8304613, s=17, M[6])
  127. and x5, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  128. eor x4, x5, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  129. movz x6, #0x9501 // Load lower half of constant 0xfd469501
  130. movk x6, #0xfd46, lsl #16 // Load upper half of constant 0xfd469501
  131. add w9, w9, w23 // Add dest value
  132. add w5, w9, w6 // Add constant 0xfd469501
  133. add w9, w5, w4 // Add aux function result
  134. ror w9, w9, #10 // Rotate left s=22 bits
  135. eor x6, x8, x19 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  136. add w4, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0xfd469501, s=22, M[7])
  137. ldp w5, w24, [x1, #32] // Load 2 words of input data0 M[8],M[9]
  138. ldp w16, w25, [x1, #40] // Load 2 words of input data0 M[10],M[11]
  139. #ifdef __AARCH64EB__
  140. rev w5, w5
  141. rev w24, w24
  142. rev w16, w16
  143. rev w25, w25
  144. #endif
  145. and x9, x6, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  146. eor x6, x9, x19 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  147. movz x9, #0x98d8 // Load lower half of constant 0x698098d8
  148. movk x9, #0x6980, lsl #16 // Load upper half of constant 0x698098d8
  149. add w17, w17, w5 // Add dest value
  150. add w9, w17, w9 // Add constant 0x698098d8
  151. add w17, w9, w6 // Add aux function result
  152. ror w17, w17, #25 // Rotate left s=7 bits
  153. eor x9, x4, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  154. add w6, w4, w17 // Add X parameter round 1 A=FF(A, B, C, D, 0x698098d8, s=7, M[8])
  155. and x17, x9, x6 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  156. eor x9, x17, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  157. movz x17, #0xf7af // Load lower half of constant 0x8b44f7af
  158. movk x17, #0x8b44, lsl #16 // Load upper half of constant 0x8b44f7af
  159. add w19, w19, w24 // Add dest value
  160. add w17, w19, w17 // Add constant 0x8b44f7af
  161. add w19, w17, w9 // Add aux function result
  162. ror w19, w19, #20 // Rotate left s=12 bits
  163. eor x9, x6, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  164. add w17, w6, w19 // Add X parameter round 1 D=FF(D, A, B, C, 0x8b44f7af, s=12, M[9])
  165. and x9, x9, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  166. eor x9, x9, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  167. movz x11, #0x5bb1 // Load lower half of constant 0xffff5bb1
  168. movk x11, #0xffff, lsl #16 // Load upper half of constant 0xffff5bb1
  169. add w8, w8, w16 // Add dest value
  170. add w8, w8, w11 // Add constant 0xffff5bb1
  171. add w8, w8, w9 // Add aux function result
  172. ror w8, w8, #15 // Rotate left s=17 bits
  173. eor x9, x17, x6 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  174. add w8, w17, w8 // Add X parameter round 1 C=FF(C, D, A, B, 0xffff5bb1, s=17, M[10])
  175. and x9, x9, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  176. eor x9, x9, x6 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  177. movz x11, #0xd7be // Load lower half of constant 0x895cd7be
  178. movk x11, #0x895c, lsl #16 // Load upper half of constant 0x895cd7be
  179. add w4, w4, w25 // Add dest value
  180. add w4, w4, w11 // Add constant 0x895cd7be
  181. add w9, w4, w9 // Add aux function result
  182. ror w9, w9, #10 // Rotate left s=22 bits
  183. eor x4, x8, x17 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  184. add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x895cd7be, s=22, M[11])
  185. ldp w11, w26, [x1, #48] // Load 2 words of input data0 M[12],M[13]
  186. ldp w12, w27, [x1, #56] // Load 2 words of input data0 M[14],M[15]
  187. #ifdef __AARCH64EB__
  188. rev w11, w11
  189. rev w26, w26
  190. rev w12, w12
  191. rev w27, w27
  192. #endif
  193. and x4, x4, x9 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  194. eor x4, x4, x17 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  195. movz x19, #0x1122 // Load lower half of constant 0x6b901122
  196. movk x19, #0x6b90, lsl #16 // Load upper half of constant 0x6b901122
  197. add w6, w6, w11 // Add dest value
  198. add w6, w6, w19 // Add constant 0x6b901122
  199. add w4, w6, w4 // Add aux function result
  200. ror w4, w4, #25 // Rotate left s=7 bits
  201. eor x6, x9, x8 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  202. add w4, w9, w4 // Add X parameter round 1 A=FF(A, B, C, D, 0x6b901122, s=7, M[12])
  203. and x6, x6, x4 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  204. eor x6, x6, x8 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  205. movz x19, #0x7193 // Load lower half of constant 0xfd987193
  206. movk x19, #0xfd98, lsl #16 // Load upper half of constant 0xfd987193
  207. add w17, w17, w26 // Add dest value
  208. add w17, w17, w19 // Add constant 0xfd987193
  209. add w17, w17, w6 // Add aux function result
  210. ror w17, w17, #20 // Rotate left s=12 bits
  211. eor x6, x4, x9 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  212. add w17, w4, w17 // Add X parameter round 1 D=FF(D, A, B, C, 0xfd987193, s=12, M[13])
  213. and x6, x6, x17 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  214. eor x6, x6, x9 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  215. movz x13, #0x438e // Load lower half of constant 0xa679438e
  216. movk x13, #0xa679, lsl #16 // Load upper half of constant 0xa679438e
  217. add w8, w8, w12 // Add dest value
  218. add w8, w8, w13 // Add constant 0xa679438e
  219. add w8, w8, w6 // Add aux function result
  220. ror w8, w8, #15 // Rotate left s=17 bits
  221. eor x6, x17, x4 // Begin aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  222. add w8, w17, w8 // Add X parameter round 1 C=FF(C, D, A, B, 0xa679438e, s=17, M[14])
  223. and x6, x6, x8 // Continue aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  224. eor x6, x6, x4 // End aux function round 1 F(x,y,z)=(((y^z)&x)^z)
  225. movz x13, #0x821 // Load lower half of constant 0x49b40821
  226. movk x13, #0x49b4, lsl #16 // Load upper half of constant 0x49b40821
  227. add w9, w9, w27 // Add dest value
  228. add w9, w9, w13 // Add constant 0x49b40821
  229. add w9, w9, w6 // Add aux function result
  230. ror w9, w9, #10 // Rotate left s=22 bits
  231. bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  232. add w9, w8, w9 // Add X parameter round 1 B=FF(B, C, D, A, 0x49b40821, s=22, M[15])
  233. and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  234. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  235. movz x13, #0x2562 // Load lower half of constant 0xf61e2562
  236. movk x13, #0xf61e, lsl #16 // Load upper half of constant 0xf61e2562
  237. add w4, w4, w20 // Add dest value
  238. add w4, w4, w13 // Add constant 0xf61e2562
  239. add w4, w4, w6 // Add aux function result
  240. ror w4, w4, #27 // Rotate left s=5 bits
  241. bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  242. add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xf61e2562, s=5, M[1])
  243. and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  244. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  245. movz x13, #0xb340 // Load lower half of constant 0xc040b340
  246. movk x13, #0xc040, lsl #16 // Load upper half of constant 0xc040b340
  247. add w17, w17, w7 // Add dest value
  248. add w17, w17, w13 // Add constant 0xc040b340
  249. add w17, w17, w6 // Add aux function result
  250. ror w17, w17, #23 // Rotate left s=9 bits
  251. bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  252. add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc040b340, s=9, M[6])
  253. and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  254. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  255. movz x13, #0x5a51 // Load lower half of constant 0x265e5a51
  256. movk x13, #0x265e, lsl #16 // Load upper half of constant 0x265e5a51
  257. add w8, w8, w25 // Add dest value
  258. add w8, w8, w13 // Add constant 0x265e5a51
  259. add w8, w8, w6 // Add aux function result
  260. ror w8, w8, #18 // Rotate left s=14 bits
  261. bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  262. add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x265e5a51, s=14, M[11])
  263. and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  264. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  265. movz x13, #0xc7aa // Load lower half of constant 0xe9b6c7aa
  266. movk x13, #0xe9b6, lsl #16 // Load upper half of constant 0xe9b6c7aa
  267. add w9, w9, w15 // Add dest value
  268. add w9, w9, w13 // Add constant 0xe9b6c7aa
  269. add w9, w9, w6 // Add aux function result
  270. ror w9, w9, #12 // Rotate left s=20 bits
  271. bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  272. add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe9b6c7aa, s=20, M[0])
  273. and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  274. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  275. movz x13, #0x105d // Load lower half of constant 0xd62f105d
  276. movk x13, #0xd62f, lsl #16 // Load upper half of constant 0xd62f105d
  277. add w4, w4, w22 // Add dest value
  278. add w4, w4, w13 // Add constant 0xd62f105d
  279. add w4, w4, w6 // Add aux function result
  280. ror w4, w4, #27 // Rotate left s=5 bits
  281. bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  282. add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xd62f105d, s=5, M[5])
  283. and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  284. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  285. movz x13, #0x1453 // Load lower half of constant 0x2441453
  286. movk x13, #0x244, lsl #16 // Load upper half of constant 0x2441453
  287. add w17, w17, w16 // Add dest value
  288. add w17, w17, w13 // Add constant 0x2441453
  289. add w17, w17, w6 // Add aux function result
  290. ror w17, w17, #23 // Rotate left s=9 bits
  291. bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  292. add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0x2441453, s=9, M[10])
  293. and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  294. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  295. movz x13, #0xe681 // Load lower half of constant 0xd8a1e681
  296. movk x13, #0xd8a1, lsl #16 // Load upper half of constant 0xd8a1e681
  297. add w8, w8, w27 // Add dest value
  298. add w8, w8, w13 // Add constant 0xd8a1e681
  299. add w8, w8, w6 // Add aux function result
  300. ror w8, w8, #18 // Rotate left s=14 bits
  301. bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  302. add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xd8a1e681, s=14, M[15])
  303. and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  304. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  305. movz x13, #0xfbc8 // Load lower half of constant 0xe7d3fbc8
  306. movk x13, #0xe7d3, lsl #16 // Load upper half of constant 0xe7d3fbc8
  307. add w9, w9, w14 // Add dest value
  308. add w9, w9, w13 // Add constant 0xe7d3fbc8
  309. add w9, w9, w6 // Add aux function result
  310. ror w9, w9, #12 // Rotate left s=20 bits
  311. bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  312. add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0xe7d3fbc8, s=20, M[4])
  313. and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  314. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  315. movz x13, #0xcde6 // Load lower half of constant 0x21e1cde6
  316. movk x13, #0x21e1, lsl #16 // Load upper half of constant 0x21e1cde6
  317. add w4, w4, w24 // Add dest value
  318. add w4, w4, w13 // Add constant 0x21e1cde6
  319. add w4, w4, w6 // Add aux function result
  320. ror w4, w4, #27 // Rotate left s=5 bits
  321. bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  322. add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0x21e1cde6, s=5, M[9])
  323. and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  324. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  325. movz x13, #0x7d6 // Load lower half of constant 0xc33707d6
  326. movk x13, #0xc337, lsl #16 // Load upper half of constant 0xc33707d6
  327. add w17, w17, w12 // Add dest value
  328. add w17, w17, w13 // Add constant 0xc33707d6
  329. add w17, w17, w6 // Add aux function result
  330. ror w17, w17, #23 // Rotate left s=9 bits
  331. bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  332. add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xc33707d6, s=9, M[14])
  333. and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  334. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  335. movz x13, #0xd87 // Load lower half of constant 0xf4d50d87
  336. movk x13, #0xf4d5, lsl #16 // Load upper half of constant 0xf4d50d87
  337. add w8, w8, w21 // Add dest value
  338. add w8, w8, w13 // Add constant 0xf4d50d87
  339. add w8, w8, w6 // Add aux function result
  340. ror w8, w8, #18 // Rotate left s=14 bits
  341. bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  342. add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0xf4d50d87, s=14, M[3])
  343. and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  344. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  345. movz x13, #0x14ed // Load lower half of constant 0x455a14ed
  346. movk x13, #0x455a, lsl #16 // Load upper half of constant 0x455a14ed
  347. add w9, w9, w5 // Add dest value
  348. add w9, w9, w13 // Add constant 0x455a14ed
  349. add w9, w9, w6 // Add aux function result
  350. ror w9, w9, #12 // Rotate left s=20 bits
  351. bic x6, x8, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  352. add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x455a14ed, s=20, M[8])
  353. and x13, x9, x17 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  354. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  355. movz x13, #0xe905 // Load lower half of constant 0xa9e3e905
  356. movk x13, #0xa9e3, lsl #16 // Load upper half of constant 0xa9e3e905
  357. add w4, w4, w26 // Add dest value
  358. add w4, w4, w13 // Add constant 0xa9e3e905
  359. add w4, w4, w6 // Add aux function result
  360. ror w4, w4, #27 // Rotate left s=5 bits
  361. bic x6, x9, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  362. add w4, w9, w4 // Add X parameter round 2 A=GG(A, B, C, D, 0xa9e3e905, s=5, M[13])
  363. and x13, x4, x8 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  364. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  365. movz x13, #0xa3f8 // Load lower half of constant 0xfcefa3f8
  366. movk x13, #0xfcef, lsl #16 // Load upper half of constant 0xfcefa3f8
  367. add w17, w17, w3 // Add dest value
  368. add w17, w17, w13 // Add constant 0xfcefa3f8
  369. add w17, w17, w6 // Add aux function result
  370. ror w17, w17, #23 // Rotate left s=9 bits
  371. bic x6, x4, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  372. add w17, w4, w17 // Add X parameter round 2 D=GG(D, A, B, C, 0xfcefa3f8, s=9, M[2])
  373. and x13, x17, x9 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  374. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  375. movz x13, #0x2d9 // Load lower half of constant 0x676f02d9
  376. movk x13, #0x676f, lsl #16 // Load upper half of constant 0x676f02d9
  377. add w8, w8, w23 // Add dest value
  378. add w8, w8, w13 // Add constant 0x676f02d9
  379. add w8, w8, w6 // Add aux function result
  380. ror w8, w8, #18 // Rotate left s=14 bits
  381. bic x6, x17, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  382. add w8, w17, w8 // Add X parameter round 2 C=GG(C, D, A, B, 0x676f02d9, s=14, M[7])
  383. and x13, x8, x4 // Aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  384. orr x6, x6, x13 // End aux function round 2 G(x,y,z)=((x&z)|(~z&y))
  385. movz x13, #0x4c8a // Load lower half of constant 0x8d2a4c8a
  386. movk x13, #0x8d2a, lsl #16 // Load upper half of constant 0x8d2a4c8a
  387. add w9, w9, w11 // Add dest value
  388. add w9, w9, w13 // Add constant 0x8d2a4c8a
  389. add w9, w9, w6 // Add aux function result
  390. eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  391. ror w9, w9, #12 // Rotate left s=20 bits
  392. movz x10, #0x3942 // Load lower half of constant 0xfffa3942
  393. add w9, w8, w9 // Add X parameter round 2 B=GG(B, C, D, A, 0x8d2a4c8a, s=20, M[12])
  394. movk x10, #0xfffa, lsl #16 // Load upper half of constant 0xfffa3942
  395. add w4, w4, w22 // Add dest value
  396. eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z)
  397. add w4, w4, w10 // Add constant 0xfffa3942
  398. add w4, w4, w6 // Add aux function result
  399. ror w4, w4, #28 // Rotate left s=4 bits
  400. eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  401. movz x10, #0xf681 // Load lower half of constant 0x8771f681
  402. add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xfffa3942, s=4, M[5])
  403. movk x10, #0x8771, lsl #16 // Load upper half of constant 0x8771f681
  404. add w17, w17, w5 // Add dest value
  405. eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z)
  406. add w17, w17, w10 // Add constant 0x8771f681
  407. add w17, w17, w6 // Add aux function result
  408. eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  409. ror w17, w17, #21 // Rotate left s=11 bits
  410. movz x13, #0x6122 // Load lower half of constant 0x6d9d6122
  411. add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0x8771f681, s=11, M[8])
  412. movk x13, #0x6d9d, lsl #16 // Load upper half of constant 0x6d9d6122
  413. add w8, w8, w25 // Add dest value
  414. eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z)
  415. add w8, w8, w13 // Add constant 0x6d9d6122
  416. add w8, w8, w6 // Add aux function result
  417. ror w8, w8, #16 // Rotate left s=16 bits
  418. eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  419. movz x13, #0x380c // Load lower half of constant 0xfde5380c
  420. add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0x6d9d6122, s=16, M[11])
  421. movk x13, #0xfde5, lsl #16 // Load upper half of constant 0xfde5380c
  422. add w9, w9, w12 // Add dest value
  423. eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z)
  424. add w9, w9, w13 // Add constant 0xfde5380c
  425. add w9, w9, w6 // Add aux function result
  426. eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  427. ror w9, w9, #9 // Rotate left s=23 bits
  428. movz x10, #0xea44 // Load lower half of constant 0xa4beea44
  429. add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xfde5380c, s=23, M[14])
  430. movk x10, #0xa4be, lsl #16 // Load upper half of constant 0xa4beea44
  431. add w4, w4, w20 // Add dest value
  432. eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z)
  433. add w4, w4, w10 // Add constant 0xa4beea44
  434. add w4, w4, w6 // Add aux function result
  435. ror w4, w4, #28 // Rotate left s=4 bits
  436. eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  437. movz x10, #0xcfa9 // Load lower half of constant 0x4bdecfa9
  438. add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xa4beea44, s=4, M[1])
  439. movk x10, #0x4bde, lsl #16 // Load upper half of constant 0x4bdecfa9
  440. add w17, w17, w14 // Add dest value
  441. eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z)
  442. add w17, w17, w10 // Add constant 0x4bdecfa9
  443. add w17, w17, w6 // Add aux function result
  444. eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  445. ror w17, w17, #21 // Rotate left s=11 bits
  446. movz x13, #0x4b60 // Load lower half of constant 0xf6bb4b60
  447. add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0x4bdecfa9, s=11, M[4])
  448. movk x13, #0xf6bb, lsl #16 // Load upper half of constant 0xf6bb4b60
  449. add w8, w8, w23 // Add dest value
  450. eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z)
  451. add w8, w8, w13 // Add constant 0xf6bb4b60
  452. add w8, w8, w6 // Add aux function result
  453. ror w8, w8, #16 // Rotate left s=16 bits
  454. eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  455. movz x13, #0xbc70 // Load lower half of constant 0xbebfbc70
  456. add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0xf6bb4b60, s=16, M[7])
  457. movk x13, #0xbebf, lsl #16 // Load upper half of constant 0xbebfbc70
  458. add w9, w9, w16 // Add dest value
  459. eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z)
  460. add w9, w9, w13 // Add constant 0xbebfbc70
  461. add w9, w9, w6 // Add aux function result
  462. eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  463. ror w9, w9, #9 // Rotate left s=23 bits
  464. movz x10, #0x7ec6 // Load lower half of constant 0x289b7ec6
  465. add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xbebfbc70, s=23, M[10])
  466. movk x10, #0x289b, lsl #16 // Load upper half of constant 0x289b7ec6
  467. add w4, w4, w26 // Add dest value
  468. eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z)
  469. add w4, w4, w10 // Add constant 0x289b7ec6
  470. add w4, w4, w6 // Add aux function result
  471. ror w4, w4, #28 // Rotate left s=4 bits
  472. eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  473. movz x10, #0x27fa // Load lower half of constant 0xeaa127fa
  474. add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0x289b7ec6, s=4, M[13])
  475. movk x10, #0xeaa1, lsl #16 // Load upper half of constant 0xeaa127fa
  476. add w17, w17, w15 // Add dest value
  477. eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z)
  478. add w17, w17, w10 // Add constant 0xeaa127fa
  479. add w17, w17, w6 // Add aux function result
  480. eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  481. ror w17, w17, #21 // Rotate left s=11 bits
  482. movz x13, #0x3085 // Load lower half of constant 0xd4ef3085
  483. add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0xeaa127fa, s=11, M[0])
  484. movk x13, #0xd4ef, lsl #16 // Load upper half of constant 0xd4ef3085
  485. add w8, w8, w21 // Add dest value
  486. eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z)
  487. add w8, w8, w13 // Add constant 0xd4ef3085
  488. add w8, w8, w6 // Add aux function result
  489. ror w8, w8, #16 // Rotate left s=16 bits
  490. eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  491. movz x13, #0x1d05 // Load lower half of constant 0x4881d05
  492. add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0xd4ef3085, s=16, M[3])
  493. movk x13, #0x488, lsl #16 // Load upper half of constant 0x4881d05
  494. add w9, w9, w7 // Add dest value
  495. eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z)
  496. add w9, w9, w13 // Add constant 0x4881d05
  497. add w9, w9, w6 // Add aux function result
  498. eor x6, x8, x17 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  499. ror w9, w9, #9 // Rotate left s=23 bits
  500. movz x10, #0xd039 // Load lower half of constant 0xd9d4d039
  501. add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0x4881d05, s=23, M[6])
  502. movk x10, #0xd9d4, lsl #16 // Load upper half of constant 0xd9d4d039
  503. add w4, w4, w24 // Add dest value
  504. eor x6, x6, x9 // End aux function round 3 H(x,y,z)=(x^y^z)
  505. add w4, w4, w10 // Add constant 0xd9d4d039
  506. add w4, w4, w6 // Add aux function result
  507. ror w4, w4, #28 // Rotate left s=4 bits
  508. eor x6, x9, x8 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  509. movz x10, #0x99e5 // Load lower half of constant 0xe6db99e5
  510. add w4, w9, w4 // Add X parameter round 3 A=HH(A, B, C, D, 0xd9d4d039, s=4, M[9])
  511. movk x10, #0xe6db, lsl #16 // Load upper half of constant 0xe6db99e5
  512. add w17, w17, w11 // Add dest value
  513. eor x6, x6, x4 // End aux function round 3 H(x,y,z)=(x^y^z)
  514. add w17, w17, w10 // Add constant 0xe6db99e5
  515. add w17, w17, w6 // Add aux function result
  516. eor x6, x4, x9 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  517. ror w17, w17, #21 // Rotate left s=11 bits
  518. movz x13, #0x7cf8 // Load lower half of constant 0x1fa27cf8
  519. add w17, w4, w17 // Add X parameter round 3 D=HH(D, A, B, C, 0xe6db99e5, s=11, M[12])
  520. movk x13, #0x1fa2, lsl #16 // Load upper half of constant 0x1fa27cf8
  521. add w8, w8, w27 // Add dest value
  522. eor x6, x6, x17 // End aux function round 3 H(x,y,z)=(x^y^z)
  523. add w8, w8, w13 // Add constant 0x1fa27cf8
  524. add w8, w8, w6 // Add aux function result
  525. ror w8, w8, #16 // Rotate left s=16 bits
  526. eor x6, x17, x4 // Begin aux function round 3 H(x,y,z)=(x^y^z)
  527. movz x13, #0x5665 // Load lower half of constant 0xc4ac5665
  528. add w8, w17, w8 // Add X parameter round 3 C=HH(C, D, A, B, 0x1fa27cf8, s=16, M[15])
  529. movk x13, #0xc4ac, lsl #16 // Load upper half of constant 0xc4ac5665
  530. add w9, w9, w3 // Add dest value
  531. eor x6, x6, x8 // End aux function round 3 H(x,y,z)=(x^y^z)
  532. add w9, w9, w13 // Add constant 0xc4ac5665
  533. add w9, w9, w6 // Add aux function result
  534. ror w9, w9, #9 // Rotate left s=23 bits
  535. movz x6, #0x2244 // Load lower half of constant 0xf4292244
  536. movk x6, #0xf429, lsl #16 // Load upper half of constant 0xf4292244
  537. add w9, w8, w9 // Add X parameter round 3 B=HH(B, C, D, A, 0xc4ac5665, s=23, M[2])
  538. add w4, w4, w15 // Add dest value
  539. orn x13, x9, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  540. add w4, w4, w6 // Add constant 0xf4292244
  541. eor x6, x8, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  542. add w4, w4, w6 // Add aux function result
  543. ror w4, w4, #26 // Rotate left s=6 bits
  544. movz x6, #0xff97 // Load lower half of constant 0x432aff97
  545. movk x6, #0x432a, lsl #16 // Load upper half of constant 0x432aff97
  546. add w4, w9, w4 // Add X parameter round 4 A=II(A, B, C, D, 0xf4292244, s=6, M[0])
  547. orn x10, x4, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  548. add w17, w17, w23 // Add dest value
  549. eor x10, x9, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  550. add w17, w17, w6 // Add constant 0x432aff97
  551. add w6, w17, w10 // Add aux function result
  552. ror w6, w6, #22 // Rotate left s=10 bits
  553. movz x17, #0x23a7 // Load lower half of constant 0xab9423a7
  554. movk x17, #0xab94, lsl #16 // Load upper half of constant 0xab9423a7
  555. add w6, w4, w6 // Add X parameter round 4 D=II(D, A, B, C, 0x432aff97, s=10, M[7])
  556. add w8, w8, w12 // Add dest value
  557. orn x10, x6, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  558. add w8, w8, w17 // Add constant 0xab9423a7
  559. eor x17, x4, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  560. add w8, w8, w17 // Add aux function result
  561. ror w8, w8, #17 // Rotate left s=15 bits
  562. movz x17, #0xa039 // Load lower half of constant 0xfc93a039
  563. movk x17, #0xfc93, lsl #16 // Load upper half of constant 0xfc93a039
  564. add w8, w6, w8 // Add X parameter round 4 C=II(C, D, A, B, 0xab9423a7, s=15, M[14])
  565. orn x13, x8, x4 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  566. add w9, w9, w22 // Add dest value
  567. eor x13, x6, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  568. add w9, w9, w17 // Add constant 0xfc93a039
  569. add w17, w9, w13 // Add aux function result
  570. ror w17, w17, #11 // Rotate left s=21 bits
  571. movz x9, #0x59c3 // Load lower half of constant 0x655b59c3
  572. movk x9, #0x655b, lsl #16 // Load upper half of constant 0x655b59c3
  573. add w17, w8, w17 // Add X parameter round 4 B=II(B, C, D, A, 0xfc93a039, s=21, M[5])
  574. add w4, w4, w11 // Add dest value
  575. orn x13, x17, x6 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  576. add w9, w4, w9 // Add constant 0x655b59c3
  577. eor x4, x8, x13 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  578. add w9, w9, w4 // Add aux function result
  579. ror w9, w9, #26 // Rotate left s=6 bits
  580. movz x4, #0xcc92 // Load lower half of constant 0x8f0ccc92
  581. movk x4, #0x8f0c, lsl #16 // Load upper half of constant 0x8f0ccc92
  582. add w9, w17, w9 // Add X parameter round 4 A=II(A, B, C, D, 0x655b59c3, s=6, M[12])
  583. orn x10, x9, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  584. add w6, w6, w21 // Add dest value
  585. eor x10, x17, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  586. add w4, w6, w4 // Add constant 0x8f0ccc92
  587. add w6, w4, w10 // Add aux function result
  588. ror w6, w6, #22 // Rotate left s=10 bits
  589. movz x4, #0xf47d // Load lower half of constant 0xffeff47d
  590. movk x4, #0xffef, lsl #16 // Load upper half of constant 0xffeff47d
  591. add w6, w9, w6 // Add X parameter round 4 D=II(D, A, B, C, 0x8f0ccc92, s=10, M[3])
  592. add w8, w8, w16 // Add dest value
  593. orn x10, x6, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  594. add w8, w8, w4 // Add constant 0xffeff47d
  595. eor x4, x9, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  596. add w8, w8, w4 // Add aux function result
  597. ror w8, w8, #17 // Rotate left s=15 bits
  598. movz x4, #0x5dd1 // Load lower half of constant 0x85845dd1
  599. movk x4, #0x8584, lsl #16 // Load upper half of constant 0x85845dd1
  600. add w8, w6, w8 // Add X parameter round 4 C=II(C, D, A, B, 0xffeff47d, s=15, M[10])
  601. orn x10, x8, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  602. add w15, w17, w20 // Add dest value
  603. eor x17, x6, x10 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  604. add w15, w15, w4 // Add constant 0x85845dd1
  605. add w4, w15, w17 // Add aux function result
  606. ror w4, w4, #11 // Rotate left s=21 bits
  607. movz x15, #0x7e4f // Load lower half of constant 0x6fa87e4f
  608. movk x15, #0x6fa8, lsl #16 // Load upper half of constant 0x6fa87e4f
  609. add w17, w8, w4 // Add X parameter round 4 B=II(B, C, D, A, 0x85845dd1, s=21, M[1])
  610. add w4, w9, w5 // Add dest value
  611. orn x9, x17, x6 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  612. add w15, w4, w15 // Add constant 0x6fa87e4f
  613. eor x4, x8, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  614. add w9, w15, w4 // Add aux function result
  615. ror w9, w9, #26 // Rotate left s=6 bits
  616. movz x15, #0xe6e0 // Load lower half of constant 0xfe2ce6e0
  617. movk x15, #0xfe2c, lsl #16 // Load upper half of constant 0xfe2ce6e0
  618. add w4, w17, w9 // Add X parameter round 4 A=II(A, B, C, D, 0x6fa87e4f, s=6, M[8])
  619. orn x9, x4, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  620. add w6, w6, w27 // Add dest value
  621. eor x9, x17, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  622. add w15, w6, w15 // Add constant 0xfe2ce6e0
  623. add w6, w15, w9 // Add aux function result
  624. ror w6, w6, #22 // Rotate left s=10 bits
  625. movz x9, #0x4314 // Load lower half of constant 0xa3014314
  626. movk x9, #0xa301, lsl #16 // Load upper half of constant 0xa3014314
  627. add w15, w4, w6 // Add X parameter round 4 D=II(D, A, B, C, 0xfe2ce6e0, s=10, M[15])
  628. add w6, w8, w7 // Add dest value
  629. orn x7, x15, x17 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  630. add w8, w6, w9 // Add constant 0xa3014314
  631. eor x9, x4, x7 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  632. add w6, w8, w9 // Add aux function result
  633. ror w6, w6, #17 // Rotate left s=15 bits
  634. movz x7, #0x11a1 // Load lower half of constant 0x4e0811a1
  635. movk x7, #0x4e08, lsl #16 // Load upper half of constant 0x4e0811a1
  636. add w8, w15, w6 // Add X parameter round 4 C=II(C, D, A, B, 0xa3014314, s=15, M[6])
  637. orn x9, x8, x4 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  638. add w6, w17, w26 // Add dest value
  639. eor x17, x15, x9 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  640. add w9, w6, w7 // Add constant 0x4e0811a1
  641. add w7, w9, w17 // Add aux function result
  642. ror w7, w7, #11 // Rotate left s=21 bits
  643. movz x6, #0x7e82 // Load lower half of constant 0xf7537e82
  644. movk x6, #0xf753, lsl #16 // Load upper half of constant 0xf7537e82
  645. add w9, w8, w7 // Add X parameter round 4 B=II(B, C, D, A, 0x4e0811a1, s=21, M[13])
  646. add w17, w4, w14 // Add dest value
  647. orn x7, x9, x15 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  648. add w14, w17, w6 // Add constant 0xf7537e82
  649. eor x4, x8, x7 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  650. add w17, w14, w4 // Add aux function result
  651. ror w17, w17, #26 // Rotate left s=6 bits
  652. movz x6, #0xf235 // Load lower half of constant 0xbd3af235
  653. movk x6, #0xbd3a, lsl #16 // Load upper half of constant 0xbd3af235
  654. add w7, w9, w17 // Add X parameter round 4 A=II(A, B, C, D, 0xf7537e82, s=6, M[4])
  655. orn x14, x7, x8 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  656. add w4, w15, w25 // Add dest value
  657. eor x17, x9, x14 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  658. add w15, w4, w6 // Add constant 0xbd3af235
  659. add w16, w15, w17 // Add aux function result
  660. ror w16, w16, #22 // Rotate left s=10 bits
  661. movz x14, #0xd2bb // Load lower half of constant 0x2ad7d2bb
  662. movk x14, #0x2ad7, lsl #16 // Load upper half of constant 0x2ad7d2bb
  663. add w4, w7, w16 // Add X parameter round 4 D=II(D, A, B, C, 0xbd3af235, s=10, M[11])
  664. add w6, w8, w3 // Add dest value
  665. orn x15, x4, x9 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  666. add w17, w6, w14 // Add constant 0x2ad7d2bb
  667. eor x16, x7, x15 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  668. add w8, w17, w16 // Add aux function result
  669. ror w8, w8, #17 // Rotate left s=15 bits
  670. movz x3, #0xd391 // Load lower half of constant 0xeb86d391
  671. movk x3, #0xeb86, lsl #16 // Load upper half of constant 0xeb86d391
  672. add w14, w4, w8 // Add X parameter round 4 C=II(C, D, A, B, 0x2ad7d2bb, s=15, M[2])
  673. orn x6, x14, x7 // Begin aux function round 4 I(x,y,z)=((~z|x)^y)
  674. add w15, w9, w24 // Add dest value
  675. eor x17, x4, x6 // End aux function round 4 I(x,y,z)=((~z|x)^y)
  676. add w16, w15, w3 // Add constant 0xeb86d391
  677. add w8, w16, w17 // Add aux function result
  678. ror w8, w8, #11 // Rotate left s=21 bits
  679. ldp w6, w15, [x0] // Reload MD5 state->A and state->B
  680. ldp w5, w9, [x0, #8] // Reload MD5 state->C and state->D
  681. add w3, w14, w8 // Add X parameter round 4 B=II(B, C, D, A, 0xeb86d391, s=21, M[9])
  682. add w13, w4, w9 // Add result of MD5 rounds to state->D
  683. add w12, w14, w5 // Add result of MD5 rounds to state->C
  684. add w10, w7, w6 // Add result of MD5 rounds to state->A
  685. add w11, w3, w15 // Add result of MD5 rounds to state->B
  686. stp w12, w13, [x0, #8] // Store MD5 states C,D
  687. stp w10, w11, [x0] // Store MD5 states A,B
  688. add x1, x1, #64 // Increment data pointer
  689. subs w2, w2, #1 // Decrement block counter
  690. b.ne ossl_md5_blocks_loop
  691. ldp x21,x22,[sp,#16]
  692. ldp x23,x24,[sp,#32]
  693. ldp x25,x26,[sp,#48]
  694. ldp x27,x28,[sp,#64]
  695. ldp x19,x20,[sp],#80
  696. ret
  697. EOF
  698. # EXCEPTION_DISPOSITION handler (EXCEPTION_RECORD *rec,ULONG64 frame,
  699. # CONTEXT *context,DISPATCHER_CONTEXT *disp)
  700. print $code;
  701. close STDOUT or die "error closing STDOUT: $!";