rsaz-avx2.s 37 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744
  1. .text
  2. .globl _rsaz_1024_sqr_avx2
  3. .p2align 6
  4. _rsaz_1024_sqr_avx2:
  5. leaq (%rsp),%rax
  6. pushq %rbx
  7. pushq %rbp
  8. pushq %r12
  9. pushq %r13
  10. pushq %r14
  11. pushq %r15
  12. vzeroupper
  13. movq %rax,%rbp
  14. movq %rdx,%r13
  15. subq $832,%rsp
  16. movq %r13,%r15
  17. subq $-128,%rdi
  18. subq $-128,%rsi
  19. subq $-128,%r13
  20. andq $4095,%r15
  21. addq $320,%r15
  22. shrq $12,%r15
  23. vpxor %ymm9,%ymm9,%ymm9
  24. jz L$sqr_1024_no_n_copy
  25. subq $320,%rsp
  26. vmovdqu 0-128(%r13),%ymm0
  27. andq $-2048,%rsp
  28. vmovdqu 32-128(%r13),%ymm1
  29. vmovdqu 64-128(%r13),%ymm2
  30. vmovdqu 96-128(%r13),%ymm3
  31. vmovdqu 128-128(%r13),%ymm4
  32. vmovdqu 160-128(%r13),%ymm5
  33. vmovdqu 192-128(%r13),%ymm6
  34. vmovdqu 224-128(%r13),%ymm7
  35. vmovdqu 256-128(%r13),%ymm8
  36. leaq 832+128(%rsp),%r13
  37. vmovdqu %ymm0,0-128(%r13)
  38. vmovdqu %ymm1,32-128(%r13)
  39. vmovdqu %ymm2,64-128(%r13)
  40. vmovdqu %ymm3,96-128(%r13)
  41. vmovdqu %ymm4,128-128(%r13)
  42. vmovdqu %ymm5,160-128(%r13)
  43. vmovdqu %ymm6,192-128(%r13)
  44. vmovdqu %ymm7,224-128(%r13)
  45. vmovdqu %ymm8,256-128(%r13)
  46. vmovdqu %ymm9,288-128(%r13)
  47. L$sqr_1024_no_n_copy:
  48. andq $-1024,%rsp
  49. vmovdqu 32-128(%rsi),%ymm1
  50. vmovdqu 64-128(%rsi),%ymm2
  51. vmovdqu 96-128(%rsi),%ymm3
  52. vmovdqu 128-128(%rsi),%ymm4
  53. vmovdqu 160-128(%rsi),%ymm5
  54. vmovdqu 192-128(%rsi),%ymm6
  55. vmovdqu 224-128(%rsi),%ymm7
  56. vmovdqu 256-128(%rsi),%ymm8
  57. leaq 192(%rsp),%rbx
  58. vmovdqu L$and_mask(%rip),%ymm15
  59. jmp L$OOP_GRANDE_SQR_1024
  60. .p2align 5
  61. L$OOP_GRANDE_SQR_1024:
  62. leaq 576+128(%rsp),%r9
  63. leaq 448(%rsp),%r12
  64. vpaddq %ymm1,%ymm1,%ymm1
  65. vpbroadcastq 0-128(%rsi),%ymm10
  66. vpaddq %ymm2,%ymm2,%ymm2
  67. vmovdqa %ymm1,0-128(%r9)
  68. vpaddq %ymm3,%ymm3,%ymm3
  69. vmovdqa %ymm2,32-128(%r9)
  70. vpaddq %ymm4,%ymm4,%ymm4
  71. vmovdqa %ymm3,64-128(%r9)
  72. vpaddq %ymm5,%ymm5,%ymm5
  73. vmovdqa %ymm4,96-128(%r9)
  74. vpaddq %ymm6,%ymm6,%ymm6
  75. vmovdqa %ymm5,128-128(%r9)
  76. vpaddq %ymm7,%ymm7,%ymm7
  77. vmovdqa %ymm6,160-128(%r9)
  78. vpaddq %ymm8,%ymm8,%ymm8
  79. vmovdqa %ymm7,192-128(%r9)
  80. vpxor %ymm9,%ymm9,%ymm9
  81. vmovdqa %ymm8,224-128(%r9)
  82. vpmuludq 0-128(%rsi),%ymm10,%ymm0
  83. vpbroadcastq 32-128(%rsi),%ymm11
  84. vmovdqu %ymm9,288-192(%rbx)
  85. vpmuludq %ymm10,%ymm1,%ymm1
  86. vmovdqu %ymm9,320-448(%r12)
  87. vpmuludq %ymm10,%ymm2,%ymm2
  88. vmovdqu %ymm9,352-448(%r12)
  89. vpmuludq %ymm10,%ymm3,%ymm3
  90. vmovdqu %ymm9,384-448(%r12)
  91. vpmuludq %ymm10,%ymm4,%ymm4
  92. vmovdqu %ymm9,416-448(%r12)
  93. vpmuludq %ymm10,%ymm5,%ymm5
  94. vmovdqu %ymm9,448-448(%r12)
  95. vpmuludq %ymm10,%ymm6,%ymm6
  96. vmovdqu %ymm9,480-448(%r12)
  97. vpmuludq %ymm10,%ymm7,%ymm7
  98. vmovdqu %ymm9,512-448(%r12)
  99. vpmuludq %ymm10,%ymm8,%ymm8
  100. vpbroadcastq 64-128(%rsi),%ymm10
  101. vmovdqu %ymm9,544-448(%r12)
  102. movq %rsi,%r15
  103. movl $4,%r14d
  104. jmp L$sqr_entry_1024
  105. .p2align 5
  106. L$OOP_SQR_1024:
  107. vpbroadcastq 32-128(%r15),%ymm11
  108. vpmuludq 0-128(%rsi),%ymm10,%ymm0
  109. vpaddq 0-192(%rbx),%ymm0,%ymm0
  110. vpmuludq 0-128(%r9),%ymm10,%ymm1
  111. vpaddq 32-192(%rbx),%ymm1,%ymm1
  112. vpmuludq 32-128(%r9),%ymm10,%ymm2
  113. vpaddq 64-192(%rbx),%ymm2,%ymm2
  114. vpmuludq 64-128(%r9),%ymm10,%ymm3
  115. vpaddq 96-192(%rbx),%ymm3,%ymm3
  116. vpmuludq 96-128(%r9),%ymm10,%ymm4
  117. vpaddq 128-192(%rbx),%ymm4,%ymm4
  118. vpmuludq 128-128(%r9),%ymm10,%ymm5
  119. vpaddq 160-192(%rbx),%ymm5,%ymm5
  120. vpmuludq 160-128(%r9),%ymm10,%ymm6
  121. vpaddq 192-192(%rbx),%ymm6,%ymm6
  122. vpmuludq 192-128(%r9),%ymm10,%ymm7
  123. vpaddq 224-192(%rbx),%ymm7,%ymm7
  124. vpmuludq 224-128(%r9),%ymm10,%ymm8
  125. vpbroadcastq 64-128(%r15),%ymm10
  126. vpaddq 256-192(%rbx),%ymm8,%ymm8
  127. L$sqr_entry_1024:
  128. vmovdqu %ymm0,0-192(%rbx)
  129. vmovdqu %ymm1,32-192(%rbx)
  130. vpmuludq 32-128(%rsi),%ymm11,%ymm12
  131. vpaddq %ymm12,%ymm2,%ymm2
  132. vpmuludq 32-128(%r9),%ymm11,%ymm14
  133. vpaddq %ymm14,%ymm3,%ymm3
  134. vpmuludq 64-128(%r9),%ymm11,%ymm13
  135. vpaddq %ymm13,%ymm4,%ymm4
  136. vpmuludq 96-128(%r9),%ymm11,%ymm12
  137. vpaddq %ymm12,%ymm5,%ymm5
  138. vpmuludq 128-128(%r9),%ymm11,%ymm14
  139. vpaddq %ymm14,%ymm6,%ymm6
  140. vpmuludq 160-128(%r9),%ymm11,%ymm13
  141. vpaddq %ymm13,%ymm7,%ymm7
  142. vpmuludq 192-128(%r9),%ymm11,%ymm12
  143. vpaddq %ymm12,%ymm8,%ymm8
  144. vpmuludq 224-128(%r9),%ymm11,%ymm0
  145. vpbroadcastq 96-128(%r15),%ymm11
  146. vpaddq 288-192(%rbx),%ymm0,%ymm0
  147. vmovdqu %ymm2,64-192(%rbx)
  148. vmovdqu %ymm3,96-192(%rbx)
  149. vpmuludq 64-128(%rsi),%ymm10,%ymm13
  150. vpaddq %ymm13,%ymm4,%ymm4
  151. vpmuludq 64-128(%r9),%ymm10,%ymm12
  152. vpaddq %ymm12,%ymm5,%ymm5
  153. vpmuludq 96-128(%r9),%ymm10,%ymm14
  154. vpaddq %ymm14,%ymm6,%ymm6
  155. vpmuludq 128-128(%r9),%ymm10,%ymm13
  156. vpaddq %ymm13,%ymm7,%ymm7
  157. vpmuludq 160-128(%r9),%ymm10,%ymm12
  158. vpaddq %ymm12,%ymm8,%ymm8
  159. vpmuludq 192-128(%r9),%ymm10,%ymm14
  160. vpaddq %ymm14,%ymm0,%ymm0
  161. vpmuludq 224-128(%r9),%ymm10,%ymm1
  162. vpbroadcastq 128-128(%r15),%ymm10
  163. vpaddq 320-448(%r12),%ymm1,%ymm1
  164. vmovdqu %ymm4,128-192(%rbx)
  165. vmovdqu %ymm5,160-192(%rbx)
  166. vpmuludq 96-128(%rsi),%ymm11,%ymm12
  167. vpaddq %ymm12,%ymm6,%ymm6
  168. vpmuludq 96-128(%r9),%ymm11,%ymm14
  169. vpaddq %ymm14,%ymm7,%ymm7
  170. vpmuludq 128-128(%r9),%ymm11,%ymm13
  171. vpaddq %ymm13,%ymm8,%ymm8
  172. vpmuludq 160-128(%r9),%ymm11,%ymm12
  173. vpaddq %ymm12,%ymm0,%ymm0
  174. vpmuludq 192-128(%r9),%ymm11,%ymm14
  175. vpaddq %ymm14,%ymm1,%ymm1
  176. vpmuludq 224-128(%r9),%ymm11,%ymm2
  177. vpbroadcastq 160-128(%r15),%ymm11
  178. vpaddq 352-448(%r12),%ymm2,%ymm2
  179. vmovdqu %ymm6,192-192(%rbx)
  180. vmovdqu %ymm7,224-192(%rbx)
  181. vpmuludq 128-128(%rsi),%ymm10,%ymm12
  182. vpaddq %ymm12,%ymm8,%ymm8
  183. vpmuludq 128-128(%r9),%ymm10,%ymm14
  184. vpaddq %ymm14,%ymm0,%ymm0
  185. vpmuludq 160-128(%r9),%ymm10,%ymm13
  186. vpaddq %ymm13,%ymm1,%ymm1
  187. vpmuludq 192-128(%r9),%ymm10,%ymm12
  188. vpaddq %ymm12,%ymm2,%ymm2
  189. vpmuludq 224-128(%r9),%ymm10,%ymm3
  190. vpbroadcastq 192-128(%r15),%ymm10
  191. vpaddq 384-448(%r12),%ymm3,%ymm3
  192. vmovdqu %ymm8,256-192(%rbx)
  193. vmovdqu %ymm0,288-192(%rbx)
  194. leaq 8(%rbx),%rbx
  195. vpmuludq 160-128(%rsi),%ymm11,%ymm13
  196. vpaddq %ymm13,%ymm1,%ymm1
  197. vpmuludq 160-128(%r9),%ymm11,%ymm12
  198. vpaddq %ymm12,%ymm2,%ymm2
  199. vpmuludq 192-128(%r9),%ymm11,%ymm14
  200. vpaddq %ymm14,%ymm3,%ymm3
  201. vpmuludq 224-128(%r9),%ymm11,%ymm4
  202. vpbroadcastq 224-128(%r15),%ymm11
  203. vpaddq 416-448(%r12),%ymm4,%ymm4
  204. vmovdqu %ymm1,320-448(%r12)
  205. vmovdqu %ymm2,352-448(%r12)
  206. vpmuludq 192-128(%rsi),%ymm10,%ymm12
  207. vpaddq %ymm12,%ymm3,%ymm3
  208. vpmuludq 192-128(%r9),%ymm10,%ymm14
  209. vpbroadcastq 256-128(%r15),%ymm0
  210. vpaddq %ymm14,%ymm4,%ymm4
  211. vpmuludq 224-128(%r9),%ymm10,%ymm5
  212. vpbroadcastq 0+8-128(%r15),%ymm10
  213. vpaddq 448-448(%r12),%ymm5,%ymm5
  214. vmovdqu %ymm3,384-448(%r12)
  215. vmovdqu %ymm4,416-448(%r12)
  216. leaq 8(%r15),%r15
  217. vpmuludq 224-128(%rsi),%ymm11,%ymm12
  218. vpaddq %ymm12,%ymm5,%ymm5
  219. vpmuludq 224-128(%r9),%ymm11,%ymm6
  220. vpaddq 480-448(%r12),%ymm6,%ymm6
  221. vpmuludq 256-128(%rsi),%ymm0,%ymm7
  222. vmovdqu %ymm5,448-448(%r12)
  223. vpaddq 512-448(%r12),%ymm7,%ymm7
  224. vmovdqu %ymm6,480-448(%r12)
  225. vmovdqu %ymm7,512-448(%r12)
  226. leaq 8(%r12),%r12
  227. decl %r14d
  228. jnz L$OOP_SQR_1024
  229. vmovdqu 256(%rsp),%ymm8
  230. vmovdqu 288(%rsp),%ymm1
  231. vmovdqu 320(%rsp),%ymm2
  232. leaq 192(%rsp),%rbx
  233. vpsrlq $29,%ymm8,%ymm14
  234. vpand %ymm15,%ymm8,%ymm8
  235. vpsrlq $29,%ymm1,%ymm11
  236. vpand %ymm15,%ymm1,%ymm1
  237. vpermq $0x93,%ymm14,%ymm14
  238. vpxor %ymm9,%ymm9,%ymm9
  239. vpermq $0x93,%ymm11,%ymm11
  240. vpblendd $3,%ymm9,%ymm14,%ymm10
  241. vpblendd $3,%ymm14,%ymm11,%ymm14
  242. vpaddq %ymm10,%ymm8,%ymm8
  243. vpblendd $3,%ymm11,%ymm9,%ymm11
  244. vpaddq %ymm14,%ymm1,%ymm1
  245. vpaddq %ymm11,%ymm2,%ymm2
  246. vmovdqu %ymm1,288-192(%rbx)
  247. vmovdqu %ymm2,320-192(%rbx)
  248. movq (%rsp),%rax
  249. movq 8(%rsp),%r10
  250. movq 16(%rsp),%r11
  251. movq 24(%rsp),%r12
  252. vmovdqu 32(%rsp),%ymm1
  253. vmovdqu 64-192(%rbx),%ymm2
  254. vmovdqu 96-192(%rbx),%ymm3
  255. vmovdqu 128-192(%rbx),%ymm4
  256. vmovdqu 160-192(%rbx),%ymm5
  257. vmovdqu 192-192(%rbx),%ymm6
  258. vmovdqu 224-192(%rbx),%ymm7
  259. movq %rax,%r9
  260. imull %ecx,%eax
  261. andl $0x1fffffff,%eax
  262. vmovd %eax,%xmm12
  263. movq %rax,%rdx
  264. imulq -128(%r13),%rax
  265. vpbroadcastq %xmm12,%ymm12
  266. addq %rax,%r9
  267. movq %rdx,%rax
  268. imulq 8-128(%r13),%rax
  269. shrq $29,%r9
  270. addq %rax,%r10
  271. movq %rdx,%rax
  272. imulq 16-128(%r13),%rax
  273. addq %r9,%r10
  274. addq %rax,%r11
  275. imulq 24-128(%r13),%rdx
  276. addq %rdx,%r12
  277. movq %r10,%rax
  278. imull %ecx,%eax
  279. andl $0x1fffffff,%eax
  280. movl $9,%r14d
  281. jmp L$OOP_REDUCE_1024
  282. .p2align 5
  283. L$OOP_REDUCE_1024:
  284. vmovd %eax,%xmm13
  285. vpbroadcastq %xmm13,%ymm13
  286. vpmuludq 32-128(%r13),%ymm12,%ymm10
  287. movq %rax,%rdx
  288. imulq -128(%r13),%rax
  289. vpaddq %ymm10,%ymm1,%ymm1
  290. addq %rax,%r10
  291. vpmuludq 64-128(%r13),%ymm12,%ymm14
  292. movq %rdx,%rax
  293. imulq 8-128(%r13),%rax
  294. vpaddq %ymm14,%ymm2,%ymm2
  295. vpmuludq 96-128(%r13),%ymm12,%ymm11
  296. .byte 0x67
  297. addq %rax,%r11
  298. .byte 0x67
  299. movq %rdx,%rax
  300. imulq 16-128(%r13),%rax
  301. shrq $29,%r10
  302. vpaddq %ymm11,%ymm3,%ymm3
  303. vpmuludq 128-128(%r13),%ymm12,%ymm10
  304. addq %rax,%r12
  305. addq %r10,%r11
  306. vpaddq %ymm10,%ymm4,%ymm4
  307. vpmuludq 160-128(%r13),%ymm12,%ymm14
  308. movq %r11,%rax
  309. imull %ecx,%eax
  310. vpaddq %ymm14,%ymm5,%ymm5
  311. vpmuludq 192-128(%r13),%ymm12,%ymm11
  312. andl $0x1fffffff,%eax
  313. vpaddq %ymm11,%ymm6,%ymm6
  314. vpmuludq 224-128(%r13),%ymm12,%ymm10
  315. vpaddq %ymm10,%ymm7,%ymm7
  316. vpmuludq 256-128(%r13),%ymm12,%ymm14
  317. vmovd %eax,%xmm12
  318. vpaddq %ymm14,%ymm8,%ymm8
  319. vpbroadcastq %xmm12,%ymm12
  320. vpmuludq 32-8-128(%r13),%ymm13,%ymm11
  321. vmovdqu 96-8-128(%r13),%ymm14
  322. movq %rax,%rdx
  323. imulq -128(%r13),%rax
  324. vpaddq %ymm11,%ymm1,%ymm1
  325. vpmuludq 64-8-128(%r13),%ymm13,%ymm10
  326. vmovdqu 128-8-128(%r13),%ymm11
  327. addq %rax,%r11
  328. movq %rdx,%rax
  329. imulq 8-128(%r13),%rax
  330. vpaddq %ymm10,%ymm2,%ymm2
  331. addq %r12,%rax
  332. shrq $29,%r11
  333. vpmuludq %ymm13,%ymm14,%ymm14
  334. vmovdqu 160-8-128(%r13),%ymm10
  335. addq %r11,%rax
  336. vpaddq %ymm14,%ymm3,%ymm3
  337. vpmuludq %ymm13,%ymm11,%ymm11
  338. vmovdqu 192-8-128(%r13),%ymm14
  339. .byte 0x67
  340. movq %rax,%r12
  341. imull %ecx,%eax
  342. vpaddq %ymm11,%ymm4,%ymm4
  343. vpmuludq %ymm13,%ymm10,%ymm10
  344. .byte 0xc4,0x41,0x7e,0x6f,0x9d,0x58,0x00,0x00,0x00
  345. andl $0x1fffffff,%eax
  346. vpaddq %ymm10,%ymm5,%ymm5
  347. vpmuludq %ymm13,%ymm14,%ymm14
  348. vmovdqu 256-8-128(%r13),%ymm10
  349. vpaddq %ymm14,%ymm6,%ymm6
  350. vpmuludq %ymm13,%ymm11,%ymm11
  351. vmovdqu 288-8-128(%r13),%ymm9
  352. vmovd %eax,%xmm0
  353. imulq -128(%r13),%rax
  354. vpaddq %ymm11,%ymm7,%ymm7
  355. vpmuludq %ymm13,%ymm10,%ymm10
  356. vmovdqu 32-16-128(%r13),%ymm14
  357. vpbroadcastq %xmm0,%ymm0
  358. vpaddq %ymm10,%ymm8,%ymm8
  359. vpmuludq %ymm13,%ymm9,%ymm9
  360. vmovdqu 64-16-128(%r13),%ymm11
  361. addq %rax,%r12
  362. vmovdqu 32-24-128(%r13),%ymm13
  363. vpmuludq %ymm12,%ymm14,%ymm14
  364. vmovdqu 96-16-128(%r13),%ymm10
  365. vpaddq %ymm14,%ymm1,%ymm1
  366. vpmuludq %ymm0,%ymm13,%ymm13
  367. vpmuludq %ymm12,%ymm11,%ymm11
  368. .byte 0xc4,0x41,0x7e,0x6f,0xb5,0xf0,0xff,0xff,0xff
  369. vpaddq %ymm1,%ymm13,%ymm13
  370. vpaddq %ymm11,%ymm2,%ymm2
  371. vpmuludq %ymm12,%ymm10,%ymm10
  372. vmovdqu 160-16-128(%r13),%ymm11
  373. .byte 0x67
  374. vmovq %xmm13,%rax
  375. vmovdqu %ymm13,(%rsp)
  376. vpaddq %ymm10,%ymm3,%ymm3
  377. vpmuludq %ymm12,%ymm14,%ymm14
  378. vmovdqu 192-16-128(%r13),%ymm10
  379. vpaddq %ymm14,%ymm4,%ymm4
  380. vpmuludq %ymm12,%ymm11,%ymm11
  381. vmovdqu 224-16-128(%r13),%ymm14
  382. vpaddq %ymm11,%ymm5,%ymm5
  383. vpmuludq %ymm12,%ymm10,%ymm10
  384. vmovdqu 256-16-128(%r13),%ymm11
  385. vpaddq %ymm10,%ymm6,%ymm6
  386. vpmuludq %ymm12,%ymm14,%ymm14
  387. shrq $29,%r12
  388. vmovdqu 288-16-128(%r13),%ymm10
  389. addq %r12,%rax
  390. vpaddq %ymm14,%ymm7,%ymm7
  391. vpmuludq %ymm12,%ymm11,%ymm11
  392. movq %rax,%r9
  393. imull %ecx,%eax
  394. vpaddq %ymm11,%ymm8,%ymm8
  395. vpmuludq %ymm12,%ymm10,%ymm10
  396. andl $0x1fffffff,%eax
  397. vmovd %eax,%xmm12
  398. vmovdqu 96-24-128(%r13),%ymm11
  399. .byte 0x67
  400. vpaddq %ymm10,%ymm9,%ymm9
  401. vpbroadcastq %xmm12,%ymm12
  402. vpmuludq 64-24-128(%r13),%ymm0,%ymm14
  403. vmovdqu 128-24-128(%r13),%ymm10
  404. movq %rax,%rdx
  405. imulq -128(%r13),%rax
  406. movq 8(%rsp),%r10
  407. vpaddq %ymm14,%ymm2,%ymm1
  408. vpmuludq %ymm0,%ymm11,%ymm11
  409. vmovdqu 160-24-128(%r13),%ymm14
  410. addq %rax,%r9
  411. movq %rdx,%rax
  412. imulq 8-128(%r13),%rax
  413. .byte 0x67
  414. shrq $29,%r9
  415. movq 16(%rsp),%r11
  416. vpaddq %ymm11,%ymm3,%ymm2
  417. vpmuludq %ymm0,%ymm10,%ymm10
  418. vmovdqu 192-24-128(%r13),%ymm11
  419. addq %rax,%r10
  420. movq %rdx,%rax
  421. imulq 16-128(%r13),%rax
  422. vpaddq %ymm10,%ymm4,%ymm3
  423. vpmuludq %ymm0,%ymm14,%ymm14
  424. vmovdqu 224-24-128(%r13),%ymm10
  425. imulq 24-128(%r13),%rdx
  426. addq %rax,%r11
  427. leaq (%r9,%r10,1),%rax
  428. vpaddq %ymm14,%ymm5,%ymm4
  429. vpmuludq %ymm0,%ymm11,%ymm11
  430. vmovdqu 256-24-128(%r13),%ymm14
  431. movq %rax,%r10
  432. imull %ecx,%eax
  433. vpmuludq %ymm0,%ymm10,%ymm10
  434. vpaddq %ymm11,%ymm6,%ymm5
  435. vmovdqu 288-24-128(%r13),%ymm11
  436. andl $0x1fffffff,%eax
  437. vpaddq %ymm10,%ymm7,%ymm6
  438. vpmuludq %ymm0,%ymm14,%ymm14
  439. addq 24(%rsp),%rdx
  440. vpaddq %ymm14,%ymm8,%ymm7
  441. vpmuludq %ymm0,%ymm11,%ymm11
  442. vpaddq %ymm11,%ymm9,%ymm8
  443. vmovq %r12,%xmm9
  444. movq %rdx,%r12
  445. decl %r14d
  446. jnz L$OOP_REDUCE_1024
  447. leaq 448(%rsp),%r12
  448. vpaddq %ymm9,%ymm13,%ymm0
  449. vpxor %ymm9,%ymm9,%ymm9
  450. vpaddq 288-192(%rbx),%ymm0,%ymm0
  451. vpaddq 320-448(%r12),%ymm1,%ymm1
  452. vpaddq 352-448(%r12),%ymm2,%ymm2
  453. vpaddq 384-448(%r12),%ymm3,%ymm3
  454. vpaddq 416-448(%r12),%ymm4,%ymm4
  455. vpaddq 448-448(%r12),%ymm5,%ymm5
  456. vpaddq 480-448(%r12),%ymm6,%ymm6
  457. vpaddq 512-448(%r12),%ymm7,%ymm7
  458. vpaddq 544-448(%r12),%ymm8,%ymm8
  459. vpsrlq $29,%ymm0,%ymm14
  460. vpand %ymm15,%ymm0,%ymm0
  461. vpsrlq $29,%ymm1,%ymm11
  462. vpand %ymm15,%ymm1,%ymm1
  463. vpsrlq $29,%ymm2,%ymm12
  464. vpermq $0x93,%ymm14,%ymm14
  465. vpand %ymm15,%ymm2,%ymm2
  466. vpsrlq $29,%ymm3,%ymm13
  467. vpermq $0x93,%ymm11,%ymm11
  468. vpand %ymm15,%ymm3,%ymm3
  469. vpermq $0x93,%ymm12,%ymm12
  470. vpblendd $3,%ymm9,%ymm14,%ymm10
  471. vpermq $0x93,%ymm13,%ymm13
  472. vpblendd $3,%ymm14,%ymm11,%ymm14
  473. vpaddq %ymm10,%ymm0,%ymm0
  474. vpblendd $3,%ymm11,%ymm12,%ymm11
  475. vpaddq %ymm14,%ymm1,%ymm1
  476. vpblendd $3,%ymm12,%ymm13,%ymm12
  477. vpaddq %ymm11,%ymm2,%ymm2
  478. vpblendd $3,%ymm13,%ymm9,%ymm13
  479. vpaddq %ymm12,%ymm3,%ymm3
  480. vpaddq %ymm13,%ymm4,%ymm4
  481. vpsrlq $29,%ymm0,%ymm14
  482. vpand %ymm15,%ymm0,%ymm0
  483. vpsrlq $29,%ymm1,%ymm11
  484. vpand %ymm15,%ymm1,%ymm1
  485. vpsrlq $29,%ymm2,%ymm12
  486. vpermq $0x93,%ymm14,%ymm14
  487. vpand %ymm15,%ymm2,%ymm2
  488. vpsrlq $29,%ymm3,%ymm13
  489. vpermq $0x93,%ymm11,%ymm11
  490. vpand %ymm15,%ymm3,%ymm3
  491. vpermq $0x93,%ymm12,%ymm12
  492. vpblendd $3,%ymm9,%ymm14,%ymm10
  493. vpermq $0x93,%ymm13,%ymm13
  494. vpblendd $3,%ymm14,%ymm11,%ymm14
  495. vpaddq %ymm10,%ymm0,%ymm0
  496. vpblendd $3,%ymm11,%ymm12,%ymm11
  497. vpaddq %ymm14,%ymm1,%ymm1
  498. vmovdqu %ymm0,0-128(%rdi)
  499. vpblendd $3,%ymm12,%ymm13,%ymm12
  500. vpaddq %ymm11,%ymm2,%ymm2
  501. vmovdqu %ymm1,32-128(%rdi)
  502. vpblendd $3,%ymm13,%ymm9,%ymm13
  503. vpaddq %ymm12,%ymm3,%ymm3
  504. vmovdqu %ymm2,64-128(%rdi)
  505. vpaddq %ymm13,%ymm4,%ymm4
  506. vmovdqu %ymm3,96-128(%rdi)
  507. vpsrlq $29,%ymm4,%ymm14
  508. vpand %ymm15,%ymm4,%ymm4
  509. vpsrlq $29,%ymm5,%ymm11
  510. vpand %ymm15,%ymm5,%ymm5
  511. vpsrlq $29,%ymm6,%ymm12
  512. vpermq $0x93,%ymm14,%ymm14
  513. vpand %ymm15,%ymm6,%ymm6
  514. vpsrlq $29,%ymm7,%ymm13
  515. vpermq $0x93,%ymm11,%ymm11
  516. vpand %ymm15,%ymm7,%ymm7
  517. vpsrlq $29,%ymm8,%ymm0
  518. vpermq $0x93,%ymm12,%ymm12
  519. vpand %ymm15,%ymm8,%ymm8
  520. vpermq $0x93,%ymm13,%ymm13
  521. vpblendd $3,%ymm9,%ymm14,%ymm10
  522. vpermq $0x93,%ymm0,%ymm0
  523. vpblendd $3,%ymm14,%ymm11,%ymm14
  524. vpaddq %ymm10,%ymm4,%ymm4
  525. vpblendd $3,%ymm11,%ymm12,%ymm11
  526. vpaddq %ymm14,%ymm5,%ymm5
  527. vpblendd $3,%ymm12,%ymm13,%ymm12
  528. vpaddq %ymm11,%ymm6,%ymm6
  529. vpblendd $3,%ymm13,%ymm0,%ymm13
  530. vpaddq %ymm12,%ymm7,%ymm7
  531. vpaddq %ymm13,%ymm8,%ymm8
  532. vpsrlq $29,%ymm4,%ymm14
  533. vpand %ymm15,%ymm4,%ymm4
  534. vpsrlq $29,%ymm5,%ymm11
  535. vpand %ymm15,%ymm5,%ymm5
  536. vpsrlq $29,%ymm6,%ymm12
  537. vpermq $0x93,%ymm14,%ymm14
  538. vpand %ymm15,%ymm6,%ymm6
  539. vpsrlq $29,%ymm7,%ymm13
  540. vpermq $0x93,%ymm11,%ymm11
  541. vpand %ymm15,%ymm7,%ymm7
  542. vpsrlq $29,%ymm8,%ymm0
  543. vpermq $0x93,%ymm12,%ymm12
  544. vpand %ymm15,%ymm8,%ymm8
  545. vpermq $0x93,%ymm13,%ymm13
  546. vpblendd $3,%ymm9,%ymm14,%ymm10
  547. vpermq $0x93,%ymm0,%ymm0
  548. vpblendd $3,%ymm14,%ymm11,%ymm14
  549. vpaddq %ymm10,%ymm4,%ymm4
  550. vpblendd $3,%ymm11,%ymm12,%ymm11
  551. vpaddq %ymm14,%ymm5,%ymm5
  552. vmovdqu %ymm4,128-128(%rdi)
  553. vpblendd $3,%ymm12,%ymm13,%ymm12
  554. vpaddq %ymm11,%ymm6,%ymm6
  555. vmovdqu %ymm5,160-128(%rdi)
  556. vpblendd $3,%ymm13,%ymm0,%ymm13
  557. vpaddq %ymm12,%ymm7,%ymm7
  558. vmovdqu %ymm6,192-128(%rdi)
  559. vpaddq %ymm13,%ymm8,%ymm8
  560. vmovdqu %ymm7,224-128(%rdi)
  561. vmovdqu %ymm8,256-128(%rdi)
  562. movq %rdi,%rsi
  563. decl %r8d
  564. jne L$OOP_GRANDE_SQR_1024
  565. vzeroall
  566. movq %rbp,%rax
  567. movq -48(%rax),%r15
  568. movq -40(%rax),%r14
  569. movq -32(%rax),%r13
  570. movq -24(%rax),%r12
  571. movq -16(%rax),%rbp
  572. movq -8(%rax),%rbx
  573. leaq (%rax),%rsp
  574. L$sqr_1024_epilogue:
  575. .byte 0xf3,0xc3
  576. .globl _rsaz_1024_mul_avx2
  577. .p2align 6
  578. _rsaz_1024_mul_avx2:
  579. leaq (%rsp),%rax
  580. pushq %rbx
  581. pushq %rbp
  582. pushq %r12
  583. pushq %r13
  584. pushq %r14
  585. pushq %r15
  586. movq %rax,%rbp
  587. vzeroall
  588. movq %rdx,%r13
  589. subq $64,%rsp
  590. .byte 0x67,0x67
  591. movq %rsi,%r15
  592. andq $4095,%r15
  593. addq $320,%r15
  594. shrq $12,%r15
  595. movq %rsi,%r15
  596. cmovnzq %r13,%rsi
  597. cmovnzq %r15,%r13
  598. movq %rcx,%r15
  599. subq $-128,%rsi
  600. subq $-128,%rcx
  601. subq $-128,%rdi
  602. andq $4095,%r15
  603. addq $320,%r15
  604. .byte 0x67,0x67
  605. shrq $12,%r15
  606. jz L$mul_1024_no_n_copy
  607. subq $320,%rsp
  608. vmovdqu 0-128(%rcx),%ymm0
  609. andq $-512,%rsp
  610. vmovdqu 32-128(%rcx),%ymm1
  611. vmovdqu 64-128(%rcx),%ymm2
  612. vmovdqu 96-128(%rcx),%ymm3
  613. vmovdqu 128-128(%rcx),%ymm4
  614. vmovdqu 160-128(%rcx),%ymm5
  615. vmovdqu 192-128(%rcx),%ymm6
  616. vmovdqu 224-128(%rcx),%ymm7
  617. vmovdqu 256-128(%rcx),%ymm8
  618. leaq 64+128(%rsp),%rcx
  619. vmovdqu %ymm0,0-128(%rcx)
  620. vpxor %ymm0,%ymm0,%ymm0
  621. vmovdqu %ymm1,32-128(%rcx)
  622. vpxor %ymm1,%ymm1,%ymm1
  623. vmovdqu %ymm2,64-128(%rcx)
  624. vpxor %ymm2,%ymm2,%ymm2
  625. vmovdqu %ymm3,96-128(%rcx)
  626. vpxor %ymm3,%ymm3,%ymm3
  627. vmovdqu %ymm4,128-128(%rcx)
  628. vpxor %ymm4,%ymm4,%ymm4
  629. vmovdqu %ymm5,160-128(%rcx)
  630. vpxor %ymm5,%ymm5,%ymm5
  631. vmovdqu %ymm6,192-128(%rcx)
  632. vpxor %ymm6,%ymm6,%ymm6
  633. vmovdqu %ymm7,224-128(%rcx)
  634. vpxor %ymm7,%ymm7,%ymm7
  635. vmovdqu %ymm8,256-128(%rcx)
  636. vmovdqa %ymm0,%ymm8
  637. vmovdqu %ymm9,288-128(%rcx)
  638. L$mul_1024_no_n_copy:
  639. andq $-64,%rsp
  640. movq (%r13),%rbx
  641. vpbroadcastq (%r13),%ymm10
  642. vmovdqu %ymm0,(%rsp)
  643. xorq %r9,%r9
  644. .byte 0x67
  645. xorq %r10,%r10
  646. xorq %r11,%r11
  647. xorq %r12,%r12
  648. vmovdqu L$and_mask(%rip),%ymm15
  649. movl $9,%r14d
  650. vmovdqu %ymm9,288-128(%rdi)
  651. jmp L$oop_mul_1024
  652. .p2align 5
  653. L$oop_mul_1024:
  654. vpsrlq $29,%ymm3,%ymm9
  655. movq %rbx,%rax
  656. imulq -128(%rsi),%rax
  657. addq %r9,%rax
  658. movq %rbx,%r10
  659. imulq 8-128(%rsi),%r10
  660. addq 8(%rsp),%r10
  661. movq %rax,%r9
  662. imull %r8d,%eax
  663. andl $0x1fffffff,%eax
  664. movq %rbx,%r11
  665. imulq 16-128(%rsi),%r11
  666. addq 16(%rsp),%r11
  667. movq %rbx,%r12
  668. imulq 24-128(%rsi),%r12
  669. addq 24(%rsp),%r12
  670. vpmuludq 32-128(%rsi),%ymm10,%ymm0
  671. vmovd %eax,%xmm11
  672. vpaddq %ymm0,%ymm1,%ymm1
  673. vpmuludq 64-128(%rsi),%ymm10,%ymm12
  674. vpbroadcastq %xmm11,%ymm11
  675. vpaddq %ymm12,%ymm2,%ymm2
  676. vpmuludq 96-128(%rsi),%ymm10,%ymm13
  677. vpand %ymm15,%ymm3,%ymm3
  678. vpaddq %ymm13,%ymm3,%ymm3
  679. vpmuludq 128-128(%rsi),%ymm10,%ymm0
  680. vpaddq %ymm0,%ymm4,%ymm4
  681. vpmuludq 160-128(%rsi),%ymm10,%ymm12
  682. vpaddq %ymm12,%ymm5,%ymm5
  683. vpmuludq 192-128(%rsi),%ymm10,%ymm13
  684. vpaddq %ymm13,%ymm6,%ymm6
  685. vpmuludq 224-128(%rsi),%ymm10,%ymm0
  686. vpermq $0x93,%ymm9,%ymm9
  687. vpaddq %ymm0,%ymm7,%ymm7
  688. vpmuludq 256-128(%rsi),%ymm10,%ymm12
  689. vpbroadcastq 8(%r13),%ymm10
  690. vpaddq %ymm12,%ymm8,%ymm8
  691. movq %rax,%rdx
  692. imulq -128(%rcx),%rax
  693. addq %rax,%r9
  694. movq %rdx,%rax
  695. imulq 8-128(%rcx),%rax
  696. addq %rax,%r10
  697. movq %rdx,%rax
  698. imulq 16-128(%rcx),%rax
  699. addq %rax,%r11
  700. shrq $29,%r9
  701. imulq 24-128(%rcx),%rdx
  702. addq %rdx,%r12
  703. addq %r9,%r10
  704. vpmuludq 32-128(%rcx),%ymm11,%ymm13
  705. vmovq %xmm10,%rbx
  706. vpaddq %ymm13,%ymm1,%ymm1
  707. vpmuludq 64-128(%rcx),%ymm11,%ymm0
  708. vpaddq %ymm0,%ymm2,%ymm2
  709. vpmuludq 96-128(%rcx),%ymm11,%ymm12
  710. vpaddq %ymm12,%ymm3,%ymm3
  711. vpmuludq 128-128(%rcx),%ymm11,%ymm13
  712. vpaddq %ymm13,%ymm4,%ymm4
  713. vpmuludq 160-128(%rcx),%ymm11,%ymm0
  714. vpaddq %ymm0,%ymm5,%ymm5
  715. vpmuludq 192-128(%rcx),%ymm11,%ymm12
  716. vpaddq %ymm12,%ymm6,%ymm6
  717. vpmuludq 224-128(%rcx),%ymm11,%ymm13
  718. vpblendd $3,%ymm14,%ymm9,%ymm12
  719. vpaddq %ymm13,%ymm7,%ymm7
  720. vpmuludq 256-128(%rcx),%ymm11,%ymm0
  721. vpaddq %ymm12,%ymm3,%ymm3
  722. vpaddq %ymm0,%ymm8,%ymm8
  723. movq %rbx,%rax
  724. imulq -128(%rsi),%rax
  725. addq %rax,%r10
  726. vmovdqu -8+32-128(%rsi),%ymm12
  727. movq %rbx,%rax
  728. imulq 8-128(%rsi),%rax
  729. addq %rax,%r11
  730. vmovdqu -8+64-128(%rsi),%ymm13
  731. movq %r10,%rax
  732. vpblendd $0xfc,%ymm14,%ymm9,%ymm9
  733. imull %r8d,%eax
  734. vpaddq %ymm9,%ymm4,%ymm4
  735. andl $0x1fffffff,%eax
  736. imulq 16-128(%rsi),%rbx
  737. addq %rbx,%r12
  738. vpmuludq %ymm10,%ymm12,%ymm12
  739. vmovd %eax,%xmm11
  740. vmovdqu -8+96-128(%rsi),%ymm0
  741. vpaddq %ymm12,%ymm1,%ymm1
  742. vpmuludq %ymm10,%ymm13,%ymm13
  743. vpbroadcastq %xmm11,%ymm11
  744. vmovdqu -8+128-128(%rsi),%ymm12
  745. vpaddq %ymm13,%ymm2,%ymm2
  746. vpmuludq %ymm10,%ymm0,%ymm0
  747. vmovdqu -8+160-128(%rsi),%ymm13
  748. vpaddq %ymm0,%ymm3,%ymm3
  749. vpmuludq %ymm10,%ymm12,%ymm12
  750. vmovdqu -8+192-128(%rsi),%ymm0
  751. vpaddq %ymm12,%ymm4,%ymm4
  752. vpmuludq %ymm10,%ymm13,%ymm13
  753. vmovdqu -8+224-128(%rsi),%ymm12
  754. vpaddq %ymm13,%ymm5,%ymm5
  755. vpmuludq %ymm10,%ymm0,%ymm0
  756. vmovdqu -8+256-128(%rsi),%ymm13
  757. vpaddq %ymm0,%ymm6,%ymm6
  758. vpmuludq %ymm10,%ymm12,%ymm12
  759. vmovdqu -8+288-128(%rsi),%ymm9
  760. vpaddq %ymm12,%ymm7,%ymm7
  761. vpmuludq %ymm10,%ymm13,%ymm13
  762. vpaddq %ymm13,%ymm8,%ymm8
  763. vpmuludq %ymm10,%ymm9,%ymm9
  764. vpbroadcastq 16(%r13),%ymm10
  765. movq %rax,%rdx
  766. imulq -128(%rcx),%rax
  767. addq %rax,%r10
  768. vmovdqu -8+32-128(%rcx),%ymm0
  769. movq %rdx,%rax
  770. imulq 8-128(%rcx),%rax
  771. addq %rax,%r11
  772. vmovdqu -8+64-128(%rcx),%ymm12
  773. shrq $29,%r10
  774. imulq 16-128(%rcx),%rdx
  775. addq %rdx,%r12
  776. addq %r10,%r11
  777. vpmuludq %ymm11,%ymm0,%ymm0
  778. vmovq %xmm10,%rbx
  779. vmovdqu -8+96-128(%rcx),%ymm13
  780. vpaddq %ymm0,%ymm1,%ymm1
  781. vpmuludq %ymm11,%ymm12,%ymm12
  782. vmovdqu -8+128-128(%rcx),%ymm0
  783. vpaddq %ymm12,%ymm2,%ymm2
  784. vpmuludq %ymm11,%ymm13,%ymm13
  785. vmovdqu -8+160-128(%rcx),%ymm12
  786. vpaddq %ymm13,%ymm3,%ymm3
  787. vpmuludq %ymm11,%ymm0,%ymm0
  788. vmovdqu -8+192-128(%rcx),%ymm13
  789. vpaddq %ymm0,%ymm4,%ymm4
  790. vpmuludq %ymm11,%ymm12,%ymm12
  791. vmovdqu -8+224-128(%rcx),%ymm0
  792. vpaddq %ymm12,%ymm5,%ymm5
  793. vpmuludq %ymm11,%ymm13,%ymm13
  794. vmovdqu -8+256-128(%rcx),%ymm12
  795. vpaddq %ymm13,%ymm6,%ymm6
  796. vpmuludq %ymm11,%ymm0,%ymm0
  797. vmovdqu -8+288-128(%rcx),%ymm13
  798. vpaddq %ymm0,%ymm7,%ymm7
  799. vpmuludq %ymm11,%ymm12,%ymm12
  800. vpaddq %ymm12,%ymm8,%ymm8
  801. vpmuludq %ymm11,%ymm13,%ymm13
  802. vpaddq %ymm13,%ymm9,%ymm9
  803. vmovdqu -16+32-128(%rsi),%ymm0
  804. movq %rbx,%rax
  805. imulq -128(%rsi),%rax
  806. addq %r11,%rax
  807. vmovdqu -16+64-128(%rsi),%ymm12
  808. movq %rax,%r11
  809. imull %r8d,%eax
  810. andl $0x1fffffff,%eax
  811. imulq 8-128(%rsi),%rbx
  812. addq %rbx,%r12
  813. vpmuludq %ymm10,%ymm0,%ymm0
  814. vmovd %eax,%xmm11
  815. vmovdqu -16+96-128(%rsi),%ymm13
  816. vpaddq %ymm0,%ymm1,%ymm1
  817. vpmuludq %ymm10,%ymm12,%ymm12
  818. vpbroadcastq %xmm11,%ymm11
  819. vmovdqu -16+128-128(%rsi),%ymm0
  820. vpaddq %ymm12,%ymm2,%ymm2
  821. vpmuludq %ymm10,%ymm13,%ymm13
  822. vmovdqu -16+160-128(%rsi),%ymm12
  823. vpaddq %ymm13,%ymm3,%ymm3
  824. vpmuludq %ymm10,%ymm0,%ymm0
  825. vmovdqu -16+192-128(%rsi),%ymm13
  826. vpaddq %ymm0,%ymm4,%ymm4
  827. vpmuludq %ymm10,%ymm12,%ymm12
  828. vmovdqu -16+224-128(%rsi),%ymm0
  829. vpaddq %ymm12,%ymm5,%ymm5
  830. vpmuludq %ymm10,%ymm13,%ymm13
  831. vmovdqu -16+256-128(%rsi),%ymm12
  832. vpaddq %ymm13,%ymm6,%ymm6
  833. vpmuludq %ymm10,%ymm0,%ymm0
  834. vmovdqu -16+288-128(%rsi),%ymm13
  835. vpaddq %ymm0,%ymm7,%ymm7
  836. vpmuludq %ymm10,%ymm12,%ymm12
  837. vpaddq %ymm12,%ymm8,%ymm8
  838. vpmuludq %ymm10,%ymm13,%ymm13
  839. vpbroadcastq 24(%r13),%ymm10
  840. vpaddq %ymm13,%ymm9,%ymm9
  841. vmovdqu -16+32-128(%rcx),%ymm0
  842. movq %rax,%rdx
  843. imulq -128(%rcx),%rax
  844. addq %rax,%r11
  845. vmovdqu -16+64-128(%rcx),%ymm12
  846. imulq 8-128(%rcx),%rdx
  847. addq %rdx,%r12
  848. shrq $29,%r11
  849. vpmuludq %ymm11,%ymm0,%ymm0
  850. vmovq %xmm10,%rbx
  851. vmovdqu -16+96-128(%rcx),%ymm13
  852. vpaddq %ymm0,%ymm1,%ymm1
  853. vpmuludq %ymm11,%ymm12,%ymm12
  854. vmovdqu -16+128-128(%rcx),%ymm0
  855. vpaddq %ymm12,%ymm2,%ymm2
  856. vpmuludq %ymm11,%ymm13,%ymm13
  857. vmovdqu -16+160-128(%rcx),%ymm12
  858. vpaddq %ymm13,%ymm3,%ymm3
  859. vpmuludq %ymm11,%ymm0,%ymm0
  860. vmovdqu -16+192-128(%rcx),%ymm13
  861. vpaddq %ymm0,%ymm4,%ymm4
  862. vpmuludq %ymm11,%ymm12,%ymm12
  863. vmovdqu -16+224-128(%rcx),%ymm0
  864. vpaddq %ymm12,%ymm5,%ymm5
  865. vpmuludq %ymm11,%ymm13,%ymm13
  866. vmovdqu -16+256-128(%rcx),%ymm12
  867. vpaddq %ymm13,%ymm6,%ymm6
  868. vpmuludq %ymm11,%ymm0,%ymm0
  869. vmovdqu -16+288-128(%rcx),%ymm13
  870. vpaddq %ymm0,%ymm7,%ymm7
  871. vpmuludq %ymm11,%ymm12,%ymm12
  872. vmovdqu -24+32-128(%rsi),%ymm0
  873. vpaddq %ymm12,%ymm8,%ymm8
  874. vpmuludq %ymm11,%ymm13,%ymm13
  875. vmovdqu -24+64-128(%rsi),%ymm12
  876. vpaddq %ymm13,%ymm9,%ymm9
  877. addq %r11,%r12
  878. imulq -128(%rsi),%rbx
  879. addq %rbx,%r12
  880. movq %r12,%rax
  881. imull %r8d,%eax
  882. andl $0x1fffffff,%eax
  883. vpmuludq %ymm10,%ymm0,%ymm0
  884. vmovd %eax,%xmm11
  885. vmovdqu -24+96-128(%rsi),%ymm13
  886. vpaddq %ymm0,%ymm1,%ymm1
  887. vpmuludq %ymm10,%ymm12,%ymm12
  888. vpbroadcastq %xmm11,%ymm11
  889. vmovdqu -24+128-128(%rsi),%ymm0
  890. vpaddq %ymm12,%ymm2,%ymm2
  891. vpmuludq %ymm10,%ymm13,%ymm13
  892. vmovdqu -24+160-128(%rsi),%ymm12
  893. vpaddq %ymm13,%ymm3,%ymm3
  894. vpmuludq %ymm10,%ymm0,%ymm0
  895. vmovdqu -24+192-128(%rsi),%ymm13
  896. vpaddq %ymm0,%ymm4,%ymm4
  897. vpmuludq %ymm10,%ymm12,%ymm12
  898. vmovdqu -24+224-128(%rsi),%ymm0
  899. vpaddq %ymm12,%ymm5,%ymm5
  900. vpmuludq %ymm10,%ymm13,%ymm13
  901. vmovdqu -24+256-128(%rsi),%ymm12
  902. vpaddq %ymm13,%ymm6,%ymm6
  903. vpmuludq %ymm10,%ymm0,%ymm0
  904. vmovdqu -24+288-128(%rsi),%ymm13
  905. vpaddq %ymm0,%ymm7,%ymm7
  906. vpmuludq %ymm10,%ymm12,%ymm12
  907. vpaddq %ymm12,%ymm8,%ymm8
  908. vpmuludq %ymm10,%ymm13,%ymm13
  909. vpbroadcastq 32(%r13),%ymm10
  910. vpaddq %ymm13,%ymm9,%ymm9
  911. addq $32,%r13
  912. vmovdqu -24+32-128(%rcx),%ymm0
  913. imulq -128(%rcx),%rax
  914. addq %rax,%r12
  915. shrq $29,%r12
  916. vmovdqu -24+64-128(%rcx),%ymm12
  917. vpmuludq %ymm11,%ymm0,%ymm0
  918. vmovq %xmm10,%rbx
  919. vmovdqu -24+96-128(%rcx),%ymm13
  920. vpaddq %ymm0,%ymm1,%ymm0
  921. vpmuludq %ymm11,%ymm12,%ymm12
  922. vmovdqu %ymm0,(%rsp)
  923. vpaddq %ymm12,%ymm2,%ymm1
  924. vmovdqu -24+128-128(%rcx),%ymm0
  925. vpmuludq %ymm11,%ymm13,%ymm13
  926. vmovdqu -24+160-128(%rcx),%ymm12
  927. vpaddq %ymm13,%ymm3,%ymm2
  928. vpmuludq %ymm11,%ymm0,%ymm0
  929. vmovdqu -24+192-128(%rcx),%ymm13
  930. vpaddq %ymm0,%ymm4,%ymm3
  931. vpmuludq %ymm11,%ymm12,%ymm12
  932. vmovdqu -24+224-128(%rcx),%ymm0
  933. vpaddq %ymm12,%ymm5,%ymm4
  934. vpmuludq %ymm11,%ymm13,%ymm13
  935. vmovdqu -24+256-128(%rcx),%ymm12
  936. vpaddq %ymm13,%ymm6,%ymm5
  937. vpmuludq %ymm11,%ymm0,%ymm0
  938. vmovdqu -24+288-128(%rcx),%ymm13
  939. movq %r12,%r9
  940. vpaddq %ymm0,%ymm7,%ymm6
  941. vpmuludq %ymm11,%ymm12,%ymm12
  942. addq (%rsp),%r9
  943. vpaddq %ymm12,%ymm8,%ymm7
  944. vpmuludq %ymm11,%ymm13,%ymm13
  945. vmovq %r12,%xmm12
  946. vpaddq %ymm13,%ymm9,%ymm8
  947. decl %r14d
  948. jnz L$oop_mul_1024
  949. vpaddq (%rsp),%ymm12,%ymm0
  950. vpsrlq $29,%ymm0,%ymm12
  951. vpand %ymm15,%ymm0,%ymm0
  952. vpsrlq $29,%ymm1,%ymm13
  953. vpand %ymm15,%ymm1,%ymm1
  954. vpsrlq $29,%ymm2,%ymm10
  955. vpermq $0x93,%ymm12,%ymm12
  956. vpand %ymm15,%ymm2,%ymm2
  957. vpsrlq $29,%ymm3,%ymm11
  958. vpermq $0x93,%ymm13,%ymm13
  959. vpand %ymm15,%ymm3,%ymm3
  960. vpblendd $3,%ymm14,%ymm12,%ymm9
  961. vpermq $0x93,%ymm10,%ymm10
  962. vpblendd $3,%ymm12,%ymm13,%ymm12
  963. vpermq $0x93,%ymm11,%ymm11
  964. vpaddq %ymm9,%ymm0,%ymm0
  965. vpblendd $3,%ymm13,%ymm10,%ymm13
  966. vpaddq %ymm12,%ymm1,%ymm1
  967. vpblendd $3,%ymm10,%ymm11,%ymm10
  968. vpaddq %ymm13,%ymm2,%ymm2
  969. vpblendd $3,%ymm11,%ymm14,%ymm11
  970. vpaddq %ymm10,%ymm3,%ymm3
  971. vpaddq %ymm11,%ymm4,%ymm4
  972. vpsrlq $29,%ymm0,%ymm12
  973. vpand %ymm15,%ymm0,%ymm0
  974. vpsrlq $29,%ymm1,%ymm13
  975. vpand %ymm15,%ymm1,%ymm1
  976. vpsrlq $29,%ymm2,%ymm10
  977. vpermq $0x93,%ymm12,%ymm12
  978. vpand %ymm15,%ymm2,%ymm2
  979. vpsrlq $29,%ymm3,%ymm11
  980. vpermq $0x93,%ymm13,%ymm13
  981. vpand %ymm15,%ymm3,%ymm3
  982. vpermq $0x93,%ymm10,%ymm10
  983. vpblendd $3,%ymm14,%ymm12,%ymm9
  984. vpermq $0x93,%ymm11,%ymm11
  985. vpblendd $3,%ymm12,%ymm13,%ymm12
  986. vpaddq %ymm9,%ymm0,%ymm0
  987. vpblendd $3,%ymm13,%ymm10,%ymm13
  988. vpaddq %ymm12,%ymm1,%ymm1
  989. vpblendd $3,%ymm10,%ymm11,%ymm10
  990. vpaddq %ymm13,%ymm2,%ymm2
  991. vpblendd $3,%ymm11,%ymm14,%ymm11
  992. vpaddq %ymm10,%ymm3,%ymm3
  993. vpaddq %ymm11,%ymm4,%ymm4
  994. vmovdqu %ymm0,0-128(%rdi)
  995. vmovdqu %ymm1,32-128(%rdi)
  996. vmovdqu %ymm2,64-128(%rdi)
  997. vmovdqu %ymm3,96-128(%rdi)
  998. vpsrlq $29,%ymm4,%ymm12
  999. vpand %ymm15,%ymm4,%ymm4
  1000. vpsrlq $29,%ymm5,%ymm13
  1001. vpand %ymm15,%ymm5,%ymm5
  1002. vpsrlq $29,%ymm6,%ymm10
  1003. vpermq $0x93,%ymm12,%ymm12
  1004. vpand %ymm15,%ymm6,%ymm6
  1005. vpsrlq $29,%ymm7,%ymm11
  1006. vpermq $0x93,%ymm13,%ymm13
  1007. vpand %ymm15,%ymm7,%ymm7
  1008. vpsrlq $29,%ymm8,%ymm0
  1009. vpermq $0x93,%ymm10,%ymm10
  1010. vpand %ymm15,%ymm8,%ymm8
  1011. vpermq $0x93,%ymm11,%ymm11
  1012. vpblendd $3,%ymm14,%ymm12,%ymm9
  1013. vpermq $0x93,%ymm0,%ymm0
  1014. vpblendd $3,%ymm12,%ymm13,%ymm12
  1015. vpaddq %ymm9,%ymm4,%ymm4
  1016. vpblendd $3,%ymm13,%ymm10,%ymm13
  1017. vpaddq %ymm12,%ymm5,%ymm5
  1018. vpblendd $3,%ymm10,%ymm11,%ymm10
  1019. vpaddq %ymm13,%ymm6,%ymm6
  1020. vpblendd $3,%ymm11,%ymm0,%ymm11
  1021. vpaddq %ymm10,%ymm7,%ymm7
  1022. vpaddq %ymm11,%ymm8,%ymm8
  1023. vpsrlq $29,%ymm4,%ymm12
  1024. vpand %ymm15,%ymm4,%ymm4
  1025. vpsrlq $29,%ymm5,%ymm13
  1026. vpand %ymm15,%ymm5,%ymm5
  1027. vpsrlq $29,%ymm6,%ymm10
  1028. vpermq $0x93,%ymm12,%ymm12
  1029. vpand %ymm15,%ymm6,%ymm6
  1030. vpsrlq $29,%ymm7,%ymm11
  1031. vpermq $0x93,%ymm13,%ymm13
  1032. vpand %ymm15,%ymm7,%ymm7
  1033. vpsrlq $29,%ymm8,%ymm0
  1034. vpermq $0x93,%ymm10,%ymm10
  1035. vpand %ymm15,%ymm8,%ymm8
  1036. vpermq $0x93,%ymm11,%ymm11
  1037. vpblendd $3,%ymm14,%ymm12,%ymm9
  1038. vpermq $0x93,%ymm0,%ymm0
  1039. vpblendd $3,%ymm12,%ymm13,%ymm12
  1040. vpaddq %ymm9,%ymm4,%ymm4
  1041. vpblendd $3,%ymm13,%ymm10,%ymm13
  1042. vpaddq %ymm12,%ymm5,%ymm5
  1043. vpblendd $3,%ymm10,%ymm11,%ymm10
  1044. vpaddq %ymm13,%ymm6,%ymm6
  1045. vpblendd $3,%ymm11,%ymm0,%ymm11
  1046. vpaddq %ymm10,%ymm7,%ymm7
  1047. vpaddq %ymm11,%ymm8,%ymm8
  1048. vmovdqu %ymm4,128-128(%rdi)
  1049. vmovdqu %ymm5,160-128(%rdi)
  1050. vmovdqu %ymm6,192-128(%rdi)
  1051. vmovdqu %ymm7,224-128(%rdi)
  1052. vmovdqu %ymm8,256-128(%rdi)
  1053. vzeroupper
  1054. movq %rbp,%rax
  1055. movq -48(%rax),%r15
  1056. movq -40(%rax),%r14
  1057. movq -32(%rax),%r13
  1058. movq -24(%rax),%r12
  1059. movq -16(%rax),%rbp
  1060. movq -8(%rax),%rbx
  1061. leaq (%rax),%rsp
  1062. L$mul_1024_epilogue:
  1063. .byte 0xf3,0xc3
  1064. .globl _rsaz_1024_red2norm_avx2
  1065. .p2align 5
  1066. _rsaz_1024_red2norm_avx2:
  1067. subq $-128,%rsi
  1068. xorq %rax,%rax
  1069. movq -128(%rsi),%r8
  1070. movq -120(%rsi),%r9
  1071. movq -112(%rsi),%r10
  1072. shlq $0,%r8
  1073. shlq $29,%r9
  1074. movq %r10,%r11
  1075. shlq $58,%r10
  1076. shrq $6,%r11
  1077. addq %r8,%rax
  1078. addq %r9,%rax
  1079. addq %r10,%rax
  1080. adcq $0,%r11
  1081. movq %rax,0(%rdi)
  1082. movq %r11,%rax
  1083. movq -104(%rsi),%r8
  1084. movq -96(%rsi),%r9
  1085. shlq $23,%r8
  1086. movq %r9,%r10
  1087. shlq $52,%r9
  1088. shrq $12,%r10
  1089. addq %r8,%rax
  1090. addq %r9,%rax
  1091. adcq $0,%r10
  1092. movq %rax,8(%rdi)
  1093. movq %r10,%rax
  1094. movq -88(%rsi),%r11
  1095. movq -80(%rsi),%r8
  1096. shlq $17,%r11
  1097. movq %r8,%r9
  1098. shlq $46,%r8
  1099. shrq $18,%r9
  1100. addq %r11,%rax
  1101. addq %r8,%rax
  1102. adcq $0,%r9
  1103. movq %rax,16(%rdi)
  1104. movq %r9,%rax
  1105. movq -72(%rsi),%r10
  1106. movq -64(%rsi),%r11
  1107. shlq $11,%r10
  1108. movq %r11,%r8
  1109. shlq $40,%r11
  1110. shrq $24,%r8
  1111. addq %r10,%rax
  1112. addq %r11,%rax
  1113. adcq $0,%r8
  1114. movq %rax,24(%rdi)
  1115. movq %r8,%rax
  1116. movq -56(%rsi),%r9
  1117. movq -48(%rsi),%r10
  1118. movq -40(%rsi),%r11
  1119. shlq $5,%r9
  1120. shlq $34,%r10
  1121. movq %r11,%r8
  1122. shlq $63,%r11
  1123. shrq $1,%r8
  1124. addq %r9,%rax
  1125. addq %r10,%rax
  1126. addq %r11,%rax
  1127. adcq $0,%r8
  1128. movq %rax,32(%rdi)
  1129. movq %r8,%rax
  1130. movq -32(%rsi),%r9
  1131. movq -24(%rsi),%r10
  1132. shlq $28,%r9
  1133. movq %r10,%r11
  1134. shlq $57,%r10
  1135. shrq $7,%r11
  1136. addq %r9,%rax
  1137. addq %r10,%rax
  1138. adcq $0,%r11
  1139. movq %rax,40(%rdi)
  1140. movq %r11,%rax
  1141. movq -16(%rsi),%r8
  1142. movq -8(%rsi),%r9
  1143. shlq $22,%r8
  1144. movq %r9,%r10
  1145. shlq $51,%r9
  1146. shrq $13,%r10
  1147. addq %r8,%rax
  1148. addq %r9,%rax
  1149. adcq $0,%r10
  1150. movq %rax,48(%rdi)
  1151. movq %r10,%rax
  1152. movq 0(%rsi),%r11
  1153. movq 8(%rsi),%r8
  1154. shlq $16,%r11
  1155. movq %r8,%r9
  1156. shlq $45,%r8
  1157. shrq $19,%r9
  1158. addq %r11,%rax
  1159. addq %r8,%rax
  1160. adcq $0,%r9
  1161. movq %rax,56(%rdi)
  1162. movq %r9,%rax
  1163. movq 16(%rsi),%r10
  1164. movq 24(%rsi),%r11
  1165. shlq $10,%r10
  1166. movq %r11,%r8
  1167. shlq $39,%r11
  1168. shrq $25,%r8
  1169. addq %r10,%rax
  1170. addq %r11,%rax
  1171. adcq $0,%r8
  1172. movq %rax,64(%rdi)
  1173. movq %r8,%rax
  1174. movq 32(%rsi),%r9
  1175. movq 40(%rsi),%r10
  1176. movq 48(%rsi),%r11
  1177. shlq $4,%r9
  1178. shlq $33,%r10
  1179. movq %r11,%r8
  1180. shlq $62,%r11
  1181. shrq $2,%r8
  1182. addq %r9,%rax
  1183. addq %r10,%rax
  1184. addq %r11,%rax
  1185. adcq $0,%r8
  1186. movq %rax,72(%rdi)
  1187. movq %r8,%rax
  1188. movq 56(%rsi),%r9
  1189. movq 64(%rsi),%r10
  1190. shlq $27,%r9
  1191. movq %r10,%r11
  1192. shlq $56,%r10
  1193. shrq $8,%r11
  1194. addq %r9,%rax
  1195. addq %r10,%rax
  1196. adcq $0,%r11
  1197. movq %rax,80(%rdi)
  1198. movq %r11,%rax
  1199. movq 72(%rsi),%r8
  1200. movq 80(%rsi),%r9
  1201. shlq $21,%r8
  1202. movq %r9,%r10
  1203. shlq $50,%r9
  1204. shrq $14,%r10
  1205. addq %r8,%rax
  1206. addq %r9,%rax
  1207. adcq $0,%r10
  1208. movq %rax,88(%rdi)
  1209. movq %r10,%rax
  1210. movq 88(%rsi),%r11
  1211. movq 96(%rsi),%r8
  1212. shlq $15,%r11
  1213. movq %r8,%r9
  1214. shlq $44,%r8
  1215. shrq $20,%r9
  1216. addq %r11,%rax
  1217. addq %r8,%rax
  1218. adcq $0,%r9
  1219. movq %rax,96(%rdi)
  1220. movq %r9,%rax
  1221. movq 104(%rsi),%r10
  1222. movq 112(%rsi),%r11
  1223. shlq $9,%r10
  1224. movq %r11,%r8
  1225. shlq $38,%r11
  1226. shrq $26,%r8
  1227. addq %r10,%rax
  1228. addq %r11,%rax
  1229. adcq $0,%r8
  1230. movq %rax,104(%rdi)
  1231. movq %r8,%rax
  1232. movq 120(%rsi),%r9
  1233. movq 128(%rsi),%r10
  1234. movq 136(%rsi),%r11
  1235. shlq $3,%r9
  1236. shlq $32,%r10
  1237. movq %r11,%r8
  1238. shlq $61,%r11
  1239. shrq $3,%r8
  1240. addq %r9,%rax
  1241. addq %r10,%rax
  1242. addq %r11,%rax
  1243. adcq $0,%r8
  1244. movq %rax,112(%rdi)
  1245. movq %r8,%rax
  1246. movq 144(%rsi),%r9
  1247. movq 152(%rsi),%r10
  1248. shlq $26,%r9
  1249. movq %r10,%r11
  1250. shlq $55,%r10
  1251. shrq $9,%r11
  1252. addq %r9,%rax
  1253. addq %r10,%rax
  1254. adcq $0,%r11
  1255. movq %rax,120(%rdi)
  1256. movq %r11,%rax
  1257. .byte 0xf3,0xc3
  1258. .globl _rsaz_1024_norm2red_avx2
  1259. .p2align 5
  1260. _rsaz_1024_norm2red_avx2:
  1261. subq $-128,%rdi
  1262. movq (%rsi),%r8
  1263. movl $0x1fffffff,%eax
  1264. movq 8(%rsi),%r9
  1265. movq %r8,%r11
  1266. shrq $0,%r11
  1267. andq %rax,%r11
  1268. movq %r11,-128(%rdi)
  1269. movq %r8,%r10
  1270. shrq $29,%r10
  1271. andq %rax,%r10
  1272. movq %r10,-120(%rdi)
  1273. shrdq $58,%r9,%r8
  1274. andq %rax,%r8
  1275. movq %r8,-112(%rdi)
  1276. movq 16(%rsi),%r10
  1277. movq %r9,%r8
  1278. shrq $23,%r8
  1279. andq %rax,%r8
  1280. movq %r8,-104(%rdi)
  1281. shrdq $52,%r10,%r9
  1282. andq %rax,%r9
  1283. movq %r9,-96(%rdi)
  1284. movq 24(%rsi),%r11
  1285. movq %r10,%r9
  1286. shrq $17,%r9
  1287. andq %rax,%r9
  1288. movq %r9,-88(%rdi)
  1289. shrdq $46,%r11,%r10
  1290. andq %rax,%r10
  1291. movq %r10,-80(%rdi)
  1292. movq 32(%rsi),%r8
  1293. movq %r11,%r10
  1294. shrq $11,%r10
  1295. andq %rax,%r10
  1296. movq %r10,-72(%rdi)
  1297. shrdq $40,%r8,%r11
  1298. andq %rax,%r11
  1299. movq %r11,-64(%rdi)
  1300. movq 40(%rsi),%r9
  1301. movq %r8,%r11
  1302. shrq $5,%r11
  1303. andq %rax,%r11
  1304. movq %r11,-56(%rdi)
  1305. movq %r8,%r10
  1306. shrq $34,%r10
  1307. andq %rax,%r10
  1308. movq %r10,-48(%rdi)
  1309. shrdq $63,%r9,%r8
  1310. andq %rax,%r8
  1311. movq %r8,-40(%rdi)
  1312. movq 48(%rsi),%r10
  1313. movq %r9,%r8
  1314. shrq $28,%r8
  1315. andq %rax,%r8
  1316. movq %r8,-32(%rdi)
  1317. shrdq $57,%r10,%r9
  1318. andq %rax,%r9
  1319. movq %r9,-24(%rdi)
  1320. movq 56(%rsi),%r11
  1321. movq %r10,%r9
  1322. shrq $22,%r9
  1323. andq %rax,%r9
  1324. movq %r9,-16(%rdi)
  1325. shrdq $51,%r11,%r10
  1326. andq %rax,%r10
  1327. movq %r10,-8(%rdi)
  1328. movq 64(%rsi),%r8
  1329. movq %r11,%r10
  1330. shrq $16,%r10
  1331. andq %rax,%r10
  1332. movq %r10,0(%rdi)
  1333. shrdq $45,%r8,%r11
  1334. andq %rax,%r11
  1335. movq %r11,8(%rdi)
  1336. movq 72(%rsi),%r9
  1337. movq %r8,%r11
  1338. shrq $10,%r11
  1339. andq %rax,%r11
  1340. movq %r11,16(%rdi)
  1341. shrdq $39,%r9,%r8
  1342. andq %rax,%r8
  1343. movq %r8,24(%rdi)
  1344. movq 80(%rsi),%r10
  1345. movq %r9,%r8
  1346. shrq $4,%r8
  1347. andq %rax,%r8
  1348. movq %r8,32(%rdi)
  1349. movq %r9,%r11
  1350. shrq $33,%r11
  1351. andq %rax,%r11
  1352. movq %r11,40(%rdi)
  1353. shrdq $62,%r10,%r9
  1354. andq %rax,%r9
  1355. movq %r9,48(%rdi)
  1356. movq 88(%rsi),%r11
  1357. movq %r10,%r9
  1358. shrq $27,%r9
  1359. andq %rax,%r9
  1360. movq %r9,56(%rdi)
  1361. shrdq $56,%r11,%r10
  1362. andq %rax,%r10
  1363. movq %r10,64(%rdi)
  1364. movq 96(%rsi),%r8
  1365. movq %r11,%r10
  1366. shrq $21,%r10
  1367. andq %rax,%r10
  1368. movq %r10,72(%rdi)
  1369. shrdq $50,%r8,%r11
  1370. andq %rax,%r11
  1371. movq %r11,80(%rdi)
  1372. movq 104(%rsi),%r9
  1373. movq %r8,%r11
  1374. shrq $15,%r11
  1375. andq %rax,%r11
  1376. movq %r11,88(%rdi)
  1377. shrdq $44,%r9,%r8
  1378. andq %rax,%r8
  1379. movq %r8,96(%rdi)
  1380. movq 112(%rsi),%r10
  1381. movq %r9,%r8
  1382. shrq $9,%r8
  1383. andq %rax,%r8
  1384. movq %r8,104(%rdi)
  1385. shrdq $38,%r10,%r9
  1386. andq %rax,%r9
  1387. movq %r9,112(%rdi)
  1388. movq 120(%rsi),%r11
  1389. movq %r10,%r9
  1390. shrq $3,%r9
  1391. andq %rax,%r9
  1392. movq %r9,120(%rdi)
  1393. movq %r10,%r8
  1394. shrq $32,%r8
  1395. andq %rax,%r8
  1396. movq %r8,128(%rdi)
  1397. shrdq $61,%r11,%r10
  1398. andq %rax,%r10
  1399. movq %r10,136(%rdi)
  1400. xorq %r8,%r8
  1401. movq %r11,%r10
  1402. shrq $26,%r10
  1403. andq %rax,%r10
  1404. movq %r10,144(%rdi)
  1405. shrdq $55,%r8,%r11
  1406. andq %rax,%r11
  1407. movq %r11,152(%rdi)
  1408. movq %r8,160(%rdi)
  1409. movq %r8,168(%rdi)
  1410. movq %r8,176(%rdi)
  1411. movq %r8,184(%rdi)
  1412. .byte 0xf3,0xc3
  1413. .globl _rsaz_1024_scatter5_avx2
  1414. .p2align 5
  1415. _rsaz_1024_scatter5_avx2:
  1416. vzeroupper
  1417. vmovdqu L$scatter_permd(%rip),%ymm5
  1418. shll $4,%edx
  1419. leaq (%rdi,%rdx,1),%rdi
  1420. movl $9,%eax
  1421. jmp L$oop_scatter_1024
  1422. .p2align 5
  1423. L$oop_scatter_1024:
  1424. vmovdqu (%rsi),%ymm0
  1425. leaq 32(%rsi),%rsi
  1426. vpermd %ymm0,%ymm5,%ymm0
  1427. vmovdqu %xmm0,(%rdi)
  1428. leaq 512(%rdi),%rdi
  1429. decl %eax
  1430. jnz L$oop_scatter_1024
  1431. vzeroupper
  1432. .byte 0xf3,0xc3
  1433. .globl _rsaz_1024_gather5_avx2
  1434. .p2align 5
  1435. _rsaz_1024_gather5_avx2:
  1436. vzeroupper
  1437. movq %rsp,%r11
  1438. leaq -256(%rsp),%rsp
  1439. andq $-32,%rsp
  1440. leaq L$inc(%rip),%r10
  1441. leaq -128(%rsp),%rax
  1442. vmovd %edx,%xmm4
  1443. vmovdqa (%r10),%ymm0
  1444. vmovdqa 32(%r10),%ymm1
  1445. vmovdqa 64(%r10),%ymm5
  1446. vpbroadcastd %xmm4,%ymm4
  1447. vpaddd %ymm5,%ymm0,%ymm2
  1448. vpcmpeqd %ymm4,%ymm0,%ymm0
  1449. vpaddd %ymm5,%ymm1,%ymm3
  1450. vpcmpeqd %ymm4,%ymm1,%ymm1
  1451. vmovdqa %ymm0,0+128(%rax)
  1452. vpaddd %ymm5,%ymm2,%ymm0
  1453. vpcmpeqd %ymm4,%ymm2,%ymm2
  1454. vmovdqa %ymm1,32+128(%rax)
  1455. vpaddd %ymm5,%ymm3,%ymm1
  1456. vpcmpeqd %ymm4,%ymm3,%ymm3
  1457. vmovdqa %ymm2,64+128(%rax)
  1458. vpaddd %ymm5,%ymm0,%ymm2
  1459. vpcmpeqd %ymm4,%ymm0,%ymm0
  1460. vmovdqa %ymm3,96+128(%rax)
  1461. vpaddd %ymm5,%ymm1,%ymm3
  1462. vpcmpeqd %ymm4,%ymm1,%ymm1
  1463. vmovdqa %ymm0,128+128(%rax)
  1464. vpaddd %ymm5,%ymm2,%ymm8
  1465. vpcmpeqd %ymm4,%ymm2,%ymm2
  1466. vmovdqa %ymm1,160+128(%rax)
  1467. vpaddd %ymm5,%ymm3,%ymm9
  1468. vpcmpeqd %ymm4,%ymm3,%ymm3
  1469. vmovdqa %ymm2,192+128(%rax)
  1470. vpaddd %ymm5,%ymm8,%ymm10
  1471. vpcmpeqd %ymm4,%ymm8,%ymm8
  1472. vmovdqa %ymm3,224+128(%rax)
  1473. vpaddd %ymm5,%ymm9,%ymm11
  1474. vpcmpeqd %ymm4,%ymm9,%ymm9
  1475. vpaddd %ymm5,%ymm10,%ymm12
  1476. vpcmpeqd %ymm4,%ymm10,%ymm10
  1477. vpaddd %ymm5,%ymm11,%ymm13
  1478. vpcmpeqd %ymm4,%ymm11,%ymm11
  1479. vpaddd %ymm5,%ymm12,%ymm14
  1480. vpcmpeqd %ymm4,%ymm12,%ymm12
  1481. vpaddd %ymm5,%ymm13,%ymm15
  1482. vpcmpeqd %ymm4,%ymm13,%ymm13
  1483. vpcmpeqd %ymm4,%ymm14,%ymm14
  1484. vpcmpeqd %ymm4,%ymm15,%ymm15
  1485. vmovdqa -32(%r10),%ymm7
  1486. leaq 128(%rsi),%rsi
  1487. movl $9,%edx
  1488. L$oop_gather_1024:
  1489. vmovdqa 0-128(%rsi),%ymm0
  1490. vmovdqa 32-128(%rsi),%ymm1
  1491. vmovdqa 64-128(%rsi),%ymm2
  1492. vmovdqa 96-128(%rsi),%ymm3
  1493. vpand 0+128(%rax),%ymm0,%ymm0
  1494. vpand 32+128(%rax),%ymm1,%ymm1
  1495. vpand 64+128(%rax),%ymm2,%ymm2
  1496. vpor %ymm0,%ymm1,%ymm4
  1497. vpand 96+128(%rax),%ymm3,%ymm3
  1498. vmovdqa 128-128(%rsi),%ymm0
  1499. vmovdqa 160-128(%rsi),%ymm1
  1500. vpor %ymm2,%ymm3,%ymm5
  1501. vmovdqa 192-128(%rsi),%ymm2
  1502. vmovdqa 224-128(%rsi),%ymm3
  1503. vpand 128+128(%rax),%ymm0,%ymm0
  1504. vpand 160+128(%rax),%ymm1,%ymm1
  1505. vpand 192+128(%rax),%ymm2,%ymm2
  1506. vpor %ymm0,%ymm4,%ymm4
  1507. vpand 224+128(%rax),%ymm3,%ymm3
  1508. vpand 256-128(%rsi),%ymm8,%ymm0
  1509. vpor %ymm1,%ymm5,%ymm5
  1510. vpand 288-128(%rsi),%ymm9,%ymm1
  1511. vpor %ymm2,%ymm4,%ymm4
  1512. vpand 320-128(%rsi),%ymm10,%ymm2
  1513. vpor %ymm3,%ymm5,%ymm5
  1514. vpand 352-128(%rsi),%ymm11,%ymm3
  1515. vpor %ymm0,%ymm4,%ymm4
  1516. vpand 384-128(%rsi),%ymm12,%ymm0
  1517. vpor %ymm1,%ymm5,%ymm5
  1518. vpand 416-128(%rsi),%ymm13,%ymm1
  1519. vpor %ymm2,%ymm4,%ymm4
  1520. vpand 448-128(%rsi),%ymm14,%ymm2
  1521. vpor %ymm3,%ymm5,%ymm5
  1522. vpand 480-128(%rsi),%ymm15,%ymm3
  1523. leaq 512(%rsi),%rsi
  1524. vpor %ymm0,%ymm4,%ymm4
  1525. vpor %ymm1,%ymm5,%ymm5
  1526. vpor %ymm2,%ymm4,%ymm4
  1527. vpor %ymm3,%ymm5,%ymm5
  1528. vpor %ymm5,%ymm4,%ymm4
  1529. vextracti128 $1,%ymm4,%xmm5
  1530. vpor %xmm4,%xmm5,%xmm5
  1531. vpermd %ymm5,%ymm7,%ymm5
  1532. vmovdqu %ymm5,(%rdi)
  1533. leaq 32(%rdi),%rdi
  1534. decl %edx
  1535. jnz L$oop_gather_1024
  1536. vpxor %ymm0,%ymm0,%ymm0
  1537. vmovdqu %ymm0,(%rdi)
  1538. vzeroupper
  1539. leaq (%r11),%rsp
  1540. .byte 0xf3,0xc3
  1541. L$SEH_end_rsaz_1024_gather5:
  1542. .globl _rsaz_avx2_eligible
  1543. .p2align 5
  1544. _rsaz_avx2_eligible:
  1545. movl _OPENSSL_ia32cap_P+8(%rip),%eax
  1546. movl $524544,%ecx
  1547. movl $0,%edx
  1548. andl %eax,%ecx
  1549. cmpl $524544,%ecx
  1550. cmovel %edx,%eax
  1551. andl $32,%eax
  1552. shrl $5,%eax
  1553. .byte 0xf3,0xc3
  1554. .p2align 6
  1555. L$and_mask:
  1556. .quad 0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff
  1557. L$scatter_permd:
  1558. .long 0,2,4,6,7,7,7,7
  1559. L$gather_permd:
  1560. .long 0,7,1,7,2,7,3,7
  1561. L$inc:
  1562. .long 0,0,0,0, 1,1,1,1
  1563. .long 2,2,2,2, 3,3,3,3
  1564. .long 4,4,4,4, 4,4,4,4
  1565. .p2align 6