x86_64-mont.s 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239
  1. .text
  2. .globl _bn_mul_mont
  3. .p2align 4
  4. _bn_mul_mont:
  5. movl %r9d,%r9d
  6. movq %rsp,%rax
  7. testl $3,%r9d
  8. jnz L$mul_enter
  9. cmpl $8,%r9d
  10. jb L$mul_enter
  11. movl _OPENSSL_ia32cap_P+8(%rip),%r11d
  12. cmpq %rsi,%rdx
  13. jne L$mul4x_enter
  14. testl $7,%r9d
  15. jz L$sqr8x_enter
  16. jmp L$mul4x_enter
  17. .p2align 4
  18. L$mul_enter:
  19. pushq %rbx
  20. pushq %rbp
  21. pushq %r12
  22. pushq %r13
  23. pushq %r14
  24. pushq %r15
  25. negq %r9
  26. movq %rsp,%r11
  27. leaq -16(%rsp,%r9,8),%r10
  28. negq %r9
  29. andq $-1024,%r10
  30. subq %r10,%r11
  31. andq $-4096,%r11
  32. leaq (%r10,%r11,1),%rsp
  33. movq (%rsp),%r11
  34. cmpq %r10,%rsp
  35. ja L$mul_page_walk
  36. jmp L$mul_page_walk_done
  37. .p2align 4
  38. L$mul_page_walk:
  39. leaq -4096(%rsp),%rsp
  40. movq (%rsp),%r11
  41. cmpq %r10,%rsp
  42. ja L$mul_page_walk
  43. L$mul_page_walk_done:
  44. movq %rax,8(%rsp,%r9,8)
  45. L$mul_body:
  46. movq %rdx,%r12
  47. movq (%r8),%r8
  48. movq (%r12),%rbx
  49. movq (%rsi),%rax
  50. xorq %r14,%r14
  51. xorq %r15,%r15
  52. movq %r8,%rbp
  53. mulq %rbx
  54. movq %rax,%r10
  55. movq (%rcx),%rax
  56. imulq %r10,%rbp
  57. movq %rdx,%r11
  58. mulq %rbp
  59. addq %rax,%r10
  60. movq 8(%rsi),%rax
  61. adcq $0,%rdx
  62. movq %rdx,%r13
  63. leaq 1(%r15),%r15
  64. jmp L$1st_enter
  65. .p2align 4
  66. L$1st:
  67. addq %rax,%r13
  68. movq (%rsi,%r15,8),%rax
  69. adcq $0,%rdx
  70. addq %r11,%r13
  71. movq %r10,%r11
  72. adcq $0,%rdx
  73. movq %r13,-16(%rsp,%r15,8)
  74. movq %rdx,%r13
  75. L$1st_enter:
  76. mulq %rbx
  77. addq %rax,%r11
  78. movq (%rcx,%r15,8),%rax
  79. adcq $0,%rdx
  80. leaq 1(%r15),%r15
  81. movq %rdx,%r10
  82. mulq %rbp
  83. cmpq %r9,%r15
  84. jne L$1st
  85. addq %rax,%r13
  86. movq (%rsi),%rax
  87. adcq $0,%rdx
  88. addq %r11,%r13
  89. adcq $0,%rdx
  90. movq %r13,-16(%rsp,%r15,8)
  91. movq %rdx,%r13
  92. movq %r10,%r11
  93. xorq %rdx,%rdx
  94. addq %r11,%r13
  95. adcq $0,%rdx
  96. movq %r13,-8(%rsp,%r9,8)
  97. movq %rdx,(%rsp,%r9,8)
  98. leaq 1(%r14),%r14
  99. jmp L$outer
  100. .p2align 4
  101. L$outer:
  102. movq (%r12,%r14,8),%rbx
  103. xorq %r15,%r15
  104. movq %r8,%rbp
  105. movq (%rsp),%r10
  106. mulq %rbx
  107. addq %rax,%r10
  108. movq (%rcx),%rax
  109. adcq $0,%rdx
  110. imulq %r10,%rbp
  111. movq %rdx,%r11
  112. mulq %rbp
  113. addq %rax,%r10
  114. movq 8(%rsi),%rax
  115. adcq $0,%rdx
  116. movq 8(%rsp),%r10
  117. movq %rdx,%r13
  118. leaq 1(%r15),%r15
  119. jmp L$inner_enter
  120. .p2align 4
  121. L$inner:
  122. addq %rax,%r13
  123. movq (%rsi,%r15,8),%rax
  124. adcq $0,%rdx
  125. addq %r10,%r13
  126. movq (%rsp,%r15,8),%r10
  127. adcq $0,%rdx
  128. movq %r13,-16(%rsp,%r15,8)
  129. movq %rdx,%r13
  130. L$inner_enter:
  131. mulq %rbx
  132. addq %rax,%r11
  133. movq (%rcx,%r15,8),%rax
  134. adcq $0,%rdx
  135. addq %r11,%r10
  136. movq %rdx,%r11
  137. adcq $0,%r11
  138. leaq 1(%r15),%r15
  139. mulq %rbp
  140. cmpq %r9,%r15
  141. jne L$inner
  142. addq %rax,%r13
  143. movq (%rsi),%rax
  144. adcq $0,%rdx
  145. addq %r10,%r13
  146. movq (%rsp,%r15,8),%r10
  147. adcq $0,%rdx
  148. movq %r13,-16(%rsp,%r15,8)
  149. movq %rdx,%r13
  150. xorq %rdx,%rdx
  151. addq %r11,%r13
  152. adcq $0,%rdx
  153. addq %r10,%r13
  154. adcq $0,%rdx
  155. movq %r13,-8(%rsp,%r9,8)
  156. movq %rdx,(%rsp,%r9,8)
  157. leaq 1(%r14),%r14
  158. cmpq %r9,%r14
  159. jb L$outer
  160. xorq %r14,%r14
  161. movq (%rsp),%rax
  162. movq %r9,%r15
  163. .p2align 4
  164. L$sub: sbbq (%rcx,%r14,8),%rax
  165. movq %rax,(%rdi,%r14,8)
  166. movq 8(%rsp,%r14,8),%rax
  167. leaq 1(%r14),%r14
  168. decq %r15
  169. jnz L$sub
  170. sbbq $0,%rax
  171. movq $-1,%rbx
  172. xorq %rax,%rbx
  173. xorq %r14,%r14
  174. movq %r9,%r15
  175. L$copy:
  176. movq (%rdi,%r14,8),%rcx
  177. movq (%rsp,%r14,8),%rdx
  178. andq %rbx,%rcx
  179. andq %rax,%rdx
  180. movq %r9,(%rsp,%r14,8)
  181. orq %rcx,%rdx
  182. movq %rdx,(%rdi,%r14,8)
  183. leaq 1(%r14),%r14
  184. subq $1,%r15
  185. jnz L$copy
  186. movq 8(%rsp,%r9,8),%rsi
  187. movq $1,%rax
  188. movq -48(%rsi),%r15
  189. movq -40(%rsi),%r14
  190. movq -32(%rsi),%r13
  191. movq -24(%rsi),%r12
  192. movq -16(%rsi),%rbp
  193. movq -8(%rsi),%rbx
  194. leaq (%rsi),%rsp
  195. L$mul_epilogue:
  196. .byte 0xf3,0xc3
  197. .p2align 4
  198. bn_mul4x_mont:
  199. movl %r9d,%r9d
  200. movq %rsp,%rax
  201. L$mul4x_enter:
  202. andl $0x80100,%r11d
  203. cmpl $0x80100,%r11d
  204. je L$mulx4x_enter
  205. pushq %rbx
  206. pushq %rbp
  207. pushq %r12
  208. pushq %r13
  209. pushq %r14
  210. pushq %r15
  211. negq %r9
  212. movq %rsp,%r11
  213. leaq -32(%rsp,%r9,8),%r10
  214. negq %r9
  215. andq $-1024,%r10
  216. subq %r10,%r11
  217. andq $-4096,%r11
  218. leaq (%r10,%r11,1),%rsp
  219. movq (%rsp),%r11
  220. cmpq %r10,%rsp
  221. ja L$mul4x_page_walk
  222. jmp L$mul4x_page_walk_done
  223. L$mul4x_page_walk:
  224. leaq -4096(%rsp),%rsp
  225. movq (%rsp),%r11
  226. cmpq %r10,%rsp
  227. ja L$mul4x_page_walk
  228. L$mul4x_page_walk_done:
  229. movq %rax,8(%rsp,%r9,8)
  230. L$mul4x_body:
  231. movq %rdi,16(%rsp,%r9,8)
  232. movq %rdx,%r12
  233. movq (%r8),%r8
  234. movq (%r12),%rbx
  235. movq (%rsi),%rax
  236. xorq %r14,%r14
  237. xorq %r15,%r15
  238. movq %r8,%rbp
  239. mulq %rbx
  240. movq %rax,%r10
  241. movq (%rcx),%rax
  242. imulq %r10,%rbp
  243. movq %rdx,%r11
  244. mulq %rbp
  245. addq %rax,%r10
  246. movq 8(%rsi),%rax
  247. adcq $0,%rdx
  248. movq %rdx,%rdi
  249. mulq %rbx
  250. addq %rax,%r11
  251. movq 8(%rcx),%rax
  252. adcq $0,%rdx
  253. movq %rdx,%r10
  254. mulq %rbp
  255. addq %rax,%rdi
  256. movq 16(%rsi),%rax
  257. adcq $0,%rdx
  258. addq %r11,%rdi
  259. leaq 4(%r15),%r15
  260. adcq $0,%rdx
  261. movq %rdi,(%rsp)
  262. movq %rdx,%r13
  263. jmp L$1st4x
  264. .p2align 4
  265. L$1st4x:
  266. mulq %rbx
  267. addq %rax,%r10
  268. movq -16(%rcx,%r15,8),%rax
  269. adcq $0,%rdx
  270. movq %rdx,%r11
  271. mulq %rbp
  272. addq %rax,%r13
  273. movq -8(%rsi,%r15,8),%rax
  274. adcq $0,%rdx
  275. addq %r10,%r13
  276. adcq $0,%rdx
  277. movq %r13,-24(%rsp,%r15,8)
  278. movq %rdx,%rdi
  279. mulq %rbx
  280. addq %rax,%r11
  281. movq -8(%rcx,%r15,8),%rax
  282. adcq $0,%rdx
  283. movq %rdx,%r10
  284. mulq %rbp
  285. addq %rax,%rdi
  286. movq (%rsi,%r15,8),%rax
  287. adcq $0,%rdx
  288. addq %r11,%rdi
  289. adcq $0,%rdx
  290. movq %rdi,-16(%rsp,%r15,8)
  291. movq %rdx,%r13
  292. mulq %rbx
  293. addq %rax,%r10
  294. movq (%rcx,%r15,8),%rax
  295. adcq $0,%rdx
  296. movq %rdx,%r11
  297. mulq %rbp
  298. addq %rax,%r13
  299. movq 8(%rsi,%r15,8),%rax
  300. adcq $0,%rdx
  301. addq %r10,%r13
  302. adcq $0,%rdx
  303. movq %r13,-8(%rsp,%r15,8)
  304. movq %rdx,%rdi
  305. mulq %rbx
  306. addq %rax,%r11
  307. movq 8(%rcx,%r15,8),%rax
  308. adcq $0,%rdx
  309. leaq 4(%r15),%r15
  310. movq %rdx,%r10
  311. mulq %rbp
  312. addq %rax,%rdi
  313. movq -16(%rsi,%r15,8),%rax
  314. adcq $0,%rdx
  315. addq %r11,%rdi
  316. adcq $0,%rdx
  317. movq %rdi,-32(%rsp,%r15,8)
  318. movq %rdx,%r13
  319. cmpq %r9,%r15
  320. jb L$1st4x
  321. mulq %rbx
  322. addq %rax,%r10
  323. movq -16(%rcx,%r15,8),%rax
  324. adcq $0,%rdx
  325. movq %rdx,%r11
  326. mulq %rbp
  327. addq %rax,%r13
  328. movq -8(%rsi,%r15,8),%rax
  329. adcq $0,%rdx
  330. addq %r10,%r13
  331. adcq $0,%rdx
  332. movq %r13,-24(%rsp,%r15,8)
  333. movq %rdx,%rdi
  334. mulq %rbx
  335. addq %rax,%r11
  336. movq -8(%rcx,%r15,8),%rax
  337. adcq $0,%rdx
  338. movq %rdx,%r10
  339. mulq %rbp
  340. addq %rax,%rdi
  341. movq (%rsi),%rax
  342. adcq $0,%rdx
  343. addq %r11,%rdi
  344. adcq $0,%rdx
  345. movq %rdi,-16(%rsp,%r15,8)
  346. movq %rdx,%r13
  347. xorq %rdi,%rdi
  348. addq %r10,%r13
  349. adcq $0,%rdi
  350. movq %r13,-8(%rsp,%r15,8)
  351. movq %rdi,(%rsp,%r15,8)
  352. leaq 1(%r14),%r14
  353. .p2align 2
  354. L$outer4x:
  355. movq (%r12,%r14,8),%rbx
  356. xorq %r15,%r15
  357. movq (%rsp),%r10
  358. movq %r8,%rbp
  359. mulq %rbx
  360. addq %rax,%r10
  361. movq (%rcx),%rax
  362. adcq $0,%rdx
  363. imulq %r10,%rbp
  364. movq %rdx,%r11
  365. mulq %rbp
  366. addq %rax,%r10
  367. movq 8(%rsi),%rax
  368. adcq $0,%rdx
  369. movq %rdx,%rdi
  370. mulq %rbx
  371. addq %rax,%r11
  372. movq 8(%rcx),%rax
  373. adcq $0,%rdx
  374. addq 8(%rsp),%r11
  375. adcq $0,%rdx
  376. movq %rdx,%r10
  377. mulq %rbp
  378. addq %rax,%rdi
  379. movq 16(%rsi),%rax
  380. adcq $0,%rdx
  381. addq %r11,%rdi
  382. leaq 4(%r15),%r15
  383. adcq $0,%rdx
  384. movq %rdi,(%rsp)
  385. movq %rdx,%r13
  386. jmp L$inner4x
  387. .p2align 4
  388. L$inner4x:
  389. mulq %rbx
  390. addq %rax,%r10
  391. movq -16(%rcx,%r15,8),%rax
  392. adcq $0,%rdx
  393. addq -16(%rsp,%r15,8),%r10
  394. adcq $0,%rdx
  395. movq %rdx,%r11
  396. mulq %rbp
  397. addq %rax,%r13
  398. movq -8(%rsi,%r15,8),%rax
  399. adcq $0,%rdx
  400. addq %r10,%r13
  401. adcq $0,%rdx
  402. movq %r13,-24(%rsp,%r15,8)
  403. movq %rdx,%rdi
  404. mulq %rbx
  405. addq %rax,%r11
  406. movq -8(%rcx,%r15,8),%rax
  407. adcq $0,%rdx
  408. addq -8(%rsp,%r15,8),%r11
  409. adcq $0,%rdx
  410. movq %rdx,%r10
  411. mulq %rbp
  412. addq %rax,%rdi
  413. movq (%rsi,%r15,8),%rax
  414. adcq $0,%rdx
  415. addq %r11,%rdi
  416. adcq $0,%rdx
  417. movq %rdi,-16(%rsp,%r15,8)
  418. movq %rdx,%r13
  419. mulq %rbx
  420. addq %rax,%r10
  421. movq (%rcx,%r15,8),%rax
  422. adcq $0,%rdx
  423. addq (%rsp,%r15,8),%r10
  424. adcq $0,%rdx
  425. movq %rdx,%r11
  426. mulq %rbp
  427. addq %rax,%r13
  428. movq 8(%rsi,%r15,8),%rax
  429. adcq $0,%rdx
  430. addq %r10,%r13
  431. adcq $0,%rdx
  432. movq %r13,-8(%rsp,%r15,8)
  433. movq %rdx,%rdi
  434. mulq %rbx
  435. addq %rax,%r11
  436. movq 8(%rcx,%r15,8),%rax
  437. adcq $0,%rdx
  438. addq 8(%rsp,%r15,8),%r11
  439. adcq $0,%rdx
  440. leaq 4(%r15),%r15
  441. movq %rdx,%r10
  442. mulq %rbp
  443. addq %rax,%rdi
  444. movq -16(%rsi,%r15,8),%rax
  445. adcq $0,%rdx
  446. addq %r11,%rdi
  447. adcq $0,%rdx
  448. movq %rdi,-32(%rsp,%r15,8)
  449. movq %rdx,%r13
  450. cmpq %r9,%r15
  451. jb L$inner4x
  452. mulq %rbx
  453. addq %rax,%r10
  454. movq -16(%rcx,%r15,8),%rax
  455. adcq $0,%rdx
  456. addq -16(%rsp,%r15,8),%r10
  457. adcq $0,%rdx
  458. movq %rdx,%r11
  459. mulq %rbp
  460. addq %rax,%r13
  461. movq -8(%rsi,%r15,8),%rax
  462. adcq $0,%rdx
  463. addq %r10,%r13
  464. adcq $0,%rdx
  465. movq %r13,-24(%rsp,%r15,8)
  466. movq %rdx,%rdi
  467. mulq %rbx
  468. addq %rax,%r11
  469. movq -8(%rcx,%r15,8),%rax
  470. adcq $0,%rdx
  471. addq -8(%rsp,%r15,8),%r11
  472. adcq $0,%rdx
  473. leaq 1(%r14),%r14
  474. movq %rdx,%r10
  475. mulq %rbp
  476. addq %rax,%rdi
  477. movq (%rsi),%rax
  478. adcq $0,%rdx
  479. addq %r11,%rdi
  480. adcq $0,%rdx
  481. movq %rdi,-16(%rsp,%r15,8)
  482. movq %rdx,%r13
  483. xorq %rdi,%rdi
  484. addq %r10,%r13
  485. adcq $0,%rdi
  486. addq (%rsp,%r9,8),%r13
  487. adcq $0,%rdi
  488. movq %r13,-8(%rsp,%r15,8)
  489. movq %rdi,(%rsp,%r15,8)
  490. cmpq %r9,%r14
  491. jb L$outer4x
  492. movq 16(%rsp,%r9,8),%rdi
  493. leaq -4(%r9),%r15
  494. movq 0(%rsp),%rax
  495. movq 8(%rsp),%rdx
  496. shrq $2,%r15
  497. leaq (%rsp),%rsi
  498. xorq %r14,%r14
  499. subq 0(%rcx),%rax
  500. movq 16(%rsi),%rbx
  501. movq 24(%rsi),%rbp
  502. sbbq 8(%rcx),%rdx
  503. L$sub4x:
  504. movq %rax,0(%rdi,%r14,8)
  505. movq %rdx,8(%rdi,%r14,8)
  506. sbbq 16(%rcx,%r14,8),%rbx
  507. movq 32(%rsi,%r14,8),%rax
  508. movq 40(%rsi,%r14,8),%rdx
  509. sbbq 24(%rcx,%r14,8),%rbp
  510. movq %rbx,16(%rdi,%r14,8)
  511. movq %rbp,24(%rdi,%r14,8)
  512. sbbq 32(%rcx,%r14,8),%rax
  513. movq 48(%rsi,%r14,8),%rbx
  514. movq 56(%rsi,%r14,8),%rbp
  515. sbbq 40(%rcx,%r14,8),%rdx
  516. leaq 4(%r14),%r14
  517. decq %r15
  518. jnz L$sub4x
  519. movq %rax,0(%rdi,%r14,8)
  520. movq 32(%rsi,%r14,8),%rax
  521. sbbq 16(%rcx,%r14,8),%rbx
  522. movq %rdx,8(%rdi,%r14,8)
  523. sbbq 24(%rcx,%r14,8),%rbp
  524. movq %rbx,16(%rdi,%r14,8)
  525. sbbq $0,%rax
  526. movq %rbp,24(%rdi,%r14,8)
  527. pxor %xmm0,%xmm0
  528. .byte 102,72,15,110,224
  529. pcmpeqd %xmm5,%xmm5
  530. pshufd $0,%xmm4,%xmm4
  531. movq %r9,%r15
  532. pxor %xmm4,%xmm5
  533. shrq $2,%r15
  534. xorl %eax,%eax
  535. jmp L$copy4x
  536. .p2align 4
  537. L$copy4x:
  538. movdqa (%rsp,%rax,1),%xmm1
  539. movdqu (%rdi,%rax,1),%xmm2
  540. pand %xmm4,%xmm1
  541. pand %xmm5,%xmm2
  542. movdqa 16(%rsp,%rax,1),%xmm3
  543. movdqa %xmm0,(%rsp,%rax,1)
  544. por %xmm2,%xmm1
  545. movdqu 16(%rdi,%rax,1),%xmm2
  546. movdqu %xmm1,(%rdi,%rax,1)
  547. pand %xmm4,%xmm3
  548. pand %xmm5,%xmm2
  549. movdqa %xmm0,16(%rsp,%rax,1)
  550. por %xmm2,%xmm3
  551. movdqu %xmm3,16(%rdi,%rax,1)
  552. leaq 32(%rax),%rax
  553. decq %r15
  554. jnz L$copy4x
  555. movq 8(%rsp,%r9,8),%rsi
  556. movq $1,%rax
  557. movq -48(%rsi),%r15
  558. movq -40(%rsi),%r14
  559. movq -32(%rsi),%r13
  560. movq -24(%rsi),%r12
  561. movq -16(%rsi),%rbp
  562. movq -8(%rsi),%rbx
  563. leaq (%rsi),%rsp
  564. L$mul4x_epilogue:
  565. .byte 0xf3,0xc3
  566. .p2align 5
  567. bn_sqr8x_mont:
  568. movq %rsp,%rax
  569. L$sqr8x_enter:
  570. pushq %rbx
  571. pushq %rbp
  572. pushq %r12
  573. pushq %r13
  574. pushq %r14
  575. pushq %r15
  576. L$sqr8x_prologue:
  577. movl %r9d,%r10d
  578. shll $3,%r9d
  579. shlq $3+2,%r10
  580. negq %r9
  581. leaq -64(%rsp,%r9,2),%r11
  582. movq %rsp,%rbp
  583. movq (%r8),%r8
  584. subq %rsi,%r11
  585. andq $4095,%r11
  586. cmpq %r11,%r10
  587. jb L$sqr8x_sp_alt
  588. subq %r11,%rbp
  589. leaq -64(%rbp,%r9,2),%rbp
  590. jmp L$sqr8x_sp_done
  591. .p2align 5
  592. L$sqr8x_sp_alt:
  593. leaq 4096-64(,%r9,2),%r10
  594. leaq -64(%rbp,%r9,2),%rbp
  595. subq %r10,%r11
  596. movq $0,%r10
  597. cmovcq %r10,%r11
  598. subq %r11,%rbp
  599. L$sqr8x_sp_done:
  600. andq $-64,%rbp
  601. movq %rsp,%r11
  602. subq %rbp,%r11
  603. andq $-4096,%r11
  604. leaq (%r11,%rbp,1),%rsp
  605. movq (%rsp),%r10
  606. cmpq %rbp,%rsp
  607. ja L$sqr8x_page_walk
  608. jmp L$sqr8x_page_walk_done
  609. .p2align 4
  610. L$sqr8x_page_walk:
  611. leaq -4096(%rsp),%rsp
  612. movq (%rsp),%r10
  613. cmpq %rbp,%rsp
  614. ja L$sqr8x_page_walk
  615. L$sqr8x_page_walk_done:
  616. movq %r9,%r10
  617. negq %r9
  618. movq %r8,32(%rsp)
  619. movq %rax,40(%rsp)
  620. L$sqr8x_body:
  621. .byte 102,72,15,110,209
  622. pxor %xmm0,%xmm0
  623. .byte 102,72,15,110,207
  624. .byte 102,73,15,110,218
  625. movl _OPENSSL_ia32cap_P+8(%rip),%eax
  626. andl $0x80100,%eax
  627. cmpl $0x80100,%eax
  628. jne L$sqr8x_nox
  629. call _bn_sqrx8x_internal
  630. leaq (%r8,%rcx,1),%rbx
  631. movq %rcx,%r9
  632. movq %rcx,%rdx
  633. .byte 102,72,15,126,207
  634. sarq $3+2,%rcx
  635. jmp L$sqr8x_sub
  636. .p2align 5
  637. L$sqr8x_nox:
  638. call _bn_sqr8x_internal
  639. leaq (%rdi,%r9,1),%rbx
  640. movq %r9,%rcx
  641. movq %r9,%rdx
  642. .byte 102,72,15,126,207
  643. sarq $3+2,%rcx
  644. jmp L$sqr8x_sub
  645. .p2align 5
  646. L$sqr8x_sub:
  647. movq 0(%rbx),%r12
  648. movq 8(%rbx),%r13
  649. movq 16(%rbx),%r14
  650. movq 24(%rbx),%r15
  651. leaq 32(%rbx),%rbx
  652. sbbq 0(%rbp),%r12
  653. sbbq 8(%rbp),%r13
  654. sbbq 16(%rbp),%r14
  655. sbbq 24(%rbp),%r15
  656. leaq 32(%rbp),%rbp
  657. movq %r12,0(%rdi)
  658. movq %r13,8(%rdi)
  659. movq %r14,16(%rdi)
  660. movq %r15,24(%rdi)
  661. leaq 32(%rdi),%rdi
  662. incq %rcx
  663. jnz L$sqr8x_sub
  664. sbbq $0,%rax
  665. leaq (%rbx,%r9,1),%rbx
  666. leaq (%rdi,%r9,1),%rdi
  667. .byte 102,72,15,110,200
  668. pxor %xmm0,%xmm0
  669. pshufd $0,%xmm1,%xmm1
  670. movq 40(%rsp),%rsi
  671. jmp L$sqr8x_cond_copy
  672. .p2align 5
  673. L$sqr8x_cond_copy:
  674. movdqa 0(%rbx),%xmm2
  675. movdqa 16(%rbx),%xmm3
  676. leaq 32(%rbx),%rbx
  677. movdqu 0(%rdi),%xmm4
  678. movdqu 16(%rdi),%xmm5
  679. leaq 32(%rdi),%rdi
  680. movdqa %xmm0,-32(%rbx)
  681. movdqa %xmm0,-16(%rbx)
  682. movdqa %xmm0,-32(%rbx,%rdx,1)
  683. movdqa %xmm0,-16(%rbx,%rdx,1)
  684. pcmpeqd %xmm1,%xmm0
  685. pand %xmm1,%xmm2
  686. pand %xmm1,%xmm3
  687. pand %xmm0,%xmm4
  688. pand %xmm0,%xmm5
  689. pxor %xmm0,%xmm0
  690. por %xmm2,%xmm4
  691. por %xmm3,%xmm5
  692. movdqu %xmm4,-32(%rdi)
  693. movdqu %xmm5,-16(%rdi)
  694. addq $32,%r9
  695. jnz L$sqr8x_cond_copy
  696. movq $1,%rax
  697. movq -48(%rsi),%r15
  698. movq -40(%rsi),%r14
  699. movq -32(%rsi),%r13
  700. movq -24(%rsi),%r12
  701. movq -16(%rsi),%rbp
  702. movq -8(%rsi),%rbx
  703. leaq (%rsi),%rsp
  704. L$sqr8x_epilogue:
  705. .byte 0xf3,0xc3
  706. .p2align 5
  707. bn_mulx4x_mont:
  708. movq %rsp,%rax
  709. L$mulx4x_enter:
  710. pushq %rbx
  711. pushq %rbp
  712. pushq %r12
  713. pushq %r13
  714. pushq %r14
  715. pushq %r15
  716. L$mulx4x_prologue:
  717. shll $3,%r9d
  718. xorq %r10,%r10
  719. subq %r9,%r10
  720. movq (%r8),%r8
  721. leaq -72(%rsp,%r10,1),%rbp
  722. andq $-128,%rbp
  723. movq %rsp,%r11
  724. subq %rbp,%r11
  725. andq $-4096,%r11
  726. leaq (%r11,%rbp,1),%rsp
  727. movq (%rsp),%r10
  728. cmpq %rbp,%rsp
  729. ja L$mulx4x_page_walk
  730. jmp L$mulx4x_page_walk_done
  731. .p2align 4
  732. L$mulx4x_page_walk:
  733. leaq -4096(%rsp),%rsp
  734. movq (%rsp),%r10
  735. cmpq %rbp,%rsp
  736. ja L$mulx4x_page_walk
  737. L$mulx4x_page_walk_done:
  738. leaq (%rdx,%r9,1),%r10
  739. movq %r9,0(%rsp)
  740. shrq $5,%r9
  741. movq %r10,16(%rsp)
  742. subq $1,%r9
  743. movq %r8,24(%rsp)
  744. movq %rdi,32(%rsp)
  745. movq %rax,40(%rsp)
  746. movq %r9,48(%rsp)
  747. jmp L$mulx4x_body
  748. .p2align 5
  749. L$mulx4x_body:
  750. leaq 8(%rdx),%rdi
  751. movq (%rdx),%rdx
  752. leaq 64+32(%rsp),%rbx
  753. movq %rdx,%r9
  754. mulxq 0(%rsi),%r8,%rax
  755. mulxq 8(%rsi),%r11,%r14
  756. addq %rax,%r11
  757. movq %rdi,8(%rsp)
  758. mulxq 16(%rsi),%r12,%r13
  759. adcq %r14,%r12
  760. adcq $0,%r13
  761. movq %r8,%rdi
  762. imulq 24(%rsp),%r8
  763. xorq %rbp,%rbp
  764. mulxq 24(%rsi),%rax,%r14
  765. movq %r8,%rdx
  766. leaq 32(%rsi),%rsi
  767. adcxq %rax,%r13
  768. adcxq %rbp,%r14
  769. mulxq 0(%rcx),%rax,%r10
  770. adcxq %rax,%rdi
  771. adoxq %r11,%r10
  772. mulxq 8(%rcx),%rax,%r11
  773. adcxq %rax,%r10
  774. adoxq %r12,%r11
  775. .byte 0xc4,0x62,0xfb,0xf6,0xa1,0x10,0x00,0x00,0x00
  776. movq 48(%rsp),%rdi
  777. movq %r10,-32(%rbx)
  778. adcxq %rax,%r11
  779. adoxq %r13,%r12
  780. mulxq 24(%rcx),%rax,%r15
  781. movq %r9,%rdx
  782. movq %r11,-24(%rbx)
  783. adcxq %rax,%r12
  784. adoxq %rbp,%r15
  785. leaq 32(%rcx),%rcx
  786. movq %r12,-16(%rbx)
  787. jmp L$mulx4x_1st
  788. .p2align 5
  789. L$mulx4x_1st:
  790. adcxq %rbp,%r15
  791. mulxq 0(%rsi),%r10,%rax
  792. adcxq %r14,%r10
  793. mulxq 8(%rsi),%r11,%r14
  794. adcxq %rax,%r11
  795. mulxq 16(%rsi),%r12,%rax
  796. adcxq %r14,%r12
  797. mulxq 24(%rsi),%r13,%r14
  798. .byte 0x67,0x67
  799. movq %r8,%rdx
  800. adcxq %rax,%r13
  801. adcxq %rbp,%r14
  802. leaq 32(%rsi),%rsi
  803. leaq 32(%rbx),%rbx
  804. adoxq %r15,%r10
  805. mulxq 0(%rcx),%rax,%r15
  806. adcxq %rax,%r10
  807. adoxq %r15,%r11
  808. mulxq 8(%rcx),%rax,%r15
  809. adcxq %rax,%r11
  810. adoxq %r15,%r12
  811. mulxq 16(%rcx),%rax,%r15
  812. movq %r10,-40(%rbx)
  813. adcxq %rax,%r12
  814. movq %r11,-32(%rbx)
  815. adoxq %r15,%r13
  816. mulxq 24(%rcx),%rax,%r15
  817. movq %r9,%rdx
  818. movq %r12,-24(%rbx)
  819. adcxq %rax,%r13
  820. adoxq %rbp,%r15
  821. leaq 32(%rcx),%rcx
  822. movq %r13,-16(%rbx)
  823. decq %rdi
  824. jnz L$mulx4x_1st
  825. movq 0(%rsp),%rax
  826. movq 8(%rsp),%rdi
  827. adcq %rbp,%r15
  828. addq %r15,%r14
  829. sbbq %r15,%r15
  830. movq %r14,-8(%rbx)
  831. jmp L$mulx4x_outer
  832. .p2align 5
  833. L$mulx4x_outer:
  834. movq (%rdi),%rdx
  835. leaq 8(%rdi),%rdi
  836. subq %rax,%rsi
  837. movq %r15,(%rbx)
  838. leaq 64+32(%rsp),%rbx
  839. subq %rax,%rcx
  840. mulxq 0(%rsi),%r8,%r11
  841. xorl %ebp,%ebp
  842. movq %rdx,%r9
  843. mulxq 8(%rsi),%r14,%r12
  844. adoxq -32(%rbx),%r8
  845. adcxq %r14,%r11
  846. mulxq 16(%rsi),%r15,%r13
  847. adoxq -24(%rbx),%r11
  848. adcxq %r15,%r12
  849. adoxq -16(%rbx),%r12
  850. adcxq %rbp,%r13
  851. adoxq %rbp,%r13
  852. movq %rdi,8(%rsp)
  853. movq %r8,%r15
  854. imulq 24(%rsp),%r8
  855. xorl %ebp,%ebp
  856. mulxq 24(%rsi),%rax,%r14
  857. movq %r8,%rdx
  858. adcxq %rax,%r13
  859. adoxq -8(%rbx),%r13
  860. adcxq %rbp,%r14
  861. leaq 32(%rsi),%rsi
  862. adoxq %rbp,%r14
  863. mulxq 0(%rcx),%rax,%r10
  864. adcxq %rax,%r15
  865. adoxq %r11,%r10
  866. mulxq 8(%rcx),%rax,%r11
  867. adcxq %rax,%r10
  868. adoxq %r12,%r11
  869. mulxq 16(%rcx),%rax,%r12
  870. movq %r10,-32(%rbx)
  871. adcxq %rax,%r11
  872. adoxq %r13,%r12
  873. mulxq 24(%rcx),%rax,%r15
  874. movq %r9,%rdx
  875. movq %r11,-24(%rbx)
  876. leaq 32(%rcx),%rcx
  877. adcxq %rax,%r12
  878. adoxq %rbp,%r15
  879. movq 48(%rsp),%rdi
  880. movq %r12,-16(%rbx)
  881. jmp L$mulx4x_inner
  882. .p2align 5
  883. L$mulx4x_inner:
  884. mulxq 0(%rsi),%r10,%rax
  885. adcxq %rbp,%r15
  886. adoxq %r14,%r10
  887. mulxq 8(%rsi),%r11,%r14
  888. adcxq 0(%rbx),%r10
  889. adoxq %rax,%r11
  890. mulxq 16(%rsi),%r12,%rax
  891. adcxq 8(%rbx),%r11
  892. adoxq %r14,%r12
  893. mulxq 24(%rsi),%r13,%r14
  894. movq %r8,%rdx
  895. adcxq 16(%rbx),%r12
  896. adoxq %rax,%r13
  897. adcxq 24(%rbx),%r13
  898. adoxq %rbp,%r14
  899. leaq 32(%rsi),%rsi
  900. leaq 32(%rbx),%rbx
  901. adcxq %rbp,%r14
  902. adoxq %r15,%r10
  903. mulxq 0(%rcx),%rax,%r15
  904. adcxq %rax,%r10
  905. adoxq %r15,%r11
  906. mulxq 8(%rcx),%rax,%r15
  907. adcxq %rax,%r11
  908. adoxq %r15,%r12
  909. mulxq 16(%rcx),%rax,%r15
  910. movq %r10,-40(%rbx)
  911. adcxq %rax,%r12
  912. adoxq %r15,%r13
  913. mulxq 24(%rcx),%rax,%r15
  914. movq %r9,%rdx
  915. movq %r11,-32(%rbx)
  916. movq %r12,-24(%rbx)
  917. adcxq %rax,%r13
  918. adoxq %rbp,%r15
  919. leaq 32(%rcx),%rcx
  920. movq %r13,-16(%rbx)
  921. decq %rdi
  922. jnz L$mulx4x_inner
  923. movq 0(%rsp),%rax
  924. movq 8(%rsp),%rdi
  925. adcq %rbp,%r15
  926. subq 0(%rbx),%rbp
  927. adcq %r15,%r14
  928. sbbq %r15,%r15
  929. movq %r14,-8(%rbx)
  930. cmpq 16(%rsp),%rdi
  931. jne L$mulx4x_outer
  932. leaq 64(%rsp),%rbx
  933. subq %rax,%rcx
  934. negq %r15
  935. movq %rax,%rdx
  936. shrq $3+2,%rax
  937. movq 32(%rsp),%rdi
  938. jmp L$mulx4x_sub
  939. .p2align 5
  940. L$mulx4x_sub:
  941. movq 0(%rbx),%r11
  942. movq 8(%rbx),%r12
  943. movq 16(%rbx),%r13
  944. movq 24(%rbx),%r14
  945. leaq 32(%rbx),%rbx
  946. sbbq 0(%rcx),%r11
  947. sbbq 8(%rcx),%r12
  948. sbbq 16(%rcx),%r13
  949. sbbq 24(%rcx),%r14
  950. leaq 32(%rcx),%rcx
  951. movq %r11,0(%rdi)
  952. movq %r12,8(%rdi)
  953. movq %r13,16(%rdi)
  954. movq %r14,24(%rdi)
  955. leaq 32(%rdi),%rdi
  956. decq %rax
  957. jnz L$mulx4x_sub
  958. sbbq $0,%r15
  959. leaq 64(%rsp),%rbx
  960. subq %rdx,%rdi
  961. .byte 102,73,15,110,207
  962. pxor %xmm0,%xmm0
  963. pshufd $0,%xmm1,%xmm1
  964. movq 40(%rsp),%rsi
  965. jmp L$mulx4x_cond_copy
  966. .p2align 5
  967. L$mulx4x_cond_copy:
  968. movdqa 0(%rbx),%xmm2
  969. movdqa 16(%rbx),%xmm3
  970. leaq 32(%rbx),%rbx
  971. movdqu 0(%rdi),%xmm4
  972. movdqu 16(%rdi),%xmm5
  973. leaq 32(%rdi),%rdi
  974. movdqa %xmm0,-32(%rbx)
  975. movdqa %xmm0,-16(%rbx)
  976. pcmpeqd %xmm1,%xmm0
  977. pand %xmm1,%xmm2
  978. pand %xmm1,%xmm3
  979. pand %xmm0,%xmm4
  980. pand %xmm0,%xmm5
  981. pxor %xmm0,%xmm0
  982. por %xmm2,%xmm4
  983. por %xmm3,%xmm5
  984. movdqu %xmm4,-32(%rdi)
  985. movdqu %xmm5,-16(%rdi)
  986. subq $32,%rdx
  987. jnz L$mulx4x_cond_copy
  988. movq %rdx,(%rbx)
  989. movq $1,%rax
  990. movq -48(%rsi),%r15
  991. movq -40(%rsi),%r14
  992. movq -32(%rsi),%r13
  993. movq -24(%rsi),%r12
  994. movq -16(%rsi),%rbp
  995. movq -8(%rsi),%rbx
  996. leaq (%rsi),%rsp
  997. L$mulx4x_epilogue:
  998. .byte 0xf3,0xc3
  999. .byte 77,111,110,116,103,111,109,101,114,121,32,77,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,120,56,54,95,54,52,44,32,67,82,89,80,84,79,71,65,77,83,32,98,121,32,60,97,112,112,114,111,64,111,112,101,110,115,115,108,46,111,114,103,62,0
  1000. .p2align 4