ecp_nistz256-x86-win32n.asm 20 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105
  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. [email protected] equ 1
  10. section .text code align=64
  11. %else
  12. section .text code
  13. %endif
  14. ;extern _GFp_ia32cap_P
  15. L$ONE_mont:
  16. dd 1,0,0,-1,-1,-1,-2,0
  17. align 16
  18. __ecp_nistz256_div_by_2:
  19. mov ebp,DWORD [esi]
  20. xor edx,edx
  21. mov ebx,DWORD [4+esi]
  22. mov eax,ebp
  23. and ebp,1
  24. mov ecx,DWORD [8+esi]
  25. sub edx,ebp
  26. add eax,edx
  27. adc ebx,edx
  28. mov DWORD [edi],eax
  29. adc ecx,edx
  30. mov DWORD [4+edi],ebx
  31. mov DWORD [8+edi],ecx
  32. mov eax,DWORD [12+esi]
  33. mov ebx,DWORD [16+esi]
  34. adc eax,0
  35. mov ecx,DWORD [20+esi]
  36. adc ebx,0
  37. mov DWORD [12+edi],eax
  38. adc ecx,0
  39. mov DWORD [16+edi],ebx
  40. mov DWORD [20+edi],ecx
  41. mov eax,DWORD [24+esi]
  42. mov ebx,DWORD [28+esi]
  43. adc eax,ebp
  44. adc ebx,edx
  45. mov DWORD [24+edi],eax
  46. sbb esi,esi
  47. mov DWORD [28+edi],ebx
  48. mov eax,DWORD [edi]
  49. mov ebx,DWORD [4+edi]
  50. mov ecx,DWORD [8+edi]
  51. mov edx,DWORD [12+edi]
  52. shr eax,1
  53. mov ebp,ebx
  54. shl ebx,31
  55. or eax,ebx
  56. shr ebp,1
  57. mov ebx,ecx
  58. shl ecx,31
  59. mov DWORD [edi],eax
  60. or ebp,ecx
  61. mov eax,DWORD [16+edi]
  62. shr ebx,1
  63. mov ecx,edx
  64. shl edx,31
  65. mov DWORD [4+edi],ebp
  66. or ebx,edx
  67. mov ebp,DWORD [20+edi]
  68. shr ecx,1
  69. mov edx,eax
  70. shl eax,31
  71. mov DWORD [8+edi],ebx
  72. or ecx,eax
  73. mov ebx,DWORD [24+edi]
  74. shr edx,1
  75. mov eax,ebp
  76. shl ebp,31
  77. mov DWORD [12+edi],ecx
  78. or edx,ebp
  79. mov ecx,DWORD [28+edi]
  80. shr eax,1
  81. mov ebp,ebx
  82. shl ebx,31
  83. mov DWORD [16+edi],edx
  84. or eax,ebx
  85. shr ebp,1
  86. mov ebx,ecx
  87. shl ecx,31
  88. mov DWORD [20+edi],eax
  89. or ebp,ecx
  90. shr ebx,1
  91. shl esi,31
  92. mov DWORD [24+edi],ebp
  93. or ebx,esi
  94. mov DWORD [28+edi],ebx
  95. ret
  96. global _GFp_nistz256_add
  97. align 16
  98. _GFp_nistz256_add:
  99. L$_GFp_nistz256_add_begin:
  100. push ebp
  101. push ebx
  102. push esi
  103. push edi
  104. mov esi,DWORD [24+esp]
  105. mov ebp,DWORD [28+esp]
  106. mov edi,DWORD [20+esp]
  107. call __ecp_nistz256_add
  108. pop edi
  109. pop esi
  110. pop ebx
  111. pop ebp
  112. ret
  113. align 16
  114. __ecp_nistz256_add:
  115. mov eax,DWORD [esi]
  116. mov ebx,DWORD [4+esi]
  117. mov ecx,DWORD [8+esi]
  118. add eax,DWORD [ebp]
  119. mov edx,DWORD [12+esi]
  120. adc ebx,DWORD [4+ebp]
  121. mov DWORD [edi],eax
  122. adc ecx,DWORD [8+ebp]
  123. mov DWORD [4+edi],ebx
  124. adc edx,DWORD [12+ebp]
  125. mov DWORD [8+edi],ecx
  126. mov DWORD [12+edi],edx
  127. mov eax,DWORD [16+esi]
  128. mov ebx,DWORD [20+esi]
  129. mov ecx,DWORD [24+esi]
  130. adc eax,DWORD [16+ebp]
  131. mov edx,DWORD [28+esi]
  132. adc ebx,DWORD [20+ebp]
  133. mov DWORD [16+edi],eax
  134. adc ecx,DWORD [24+ebp]
  135. mov DWORD [20+edi],ebx
  136. mov esi,0
  137. adc edx,DWORD [28+ebp]
  138. mov DWORD [24+edi],ecx
  139. adc esi,0
  140. mov DWORD [28+edi],edx
  141. mov eax,DWORD [edi]
  142. mov ebx,DWORD [4+edi]
  143. mov ecx,DWORD [8+edi]
  144. sub eax,-1
  145. mov edx,DWORD [12+edi]
  146. sbb ebx,-1
  147. mov eax,DWORD [16+edi]
  148. sbb ecx,-1
  149. mov ebx,DWORD [20+edi]
  150. sbb edx,0
  151. mov ecx,DWORD [24+edi]
  152. sbb eax,0
  153. mov edx,DWORD [28+edi]
  154. sbb ebx,0
  155. sbb ecx,1
  156. sbb edx,-1
  157. sbb esi,0
  158. not esi
  159. mov eax,DWORD [edi]
  160. mov ebp,esi
  161. mov ebx,DWORD [4+edi]
  162. shr ebp,31
  163. mov ecx,DWORD [8+edi]
  164. sub eax,esi
  165. mov edx,DWORD [12+edi]
  166. sbb ebx,esi
  167. mov DWORD [edi],eax
  168. sbb ecx,esi
  169. mov DWORD [4+edi],ebx
  170. sbb edx,0
  171. mov DWORD [8+edi],ecx
  172. mov DWORD [12+edi],edx
  173. mov eax,DWORD [16+edi]
  174. mov ebx,DWORD [20+edi]
  175. mov ecx,DWORD [24+edi]
  176. sbb eax,0
  177. mov edx,DWORD [28+edi]
  178. sbb ebx,0
  179. mov DWORD [16+edi],eax
  180. sbb ecx,ebp
  181. mov DWORD [20+edi],ebx
  182. sbb edx,esi
  183. mov DWORD [24+edi],ecx
  184. mov DWORD [28+edi],edx
  185. ret
  186. align 16
  187. __ecp_nistz256_sub:
  188. mov eax,DWORD [esi]
  189. mov ebx,DWORD [4+esi]
  190. mov ecx,DWORD [8+esi]
  191. sub eax,DWORD [ebp]
  192. mov edx,DWORD [12+esi]
  193. sbb ebx,DWORD [4+ebp]
  194. mov DWORD [edi],eax
  195. sbb ecx,DWORD [8+ebp]
  196. mov DWORD [4+edi],ebx
  197. sbb edx,DWORD [12+ebp]
  198. mov DWORD [8+edi],ecx
  199. mov DWORD [12+edi],edx
  200. mov eax,DWORD [16+esi]
  201. mov ebx,DWORD [20+esi]
  202. mov ecx,DWORD [24+esi]
  203. sbb eax,DWORD [16+ebp]
  204. mov edx,DWORD [28+esi]
  205. sbb ebx,DWORD [20+ebp]
  206. sbb ecx,DWORD [24+ebp]
  207. mov DWORD [16+edi],eax
  208. sbb edx,DWORD [28+ebp]
  209. mov DWORD [20+edi],ebx
  210. sbb esi,esi
  211. mov DWORD [24+edi],ecx
  212. mov DWORD [28+edi],edx
  213. mov eax,DWORD [edi]
  214. mov ebp,esi
  215. mov ebx,DWORD [4+edi]
  216. shr ebp,31
  217. mov ecx,DWORD [8+edi]
  218. add eax,esi
  219. mov edx,DWORD [12+edi]
  220. adc ebx,esi
  221. mov DWORD [edi],eax
  222. adc ecx,esi
  223. mov DWORD [4+edi],ebx
  224. adc edx,0
  225. mov DWORD [8+edi],ecx
  226. mov DWORD [12+edi],edx
  227. mov eax,DWORD [16+edi]
  228. mov ebx,DWORD [20+edi]
  229. mov ecx,DWORD [24+edi]
  230. adc eax,0
  231. mov edx,DWORD [28+edi]
  232. adc ebx,0
  233. mov DWORD [16+edi],eax
  234. adc ecx,ebp
  235. mov DWORD [20+edi],ebx
  236. adc edx,esi
  237. mov DWORD [24+edi],ecx
  238. mov DWORD [28+edi],edx
  239. ret
  240. global _GFp_nistz256_neg
  241. align 16
  242. _GFp_nistz256_neg:
  243. L$_GFp_nistz256_neg_begin:
  244. push ebp
  245. push ebx
  246. push esi
  247. push edi
  248. mov ebp,DWORD [24+esp]
  249. mov edi,DWORD [20+esp]
  250. xor eax,eax
  251. sub esp,32
  252. mov DWORD [esp],eax
  253. mov esi,esp
  254. mov DWORD [4+esp],eax
  255. mov DWORD [8+esp],eax
  256. mov DWORD [12+esp],eax
  257. mov DWORD [16+esp],eax
  258. mov DWORD [20+esp],eax
  259. mov DWORD [24+esp],eax
  260. mov DWORD [28+esp],eax
  261. call __ecp_nistz256_sub
  262. add esp,32
  263. pop edi
  264. pop esi
  265. pop ebx
  266. pop ebp
  267. ret
  268. align 16
  269. __picup_eax:
  270. mov eax,DWORD [esp]
  271. ret
  272. global _GFp_nistz256_mul_mont
  273. align 16
  274. _GFp_nistz256_mul_mont:
  275. L$_GFp_nistz256_mul_mont_begin:
  276. push ebp
  277. push ebx
  278. push esi
  279. push edi
  280. mov esi,DWORD [24+esp]
  281. mov ebp,DWORD [28+esp]
  282. call __picup_eax
  283. L$000pic:
  284. lea eax,[_GFp_ia32cap_P]
  285. mov eax,DWORD [eax]
  286. mov edi,DWORD [20+esp]
  287. call __ecp_nistz256_mul_mont
  288. pop edi
  289. pop esi
  290. pop ebx
  291. pop ebp
  292. ret
  293. align 16
  294. __ecp_nistz256_mul_mont:
  295. mov edx,esp
  296. sub esp,256
  297. movd xmm7,DWORD [ebp]
  298. lea ebp,[4+ebp]
  299. pcmpeqd xmm6,xmm6
  300. psrlq xmm6,48
  301. pshuflw xmm7,xmm7,220
  302. and esp,-64
  303. pshufd xmm7,xmm7,220
  304. lea ebx,[128+esp]
  305. movd xmm0,DWORD [esi]
  306. pshufd xmm0,xmm0,204
  307. movd xmm1,DWORD [4+esi]
  308. movdqa [ebx],xmm0
  309. pmuludq xmm0,xmm7
  310. movd xmm2,DWORD [8+esi]
  311. pshufd xmm1,xmm1,204
  312. movdqa [16+ebx],xmm1
  313. pmuludq xmm1,xmm7
  314. movq xmm4,xmm0
  315. pslldq xmm4,6
  316. paddq xmm4,xmm0
  317. movdqa xmm5,xmm4
  318. psrldq xmm4,10
  319. pand xmm5,xmm6
  320. movd xmm3,DWORD [12+esi]
  321. pshufd xmm2,xmm2,204
  322. movdqa [32+ebx],xmm2
  323. pmuludq xmm2,xmm7
  324. paddq xmm1,xmm4
  325. movdqa [esp],xmm1
  326. movd xmm0,DWORD [16+esi]
  327. pshufd xmm3,xmm3,204
  328. movdqa [48+ebx],xmm3
  329. pmuludq xmm3,xmm7
  330. movdqa [16+esp],xmm2
  331. movd xmm1,DWORD [20+esi]
  332. pshufd xmm0,xmm0,204
  333. movdqa [64+ebx],xmm0
  334. pmuludq xmm0,xmm7
  335. paddq xmm3,xmm5
  336. movdqa [32+esp],xmm3
  337. movd xmm2,DWORD [24+esi]
  338. pshufd xmm1,xmm1,204
  339. movdqa [80+ebx],xmm1
  340. pmuludq xmm1,xmm7
  341. movdqa [48+esp],xmm0
  342. pshufd xmm4,xmm5,177
  343. movd xmm3,DWORD [28+esi]
  344. pshufd xmm2,xmm2,204
  345. movdqa [96+ebx],xmm2
  346. pmuludq xmm2,xmm7
  347. movdqa [64+esp],xmm1
  348. psubq xmm4,xmm5
  349. movd xmm0,DWORD [ebp]
  350. pshufd xmm3,xmm3,204
  351. movdqa [112+ebx],xmm3
  352. pmuludq xmm3,xmm7
  353. pshuflw xmm7,xmm0,220
  354. movdqa xmm0,[ebx]
  355. pshufd xmm7,xmm7,220
  356. mov ecx,6
  357. lea ebp,[4+ebp]
  358. jmp NEAR L$001madd_sse2
  359. align 16
  360. L$001madd_sse2:
  361. paddq xmm2,xmm5
  362. paddq xmm3,xmm4
  363. movdqa xmm1,[16+ebx]
  364. pmuludq xmm0,xmm7
  365. movdqa [80+esp],xmm2
  366. movdqa xmm2,[32+ebx]
  367. pmuludq xmm1,xmm7
  368. movdqa [96+esp],xmm3
  369. paddq xmm0,[esp]
  370. movdqa xmm3,[48+ebx]
  371. pmuludq xmm2,xmm7
  372. movq xmm4,xmm0
  373. pslldq xmm4,6
  374. paddq xmm1,[16+esp]
  375. paddq xmm4,xmm0
  376. movdqa xmm5,xmm4
  377. psrldq xmm4,10
  378. movdqa xmm0,[64+ebx]
  379. pmuludq xmm3,xmm7
  380. paddq xmm1,xmm4
  381. paddq xmm2,[32+esp]
  382. movdqa [esp],xmm1
  383. movdqa xmm1,[80+ebx]
  384. pmuludq xmm0,xmm7
  385. paddq xmm3,[48+esp]
  386. movdqa [16+esp],xmm2
  387. pand xmm5,xmm6
  388. movdqa xmm2,[96+ebx]
  389. pmuludq xmm1,xmm7
  390. paddq xmm3,xmm5
  391. paddq xmm0,[64+esp]
  392. movdqa [32+esp],xmm3
  393. pshufd xmm4,xmm5,177
  394. movdqa xmm3,xmm7
  395. pmuludq xmm2,xmm7
  396. movd xmm7,DWORD [ebp]
  397. lea ebp,[4+ebp]
  398. paddq xmm1,[80+esp]
  399. psubq xmm4,xmm5
  400. movdqa [48+esp],xmm0
  401. pshuflw xmm7,xmm7,220
  402. pmuludq xmm3,[112+ebx]
  403. pshufd xmm7,xmm7,220
  404. movdqa xmm0,[ebx]
  405. movdqa [64+esp],xmm1
  406. paddq xmm2,[96+esp]
  407. dec ecx
  408. jnz NEAR L$001madd_sse2
  409. paddq xmm2,xmm5
  410. paddq xmm3,xmm4
  411. movdqa xmm1,[16+ebx]
  412. pmuludq xmm0,xmm7
  413. movdqa [80+esp],xmm2
  414. movdqa xmm2,[32+ebx]
  415. pmuludq xmm1,xmm7
  416. movdqa [96+esp],xmm3
  417. paddq xmm0,[esp]
  418. movdqa xmm3,[48+ebx]
  419. pmuludq xmm2,xmm7
  420. movq xmm4,xmm0
  421. pslldq xmm4,6
  422. paddq xmm1,[16+esp]
  423. paddq xmm4,xmm0
  424. movdqa xmm5,xmm4
  425. psrldq xmm4,10
  426. movdqa xmm0,[64+ebx]
  427. pmuludq xmm3,xmm7
  428. paddq xmm1,xmm4
  429. paddq xmm2,[32+esp]
  430. movdqa [esp],xmm1
  431. movdqa xmm1,[80+ebx]
  432. pmuludq xmm0,xmm7
  433. paddq xmm3,[48+esp]
  434. movdqa [16+esp],xmm2
  435. pand xmm5,xmm6
  436. movdqa xmm2,[96+ebx]
  437. pmuludq xmm1,xmm7
  438. paddq xmm3,xmm5
  439. paddq xmm0,[64+esp]
  440. movdqa [32+esp],xmm3
  441. pshufd xmm4,xmm5,177
  442. movdqa xmm3,[112+ebx]
  443. pmuludq xmm2,xmm7
  444. paddq xmm1,[80+esp]
  445. psubq xmm4,xmm5
  446. movdqa [48+esp],xmm0
  447. pmuludq xmm3,xmm7
  448. pcmpeqd xmm7,xmm7
  449. movdqa xmm0,[esp]
  450. pslldq xmm7,8
  451. movdqa [64+esp],xmm1
  452. paddq xmm2,[96+esp]
  453. paddq xmm2,xmm5
  454. paddq xmm3,xmm4
  455. movdqa [80+esp],xmm2
  456. movdqa [96+esp],xmm3
  457. movdqa xmm1,[16+esp]
  458. movdqa xmm2,[32+esp]
  459. movdqa xmm3,[48+esp]
  460. movq xmm4,xmm0
  461. pand xmm0,xmm7
  462. xor ebp,ebp
  463. pslldq xmm4,6
  464. movq xmm5,xmm1
  465. paddq xmm0,xmm4
  466. pand xmm1,xmm7
  467. psrldq xmm0,6
  468. movd eax,xmm0
  469. psrldq xmm0,4
  470. paddq xmm5,xmm0
  471. movdqa xmm0,[64+esp]
  472. sub eax,-1
  473. pslldq xmm5,6
  474. movq xmm4,xmm2
  475. paddq xmm1,xmm5
  476. pand xmm2,xmm7
  477. psrldq xmm1,6
  478. mov DWORD [edi],eax
  479. movd eax,xmm1
  480. psrldq xmm1,4
  481. paddq xmm4,xmm1
  482. movdqa xmm1,[80+esp]
  483. sbb eax,-1
  484. pslldq xmm4,6
  485. movq xmm5,xmm3
  486. paddq xmm2,xmm4
  487. pand xmm3,xmm7
  488. psrldq xmm2,6
  489. mov DWORD [4+edi],eax
  490. movd eax,xmm2
  491. psrldq xmm2,4
  492. paddq xmm5,xmm2
  493. movdqa xmm2,[96+esp]
  494. sbb eax,-1
  495. pslldq xmm5,6
  496. movq xmm4,xmm0
  497. paddq xmm3,xmm5
  498. pand xmm0,xmm7
  499. psrldq xmm3,6
  500. mov DWORD [8+edi],eax
  501. movd eax,xmm3
  502. psrldq xmm3,4
  503. paddq xmm4,xmm3
  504. sbb eax,0
  505. pslldq xmm4,6
  506. movq xmm5,xmm1
  507. paddq xmm0,xmm4
  508. pand xmm1,xmm7
  509. psrldq xmm0,6
  510. mov DWORD [12+edi],eax
  511. movd eax,xmm0
  512. psrldq xmm0,4
  513. paddq xmm5,xmm0
  514. sbb eax,0
  515. pslldq xmm5,6
  516. movq xmm4,xmm2
  517. paddq xmm1,xmm5
  518. pand xmm2,xmm7
  519. psrldq xmm1,6
  520. movd ebx,xmm1
  521. psrldq xmm1,4
  522. mov esp,edx
  523. paddq xmm4,xmm1
  524. pslldq xmm4,6
  525. paddq xmm2,xmm4
  526. psrldq xmm2,6
  527. movd ecx,xmm2
  528. psrldq xmm2,4
  529. sbb ebx,0
  530. movd edx,xmm2
  531. pextrw esi,xmm2,2
  532. sbb ecx,1
  533. sbb edx,-1
  534. sbb esi,0
  535. sub ebp,esi
  536. add DWORD [edi],esi
  537. adc DWORD [4+edi],esi
  538. adc DWORD [8+edi],esi
  539. adc DWORD [12+edi],0
  540. adc eax,0
  541. adc ebx,0
  542. mov DWORD [16+edi],eax
  543. adc ecx,ebp
  544. mov DWORD [20+edi],ebx
  545. adc edx,esi
  546. mov DWORD [24+edi],ecx
  547. mov DWORD [28+edi],edx
  548. ret
  549. global _GFp_nistz256_point_double
  550. align 16
  551. _GFp_nistz256_point_double:
  552. L$_GFp_nistz256_point_double_begin:
  553. push ebp
  554. push ebx
  555. push esi
  556. push edi
  557. mov esi,DWORD [24+esp]
  558. sub esp,164
  559. call __picup_eax
  560. L$002pic:
  561. lea edx,[_GFp_ia32cap_P]
  562. mov ebp,DWORD [edx]
  563. L$point_double_shortcut:
  564. mov eax,DWORD [esi]
  565. mov ebx,DWORD [4+esi]
  566. mov ecx,DWORD [8+esi]
  567. mov edx,DWORD [12+esi]
  568. mov DWORD [96+esp],eax
  569. mov DWORD [100+esp],ebx
  570. mov DWORD [104+esp],ecx
  571. mov DWORD [108+esp],edx
  572. mov eax,DWORD [16+esi]
  573. mov ebx,DWORD [20+esi]
  574. mov ecx,DWORD [24+esi]
  575. mov edx,DWORD [28+esi]
  576. mov DWORD [112+esp],eax
  577. mov DWORD [116+esp],ebx
  578. mov DWORD [120+esp],ecx
  579. mov DWORD [124+esp],edx
  580. mov DWORD [160+esp],ebp
  581. lea ebp,[32+esi]
  582. lea esi,[32+esi]
  583. lea edi,[esp]
  584. call __ecp_nistz256_add
  585. mov eax,DWORD [160+esp]
  586. mov esi,64
  587. add esi,DWORD [188+esp]
  588. lea edi,[64+esp]
  589. mov ebp,esi
  590. call __ecp_nistz256_mul_mont
  591. mov eax,DWORD [160+esp]
  592. lea esi,[esp]
  593. lea ebp,[esp]
  594. lea edi,[esp]
  595. call __ecp_nistz256_mul_mont
  596. mov eax,DWORD [160+esp]
  597. mov ebp,DWORD [188+esp]
  598. lea esi,[32+ebp]
  599. lea ebp,[64+ebp]
  600. lea edi,[128+esp]
  601. call __ecp_nistz256_mul_mont
  602. lea esi,[96+esp]
  603. lea ebp,[64+esp]
  604. lea edi,[32+esp]
  605. call __ecp_nistz256_add
  606. mov edi,64
  607. lea esi,[128+esp]
  608. lea ebp,[128+esp]
  609. add edi,DWORD [184+esp]
  610. call __ecp_nistz256_add
  611. lea esi,[96+esp]
  612. lea ebp,[64+esp]
  613. lea edi,[64+esp]
  614. call __ecp_nistz256_sub
  615. mov eax,DWORD [160+esp]
  616. lea esi,[esp]
  617. lea ebp,[esp]
  618. lea edi,[128+esp]
  619. call __ecp_nistz256_mul_mont
  620. mov eax,DWORD [160+esp]
  621. lea esi,[32+esp]
  622. lea ebp,[64+esp]
  623. lea edi,[32+esp]
  624. call __ecp_nistz256_mul_mont
  625. mov edi,32
  626. lea esi,[128+esp]
  627. add edi,DWORD [184+esp]
  628. call __ecp_nistz256_div_by_2
  629. lea esi,[32+esp]
  630. lea ebp,[32+esp]
  631. lea edi,[128+esp]
  632. call __ecp_nistz256_add
  633. mov eax,DWORD [160+esp]
  634. lea esi,[96+esp]
  635. lea ebp,[esp]
  636. lea edi,[esp]
  637. call __ecp_nistz256_mul_mont
  638. lea esi,[128+esp]
  639. lea ebp,[32+esp]
  640. lea edi,[32+esp]
  641. call __ecp_nistz256_add
  642. lea esi,[esp]
  643. lea ebp,[esp]
  644. lea edi,[128+esp]
  645. call __ecp_nistz256_add
  646. mov eax,DWORD [160+esp]
  647. lea esi,[32+esp]
  648. lea ebp,[32+esp]
  649. mov edi,DWORD [184+esp]
  650. call __ecp_nistz256_mul_mont
  651. mov esi,edi
  652. lea ebp,[128+esp]
  653. call __ecp_nistz256_sub
  654. lea esi,[esp]
  655. mov ebp,edi
  656. lea edi,[esp]
  657. call __ecp_nistz256_sub
  658. mov eax,DWORD [160+esp]
  659. mov esi,edi
  660. lea ebp,[32+esp]
  661. call __ecp_nistz256_mul_mont
  662. mov ebp,32
  663. lea esi,[esp]
  664. add ebp,DWORD [184+esp]
  665. mov edi,ebp
  666. call __ecp_nistz256_sub
  667. add esp,164
  668. pop edi
  669. pop esi
  670. pop ebx
  671. pop ebp
  672. ret
  673. global _GFp_nistz256_point_add_affine
  674. align 16
  675. _GFp_nistz256_point_add_affine:
  676. L$_GFp_nistz256_point_add_affine_begin:
  677. push ebp
  678. push ebx
  679. push esi
  680. push edi
  681. mov esi,DWORD [24+esp]
  682. sub esp,492
  683. call __picup_eax
  684. L$003pic:
  685. lea edx,[_GFp_ia32cap_P]
  686. mov ebp,DWORD [edx]
  687. lea edi,[96+esp]
  688. mov eax,DWORD [esi]
  689. mov ebx,DWORD [4+esi]
  690. mov ecx,DWORD [8+esi]
  691. mov edx,DWORD [12+esi]
  692. mov DWORD [edi],eax
  693. mov DWORD [488+esp],ebp
  694. mov DWORD [4+edi],ebx
  695. mov DWORD [8+edi],ecx
  696. mov DWORD [12+edi],edx
  697. mov eax,DWORD [16+esi]
  698. mov ebx,DWORD [20+esi]
  699. mov ecx,DWORD [24+esi]
  700. mov edx,DWORD [28+esi]
  701. mov DWORD [16+edi],eax
  702. mov DWORD [20+edi],ebx
  703. mov DWORD [24+edi],ecx
  704. mov DWORD [28+edi],edx
  705. mov eax,DWORD [32+esi]
  706. mov ebx,DWORD [36+esi]
  707. mov ecx,DWORD [40+esi]
  708. mov edx,DWORD [44+esi]
  709. mov DWORD [32+edi],eax
  710. mov DWORD [36+edi],ebx
  711. mov DWORD [40+edi],ecx
  712. mov DWORD [44+edi],edx
  713. mov eax,DWORD [48+esi]
  714. mov ebx,DWORD [52+esi]
  715. mov ecx,DWORD [56+esi]
  716. mov edx,DWORD [60+esi]
  717. mov DWORD [48+edi],eax
  718. mov DWORD [52+edi],ebx
  719. mov DWORD [56+edi],ecx
  720. mov DWORD [60+edi],edx
  721. mov eax,DWORD [64+esi]
  722. mov ebx,DWORD [68+esi]
  723. mov ecx,DWORD [72+esi]
  724. mov edx,DWORD [76+esi]
  725. mov DWORD [64+edi],eax
  726. mov ebp,eax
  727. mov DWORD [68+edi],ebx
  728. or ebp,ebx
  729. mov DWORD [72+edi],ecx
  730. or ebp,ecx
  731. mov DWORD [76+edi],edx
  732. or ebp,edx
  733. mov eax,DWORD [80+esi]
  734. mov ebx,DWORD [84+esi]
  735. mov ecx,DWORD [88+esi]
  736. mov edx,DWORD [92+esi]
  737. mov DWORD [80+edi],eax
  738. or ebp,eax
  739. mov DWORD [84+edi],ebx
  740. or ebp,ebx
  741. mov DWORD [88+edi],ecx
  742. or ebp,ecx
  743. mov DWORD [92+edi],edx
  744. or ebp,edx
  745. xor eax,eax
  746. mov esi,DWORD [520+esp]
  747. sub eax,ebp
  748. or ebp,eax
  749. sar ebp,31
  750. mov DWORD [480+esp],ebp
  751. lea edi,[192+esp]
  752. mov eax,DWORD [esi]
  753. mov ebx,DWORD [4+esi]
  754. mov ecx,DWORD [8+esi]
  755. mov edx,DWORD [12+esi]
  756. mov DWORD [edi],eax
  757. mov ebp,eax
  758. mov DWORD [4+edi],ebx
  759. or ebp,ebx
  760. mov DWORD [8+edi],ecx
  761. or ebp,ecx
  762. mov DWORD [12+edi],edx
  763. or ebp,edx
  764. mov eax,DWORD [16+esi]
  765. mov ebx,DWORD [20+esi]
  766. mov ecx,DWORD [24+esi]
  767. mov edx,DWORD [28+esi]
  768. mov DWORD [16+edi],eax
  769. or ebp,eax
  770. mov DWORD [20+edi],ebx
  771. or ebp,ebx
  772. mov DWORD [24+edi],ecx
  773. or ebp,ecx
  774. mov DWORD [28+edi],edx
  775. or ebp,edx
  776. mov eax,DWORD [32+esi]
  777. mov ebx,DWORD [36+esi]
  778. mov ecx,DWORD [40+esi]
  779. mov edx,DWORD [44+esi]
  780. mov DWORD [32+edi],eax
  781. or ebp,eax
  782. mov DWORD [36+edi],ebx
  783. or ebp,ebx
  784. mov DWORD [40+edi],ecx
  785. or ebp,ecx
  786. mov DWORD [44+edi],edx
  787. or ebp,edx
  788. mov eax,DWORD [48+esi]
  789. mov ebx,DWORD [52+esi]
  790. mov ecx,DWORD [56+esi]
  791. mov edx,DWORD [60+esi]
  792. mov DWORD [48+edi],eax
  793. or ebp,eax
  794. mov DWORD [52+edi],ebx
  795. or ebp,ebx
  796. mov DWORD [56+edi],ecx
  797. or ebp,ecx
  798. mov DWORD [60+edi],edx
  799. or ebp,edx
  800. xor ebx,ebx
  801. mov eax,DWORD [488+esp]
  802. sub ebx,ebp
  803. lea esi,[160+esp]
  804. or ebx,ebp
  805. lea ebp,[160+esp]
  806. sar ebx,31
  807. lea edi,[288+esp]
  808. mov DWORD [484+esp],ebx
  809. call __ecp_nistz256_mul_mont
  810. mov eax,DWORD [488+esp]
  811. lea esi,[192+esp]
  812. mov ebp,edi
  813. lea edi,[256+esp]
  814. call __ecp_nistz256_mul_mont
  815. mov eax,DWORD [488+esp]
  816. lea esi,[160+esp]
  817. lea ebp,[288+esp]
  818. lea edi,[288+esp]
  819. call __ecp_nistz256_mul_mont
  820. lea esi,[256+esp]
  821. lea ebp,[96+esp]
  822. lea edi,[320+esp]
  823. call __ecp_nistz256_sub
  824. mov eax,DWORD [488+esp]
  825. lea esi,[224+esp]
  826. lea ebp,[288+esp]
  827. lea edi,[288+esp]
  828. call __ecp_nistz256_mul_mont
  829. mov eax,DWORD [488+esp]
  830. lea esi,[160+esp]
  831. lea ebp,[320+esp]
  832. lea edi,[64+esp]
  833. call __ecp_nistz256_mul_mont
  834. lea esi,[288+esp]
  835. lea ebp,[128+esp]
  836. lea edi,[352+esp]
  837. call __ecp_nistz256_sub
  838. mov eax,DWORD [488+esp]
  839. lea esi,[320+esp]
  840. lea ebp,[320+esp]
  841. lea edi,[384+esp]
  842. call __ecp_nistz256_mul_mont
  843. mov eax,DWORD [488+esp]
  844. lea esi,[352+esp]
  845. lea ebp,[352+esp]
  846. lea edi,[448+esp]
  847. call __ecp_nistz256_mul_mont
  848. mov eax,DWORD [488+esp]
  849. lea esi,[96+esp]
  850. lea ebp,[384+esp]
  851. lea edi,[256+esp]
  852. call __ecp_nistz256_mul_mont
  853. mov eax,DWORD [488+esp]
  854. lea esi,[320+esp]
  855. lea ebp,[384+esp]
  856. lea edi,[416+esp]
  857. call __ecp_nistz256_mul_mont
  858. lea esi,[256+esp]
  859. lea ebp,[256+esp]
  860. lea edi,[384+esp]
  861. call __ecp_nistz256_add
  862. lea esi,[448+esp]
  863. lea ebp,[384+esp]
  864. lea edi,[esp]
  865. call __ecp_nistz256_sub
  866. lea esi,[esp]
  867. lea ebp,[416+esp]
  868. lea edi,[esp]
  869. call __ecp_nistz256_sub
  870. lea esi,[256+esp]
  871. lea ebp,[esp]
  872. lea edi,[32+esp]
  873. call __ecp_nistz256_sub
  874. mov eax,DWORD [488+esp]
  875. lea esi,[416+esp]
  876. lea ebp,[128+esp]
  877. lea edi,[288+esp]
  878. call __ecp_nistz256_mul_mont
  879. mov eax,DWORD [488+esp]
  880. lea esi,[352+esp]
  881. lea ebp,[32+esp]
  882. lea edi,[32+esp]
  883. call __ecp_nistz256_mul_mont
  884. lea esi,[32+esp]
  885. lea ebp,[288+esp]
  886. lea edi,[32+esp]
  887. call __ecp_nistz256_sub
  888. mov ebp,DWORD [480+esp]
  889. mov esi,DWORD [484+esp]
  890. mov edi,DWORD [512+esp]
  891. mov edx,ebp
  892. not ebp
  893. and edx,esi
  894. and ebp,esi
  895. not esi
  896. mov eax,edx
  897. and eax,DWORD [64+esp]
  898. mov ebx,ebp
  899. and ebx,1
  900. mov ecx,esi
  901. and ecx,DWORD [160+esp]
  902. or eax,ebx
  903. or eax,ecx
  904. mov DWORD [64+edi],eax
  905. mov eax,edx
  906. and eax,DWORD [68+esp]
  907. mov ecx,esi
  908. and ecx,DWORD [164+esp]
  909. or eax,ecx
  910. mov DWORD [68+edi],eax
  911. mov eax,edx
  912. and eax,DWORD [72+esp]
  913. mov ecx,esi
  914. and ecx,DWORD [168+esp]
  915. or eax,ecx
  916. mov DWORD [72+edi],eax
  917. mov eax,edx
  918. and eax,DWORD [76+esp]
  919. mov ecx,esi
  920. and ecx,DWORD [172+esp]
  921. or eax,ebp
  922. or eax,ecx
  923. mov DWORD [76+edi],eax
  924. mov eax,edx
  925. and eax,DWORD [80+esp]
  926. mov ecx,esi
  927. and ecx,DWORD [176+esp]
  928. or eax,ebp
  929. or eax,ecx
  930. mov DWORD [80+edi],eax
  931. mov eax,edx
  932. and eax,DWORD [84+esp]
  933. mov ecx,esi
  934. and ecx,DWORD [180+esp]
  935. or eax,ebp
  936. or eax,ecx
  937. mov DWORD [84+edi],eax
  938. mov eax,edx
  939. and eax,DWORD [88+esp]
  940. mov ebx,ebp
  941. and ebx,-2
  942. mov ecx,esi
  943. and ecx,DWORD [184+esp]
  944. or eax,ebx
  945. or eax,ecx
  946. mov DWORD [88+edi],eax
  947. mov eax,edx
  948. and eax,DWORD [92+esp]
  949. mov ecx,esi
  950. and ecx,DWORD [188+esp]
  951. or eax,ecx
  952. mov DWORD [92+edi],eax
  953. mov eax,edx
  954. and eax,DWORD [esp]
  955. mov ebx,ebp
  956. and ebx,DWORD [192+esp]
  957. mov ecx,esi
  958. and ecx,DWORD [96+esp]
  959. or eax,ebx
  960. or eax,ecx
  961. mov DWORD [edi],eax
  962. mov eax,edx
  963. and eax,DWORD [4+esp]
  964. mov ebx,ebp
  965. and ebx,DWORD [196+esp]
  966. mov ecx,esi
  967. and ecx,DWORD [100+esp]
  968. or eax,ebx
  969. or eax,ecx
  970. mov DWORD [4+edi],eax
  971. mov eax,edx
  972. and eax,DWORD [8+esp]
  973. mov ebx,ebp
  974. and ebx,DWORD [200+esp]
  975. mov ecx,esi
  976. and ecx,DWORD [104+esp]
  977. or eax,ebx
  978. or eax,ecx
  979. mov DWORD [8+edi],eax
  980. mov eax,edx
  981. and eax,DWORD [12+esp]
  982. mov ebx,ebp
  983. and ebx,DWORD [204+esp]
  984. mov ecx,esi
  985. and ecx,DWORD [108+esp]
  986. or eax,ebx
  987. or eax,ecx
  988. mov DWORD [12+edi],eax
  989. mov eax,edx
  990. and eax,DWORD [16+esp]
  991. mov ebx,ebp
  992. and ebx,DWORD [208+esp]
  993. mov ecx,esi
  994. and ecx,DWORD [112+esp]
  995. or eax,ebx
  996. or eax,ecx
  997. mov DWORD [16+edi],eax
  998. mov eax,edx
  999. and eax,DWORD [20+esp]
  1000. mov ebx,ebp
  1001. and ebx,DWORD [212+esp]
  1002. mov ecx,esi
  1003. and ecx,DWORD [116+esp]
  1004. or eax,ebx
  1005. or eax,ecx
  1006. mov DWORD [20+edi],eax
  1007. mov eax,edx
  1008. and eax,DWORD [24+esp]
  1009. mov ebx,ebp
  1010. and ebx,DWORD [216+esp]
  1011. mov ecx,esi
  1012. and ecx,DWORD [120+esp]
  1013. or eax,ebx
  1014. or eax,ecx
  1015. mov DWORD [24+edi],eax
  1016. mov eax,edx
  1017. and eax,DWORD [28+esp]
  1018. mov ebx,ebp
  1019. and ebx,DWORD [220+esp]
  1020. mov ecx,esi
  1021. and ecx,DWORD [124+esp]
  1022. or eax,ebx
  1023. or eax,ecx
  1024. mov DWORD [28+edi],eax
  1025. mov eax,edx
  1026. and eax,DWORD [32+esp]
  1027. mov ebx,ebp
  1028. and ebx,DWORD [224+esp]
  1029. mov ecx,esi
  1030. and ecx,DWORD [128+esp]
  1031. or eax,ebx
  1032. or eax,ecx
  1033. mov DWORD [32+edi],eax
  1034. mov eax,edx
  1035. and eax,DWORD [36+esp]
  1036. mov ebx,ebp
  1037. and ebx,DWORD [228+esp]
  1038. mov ecx,esi
  1039. and ecx,DWORD [132+esp]
  1040. or eax,ebx
  1041. or eax,ecx
  1042. mov DWORD [36+edi],eax
  1043. mov eax,edx
  1044. and eax,DWORD [40+esp]
  1045. mov ebx,ebp
  1046. and ebx,DWORD [232+esp]
  1047. mov ecx,esi
  1048. and ecx,DWORD [136+esp]
  1049. or eax,ebx
  1050. or eax,ecx
  1051. mov DWORD [40+edi],eax
  1052. mov eax,edx
  1053. and eax,DWORD [44+esp]
  1054. mov ebx,ebp
  1055. and ebx,DWORD [236+esp]
  1056. mov ecx,esi
  1057. and ecx,DWORD [140+esp]
  1058. or eax,ebx
  1059. or eax,ecx
  1060. mov DWORD [44+edi],eax
  1061. mov eax,edx
  1062. and eax,DWORD [48+esp]
  1063. mov ebx,ebp
  1064. and ebx,DWORD [240+esp]
  1065. mov ecx,esi
  1066. and ecx,DWORD [144+esp]
  1067. or eax,ebx
  1068. or eax,ecx
  1069. mov DWORD [48+edi],eax
  1070. mov eax,edx
  1071. and eax,DWORD [52+esp]
  1072. mov ebx,ebp
  1073. and ebx,DWORD [244+esp]
  1074. mov ecx,esi
  1075. and ecx,DWORD [148+esp]
  1076. or eax,ebx
  1077. or eax,ecx
  1078. mov DWORD [52+edi],eax
  1079. mov eax,edx
  1080. and eax,DWORD [56+esp]
  1081. mov ebx,ebp
  1082. and ebx,DWORD [248+esp]
  1083. mov ecx,esi
  1084. and ecx,DWORD [152+esp]
  1085. or eax,ebx
  1086. or eax,ecx
  1087. mov DWORD [56+edi],eax
  1088. mov eax,edx
  1089. and eax,DWORD [60+esp]
  1090. mov ebx,ebp
  1091. and ebx,DWORD [252+esp]
  1092. mov ecx,esi
  1093. and ecx,DWORD [156+esp]
  1094. or eax,ebx
  1095. or eax,ecx
  1096. mov DWORD [60+edi],eax
  1097. add esp,492
  1098. pop edi
  1099. pop esi
  1100. pop ebx
  1101. pop ebp
  1102. ret
  1103. segment .bss
  1104. common _GFp_ia32cap_P 16