bn-586.asm 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. ; This file is generated from a similarly-named Perl script in the BoringSSL
  2. ; source tree. Do not edit by hand.
  3. %ifdef BORINGSSL_PREFIX
  4. %include "boringssl_prefix_symbols_nasm.inc"
  5. %endif
  6. %ifidn __OUTPUT_FORMAT__,obj
  7. section code use32 class=code align=64
  8. %elifidn __OUTPUT_FORMAT__,win32
  9. $@feat.00 equ 1
  10. section .text code align=64
  11. %else
  12. section .text code
  13. %endif
  14. ;extern _OPENSSL_ia32cap_P
  15. global _bn_mul_add_words
  16. align 16
  17. _bn_mul_add_words:
  18. L$_bn_mul_add_words_begin:
  19. lea eax,[_OPENSSL_ia32cap_P]
  20. bt DWORD [eax],26
  21. jnc NEAR L$000maw_non_sse2
  22. mov eax,DWORD [4+esp]
  23. mov edx,DWORD [8+esp]
  24. mov ecx,DWORD [12+esp]
  25. movd mm0,DWORD [16+esp]
  26. pxor mm1,mm1
  27. jmp NEAR L$001maw_sse2_entry
  28. align 16
  29. L$002maw_sse2_unrolled:
  30. movd mm3,DWORD [eax]
  31. paddq mm1,mm3
  32. movd mm2,DWORD [edx]
  33. pmuludq mm2,mm0
  34. movd mm4,DWORD [4+edx]
  35. pmuludq mm4,mm0
  36. movd mm6,DWORD [8+edx]
  37. pmuludq mm6,mm0
  38. movd mm7,DWORD [12+edx]
  39. pmuludq mm7,mm0
  40. paddq mm1,mm2
  41. movd mm3,DWORD [4+eax]
  42. paddq mm3,mm4
  43. movd mm5,DWORD [8+eax]
  44. paddq mm5,mm6
  45. movd mm4,DWORD [12+eax]
  46. paddq mm7,mm4
  47. movd DWORD [eax],mm1
  48. movd mm2,DWORD [16+edx]
  49. pmuludq mm2,mm0
  50. psrlq mm1,32
  51. movd mm4,DWORD [20+edx]
  52. pmuludq mm4,mm0
  53. paddq mm1,mm3
  54. movd mm6,DWORD [24+edx]
  55. pmuludq mm6,mm0
  56. movd DWORD [4+eax],mm1
  57. psrlq mm1,32
  58. movd mm3,DWORD [28+edx]
  59. add edx,32
  60. pmuludq mm3,mm0
  61. paddq mm1,mm5
  62. movd mm5,DWORD [16+eax]
  63. paddq mm2,mm5
  64. movd DWORD [8+eax],mm1
  65. psrlq mm1,32
  66. paddq mm1,mm7
  67. movd mm5,DWORD [20+eax]
  68. paddq mm4,mm5
  69. movd DWORD [12+eax],mm1
  70. psrlq mm1,32
  71. paddq mm1,mm2
  72. movd mm5,DWORD [24+eax]
  73. paddq mm6,mm5
  74. movd DWORD [16+eax],mm1
  75. psrlq mm1,32
  76. paddq mm1,mm4
  77. movd mm5,DWORD [28+eax]
  78. paddq mm3,mm5
  79. movd DWORD [20+eax],mm1
  80. psrlq mm1,32
  81. paddq mm1,mm6
  82. movd DWORD [24+eax],mm1
  83. psrlq mm1,32
  84. paddq mm1,mm3
  85. movd DWORD [28+eax],mm1
  86. lea eax,[32+eax]
  87. psrlq mm1,32
  88. sub ecx,8
  89. jz NEAR L$003maw_sse2_exit
  90. L$001maw_sse2_entry:
  91. test ecx,4294967288
  92. jnz NEAR L$002maw_sse2_unrolled
  93. align 4
  94. L$004maw_sse2_loop:
  95. movd mm2,DWORD [edx]
  96. movd mm3,DWORD [eax]
  97. pmuludq mm2,mm0
  98. lea edx,[4+edx]
  99. paddq mm1,mm3
  100. paddq mm1,mm2
  101. movd DWORD [eax],mm1
  102. sub ecx,1
  103. psrlq mm1,32
  104. lea eax,[4+eax]
  105. jnz NEAR L$004maw_sse2_loop
  106. L$003maw_sse2_exit:
  107. movd eax,mm1
  108. emms
  109. ret
  110. align 16
  111. L$000maw_non_sse2:
  112. push ebp
  113. push ebx
  114. push esi
  115. push edi
  116. ;
  117. xor esi,esi
  118. mov edi,DWORD [20+esp]
  119. mov ecx,DWORD [28+esp]
  120. mov ebx,DWORD [24+esp]
  121. and ecx,4294967288
  122. mov ebp,DWORD [32+esp]
  123. push ecx
  124. jz NEAR L$005maw_finish
  125. align 16
  126. L$006maw_loop:
  127. ; Round 0
  128. mov eax,DWORD [ebx]
  129. mul ebp
  130. add eax,esi
  131. adc edx,0
  132. add eax,DWORD [edi]
  133. adc edx,0
  134. mov DWORD [edi],eax
  135. mov esi,edx
  136. ; Round 4
  137. mov eax,DWORD [4+ebx]
  138. mul ebp
  139. add eax,esi
  140. adc edx,0
  141. add eax,DWORD [4+edi]
  142. adc edx,0
  143. mov DWORD [4+edi],eax
  144. mov esi,edx
  145. ; Round 8
  146. mov eax,DWORD [8+ebx]
  147. mul ebp
  148. add eax,esi
  149. adc edx,0
  150. add eax,DWORD [8+edi]
  151. adc edx,0
  152. mov DWORD [8+edi],eax
  153. mov esi,edx
  154. ; Round 12
  155. mov eax,DWORD [12+ebx]
  156. mul ebp
  157. add eax,esi
  158. adc edx,0
  159. add eax,DWORD [12+edi]
  160. adc edx,0
  161. mov DWORD [12+edi],eax
  162. mov esi,edx
  163. ; Round 16
  164. mov eax,DWORD [16+ebx]
  165. mul ebp
  166. add eax,esi
  167. adc edx,0
  168. add eax,DWORD [16+edi]
  169. adc edx,0
  170. mov DWORD [16+edi],eax
  171. mov esi,edx
  172. ; Round 20
  173. mov eax,DWORD [20+ebx]
  174. mul ebp
  175. add eax,esi
  176. adc edx,0
  177. add eax,DWORD [20+edi]
  178. adc edx,0
  179. mov DWORD [20+edi],eax
  180. mov esi,edx
  181. ; Round 24
  182. mov eax,DWORD [24+ebx]
  183. mul ebp
  184. add eax,esi
  185. adc edx,0
  186. add eax,DWORD [24+edi]
  187. adc edx,0
  188. mov DWORD [24+edi],eax
  189. mov esi,edx
  190. ; Round 28
  191. mov eax,DWORD [28+ebx]
  192. mul ebp
  193. add eax,esi
  194. adc edx,0
  195. add eax,DWORD [28+edi]
  196. adc edx,0
  197. mov DWORD [28+edi],eax
  198. mov esi,edx
  199. ;
  200. sub ecx,8
  201. lea ebx,[32+ebx]
  202. lea edi,[32+edi]
  203. jnz NEAR L$006maw_loop
  204. L$005maw_finish:
  205. mov ecx,DWORD [32+esp]
  206. and ecx,7
  207. jnz NEAR L$007maw_finish2
  208. jmp NEAR L$008maw_end
  209. L$007maw_finish2:
  210. ; Tail Round 0
  211. mov eax,DWORD [ebx]
  212. mul ebp
  213. add eax,esi
  214. adc edx,0
  215. add eax,DWORD [edi]
  216. adc edx,0
  217. dec ecx
  218. mov DWORD [edi],eax
  219. mov esi,edx
  220. jz NEAR L$008maw_end
  221. ; Tail Round 1
  222. mov eax,DWORD [4+ebx]
  223. mul ebp
  224. add eax,esi
  225. adc edx,0
  226. add eax,DWORD [4+edi]
  227. adc edx,0
  228. dec ecx
  229. mov DWORD [4+edi],eax
  230. mov esi,edx
  231. jz NEAR L$008maw_end
  232. ; Tail Round 2
  233. mov eax,DWORD [8+ebx]
  234. mul ebp
  235. add eax,esi
  236. adc edx,0
  237. add eax,DWORD [8+edi]
  238. adc edx,0
  239. dec ecx
  240. mov DWORD [8+edi],eax
  241. mov esi,edx
  242. jz NEAR L$008maw_end
  243. ; Tail Round 3
  244. mov eax,DWORD [12+ebx]
  245. mul ebp
  246. add eax,esi
  247. adc edx,0
  248. add eax,DWORD [12+edi]
  249. adc edx,0
  250. dec ecx
  251. mov DWORD [12+edi],eax
  252. mov esi,edx
  253. jz NEAR L$008maw_end
  254. ; Tail Round 4
  255. mov eax,DWORD [16+ebx]
  256. mul ebp
  257. add eax,esi
  258. adc edx,0
  259. add eax,DWORD [16+edi]
  260. adc edx,0
  261. dec ecx
  262. mov DWORD [16+edi],eax
  263. mov esi,edx
  264. jz NEAR L$008maw_end
  265. ; Tail Round 5
  266. mov eax,DWORD [20+ebx]
  267. mul ebp
  268. add eax,esi
  269. adc edx,0
  270. add eax,DWORD [20+edi]
  271. adc edx,0
  272. dec ecx
  273. mov DWORD [20+edi],eax
  274. mov esi,edx
  275. jz NEAR L$008maw_end
  276. ; Tail Round 6
  277. mov eax,DWORD [24+ebx]
  278. mul ebp
  279. add eax,esi
  280. adc edx,0
  281. add eax,DWORD [24+edi]
  282. adc edx,0
  283. mov DWORD [24+edi],eax
  284. mov esi,edx
  285. L$008maw_end:
  286. mov eax,esi
  287. pop ecx
  288. pop edi
  289. pop esi
  290. pop ebx
  291. pop ebp
  292. ret
  293. global _bn_mul_words
  294. align 16
  295. _bn_mul_words:
  296. L$_bn_mul_words_begin:
  297. lea eax,[_OPENSSL_ia32cap_P]
  298. bt DWORD [eax],26
  299. jnc NEAR L$009mw_non_sse2
  300. mov eax,DWORD [4+esp]
  301. mov edx,DWORD [8+esp]
  302. mov ecx,DWORD [12+esp]
  303. movd mm0,DWORD [16+esp]
  304. pxor mm1,mm1
  305. align 16
  306. L$010mw_sse2_loop:
  307. movd mm2,DWORD [edx]
  308. pmuludq mm2,mm0
  309. lea edx,[4+edx]
  310. paddq mm1,mm2
  311. movd DWORD [eax],mm1
  312. sub ecx,1
  313. psrlq mm1,32
  314. lea eax,[4+eax]
  315. jnz NEAR L$010mw_sse2_loop
  316. movd eax,mm1
  317. emms
  318. ret
  319. align 16
  320. L$009mw_non_sse2:
  321. push ebp
  322. push ebx
  323. push esi
  324. push edi
  325. ;
  326. xor esi,esi
  327. mov edi,DWORD [20+esp]
  328. mov ebx,DWORD [24+esp]
  329. mov ebp,DWORD [28+esp]
  330. mov ecx,DWORD [32+esp]
  331. and ebp,4294967288
  332. jz NEAR L$011mw_finish
  333. L$012mw_loop:
  334. ; Round 0
  335. mov eax,DWORD [ebx]
  336. mul ecx
  337. add eax,esi
  338. adc edx,0
  339. mov DWORD [edi],eax
  340. mov esi,edx
  341. ; Round 4
  342. mov eax,DWORD [4+ebx]
  343. mul ecx
  344. add eax,esi
  345. adc edx,0
  346. mov DWORD [4+edi],eax
  347. mov esi,edx
  348. ; Round 8
  349. mov eax,DWORD [8+ebx]
  350. mul ecx
  351. add eax,esi
  352. adc edx,0
  353. mov DWORD [8+edi],eax
  354. mov esi,edx
  355. ; Round 12
  356. mov eax,DWORD [12+ebx]
  357. mul ecx
  358. add eax,esi
  359. adc edx,0
  360. mov DWORD [12+edi],eax
  361. mov esi,edx
  362. ; Round 16
  363. mov eax,DWORD [16+ebx]
  364. mul ecx
  365. add eax,esi
  366. adc edx,0
  367. mov DWORD [16+edi],eax
  368. mov esi,edx
  369. ; Round 20
  370. mov eax,DWORD [20+ebx]
  371. mul ecx
  372. add eax,esi
  373. adc edx,0
  374. mov DWORD [20+edi],eax
  375. mov esi,edx
  376. ; Round 24
  377. mov eax,DWORD [24+ebx]
  378. mul ecx
  379. add eax,esi
  380. adc edx,0
  381. mov DWORD [24+edi],eax
  382. mov esi,edx
  383. ; Round 28
  384. mov eax,DWORD [28+ebx]
  385. mul ecx
  386. add eax,esi
  387. adc edx,0
  388. mov DWORD [28+edi],eax
  389. mov esi,edx
  390. ;
  391. add ebx,32
  392. add edi,32
  393. sub ebp,8
  394. jz NEAR L$011mw_finish
  395. jmp NEAR L$012mw_loop
  396. L$011mw_finish:
  397. mov ebp,DWORD [28+esp]
  398. and ebp,7
  399. jnz NEAR L$013mw_finish2
  400. jmp NEAR L$014mw_end
  401. L$013mw_finish2:
  402. ; Tail Round 0
  403. mov eax,DWORD [ebx]
  404. mul ecx
  405. add eax,esi
  406. adc edx,0
  407. mov DWORD [edi],eax
  408. mov esi,edx
  409. dec ebp
  410. jz NEAR L$014mw_end
  411. ; Tail Round 1
  412. mov eax,DWORD [4+ebx]
  413. mul ecx
  414. add eax,esi
  415. adc edx,0
  416. mov DWORD [4+edi],eax
  417. mov esi,edx
  418. dec ebp
  419. jz NEAR L$014mw_end
  420. ; Tail Round 2
  421. mov eax,DWORD [8+ebx]
  422. mul ecx
  423. add eax,esi
  424. adc edx,0
  425. mov DWORD [8+edi],eax
  426. mov esi,edx
  427. dec ebp
  428. jz NEAR L$014mw_end
  429. ; Tail Round 3
  430. mov eax,DWORD [12+ebx]
  431. mul ecx
  432. add eax,esi
  433. adc edx,0
  434. mov DWORD [12+edi],eax
  435. mov esi,edx
  436. dec ebp
  437. jz NEAR L$014mw_end
  438. ; Tail Round 4
  439. mov eax,DWORD [16+ebx]
  440. mul ecx
  441. add eax,esi
  442. adc edx,0
  443. mov DWORD [16+edi],eax
  444. mov esi,edx
  445. dec ebp
  446. jz NEAR L$014mw_end
  447. ; Tail Round 5
  448. mov eax,DWORD [20+ebx]
  449. mul ecx
  450. add eax,esi
  451. adc edx,0
  452. mov DWORD [20+edi],eax
  453. mov esi,edx
  454. dec ebp
  455. jz NEAR L$014mw_end
  456. ; Tail Round 6
  457. mov eax,DWORD [24+ebx]
  458. mul ecx
  459. add eax,esi
  460. adc edx,0
  461. mov DWORD [24+edi],eax
  462. mov esi,edx
  463. L$014mw_end:
  464. mov eax,esi
  465. pop edi
  466. pop esi
  467. pop ebx
  468. pop ebp
  469. ret
  470. global _bn_sqr_words
  471. align 16
  472. _bn_sqr_words:
  473. L$_bn_sqr_words_begin:
  474. lea eax,[_OPENSSL_ia32cap_P]
  475. bt DWORD [eax],26
  476. jnc NEAR L$015sqr_non_sse2
  477. mov eax,DWORD [4+esp]
  478. mov edx,DWORD [8+esp]
  479. mov ecx,DWORD [12+esp]
  480. align 16
  481. L$016sqr_sse2_loop:
  482. movd mm0,DWORD [edx]
  483. pmuludq mm0,mm0
  484. lea edx,[4+edx]
  485. movq [eax],mm0
  486. sub ecx,1
  487. lea eax,[8+eax]
  488. jnz NEAR L$016sqr_sse2_loop
  489. emms
  490. ret
  491. align 16
  492. L$015sqr_non_sse2:
  493. push ebp
  494. push ebx
  495. push esi
  496. push edi
  497. ;
  498. mov esi,DWORD [20+esp]
  499. mov edi,DWORD [24+esp]
  500. mov ebx,DWORD [28+esp]
  501. and ebx,4294967288
  502. jz NEAR L$017sw_finish
  503. L$018sw_loop:
  504. ; Round 0
  505. mov eax,DWORD [edi]
  506. mul eax
  507. mov DWORD [esi],eax
  508. mov DWORD [4+esi],edx
  509. ; Round 4
  510. mov eax,DWORD [4+edi]
  511. mul eax
  512. mov DWORD [8+esi],eax
  513. mov DWORD [12+esi],edx
  514. ; Round 8
  515. mov eax,DWORD [8+edi]
  516. mul eax
  517. mov DWORD [16+esi],eax
  518. mov DWORD [20+esi],edx
  519. ; Round 12
  520. mov eax,DWORD [12+edi]
  521. mul eax
  522. mov DWORD [24+esi],eax
  523. mov DWORD [28+esi],edx
  524. ; Round 16
  525. mov eax,DWORD [16+edi]
  526. mul eax
  527. mov DWORD [32+esi],eax
  528. mov DWORD [36+esi],edx
  529. ; Round 20
  530. mov eax,DWORD [20+edi]
  531. mul eax
  532. mov DWORD [40+esi],eax
  533. mov DWORD [44+esi],edx
  534. ; Round 24
  535. mov eax,DWORD [24+edi]
  536. mul eax
  537. mov DWORD [48+esi],eax
  538. mov DWORD [52+esi],edx
  539. ; Round 28
  540. mov eax,DWORD [28+edi]
  541. mul eax
  542. mov DWORD [56+esi],eax
  543. mov DWORD [60+esi],edx
  544. ;
  545. add edi,32
  546. add esi,64
  547. sub ebx,8
  548. jnz NEAR L$018sw_loop
  549. L$017sw_finish:
  550. mov ebx,DWORD [28+esp]
  551. and ebx,7
  552. jz NEAR L$019sw_end
  553. ; Tail Round 0
  554. mov eax,DWORD [edi]
  555. mul eax
  556. mov DWORD [esi],eax
  557. dec ebx
  558. mov DWORD [4+esi],edx
  559. jz NEAR L$019sw_end
  560. ; Tail Round 1
  561. mov eax,DWORD [4+edi]
  562. mul eax
  563. mov DWORD [8+esi],eax
  564. dec ebx
  565. mov DWORD [12+esi],edx
  566. jz NEAR L$019sw_end
  567. ; Tail Round 2
  568. mov eax,DWORD [8+edi]
  569. mul eax
  570. mov DWORD [16+esi],eax
  571. dec ebx
  572. mov DWORD [20+esi],edx
  573. jz NEAR L$019sw_end
  574. ; Tail Round 3
  575. mov eax,DWORD [12+edi]
  576. mul eax
  577. mov DWORD [24+esi],eax
  578. dec ebx
  579. mov DWORD [28+esi],edx
  580. jz NEAR L$019sw_end
  581. ; Tail Round 4
  582. mov eax,DWORD [16+edi]
  583. mul eax
  584. mov DWORD [32+esi],eax
  585. dec ebx
  586. mov DWORD [36+esi],edx
  587. jz NEAR L$019sw_end
  588. ; Tail Round 5
  589. mov eax,DWORD [20+edi]
  590. mul eax
  591. mov DWORD [40+esi],eax
  592. dec ebx
  593. mov DWORD [44+esi],edx
  594. jz NEAR L$019sw_end
  595. ; Tail Round 6
  596. mov eax,DWORD [24+edi]
  597. mul eax
  598. mov DWORD [48+esi],eax
  599. mov DWORD [52+esi],edx
  600. L$019sw_end:
  601. pop edi
  602. pop esi
  603. pop ebx
  604. pop ebp
  605. ret
  606. global _bn_div_words
  607. align 16
  608. _bn_div_words:
  609. L$_bn_div_words_begin:
  610. mov edx,DWORD [4+esp]
  611. mov eax,DWORD [8+esp]
  612. mov ecx,DWORD [12+esp]
  613. div ecx
  614. ret
  615. global _bn_add_words
  616. align 16
  617. _bn_add_words:
  618. L$_bn_add_words_begin:
  619. push ebp
  620. push ebx
  621. push esi
  622. push edi
  623. ;
  624. mov ebx,DWORD [20+esp]
  625. mov esi,DWORD [24+esp]
  626. mov edi,DWORD [28+esp]
  627. mov ebp,DWORD [32+esp]
  628. xor eax,eax
  629. and ebp,4294967288
  630. jz NEAR L$020aw_finish
  631. L$021aw_loop:
  632. ; Round 0
  633. mov ecx,DWORD [esi]
  634. mov edx,DWORD [edi]
  635. add ecx,eax
  636. mov eax,0
  637. adc eax,eax
  638. add ecx,edx
  639. adc eax,0
  640. mov DWORD [ebx],ecx
  641. ; Round 1
  642. mov ecx,DWORD [4+esi]
  643. mov edx,DWORD [4+edi]
  644. add ecx,eax
  645. mov eax,0
  646. adc eax,eax
  647. add ecx,edx
  648. adc eax,0
  649. mov DWORD [4+ebx],ecx
  650. ; Round 2
  651. mov ecx,DWORD [8+esi]
  652. mov edx,DWORD [8+edi]
  653. add ecx,eax
  654. mov eax,0
  655. adc eax,eax
  656. add ecx,edx
  657. adc eax,0
  658. mov DWORD [8+ebx],ecx
  659. ; Round 3
  660. mov ecx,DWORD [12+esi]
  661. mov edx,DWORD [12+edi]
  662. add ecx,eax
  663. mov eax,0
  664. adc eax,eax
  665. add ecx,edx
  666. adc eax,0
  667. mov DWORD [12+ebx],ecx
  668. ; Round 4
  669. mov ecx,DWORD [16+esi]
  670. mov edx,DWORD [16+edi]
  671. add ecx,eax
  672. mov eax,0
  673. adc eax,eax
  674. add ecx,edx
  675. adc eax,0
  676. mov DWORD [16+ebx],ecx
  677. ; Round 5
  678. mov ecx,DWORD [20+esi]
  679. mov edx,DWORD [20+edi]
  680. add ecx,eax
  681. mov eax,0
  682. adc eax,eax
  683. add ecx,edx
  684. adc eax,0
  685. mov DWORD [20+ebx],ecx
  686. ; Round 6
  687. mov ecx,DWORD [24+esi]
  688. mov edx,DWORD [24+edi]
  689. add ecx,eax
  690. mov eax,0
  691. adc eax,eax
  692. add ecx,edx
  693. adc eax,0
  694. mov DWORD [24+ebx],ecx
  695. ; Round 7
  696. mov ecx,DWORD [28+esi]
  697. mov edx,DWORD [28+edi]
  698. add ecx,eax
  699. mov eax,0
  700. adc eax,eax
  701. add ecx,edx
  702. adc eax,0
  703. mov DWORD [28+ebx],ecx
  704. ;
  705. add esi,32
  706. add edi,32
  707. add ebx,32
  708. sub ebp,8
  709. jnz NEAR L$021aw_loop
  710. L$020aw_finish:
  711. mov ebp,DWORD [32+esp]
  712. and ebp,7
  713. jz NEAR L$022aw_end
  714. ; Tail Round 0
  715. mov ecx,DWORD [esi]
  716. mov edx,DWORD [edi]
  717. add ecx,eax
  718. mov eax,0
  719. adc eax,eax
  720. add ecx,edx
  721. adc eax,0
  722. dec ebp
  723. mov DWORD [ebx],ecx
  724. jz NEAR L$022aw_end
  725. ; Tail Round 1
  726. mov ecx,DWORD [4+esi]
  727. mov edx,DWORD [4+edi]
  728. add ecx,eax
  729. mov eax,0
  730. adc eax,eax
  731. add ecx,edx
  732. adc eax,0
  733. dec ebp
  734. mov DWORD [4+ebx],ecx
  735. jz NEAR L$022aw_end
  736. ; Tail Round 2
  737. mov ecx,DWORD [8+esi]
  738. mov edx,DWORD [8+edi]
  739. add ecx,eax
  740. mov eax,0
  741. adc eax,eax
  742. add ecx,edx
  743. adc eax,0
  744. dec ebp
  745. mov DWORD [8+ebx],ecx
  746. jz NEAR L$022aw_end
  747. ; Tail Round 3
  748. mov ecx,DWORD [12+esi]
  749. mov edx,DWORD [12+edi]
  750. add ecx,eax
  751. mov eax,0
  752. adc eax,eax
  753. add ecx,edx
  754. adc eax,0
  755. dec ebp
  756. mov DWORD [12+ebx],ecx
  757. jz NEAR L$022aw_end
  758. ; Tail Round 4
  759. mov ecx,DWORD [16+esi]
  760. mov edx,DWORD [16+edi]
  761. add ecx,eax
  762. mov eax,0
  763. adc eax,eax
  764. add ecx,edx
  765. adc eax,0
  766. dec ebp
  767. mov DWORD [16+ebx],ecx
  768. jz NEAR L$022aw_end
  769. ; Tail Round 5
  770. mov ecx,DWORD [20+esi]
  771. mov edx,DWORD [20+edi]
  772. add ecx,eax
  773. mov eax,0
  774. adc eax,eax
  775. add ecx,edx
  776. adc eax,0
  777. dec ebp
  778. mov DWORD [20+ebx],ecx
  779. jz NEAR L$022aw_end
  780. ; Tail Round 6
  781. mov ecx,DWORD [24+esi]
  782. mov edx,DWORD [24+edi]
  783. add ecx,eax
  784. mov eax,0
  785. adc eax,eax
  786. add ecx,edx
  787. adc eax,0
  788. mov DWORD [24+ebx],ecx
  789. L$022aw_end:
  790. pop edi
  791. pop esi
  792. pop ebx
  793. pop ebp
  794. ret
  795. global _bn_sub_words
  796. align 16
  797. _bn_sub_words:
  798. L$_bn_sub_words_begin:
  799. push ebp
  800. push ebx
  801. push esi
  802. push edi
  803. ;
  804. mov ebx,DWORD [20+esp]
  805. mov esi,DWORD [24+esp]
  806. mov edi,DWORD [28+esp]
  807. mov ebp,DWORD [32+esp]
  808. xor eax,eax
  809. and ebp,4294967288
  810. jz NEAR L$023aw_finish
  811. L$024aw_loop:
  812. ; Round 0
  813. mov ecx,DWORD [esi]
  814. mov edx,DWORD [edi]
  815. sub ecx,eax
  816. mov eax,0
  817. adc eax,eax
  818. sub ecx,edx
  819. adc eax,0
  820. mov DWORD [ebx],ecx
  821. ; Round 1
  822. mov ecx,DWORD [4+esi]
  823. mov edx,DWORD [4+edi]
  824. sub ecx,eax
  825. mov eax,0
  826. adc eax,eax
  827. sub ecx,edx
  828. adc eax,0
  829. mov DWORD [4+ebx],ecx
  830. ; Round 2
  831. mov ecx,DWORD [8+esi]
  832. mov edx,DWORD [8+edi]
  833. sub ecx,eax
  834. mov eax,0
  835. adc eax,eax
  836. sub ecx,edx
  837. adc eax,0
  838. mov DWORD [8+ebx],ecx
  839. ; Round 3
  840. mov ecx,DWORD [12+esi]
  841. mov edx,DWORD [12+edi]
  842. sub ecx,eax
  843. mov eax,0
  844. adc eax,eax
  845. sub ecx,edx
  846. adc eax,0
  847. mov DWORD [12+ebx],ecx
  848. ; Round 4
  849. mov ecx,DWORD [16+esi]
  850. mov edx,DWORD [16+edi]
  851. sub ecx,eax
  852. mov eax,0
  853. adc eax,eax
  854. sub ecx,edx
  855. adc eax,0
  856. mov DWORD [16+ebx],ecx
  857. ; Round 5
  858. mov ecx,DWORD [20+esi]
  859. mov edx,DWORD [20+edi]
  860. sub ecx,eax
  861. mov eax,0
  862. adc eax,eax
  863. sub ecx,edx
  864. adc eax,0
  865. mov DWORD [20+ebx],ecx
  866. ; Round 6
  867. mov ecx,DWORD [24+esi]
  868. mov edx,DWORD [24+edi]
  869. sub ecx,eax
  870. mov eax,0
  871. adc eax,eax
  872. sub ecx,edx
  873. adc eax,0
  874. mov DWORD [24+ebx],ecx
  875. ; Round 7
  876. mov ecx,DWORD [28+esi]
  877. mov edx,DWORD [28+edi]
  878. sub ecx,eax
  879. mov eax,0
  880. adc eax,eax
  881. sub ecx,edx
  882. adc eax,0
  883. mov DWORD [28+ebx],ecx
  884. ;
  885. add esi,32
  886. add edi,32
  887. add ebx,32
  888. sub ebp,8
  889. jnz NEAR L$024aw_loop
  890. L$023aw_finish:
  891. mov ebp,DWORD [32+esp]
  892. and ebp,7
  893. jz NEAR L$025aw_end
  894. ; Tail Round 0
  895. mov ecx,DWORD [esi]
  896. mov edx,DWORD [edi]
  897. sub ecx,eax
  898. mov eax,0
  899. adc eax,eax
  900. sub ecx,edx
  901. adc eax,0
  902. dec ebp
  903. mov DWORD [ebx],ecx
  904. jz NEAR L$025aw_end
  905. ; Tail Round 1
  906. mov ecx,DWORD [4+esi]
  907. mov edx,DWORD [4+edi]
  908. sub ecx,eax
  909. mov eax,0
  910. adc eax,eax
  911. sub ecx,edx
  912. adc eax,0
  913. dec ebp
  914. mov DWORD [4+ebx],ecx
  915. jz NEAR L$025aw_end
  916. ; Tail Round 2
  917. mov ecx,DWORD [8+esi]
  918. mov edx,DWORD [8+edi]
  919. sub ecx,eax
  920. mov eax,0
  921. adc eax,eax
  922. sub ecx,edx
  923. adc eax,0
  924. dec ebp
  925. mov DWORD [8+ebx],ecx
  926. jz NEAR L$025aw_end
  927. ; Tail Round 3
  928. mov ecx,DWORD [12+esi]
  929. mov edx,DWORD [12+edi]
  930. sub ecx,eax
  931. mov eax,0
  932. adc eax,eax
  933. sub ecx,edx
  934. adc eax,0
  935. dec ebp
  936. mov DWORD [12+ebx],ecx
  937. jz NEAR L$025aw_end
  938. ; Tail Round 4
  939. mov ecx,DWORD [16+esi]
  940. mov edx,DWORD [16+edi]
  941. sub ecx,eax
  942. mov eax,0
  943. adc eax,eax
  944. sub ecx,edx
  945. adc eax,0
  946. dec ebp
  947. mov DWORD [16+ebx],ecx
  948. jz NEAR L$025aw_end
  949. ; Tail Round 5
  950. mov ecx,DWORD [20+esi]
  951. mov edx,DWORD [20+edi]
  952. sub ecx,eax
  953. mov eax,0
  954. adc eax,eax
  955. sub ecx,edx
  956. adc eax,0
  957. dec ebp
  958. mov DWORD [20+ebx],ecx
  959. jz NEAR L$025aw_end
  960. ; Tail Round 6
  961. mov ecx,DWORD [24+esi]
  962. mov edx,DWORD [24+edi]
  963. sub ecx,eax
  964. mov eax,0
  965. adc eax,eax
  966. sub ecx,edx
  967. adc eax,0
  968. mov DWORD [24+ebx],ecx
  969. L$025aw_end:
  970. pop edi
  971. pop esi
  972. pop ebx
  973. pop ebp
  974. ret
  975. segment .bss
  976. common _OPENSSL_ia32cap_P 16