arithmetic_x86.s 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150
  1. // +build amd64,blsasm amd64,blsadx
  2. #include "textflag.h"
  3. // addition w/ modular reduction
  4. // a = (a + b) % p
  5. TEXT ·addAssign(SB), NOSPLIT, $0-16
  6. // |
  7. MOVQ a+0(FP), DI
  8. MOVQ b+8(FP), SI
  9. // |
  10. MOVQ (DI), R8
  11. MOVQ 8(DI), R9
  12. MOVQ 16(DI), R10
  13. MOVQ 24(DI), R11
  14. MOVQ 32(DI), R12
  15. MOVQ 40(DI), R13
  16. // |
  17. ADDQ (SI), R8
  18. ADCQ 8(SI), R9
  19. ADCQ 16(SI), R10
  20. ADCQ 24(SI), R11
  21. ADCQ 32(SI), R12
  22. ADCQ 40(SI), R13
  23. // |
  24. MOVQ R8, R14
  25. MOVQ R9, R15
  26. MOVQ R10, CX
  27. MOVQ R11, DX
  28. MOVQ R12, SI
  29. MOVQ R13, BX
  30. MOVQ $0xb9feffffffffaaab, AX
  31. SUBQ AX, R14
  32. MOVQ $0x1eabfffeb153ffff, AX
  33. SBBQ AX, R15
  34. MOVQ $0x6730d2a0f6b0f624, AX
  35. SBBQ AX, CX
  36. MOVQ $0x64774b84f38512bf, AX
  37. SBBQ AX, DX
  38. MOVQ $0x4b1ba7b6434bacd7, AX
  39. SBBQ AX, SI
  40. MOVQ $0x1a0111ea397fe69a, AX
  41. SBBQ AX, BX
  42. CMOVQCC R14, R8
  43. CMOVQCC R15, R9
  44. CMOVQCC CX, R10
  45. CMOVQCC DX, R11
  46. CMOVQCC SI, R12
  47. CMOVQCC BX, R13
  48. // |
  49. MOVQ R8, (DI)
  50. MOVQ R9, 8(DI)
  51. MOVQ R10, 16(DI)
  52. MOVQ R11, 24(DI)
  53. MOVQ R12, 32(DI)
  54. MOVQ R13, 40(DI)
  55. RET
  56. /* | end */
  57. // addition w/ modular reduction
  58. // c = (a + b) % p
  59. TEXT ·add(SB), NOSPLIT, $0-24
  60. // |
  61. MOVQ a+8(FP), DI
  62. MOVQ b+16(FP), SI
  63. // |
  64. MOVQ (DI), R8
  65. MOVQ 8(DI), R9
  66. MOVQ 16(DI), R10
  67. MOVQ 24(DI), R11
  68. MOVQ 32(DI), R12
  69. MOVQ 40(DI), R13
  70. // |
  71. ADDQ (SI), R8
  72. ADCQ 8(SI), R9
  73. ADCQ 16(SI), R10
  74. ADCQ 24(SI), R11
  75. ADCQ 32(SI), R12
  76. ADCQ 40(SI), R13
  77. // |
  78. MOVQ R8, R14
  79. MOVQ R9, R15
  80. MOVQ R10, CX
  81. MOVQ R11, DX
  82. MOVQ R12, SI
  83. MOVQ R13, BX
  84. MOVQ $0xb9feffffffffaaab, DI
  85. SUBQ DI, R14
  86. MOVQ $0x1eabfffeb153ffff, DI
  87. SBBQ DI, R15
  88. MOVQ $0x6730d2a0f6b0f624, DI
  89. SBBQ DI, CX
  90. MOVQ $0x64774b84f38512bf, DI
  91. SBBQ DI, DX
  92. MOVQ $0x4b1ba7b6434bacd7, DI
  93. SBBQ DI, SI
  94. MOVQ $0x1a0111ea397fe69a, DI
  95. SBBQ DI, BX
  96. CMOVQCC R14, R8
  97. CMOVQCC R15, R9
  98. CMOVQCC CX, R10
  99. CMOVQCC DX, R11
  100. CMOVQCC SI, R12
  101. CMOVQCC BX, R13
  102. // |
  103. MOVQ c+0(FP), DI
  104. MOVQ R8, (DI)
  105. MOVQ R9, 8(DI)
  106. MOVQ R10, 16(DI)
  107. MOVQ R11, 24(DI)
  108. MOVQ R12, 32(DI)
  109. MOVQ R13, 40(DI)
  110. RET
  111. /* | end */
  112. // addition w/o reduction check
  113. // c = (a + b)
  114. TEXT ·ladd(SB), NOSPLIT, $0-24
  115. // |
  116. MOVQ a+8(FP), DI
  117. MOVQ b+16(FP), SI
  118. // |
  119. MOVQ (DI), R8
  120. MOVQ 8(DI), R9
  121. MOVQ 16(DI), R10
  122. MOVQ 24(DI), R11
  123. MOVQ 32(DI), R12
  124. MOVQ 40(DI), R13
  125. // |
  126. ADDQ (SI), R8
  127. ADCQ 8(SI), R9
  128. ADCQ 16(SI), R10
  129. ADCQ 24(SI), R11
  130. ADCQ 32(SI), R12
  131. ADCQ 40(SI), R13
  132. // |
  133. MOVQ c+0(FP), DI
  134. MOVQ R8, (DI)
  135. MOVQ R9, 8(DI)
  136. MOVQ R10, 16(DI)
  137. MOVQ R11, 24(DI)
  138. MOVQ R12, 32(DI)
  139. MOVQ R13, 40(DI)
  140. RET
  141. /* | end */
  142. // addition w/o reduction check
  143. // a = a + b
  144. TEXT ·laddAssign(SB), NOSPLIT, $0-16
  145. // |
  146. MOVQ a+0(FP), DI
  147. MOVQ b+8(FP), SI
  148. // |
  149. MOVQ (DI), R8
  150. MOVQ 8(DI), R9
  151. MOVQ 16(DI), R10
  152. MOVQ 24(DI), R11
  153. MOVQ 32(DI), R12
  154. MOVQ 40(DI), R13
  155. // |
  156. ADDQ (SI), R8
  157. ADCQ 8(SI), R9
  158. ADCQ 16(SI), R10
  159. ADCQ 24(SI), R11
  160. ADCQ 32(SI), R12
  161. ADCQ 40(SI), R13
  162. // |
  163. MOVQ a+0(FP), DI
  164. MOVQ R8, (DI)
  165. MOVQ R9, 8(DI)
  166. MOVQ R10, 16(DI)
  167. MOVQ R11, 24(DI)
  168. MOVQ R12, 32(DI)
  169. MOVQ R13, 40(DI)
  170. RET
  171. /* | end */
  172. // subtraction w/ modular reduction
  173. // c = (a - b) % p
  174. TEXT ·sub(SB), NOSPLIT, $0-24
  175. // |
  176. MOVQ a+8(FP), DI
  177. MOVQ b+16(FP), SI
  178. XORQ AX, AX
  179. // |
  180. MOVQ (DI), R8
  181. MOVQ 8(DI), R9
  182. MOVQ 16(DI), R10
  183. MOVQ 24(DI), R11
  184. MOVQ 32(DI), R12
  185. MOVQ 40(DI), R13
  186. SUBQ (SI), R8
  187. SBBQ 8(SI), R9
  188. SBBQ 16(SI), R10
  189. SBBQ 24(SI), R11
  190. SBBQ 32(SI), R12
  191. SBBQ 40(SI), R13
  192. // |
  193. MOVQ $0xb9feffffffffaaab, R14
  194. MOVQ $0x1eabfffeb153ffff, R15
  195. MOVQ $0x6730d2a0f6b0f624, CX
  196. MOVQ $0x64774b84f38512bf, DX
  197. MOVQ $0x4b1ba7b6434bacd7, SI
  198. MOVQ $0x1a0111ea397fe69a, BX
  199. CMOVQCC AX, R14
  200. CMOVQCC AX, R15
  201. CMOVQCC AX, CX
  202. CMOVQCC AX, DX
  203. CMOVQCC AX, SI
  204. CMOVQCC AX, BX
  205. ADDQ R14, R8
  206. ADCQ R15, R9
  207. ADCQ CX, R10
  208. ADCQ DX, R11
  209. ADCQ SI, R12
  210. ADCQ BX, R13
  211. // |
  212. MOVQ c+0(FP), DI
  213. MOVQ R8, (DI)
  214. MOVQ R9, 8(DI)
  215. MOVQ R10, 16(DI)
  216. MOVQ R11, 24(DI)
  217. MOVQ R12, 32(DI)
  218. MOVQ R13, 40(DI)
  219. RET
  220. /* | end */
  221. // subtraction w/ modular reduction
  222. // a = (a - b) % p
  223. TEXT ·subAssign(SB), NOSPLIT, $0-16
  224. // |
  225. MOVQ a+0(FP), DI
  226. MOVQ b+8(FP), SI
  227. XORQ AX, AX
  228. // |
  229. MOVQ (DI), R8
  230. MOVQ 8(DI), R9
  231. MOVQ 16(DI), R10
  232. MOVQ 24(DI), R11
  233. MOVQ 32(DI), R12
  234. MOVQ 40(DI), R13
  235. SUBQ (SI), R8
  236. SBBQ 8(SI), R9
  237. SBBQ 16(SI), R10
  238. SBBQ 24(SI), R11
  239. SBBQ 32(SI), R12
  240. SBBQ 40(SI), R13
  241. // |
  242. MOVQ $0xb9feffffffffaaab, R14
  243. MOVQ $0x1eabfffeb153ffff, R15
  244. MOVQ $0x6730d2a0f6b0f624, CX
  245. MOVQ $0x64774b84f38512bf, DX
  246. MOVQ $0x4b1ba7b6434bacd7, SI
  247. MOVQ $0x1a0111ea397fe69a, BX
  248. CMOVQCC AX, R14
  249. CMOVQCC AX, R15
  250. CMOVQCC AX, CX
  251. CMOVQCC AX, DX
  252. CMOVQCC AX, SI
  253. CMOVQCC AX, BX
  254. ADDQ R14, R8
  255. ADCQ R15, R9
  256. ADCQ CX, R10
  257. ADCQ DX, R11
  258. ADCQ SI, R12
  259. ADCQ BX, R13
  260. // |
  261. MOVQ a+0(FP), DI
  262. MOVQ R8, (DI)
  263. MOVQ R9, 8(DI)
  264. MOVQ R10, 16(DI)
  265. MOVQ R11, 24(DI)
  266. MOVQ R12, 32(DI)
  267. MOVQ R13, 40(DI)
  268. RET
  269. /* | end */
  270. // subtraction w/o reduction check
  271. // a = (a - b)
  272. TEXT ·lsubAssign(SB), NOSPLIT, $0-16
  273. // |
  274. MOVQ a+0(FP), DI
  275. MOVQ b+8(FP), SI
  276. // |
  277. MOVQ (DI), R8
  278. MOVQ 8(DI), R9
  279. MOVQ 16(DI), R10
  280. MOVQ 24(DI), R11
  281. MOVQ 32(DI), R12
  282. MOVQ 40(DI), R13
  283. SUBQ (SI), R8
  284. SBBQ 8(SI), R9
  285. SBBQ 16(SI), R10
  286. SBBQ 24(SI), R11
  287. SBBQ 32(SI), R12
  288. SBBQ 40(SI), R13
  289. // |
  290. MOVQ a+0(FP), DI
  291. MOVQ R8, (DI)
  292. MOVQ R9, 8(DI)
  293. MOVQ R10, 16(DI)
  294. MOVQ R11, 24(DI)
  295. MOVQ R12, 32(DI)
  296. MOVQ R13, 40(DI)
  297. RET
  298. /* | end */
  299. // doubling w/ reduction
  300. // c = (2 * a) % p
  301. TEXT ·double(SB), NOSPLIT, $0-16
  302. // |
  303. MOVQ a+8(FP), DI
  304. MOVQ (DI), R8
  305. MOVQ 8(DI), R9
  306. MOVQ 16(DI), R10
  307. MOVQ 24(DI), R11
  308. MOVQ 32(DI), R12
  309. MOVQ 40(DI), R13
  310. ADDQ R8, R8
  311. ADCQ R9, R9
  312. ADCQ R10, R10
  313. ADCQ R11, R11
  314. ADCQ R12, R12
  315. ADCQ R13, R13
  316. // |
  317. MOVQ R8, R14
  318. MOVQ R9, R15
  319. MOVQ R10, CX
  320. MOVQ R11, DX
  321. MOVQ R12, SI
  322. MOVQ R13, BX
  323. MOVQ $0xb9feffffffffaaab, DI
  324. SUBQ DI, R14
  325. MOVQ $0x1eabfffeb153ffff, DI
  326. SBBQ DI, R15
  327. MOVQ $0x6730d2a0f6b0f624, DI
  328. SBBQ DI, CX
  329. MOVQ $0x64774b84f38512bf, DI
  330. SBBQ DI, DX
  331. MOVQ $0x4b1ba7b6434bacd7, DI
  332. SBBQ DI, SI
  333. MOVQ $0x1a0111ea397fe69a, DI
  334. SBBQ DI, BX
  335. CMOVQCC R14, R8
  336. CMOVQCC R15, R9
  337. CMOVQCC CX, R10
  338. CMOVQCC DX, R11
  339. CMOVQCC SI, R12
  340. CMOVQCC BX, R13
  341. // |
  342. MOVQ c+0(FP), DI
  343. MOVQ R8, (DI)
  344. MOVQ R9, 8(DI)
  345. MOVQ R10, 16(DI)
  346. MOVQ R11, 24(DI)
  347. MOVQ R12, 32(DI)
  348. MOVQ R13, 40(DI)
  349. RET
  350. /* | end */
  351. // doubling w/ reduction
  352. // a = (2 * a) % p
  353. TEXT ·doubleAssign(SB), NOSPLIT, $0-8
  354. // |
  355. MOVQ a+0(FP), DI
  356. MOVQ (DI), R8
  357. MOVQ 8(DI), R9
  358. MOVQ 16(DI), R10
  359. MOVQ 24(DI), R11
  360. MOVQ 32(DI), R12
  361. MOVQ 40(DI), R13
  362. ADDQ R8, R8
  363. ADCQ R9, R9
  364. ADCQ R10, R10
  365. ADCQ R11, R11
  366. ADCQ R12, R12
  367. ADCQ R13, R13
  368. // |
  369. MOVQ R8, R14
  370. MOVQ R9, R15
  371. MOVQ R10, CX
  372. MOVQ R11, DX
  373. MOVQ R12, SI
  374. MOVQ R13, BX
  375. MOVQ $0xb9feffffffffaaab, AX
  376. SUBQ AX, R14
  377. MOVQ $0x1eabfffeb153ffff, AX
  378. SBBQ AX, R15
  379. MOVQ $0x6730d2a0f6b0f624, AX
  380. SBBQ AX, CX
  381. MOVQ $0x64774b84f38512bf, AX
  382. SBBQ AX, DX
  383. MOVQ $0x4b1ba7b6434bacd7, AX
  384. SBBQ AX, SI
  385. MOVQ $0x1a0111ea397fe69a, AX
  386. SBBQ AX, BX
  387. CMOVQCC R14, R8
  388. CMOVQCC R15, R9
  389. CMOVQCC CX, R10
  390. CMOVQCC DX, R11
  391. CMOVQCC SI, R12
  392. CMOVQCC BX, R13
  393. MOVQ R8, (DI)
  394. MOVQ R9, 8(DI)
  395. MOVQ R10, 16(DI)
  396. MOVQ R11, 24(DI)
  397. MOVQ R12, 32(DI)
  398. MOVQ R13, 40(DI)
  399. RET
  400. /* | end */
  401. // doubling w/o reduction
  402. // c = 2 * a
  403. TEXT ·ldouble(SB), NOSPLIT, $0-16
  404. // |
  405. MOVQ a+8(FP), DI
  406. MOVQ (DI), R8
  407. MOVQ 8(DI), R9
  408. MOVQ 16(DI), R10
  409. MOVQ 24(DI), R11
  410. MOVQ 32(DI), R12
  411. MOVQ 40(DI), R13
  412. // |
  413. ADDQ R8, R8
  414. ADCQ R9, R9
  415. ADCQ R10, R10
  416. ADCQ R11, R11
  417. ADCQ R12, R12
  418. ADCQ R13, R13
  419. // |
  420. MOVQ c+0(FP), DI
  421. MOVQ R8, (DI)
  422. MOVQ R9, 8(DI)
  423. MOVQ R10, 16(DI)
  424. MOVQ R11, 24(DI)
  425. MOVQ R12, 32(DI)
  426. MOVQ R13, 40(DI)
  427. RET
  428. /* | end */
  429. TEXT ·_neg(SB), NOSPLIT, $0-16
  430. // |
  431. MOVQ a+8(FP), DI
  432. // |
  433. MOVQ $0xb9feffffffffaaab, R8
  434. MOVQ $0x1eabfffeb153ffff, R9
  435. MOVQ $0x6730d2a0f6b0f624, R10
  436. MOVQ $0x64774b84f38512bf, R11
  437. MOVQ $0x4b1ba7b6434bacd7, R12
  438. MOVQ $0x1a0111ea397fe69a, R13
  439. SUBQ (DI), R8
  440. SBBQ 8(DI), R9
  441. SBBQ 16(DI), R10
  442. SBBQ 24(DI), R11
  443. SBBQ 32(DI), R12
  444. SBBQ 40(DI), R13
  445. // |
  446. MOVQ c+0(FP), DI
  447. MOVQ R8, (DI)
  448. MOVQ R9, 8(DI)
  449. MOVQ R10, 16(DI)
  450. MOVQ R11, 24(DI)
  451. MOVQ R12, 32(DI)
  452. MOVQ R13, 40(DI)
  453. RET
  454. /* | end */
  455. // multiplication without using MULX/ADX
  456. // c = a * b % p
  457. TEXT ·mulNoADX(SB), NOSPLIT, $24-24
  458. // |
  459. /* inputs */
  460. MOVQ a+8(FP), DI
  461. MOVQ b+16(FP), SI
  462. MOVQ $0x00, R9
  463. MOVQ $0x00, R10
  464. MOVQ $0x00, R11
  465. MOVQ $0x00, R12
  466. MOVQ $0x00, R13
  467. MOVQ $0x00, R14
  468. MOVQ $0x00, R15
  469. // |
  470. /* i0 */
  471. // | a0 @ CX
  472. MOVQ (DI), CX
  473. // | a0 * b0
  474. MOVQ (SI), AX
  475. MULQ CX
  476. MOVQ AX, (SP)
  477. MOVQ DX, R8
  478. // | a0 * b1
  479. MOVQ 8(SI), AX
  480. MULQ CX
  481. ADDQ AX, R8
  482. ADCQ DX, R9
  483. // | a0 * b2
  484. MOVQ 16(SI), AX
  485. MULQ CX
  486. ADDQ AX, R9
  487. ADCQ DX, R10
  488. // | a0 * b3
  489. MOVQ 24(SI), AX
  490. MULQ CX
  491. ADDQ AX, R10
  492. ADCQ DX, R11
  493. // | a0 * b4
  494. MOVQ 32(SI), AX
  495. MULQ CX
  496. ADDQ AX, R11
  497. ADCQ DX, R12
  498. // | a0 * b5
  499. MOVQ 40(SI), AX
  500. MULQ CX
  501. ADDQ AX, R12
  502. ADCQ DX, R13
  503. // |
  504. /* i1 */
  505. // | a1 @ CX
  506. MOVQ 8(DI), CX
  507. MOVQ $0x00, BX
  508. // | a1 * b0
  509. MOVQ (SI), AX
  510. MULQ CX
  511. ADDQ AX, R8
  512. ADCQ DX, R9
  513. ADCQ $0x00, R10
  514. ADCQ $0x00, BX
  515. MOVQ R8, 8(SP)
  516. MOVQ $0x00, R8
  517. // | a1 * b1
  518. MOVQ 8(SI), AX
  519. MULQ CX
  520. ADDQ AX, R9
  521. ADCQ DX, R10
  522. ADCQ BX, R11
  523. MOVQ $0x00, BX
  524. ADCQ $0x00, BX
  525. // | a1 * b2
  526. MOVQ 16(SI), AX
  527. MULQ CX
  528. ADDQ AX, R10
  529. ADCQ DX, R11
  530. ADCQ BX, R12
  531. MOVQ $0x00, BX
  532. ADCQ $0x00, BX
  533. // | a1 * b3
  534. MOVQ 24(SI), AX
  535. MULQ CX
  536. ADDQ AX, R11
  537. ADCQ DX, R12
  538. ADCQ BX, R13
  539. MOVQ $0x00, BX
  540. ADCQ $0x00, BX
  541. // | a1 * b4
  542. MOVQ 32(SI), AX
  543. MULQ CX
  544. ADDQ AX, R12
  545. ADCQ DX, R13
  546. ADCQ BX, R14
  547. // | a1 * b5
  548. MOVQ 40(SI), AX
  549. MULQ CX
  550. ADDQ AX, R13
  551. ADCQ DX, R14
  552. // |
  553. /* i2 */
  554. // | a2 @ CX
  555. MOVQ 16(DI), CX
  556. MOVQ $0x00, BX
  557. // | a2 * b0
  558. MOVQ (SI), AX
  559. MULQ CX
  560. ADDQ AX, R9
  561. ADCQ DX, R10
  562. ADCQ $0x00, R11
  563. ADCQ $0x00, BX
  564. MOVQ R9, 16(SP)
  565. MOVQ $0x00, R9
  566. // | a2 * b1
  567. MOVQ 8(SI), AX
  568. MULQ CX
  569. ADDQ AX, R10
  570. ADCQ DX, R11
  571. ADCQ BX, R12
  572. MOVQ $0x00, BX
  573. ADCQ $0x00, BX
  574. // | a2 * b2
  575. MOVQ 16(SI), AX
  576. MULQ CX
  577. ADDQ AX, R11
  578. ADCQ DX, R12
  579. ADCQ BX, R13
  580. MOVQ $0x00, BX
  581. ADCQ $0x00, BX
  582. // | a2 * b3
  583. MOVQ 24(SI), AX
  584. MULQ CX
  585. ADDQ AX, R12
  586. ADCQ DX, R13
  587. ADCQ BX, R14
  588. MOVQ $0x00, BX
  589. ADCQ $0x00, BX
  590. // | a2 * b4
  591. MOVQ 32(SI), AX
  592. MULQ CX
  593. ADDQ AX, R13
  594. ADCQ DX, R14
  595. ADCQ BX, R15
  596. // | a2 * b5
  597. MOVQ 40(SI), AX
  598. MULQ CX
  599. ADDQ AX, R14
  600. ADCQ DX, R15
  601. // |
  602. /* i3 */
  603. // | a3 @ CX
  604. MOVQ 24(DI), CX
  605. MOVQ $0x00, BX
  606. // | a3 * b0
  607. MOVQ (SI), AX
  608. MULQ CX
  609. ADDQ AX, R10
  610. ADCQ DX, R11
  611. ADCQ $0x00, R12
  612. ADCQ $0x00, BX
  613. // | a3 * b1
  614. MOVQ 8(SI), AX
  615. MULQ CX
  616. ADDQ AX, R11
  617. ADCQ DX, R12
  618. ADCQ BX, R13
  619. MOVQ $0x00, BX
  620. ADCQ $0x00, BX
  621. // | a3 * b2
  622. MOVQ 16(SI), AX
  623. MULQ CX
  624. ADDQ AX, R12
  625. ADCQ DX, R13
  626. ADCQ BX, R14
  627. MOVQ $0x00, BX
  628. ADCQ $0x00, BX
  629. // | a3 * b3
  630. MOVQ 24(SI), AX
  631. MULQ CX
  632. ADDQ AX, R13
  633. ADCQ DX, R14
  634. ADCQ BX, R15
  635. MOVQ $0x00, BX
  636. ADCQ $0x00, BX
  637. // | a3 * b4
  638. MOVQ 32(SI), AX
  639. MULQ CX
  640. ADDQ AX, R14
  641. ADCQ DX, R15
  642. ADCQ BX, R8
  643. // | a3 * b5
  644. MOVQ 40(SI), AX
  645. MULQ CX
  646. ADDQ AX, R15
  647. ADCQ DX, R8
  648. // |
  649. /* i4 */
  650. // | a4 @ CX
  651. MOVQ 32(DI), CX
  652. MOVQ $0x00, BX
  653. // | a4 * b0
  654. MOVQ (SI), AX
  655. MULQ CX
  656. ADDQ AX, R11
  657. ADCQ DX, R12
  658. ADCQ $0x00, R13
  659. ADCQ $0x00, BX
  660. // | a4 * b1
  661. MOVQ 8(SI), AX
  662. MULQ CX
  663. ADDQ AX, R12
  664. ADCQ DX, R13
  665. ADCQ BX, R14
  666. MOVQ $0x00, BX
  667. ADCQ $0x00, BX
  668. // | a4 * b2
  669. MOVQ 16(SI), AX
  670. MULQ CX
  671. ADDQ AX, R13
  672. ADCQ DX, R14
  673. ADCQ BX, R15
  674. MOVQ $0x00, BX
  675. ADCQ $0x00, BX
  676. // | a4 * b3
  677. MOVQ 24(SI), AX
  678. MULQ CX
  679. ADDQ AX, R14
  680. ADCQ DX, R15
  681. ADCQ BX, R8
  682. MOVQ $0x00, BX
  683. ADCQ $0x00, BX
  684. // | a4 * b4
  685. MOVQ 32(SI), AX
  686. MULQ CX
  687. ADDQ AX, R15
  688. ADCQ DX, R8
  689. ADCQ BX, R9
  690. // | a4 * b5
  691. MOVQ 40(SI), AX
  692. MULQ CX
  693. ADDQ AX, R8
  694. ADCQ DX, R9
  695. // |
  696. /* i5 */
  697. // | a5 @ CX
  698. MOVQ 40(DI), CX
  699. MOVQ $0x00, BX
  700. // | a5 * b0
  701. MOVQ (SI), AX
  702. MULQ CX
  703. ADDQ AX, R12
  704. ADCQ DX, R13
  705. ADCQ $0x00, R14
  706. ADCQ $0x00, BX
  707. // | a5 * b1
  708. MOVQ 8(SI), AX
  709. MULQ CX
  710. ADDQ AX, R13
  711. ADCQ DX, R14
  712. ADCQ BX, R15
  713. MOVQ $0x00, BX
  714. ADCQ $0x00, BX
  715. // | a5 * b2
  716. MOVQ 16(SI), AX
  717. MULQ CX
  718. ADDQ AX, R14
  719. ADCQ DX, R15
  720. ADCQ BX, R8
  721. MOVQ $0x00, BX
  722. ADCQ $0x00, BX
  723. // | a5 * b3
  724. MOVQ 24(SI), AX
  725. MULQ CX
  726. ADDQ AX, R15
  727. ADCQ DX, R8
  728. ADCQ BX, R9
  729. MOVQ $0x00, BX
  730. ADCQ $0x00, BX
  731. // | a5 * b4
  732. MOVQ 32(SI), AX
  733. MULQ CX
  734. ADDQ AX, R8
  735. ADCQ DX, R9
  736. ADCQ $0x00, BX
  737. // | a5 * b5
  738. MOVQ 40(SI), AX
  739. MULQ CX
  740. ADDQ AX, R9
  741. ADCQ DX, BX
  742. // |
  743. /* */
  744. // |
  745. // | W
  746. // | 0 (SP) | 1 8(SP) | 2 16(SP) | 3 R10 | 4 R11 | 5 R12
  747. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 R9 | 11 BX
  748. MOVQ (SP), CX
  749. MOVQ 8(SP), DI
  750. MOVQ 16(SP), SI
  751. MOVQ BX, (SP)
  752. MOVQ R9, 8(SP)
  753. // |
  754. /* montgomery reduction */
  755. // |
  756. /* i0 */
  757. // |
  758. // | W
  759. // | 0 CX | 1 DI | 2 SI | 3 R10 | 4 R11 | 5 R12
  760. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 8(SP) | 11 (SP)
  761. // | | u0 = w0 * inp
  762. MOVQ CX, AX
  763. MULQ ·inp+0(SB)
  764. MOVQ AX, R9
  765. MOVQ $0x00, BX
  766. // |
  767. /* */
  768. // | j0
  769. // | w0 @ CX
  770. MOVQ ·modulus+0(SB), AX
  771. MULQ R9
  772. ADDQ AX, CX
  773. ADCQ DX, BX
  774. // | j1
  775. // | w1 @ DI
  776. MOVQ ·modulus+8(SB), AX
  777. MULQ R9
  778. ADDQ AX, DI
  779. ADCQ $0x00, DX
  780. ADDQ BX, DI
  781. MOVQ $0x00, BX
  782. ADCQ DX, BX
  783. // | j2
  784. // | w2 @ SI
  785. MOVQ ·modulus+16(SB), AX
  786. MULQ R9
  787. ADDQ AX, SI
  788. ADCQ $0x00, DX
  789. ADDQ BX, SI
  790. MOVQ $0x00, BX
  791. ADCQ DX, BX
  792. // | j3
  793. // | w3 @ R10
  794. MOVQ ·modulus+24(SB), AX
  795. MULQ R9
  796. ADDQ AX, R10
  797. ADCQ $0x00, DX
  798. ADDQ BX, R10
  799. MOVQ $0x00, BX
  800. ADCQ DX, BX
  801. // | j4
  802. // | w4 @ R11
  803. MOVQ ·modulus+32(SB), AX
  804. MULQ R9
  805. ADDQ AX, R11
  806. ADCQ $0x00, DX
  807. ADDQ BX, R11
  808. MOVQ $0x00, BX
  809. ADCQ DX, BX
  810. // | j5
  811. // | w5 @ R12
  812. MOVQ ·modulus+40(SB), AX
  813. MULQ R9
  814. ADDQ AX, R12
  815. ADCQ $0x00, DX
  816. ADDQ BX, R12
  817. // | w6 @ R13
  818. ADCQ DX, R13
  819. ADCQ $0x00, CX
  820. // |
  821. /* i1 */
  822. // |
  823. // | W
  824. // | 0 - | 1 DI | 2 SI | 3 R10 | 4 R11 | 5 R12
  825. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 8(SP) | 11 (SP)
  826. // | | u1 = w1 * inp
  827. MOVQ DI, AX
  828. MULQ ·inp+0(SB)
  829. MOVQ AX, R9
  830. MOVQ $0x00, BX
  831. // |
  832. /* */
  833. // | j0
  834. // | w1 @ DI
  835. MOVQ ·modulus+0(SB), AX
  836. MULQ R9
  837. ADDQ AX, DI
  838. ADCQ DX, BX
  839. // | j1
  840. // | w2 @ SI
  841. MOVQ ·modulus+8(SB), AX
  842. MULQ R9
  843. ADDQ AX, SI
  844. ADCQ $0x00, DX
  845. ADDQ BX, SI
  846. MOVQ $0x00, BX
  847. ADCQ DX, BX
  848. // | j2
  849. // | w3 @ R10
  850. MOVQ ·modulus+16(SB), AX
  851. MULQ R9
  852. ADDQ AX, R10
  853. ADCQ $0x00, DX
  854. ADDQ BX, R10
  855. MOVQ $0x00, BX
  856. ADCQ DX, BX
  857. // | j3
  858. // | w4 @ R11
  859. MOVQ ·modulus+24(SB), AX
  860. MULQ R9
  861. ADDQ AX, R11
  862. ADCQ $0x00, DX
  863. ADDQ BX, R11
  864. MOVQ $0x00, BX
  865. ADCQ DX, BX
  866. // | j4
  867. // | w5 @ R12
  868. MOVQ ·modulus+32(SB), AX
  869. MULQ R9
  870. ADDQ AX, R12
  871. ADCQ $0x00, DX
  872. ADDQ BX, R12
  873. MOVQ $0x00, BX
  874. ADCQ DX, BX
  875. // | j5
  876. // | w6 @ R13
  877. MOVQ ·modulus+40(SB), AX
  878. MULQ R9
  879. ADDQ AX, R13
  880. ADCQ DX, CX
  881. ADDQ BX, R13
  882. // | w7 @ R14
  883. ADCQ CX, R14
  884. MOVQ $0x00, CX
  885. ADCQ $0x00, CX
  886. // |
  887. /* i2 */
  888. // |
  889. // | W
  890. // | 0 - | 1 - | 2 SI | 3 R10 | 4 R11 | 5 R12
  891. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 8(SP) | 11 (SP)
  892. // | | u2 = w2 * inp
  893. MOVQ SI, AX
  894. MULQ ·inp+0(SB)
  895. MOVQ AX, R9
  896. MOVQ $0x00, BX
  897. // |
  898. /* */
  899. // | j0
  900. // | w2 @ SI
  901. MOVQ ·modulus+0(SB), AX
  902. MULQ R9
  903. ADDQ AX, SI
  904. ADCQ DX, BX
  905. // | j1
  906. // | w3 @ R10
  907. MOVQ ·modulus+8(SB), AX
  908. MULQ R9
  909. ADDQ AX, R10
  910. ADCQ $0x00, DX
  911. ADDQ BX, R10
  912. MOVQ $0x00, BX
  913. ADCQ DX, BX
  914. // | j2
  915. // | w4 @ R11
  916. MOVQ ·modulus+16(SB), AX
  917. MULQ R9
  918. ADDQ AX, R11
  919. ADCQ $0x00, DX
  920. ADDQ BX, R11
  921. MOVQ $0x00, BX
  922. ADCQ DX, BX
  923. // | j3
  924. // | w5 @ R12
  925. MOVQ ·modulus+24(SB), AX
  926. MULQ R9
  927. ADDQ AX, R12
  928. ADCQ $0x00, DX
  929. ADDQ BX, R12
  930. MOVQ $0x00, BX
  931. ADCQ DX, BX
  932. // | j4
  933. // | w6 @ R13
  934. MOVQ ·modulus+32(SB), AX
  935. MULQ R9
  936. ADDQ AX, R13
  937. ADCQ $0x00, DX
  938. ADDQ BX, R13
  939. MOVQ $0x00, BX
  940. ADCQ DX, BX
  941. // | j5
  942. // | w7 @ R14
  943. MOVQ ·modulus+40(SB), AX
  944. MULQ R9
  945. ADDQ AX, R14
  946. ADCQ DX, CX
  947. ADDQ BX, R14
  948. // | w8 @ R15
  949. ADCQ CX, R15
  950. MOVQ $0x00, CX
  951. ADCQ $0x00, CX
  952. // |
  953. /* i3 */
  954. // |
  955. // | W
  956. // | 0 - | 1 - | 2 - | 3 R10 | 4 R11 | 5 R12
  957. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 8(SP) | 11 (SP)
  958. // | | u3 = w3 * inp
  959. MOVQ R10, AX
  960. MULQ ·inp+0(SB)
  961. MOVQ AX, R9
  962. MOVQ $0x00, BX
  963. // |
  964. /* */
  965. // | j0
  966. // | w3 @ R10
  967. MOVQ ·modulus+0(SB), AX
  968. MULQ R9
  969. ADDQ AX, R10
  970. ADCQ DX, BX
  971. // | j1
  972. // | w4 @ R11
  973. MOVQ ·modulus+8(SB), AX
  974. MULQ R9
  975. ADDQ AX, R11
  976. ADCQ $0x00, DX
  977. ADDQ BX, R11
  978. MOVQ $0x00, BX
  979. ADCQ DX, BX
  980. // | j2
  981. // | w5 @ R12
  982. MOVQ ·modulus+16(SB), AX
  983. MULQ R9
  984. ADDQ AX, R12
  985. ADCQ $0x00, DX
  986. ADDQ BX, R12
  987. MOVQ $0x00, BX
  988. ADCQ DX, BX
  989. // | j3
  990. // | w6 @ R13
  991. MOVQ ·modulus+24(SB), AX
  992. MULQ R9
  993. ADDQ AX, R13
  994. ADCQ $0x00, DX
  995. ADDQ BX, R13
  996. MOVQ $0x00, BX
  997. ADCQ DX, BX
  998. // | j4
  999. // | w7 @ R14
  1000. MOVQ ·modulus+32(SB), AX
  1001. MULQ R9
  1002. ADDQ AX, R14
  1003. ADCQ $0x00, DX
  1004. ADDQ BX, R14
  1005. MOVQ $0x00, BX
  1006. ADCQ DX, BX
  1007. // | j5
  1008. // | w8 @ R15
  1009. MOVQ ·modulus+40(SB), AX
  1010. MULQ R9
  1011. ADDQ AX, R15
  1012. ADCQ DX, CX
  1013. ADDQ BX, R15
  1014. // | w9 @ R8
  1015. ADCQ CX, R8
  1016. MOVQ $0x00, CX
  1017. ADCQ $0x00, CX
  1018. // |
  1019. /* i4 */
  1020. // |
  1021. // | W
  1022. // | 0 - | 1 - | 2 - | 3 - | 4 R11 | 5 R12
  1023. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 8(SP) | 11 (SP)
  1024. // | | u4 = w4 * inp
  1025. MOVQ R11, AX
  1026. MULQ ·inp+0(SB)
  1027. MOVQ AX, R9
  1028. MOVQ $0x00, BX
  1029. // |
  1030. /* */
  1031. // | j0
  1032. // | w4 @ R11
  1033. MOVQ ·modulus+0(SB), AX
  1034. MULQ R9
  1035. ADDQ AX, R11
  1036. ADCQ DX, BX
  1037. // | j1
  1038. // | w5 @ R12
  1039. MOVQ ·modulus+8(SB), AX
  1040. MULQ R9
  1041. ADDQ AX, R12
  1042. ADCQ $0x00, DX
  1043. ADDQ BX, R12
  1044. MOVQ $0x00, BX
  1045. ADCQ DX, BX
  1046. // | j2
  1047. // | w6 @ R13
  1048. MOVQ ·modulus+16(SB), AX
  1049. MULQ R9
  1050. ADDQ AX, R13
  1051. ADCQ $0x00, DX
  1052. ADDQ BX, R13
  1053. MOVQ $0x00, BX
  1054. ADCQ DX, BX
  1055. // | j3
  1056. // | w7 @ R14
  1057. MOVQ ·modulus+24(SB), AX
  1058. MULQ R9
  1059. ADDQ AX, R14
  1060. ADCQ $0x00, DX
  1061. ADDQ BX, R14
  1062. MOVQ $0x00, BX
  1063. ADCQ DX, BX
  1064. // | j4
  1065. // | w8 @ R15
  1066. MOVQ ·modulus+32(SB), AX
  1067. MULQ R9
  1068. ADDQ AX, R15
  1069. ADCQ $0x00, DX
  1070. ADDQ BX, R15
  1071. MOVQ $0x00, BX
  1072. ADCQ DX, BX
  1073. // | j5
  1074. // | w9 @ R8
  1075. MOVQ ·modulus+40(SB), AX
  1076. MULQ R9
  1077. ADDQ AX, R8
  1078. ADCQ DX, CX
  1079. ADDQ BX, R8
  1080. // | move to idle register
  1081. MOVQ 8(SP), DI
  1082. // | w10 @ DI
  1083. ADCQ CX, DI
  1084. MOVQ $0x00, CX
  1085. ADCQ $0x00, CX
  1086. // |
  1087. /* i5 */
  1088. // |
  1089. // | W
  1090. // | 0 - | 1 - | 2 - | 3 - | 4 - | 5 R12
  1091. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 DI | 11 (SP)
  1092. // | | u5 = w5 * inp
  1093. MOVQ R12, AX
  1094. MULQ ·inp+0(SB)
  1095. MOVQ AX, R9
  1096. MOVQ $0x00, BX
  1097. // |
  1098. /* */
  1099. // | j0
  1100. // | w5 @ R12
  1101. MOVQ ·modulus+0(SB), AX
  1102. MULQ R9
  1103. ADDQ AX, R12
  1104. ADCQ DX, BX
  1105. // | j1
  1106. // | w6 @ R13
  1107. MOVQ ·modulus+8(SB), AX
  1108. MULQ R9
  1109. ADDQ AX, R13
  1110. ADCQ $0x00, DX
  1111. ADDQ BX, R13
  1112. MOVQ $0x00, BX
  1113. ADCQ DX, BX
  1114. // | j2
  1115. // | w7 @ R14
  1116. MOVQ ·modulus+16(SB), AX
  1117. MULQ R9
  1118. ADDQ AX, R14
  1119. ADCQ $0x00, DX
  1120. ADDQ BX, R14
  1121. MOVQ $0x00, BX
  1122. ADCQ DX, BX
  1123. // | j3
  1124. // | w8 @ R15
  1125. MOVQ ·modulus+24(SB), AX
  1126. MULQ R9
  1127. ADDQ AX, R15
  1128. ADCQ $0x00, DX
  1129. ADDQ BX, R15
  1130. MOVQ $0x00, BX
  1131. ADCQ DX, BX
  1132. // | j4
  1133. // | w9 @ R8
  1134. MOVQ ·modulus+32(SB), AX
  1135. MULQ R9
  1136. ADDQ AX, R8
  1137. ADCQ $0x00, DX
  1138. ADDQ BX, R8
  1139. MOVQ $0x00, BX
  1140. ADCQ DX, BX
  1141. // | j5
  1142. // | w10 @ DI
  1143. MOVQ ·modulus+40(SB), AX
  1144. MULQ R9
  1145. ADDQ AX, DI
  1146. ADCQ DX, CX
  1147. ADDQ BX, DI
  1148. // | w11 @ CX
  1149. ADCQ (SP), CX
  1150. // |
  1151. // | W montgomerry reduction ends
  1152. // | 0 - | 1 - | 2 - | 3 - | 4 - | 5 -
  1153. // | 6 R13 | 7 R14 | 8 R15 | 9 R8 | 10 DI | 11 CX
  1154. // |
  1155. /* modular reduction */
  1156. MOVQ R13, R10
  1157. SUBQ ·modulus+0(SB), R10
  1158. MOVQ R14, R11
  1159. SBBQ ·modulus+8(SB), R11
  1160. MOVQ R15, R12
  1161. SBBQ ·modulus+16(SB), R12
  1162. MOVQ R8, AX
  1163. SBBQ ·modulus+24(SB), AX
  1164. MOVQ DI, BX
  1165. SBBQ ·modulus+32(SB), BX
  1166. MOVQ CX, R9
  1167. SBBQ ·modulus+40(SB), R9
  1168. // |
  1169. /* out */
  1170. MOVQ c+0(FP), SI
  1171. CMOVQCC R10, R13
  1172. MOVQ R13, (SI)
  1173. CMOVQCC R11, R14
  1174. MOVQ R14, 8(SI)
  1175. CMOVQCC R12, R15
  1176. MOVQ R15, 16(SI)
  1177. CMOVQCC AX, R8
  1178. MOVQ R8, 24(SI)
  1179. CMOVQCC BX, DI
  1180. MOVQ DI, 32(SI)
  1181. CMOVQCC R9, CX
  1182. MOVQ CX, 40(SI)
  1183. RET
  1184. // |
  1185. /* end */
  1186. // multiplication
  1187. // c = a * b % p
  1188. TEXT ·mulADX(SB), NOSPLIT, $16-24
  1189. // |
  1190. /* inputs */
  1191. MOVQ a+8(FP), DI
  1192. MOVQ b+16(FP), SI
  1193. XORQ AX, AX
  1194. // |
  1195. /* i0 */
  1196. // | a0 @ DX
  1197. MOVQ (DI), DX
  1198. // | a0 * b0
  1199. MULXQ (SI), AX, CX
  1200. MOVQ AX, (SP)
  1201. // | a0 * b1
  1202. MULXQ 8(SI), AX, R8
  1203. ADCXQ AX, CX
  1204. // | a0 * b2
  1205. MULXQ 16(SI), AX, R9
  1206. ADCXQ AX, R8
  1207. // | a0 * b3
  1208. MULXQ 24(SI), AX, R10
  1209. ADCXQ AX, R9
  1210. // | a0 * b4
  1211. MULXQ 32(SI), AX, R11
  1212. ADCXQ AX, R10
  1213. // | a0 * b5
  1214. MULXQ 40(SI), AX, R12
  1215. ADCXQ AX, R11
  1216. ADCQ $0x00, R12
  1217. // |
  1218. /* i1 */
  1219. // | a1 @ DX
  1220. MOVQ 8(DI), DX
  1221. XORQ R13, R13
  1222. // | a1 * b0
  1223. MULXQ (SI), AX, BX
  1224. ADOXQ AX, CX
  1225. ADCXQ BX, R8
  1226. MOVQ CX, 8(SP)
  1227. // | a1 * b1
  1228. MULXQ 8(SI), AX, BX
  1229. ADOXQ AX, R8
  1230. ADCXQ BX, R9
  1231. // | a1 * b2
  1232. MULXQ 16(SI), AX, BX
  1233. ADOXQ AX, R9
  1234. ADCXQ BX, R10
  1235. // | a1 * b3
  1236. MULXQ 24(SI), AX, BX
  1237. ADOXQ AX, R10
  1238. ADCXQ BX, R11
  1239. // | a1 * b4
  1240. MULXQ 32(SI), AX, BX
  1241. ADOXQ AX, R11
  1242. ADCXQ BX, R12
  1243. // | a1 * b5
  1244. MULXQ 40(SI), AX, BX
  1245. ADOXQ AX, R12
  1246. ADOXQ R13, R13
  1247. ADCXQ BX, R13
  1248. // |
  1249. /* i2 */
  1250. // | a2 @ DX
  1251. MOVQ 16(DI), DX
  1252. XORQ R14, R14
  1253. // | a2 * b0
  1254. MULXQ (SI), AX, BX
  1255. ADOXQ AX, R8
  1256. ADCXQ BX, R9
  1257. // | a2 * b1
  1258. MULXQ 8(SI), AX, BX
  1259. ADOXQ AX, R9
  1260. ADCXQ BX, R10
  1261. // | a2 * b2
  1262. MULXQ 16(SI), AX, BX
  1263. ADOXQ AX, R10
  1264. ADCXQ BX, R11
  1265. // | a2 * b3
  1266. MULXQ 24(SI), AX, BX
  1267. ADOXQ AX, R11
  1268. ADCXQ BX, R12
  1269. // | a2 * b4
  1270. MULXQ 32(SI), AX, BX
  1271. ADOXQ AX, R12
  1272. ADCXQ BX, R13
  1273. // | a2 * b5
  1274. MULXQ 40(SI), AX, BX
  1275. ADOXQ AX, R13
  1276. ADOXQ R14, R14
  1277. ADCXQ BX, R14
  1278. // |
  1279. /* i3 */
  1280. // | a3 @ DX
  1281. MOVQ 24(DI), DX
  1282. XORQ R15, R15
  1283. // | a3 * b0
  1284. MULXQ (SI), AX, BX
  1285. ADOXQ AX, R9
  1286. ADCXQ BX, R10
  1287. // | a3 * b1
  1288. MULXQ 8(SI), AX, BX
  1289. ADOXQ AX, R10
  1290. ADCXQ BX, R11
  1291. // | a3 * b2
  1292. MULXQ 16(SI), AX, BX
  1293. ADOXQ AX, R11
  1294. ADCXQ BX, R12
  1295. // | a3 * b3
  1296. MULXQ 24(SI), AX, BX
  1297. ADOXQ AX, R12
  1298. ADCXQ BX, R13
  1299. // | a3 * b4
  1300. MULXQ 32(SI), AX, BX
  1301. ADOXQ AX, R13
  1302. ADCXQ BX, R14
  1303. // | a3 * b5
  1304. MULXQ 40(SI), AX, BX
  1305. ADOXQ AX, R14
  1306. ADOXQ R15, R15
  1307. ADCXQ BX, R15
  1308. // |
  1309. /* i4 */
  1310. // | a4 @ DX
  1311. MOVQ 32(DI), DX
  1312. XORQ CX, CX
  1313. // | a4 * b0
  1314. MULXQ (SI), AX, BX
  1315. ADOXQ AX, R10
  1316. ADCXQ BX, R11
  1317. // | a4 * b1
  1318. MULXQ 8(SI), AX, BX
  1319. ADOXQ AX, R11
  1320. ADCXQ BX, R12
  1321. // | a4 * b2
  1322. MULXQ 16(SI), AX, BX
  1323. ADOXQ AX, R12
  1324. ADCXQ BX, R13
  1325. // | a4 * b3
  1326. MULXQ 24(SI), AX, BX
  1327. ADOXQ AX, R13
  1328. ADCXQ BX, R14
  1329. // | a4 * b4
  1330. MULXQ 32(SI), AX, BX
  1331. ADOXQ AX, R14
  1332. ADCXQ BX, R15
  1333. // | a4 * b5
  1334. MULXQ 40(SI), AX, BX
  1335. ADOXQ AX, R15
  1336. ADOXQ CX, CX
  1337. ADCXQ BX, CX
  1338. // |
  1339. /* i5 */
  1340. // | a5 @ DX
  1341. MOVQ 40(DI), DX
  1342. XORQ DI, DI
  1343. // | a5 * b0
  1344. MULXQ (SI), AX, BX
  1345. ADOXQ AX, R11
  1346. ADCXQ BX, R12
  1347. // | a5 * b1
  1348. MULXQ 8(SI), AX, BX
  1349. ADOXQ AX, R12
  1350. ADCXQ BX, R13
  1351. // | a5 * b2
  1352. MULXQ 16(SI), AX, BX
  1353. ADOXQ AX, R13
  1354. ADCXQ BX, R14
  1355. // | a5 * b3
  1356. MULXQ 24(SI), AX, BX
  1357. ADOXQ AX, R14
  1358. ADCXQ BX, R15
  1359. // | a5 * b4
  1360. MULXQ 32(SI), AX, BX
  1361. ADOXQ AX, R15
  1362. ADCXQ BX, CX
  1363. // | a5 * b5
  1364. MULXQ 40(SI), AX, BX
  1365. ADOXQ AX, CX
  1366. ADOXQ BX, DI
  1367. ADCQ $0x00, DI
  1368. // |
  1369. /* */
  1370. // |
  1371. // | W
  1372. // | 0 (SP) | 1 8(SP) | 2 R8 | 3 R9 | 4 R10 | 5 R11
  1373. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 DI
  1374. MOVQ (SP), BX
  1375. MOVQ 8(SP), SI
  1376. MOVQ DI, (SP)
  1377. // |
  1378. // | W ready to mont
  1379. // | 0 BX | 1 SI | 2 R8 | 3 R9 | 4 R10 | 5 R11
  1380. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1381. // |
  1382. /* montgomery reduction */
  1383. // | clear flags
  1384. XORQ AX, AX
  1385. // |
  1386. /* i0 */
  1387. // |
  1388. // | W
  1389. // | 0 BX | 1 SI | 2 R8 | 3 R9 | 4 R10 | 5 R11
  1390. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1391. // | | u0 = w0 * inp
  1392. MOVQ BX, DX
  1393. MULXQ ·inp+0(SB), DX, DI
  1394. // |
  1395. /* */
  1396. // | j0
  1397. // | w0 @ BX
  1398. MULXQ ·modulus+0(SB), AX, DI
  1399. ADOXQ AX, BX
  1400. ADCXQ DI, SI
  1401. // | j1
  1402. // | w1 @ SI
  1403. MULXQ ·modulus+8(SB), AX, DI
  1404. ADOXQ AX, SI
  1405. ADCXQ DI, R8
  1406. // | j2
  1407. // | w2 @ R8
  1408. MULXQ ·modulus+16(SB), AX, DI
  1409. ADOXQ AX, R8
  1410. ADCXQ DI, R9
  1411. // | j3
  1412. // | w3 @ R9
  1413. MULXQ ·modulus+24(SB), AX, DI
  1414. ADOXQ AX, R9
  1415. ADCXQ DI, R10
  1416. // | j4
  1417. // | w4 @ R10
  1418. MULXQ ·modulus+32(SB), AX, DI
  1419. ADOXQ AX, R10
  1420. ADCXQ DI, R11
  1421. // | j5
  1422. // | w5 @ R11
  1423. MULXQ ·modulus+40(SB), AX, DI
  1424. ADOXQ AX, R11
  1425. ADCXQ DI, R12
  1426. ADOXQ BX, R12
  1427. ADCXQ BX, BX
  1428. MOVQ $0x00, AX
  1429. ADOXQ AX, BX
  1430. // | clear flags
  1431. XORQ AX, AX
  1432. // |
  1433. /* i1 */
  1434. // |
  1435. // | W
  1436. // | 0 - | 1 SI | 2 R8 | 3 R9 | 4 R10 | 5 R11
  1437. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1438. // | | u1 = w1 * inp
  1439. MOVQ SI, DX
  1440. MULXQ ·inp+0(SB), DX, DI
  1441. // |
  1442. /* */
  1443. // | j0
  1444. // | w1 @ SI
  1445. MULXQ ·modulus+0(SB), AX, DI
  1446. ADOXQ AX, SI
  1447. ADCXQ DI, R8
  1448. // | j1
  1449. // | w2 @ R8
  1450. MULXQ ·modulus+8(SB), AX, DI
  1451. ADOXQ AX, R8
  1452. ADCXQ DI, R9
  1453. // | j2
  1454. // | w3 @ R9
  1455. MULXQ ·modulus+16(SB), AX, DI
  1456. ADOXQ AX, R9
  1457. ADCXQ DI, R10
  1458. // | j3
  1459. // | w4 @ R10
  1460. MULXQ ·modulus+24(SB), AX, DI
  1461. ADOXQ AX, R10
  1462. ADCXQ DI, R11
  1463. // | j4
  1464. // | w5 @ R11
  1465. MULXQ ·modulus+32(SB), AX, DI
  1466. ADOXQ AX, R11
  1467. ADCXQ DI, R12
  1468. // | j5
  1469. // | w6 @ R12
  1470. MULXQ ·modulus+40(SB), AX, DI
  1471. ADOXQ AX, R12
  1472. ADCXQ DI, R13
  1473. ADOXQ BX, R13
  1474. ADCXQ SI, SI
  1475. MOVQ $0x00, AX
  1476. ADOXQ AX, SI
  1477. // | clear flags
  1478. XORQ AX, AX
  1479. // |
  1480. /* i2 */
  1481. // |
  1482. // | W
  1483. // | 0 - | 1 - | 2 R8 | 3 R9 | 4 R10 | 5 R11
  1484. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1485. // | | u2 = w2 * inp
  1486. MOVQ R8, DX
  1487. MULXQ ·inp+0(SB), DX, DI
  1488. // |
  1489. /* */
  1490. // | j0
  1491. // | w2 @ R8
  1492. MULXQ ·modulus+0(SB), AX, DI
  1493. ADOXQ AX, R8
  1494. ADCXQ DI, R9
  1495. // | j1
  1496. // | w3 @ R9
  1497. MULXQ ·modulus+8(SB), AX, DI
  1498. ADOXQ AX, R9
  1499. ADCXQ DI, R10
  1500. // | j2
  1501. // | w4 @ R10
  1502. MULXQ ·modulus+16(SB), AX, DI
  1503. ADOXQ AX, R10
  1504. ADCXQ DI, R11
  1505. // | j3
  1506. // | w5 @ R11
  1507. MULXQ ·modulus+24(SB), AX, DI
  1508. ADOXQ AX, R11
  1509. ADCXQ DI, R12
  1510. // | j4
  1511. // | w6 @ R12
  1512. MULXQ ·modulus+32(SB), AX, DI
  1513. ADOXQ AX, R12
  1514. ADCXQ DI, R13
  1515. // | j5
  1516. // | w7 @ R13
  1517. MULXQ ·modulus+40(SB), AX, DI
  1518. ADOXQ AX, R13
  1519. ADCXQ DI, R14
  1520. ADOXQ SI, R14
  1521. ADCXQ R8, R8
  1522. MOVQ $0x00, AX
  1523. ADOXQ AX, R8
  1524. // | clear flags
  1525. XORQ AX, AX
  1526. // |
  1527. /* i3 */
  1528. // |
  1529. // | W
  1530. // | 0 - | 1 - | 2 - | 3 R9 | 4 R10 | 5 R11
  1531. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1532. // | | u3 = w3 * inp
  1533. MOVQ R9, DX
  1534. MULXQ ·inp+0(SB), DX, DI
  1535. // |
  1536. /* */
  1537. // | j0
  1538. // | w3 @ R9
  1539. MULXQ ·modulus+0(SB), AX, DI
  1540. ADOXQ AX, R9
  1541. ADCXQ DI, R10
  1542. // | j1
  1543. // | w4 @ R10
  1544. MULXQ ·modulus+8(SB), AX, DI
  1545. ADOXQ AX, R10
  1546. ADCXQ DI, R11
  1547. // | j2
  1548. // | w5 @ R11
  1549. MULXQ ·modulus+16(SB), AX, DI
  1550. ADOXQ AX, R11
  1551. ADCXQ DI, R12
  1552. // | j3
  1553. // | w6 @ R12
  1554. MULXQ ·modulus+24(SB), AX, DI
  1555. ADOXQ AX, R12
  1556. ADCXQ DI, R13
  1557. // | j4
  1558. // | w7 @ R13
  1559. MULXQ ·modulus+32(SB), AX, DI
  1560. ADOXQ AX, R13
  1561. ADCXQ DI, R14
  1562. // | j5
  1563. // | w8 @ R14
  1564. MULXQ ·modulus+40(SB), AX, DI
  1565. ADOXQ AX, R14
  1566. ADCXQ DI, R15
  1567. ADOXQ R8, R15
  1568. ADCXQ R9, R9
  1569. MOVQ $0x00, AX
  1570. ADOXQ AX, R9
  1571. // | clear flags
  1572. XORQ AX, AX
  1573. // |
  1574. /* i4 */
  1575. // |
  1576. // | W
  1577. // | 0 - | 1 - | 2 - | 3 - | 4 R10 | 5 R11
  1578. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1579. // | | u4 = w4 * inp
  1580. MOVQ R10, DX
  1581. MULXQ ·inp+0(SB), DX, DI
  1582. // |
  1583. /* */
  1584. // | j0
  1585. // | w4 @ R10
  1586. MULXQ ·modulus+0(SB), AX, DI
  1587. ADOXQ AX, R10
  1588. ADCXQ DI, R11
  1589. // | j1
  1590. // | w5 @ R11
  1591. MULXQ ·modulus+8(SB), AX, DI
  1592. ADOXQ AX, R11
  1593. ADCXQ DI, R12
  1594. // | j2
  1595. // | w6 @ R12
  1596. MULXQ ·modulus+16(SB), AX, DI
  1597. ADOXQ AX, R12
  1598. ADCXQ DI, R13
  1599. // | j3
  1600. // | w7 @ R13
  1601. MULXQ ·modulus+24(SB), AX, DI
  1602. ADOXQ AX, R13
  1603. ADCXQ DI, R14
  1604. // | j4
  1605. // | w8 @ R14
  1606. MULXQ ·modulus+32(SB), AX, DI
  1607. ADOXQ AX, R14
  1608. ADCXQ DI, R15
  1609. // | j5
  1610. // | w9 @ R15
  1611. MULXQ ·modulus+40(SB), AX, DI
  1612. ADOXQ AX, R15
  1613. ADCXQ DI, CX
  1614. ADOXQ R9, CX
  1615. ADCXQ R10, R10
  1616. MOVQ $0x00, AX
  1617. ADOXQ AX, R10
  1618. // | clear flags
  1619. XORQ AX, AX
  1620. // |
  1621. /* i5 */
  1622. // |
  1623. // | W
  1624. // | 0 - | 1 - | 2 - | 3 - | 4 - | 5 R11
  1625. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 (SP)
  1626. // | | u5 = w5 * inp
  1627. MOVQ R11, DX
  1628. MULXQ ·inp+0(SB), DX, DI
  1629. // |
  1630. /* */
  1631. // | j0
  1632. // | w5 @ R11
  1633. MULXQ ·modulus+0(SB), AX, DI
  1634. ADOXQ AX, R11
  1635. ADCXQ DI, R12
  1636. // | j1
  1637. // | w6 @ R12
  1638. MULXQ ·modulus+8(SB), AX, DI
  1639. ADOXQ AX, R12
  1640. ADCXQ DI, R13
  1641. // | j2
  1642. // | w7 @ R13
  1643. MULXQ ·modulus+16(SB), AX, DI
  1644. ADOXQ AX, R13
  1645. ADCXQ DI, R14
  1646. // | j3
  1647. // | w8 @ R14
  1648. MULXQ ·modulus+24(SB), AX, DI
  1649. ADOXQ AX, R14
  1650. ADCXQ DI, R15
  1651. // | j4
  1652. // | w9 @ R15
  1653. MULXQ ·modulus+32(SB), AX, DI
  1654. ADOXQ AX, R15
  1655. ADCXQ DI, CX
  1656. // | j5
  1657. // | w10 @ CX
  1658. MULXQ ·modulus+40(SB), AX, DI
  1659. ADOXQ AX, CX
  1660. // | w11 @ (SP)
  1661. // | move to an idle register
  1662. MOVQ (SP), BX
  1663. ADCXQ DI, BX
  1664. ADOXQ R10, BX
  1665. // |
  1666. // | W montgomery reduction ends
  1667. // | 0 - | 1 - | 2 - | 3 - | 4 - | 5 -
  1668. // | 6 R12 | 7 R13 | 8 R14 | 9 R15 | 10 CX | 11 BX
  1669. // |
  1670. /* modular reduction */
  1671. MOVQ R12, AX
  1672. SUBQ ·modulus+0(SB), AX
  1673. MOVQ R13, DI
  1674. SBBQ ·modulus+8(SB), DI
  1675. MOVQ R14, SI
  1676. SBBQ ·modulus+16(SB), SI
  1677. MOVQ R15, R8
  1678. SBBQ ·modulus+24(SB), R8
  1679. MOVQ CX, R9
  1680. SBBQ ·modulus+32(SB), R9
  1681. MOVQ BX, R10
  1682. SBBQ ·modulus+40(SB), R10
  1683. // |
  1684. /* out */
  1685. MOVQ c+0(FP), R11
  1686. CMOVQCC AX, R12
  1687. MOVQ R12, (R11)
  1688. CMOVQCC DI, R13
  1689. MOVQ R13, 8(R11)
  1690. CMOVQCC SI, R14
  1691. MOVQ R14, 16(R11)
  1692. CMOVQCC R8, R15
  1693. MOVQ R15, 24(R11)
  1694. CMOVQCC R9, CX
  1695. MOVQ CX, 32(R11)
  1696. CMOVQCC R10, BX
  1697. MOVQ BX, 40(R11)
  1698. RET
  1699. // |
  1700. /* end */