2
0

fp_mul_comba_small_set.i 64 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268
  1. /* fp_mul_comba_small_set.i
  2. *
  3. * Copyright (C) 2006-2023 wolfSSL Inc.
  4. *
  5. * This file is part of wolfSSL.
  6. *
  7. * wolfSSL is free software; you can redistribute it and/or modify
  8. * it under the terms of the GNU General Public License as published by
  9. * the Free Software Foundation; either version 2 of the License, or
  10. * (at your option) any later version.
  11. *
  12. * wolfSSL is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU General Public License
  18. * along with this program; if not, write to the Free Software
  19. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
  20. */
  21. #if defined(TFM_SMALL_SET)
  22. int fp_mul_comba_small(fp_int *A, fp_int *B, fp_int *C)
  23. {
  24. fp_digit c0, c1, c2;
  25. #ifndef WOLFSSL_SMALL_STACK
  26. fp_digit at[32];
  27. #else
  28. fp_digit *at;
  29. #endif
  30. #ifdef WOLFSSL_SMALL_STACK
  31. at = (fp_digit*)XMALLOC(sizeof(fp_digit) * 32, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  32. if (at == NULL)
  33. return FP_MEM;
  34. #endif
  35. switch (MAX(A->used, B->used)) {
  36. case 1:
  37. XMEMCPY(at, A->dp, 1 * sizeof(fp_digit));
  38. XMEMCPY(at+1, B->dp, 1 * sizeof(fp_digit));
  39. COMBA_START;
  40. COMBA_CLEAR;
  41. /* 0 */
  42. MULADD(at[0], at[1]);
  43. COMBA_STORE(C->dp[0]);
  44. COMBA_STORE2(C->dp[1]);
  45. C->used = 2;
  46. C->sign = A->sign ^ B->sign;
  47. fp_clamp(C);
  48. COMBA_FINI;
  49. break;
  50. case 2:
  51. XMEMCPY(at, A->dp, 2 * sizeof(fp_digit));
  52. XMEMCPY(at+2, B->dp, 2 * sizeof(fp_digit));
  53. COMBA_START;
  54. COMBA_CLEAR;
  55. /* 0 */
  56. MULADD(at[0], at[2]);
  57. COMBA_STORE(C->dp[0]);
  58. /* 1 */
  59. COMBA_FORWARD;
  60. MULADD(at[0], at[3]); MULADD(at[1], at[2]);
  61. COMBA_STORE(C->dp[1]);
  62. /* 2 */
  63. COMBA_FORWARD;
  64. MULADD(at[1], at[3]);
  65. COMBA_STORE(C->dp[2]);
  66. COMBA_STORE2(C->dp[3]);
  67. C->used = 4;
  68. C->sign = A->sign ^ B->sign;
  69. fp_clamp(C);
  70. COMBA_FINI;
  71. break;
  72. case 3:
  73. XMEMCPY(at, A->dp, 3 * sizeof(fp_digit));
  74. XMEMCPY(at+3, B->dp, 3 * sizeof(fp_digit));
  75. COMBA_START;
  76. COMBA_CLEAR;
  77. /* 0 */
  78. MULADD(at[0], at[3]);
  79. COMBA_STORE(C->dp[0]);
  80. /* 1 */
  81. COMBA_FORWARD;
  82. MULADD(at[0], at[4]); MULADD(at[1], at[3]);
  83. COMBA_STORE(C->dp[1]);
  84. /* 2 */
  85. COMBA_FORWARD;
  86. MULADD(at[0], at[5]); MULADD(at[1], at[4]); MULADD(at[2], at[3]);
  87. COMBA_STORE(C->dp[2]);
  88. /* 3 */
  89. COMBA_FORWARD;
  90. MULADD(at[1], at[5]); MULADD(at[2], at[4]);
  91. COMBA_STORE(C->dp[3]);
  92. /* 4 */
  93. COMBA_FORWARD;
  94. MULADD(at[2], at[5]);
  95. COMBA_STORE(C->dp[4]);
  96. COMBA_STORE2(C->dp[5]);
  97. C->used = 6;
  98. C->sign = A->sign ^ B->sign;
  99. fp_clamp(C);
  100. COMBA_FINI;
  101. break;
  102. case 4:
  103. XMEMCPY(at, A->dp, 4 * sizeof(fp_digit));
  104. XMEMCPY(at+4, B->dp, 4 * sizeof(fp_digit));
  105. COMBA_START;
  106. COMBA_CLEAR;
  107. /* 0 */
  108. MULADD(at[0], at[4]);
  109. COMBA_STORE(C->dp[0]);
  110. /* 1 */
  111. COMBA_FORWARD;
  112. MULADD(at[0], at[5]); MULADD(at[1], at[4]);
  113. COMBA_STORE(C->dp[1]);
  114. /* 2 */
  115. COMBA_FORWARD;
  116. MULADD(at[0], at[6]); MULADD(at[1], at[5]); MULADD(at[2], at[4]);
  117. COMBA_STORE(C->dp[2]);
  118. /* 3 */
  119. COMBA_FORWARD;
  120. MULADD(at[0], at[7]); MULADD(at[1], at[6]); MULADD(at[2], at[5]); MULADD(at[3], at[4]);
  121. COMBA_STORE(C->dp[3]);
  122. /* 4 */
  123. COMBA_FORWARD;
  124. MULADD(at[1], at[7]); MULADD(at[2], at[6]); MULADD(at[3], at[5]);
  125. COMBA_STORE(C->dp[4]);
  126. /* 5 */
  127. COMBA_FORWARD;
  128. MULADD(at[2], at[7]); MULADD(at[3], at[6]);
  129. COMBA_STORE(C->dp[5]);
  130. /* 6 */
  131. COMBA_FORWARD;
  132. MULADD(at[3], at[7]);
  133. COMBA_STORE(C->dp[6]);
  134. COMBA_STORE2(C->dp[7]);
  135. C->used = 8;
  136. C->sign = A->sign ^ B->sign;
  137. fp_clamp(C);
  138. COMBA_FINI;
  139. break;
  140. case 5:
  141. XMEMCPY(at, A->dp, 5 * sizeof(fp_digit));
  142. XMEMCPY(at+5, B->dp, 5 * sizeof(fp_digit));
  143. COMBA_START;
  144. COMBA_CLEAR;
  145. /* 0 */
  146. MULADD(at[0], at[5]);
  147. COMBA_STORE(C->dp[0]);
  148. /* 1 */
  149. COMBA_FORWARD;
  150. MULADD(at[0], at[6]); MULADD(at[1], at[5]);
  151. COMBA_STORE(C->dp[1]);
  152. /* 2 */
  153. COMBA_FORWARD;
  154. MULADD(at[0], at[7]); MULADD(at[1], at[6]); MULADD(at[2], at[5]);
  155. COMBA_STORE(C->dp[2]);
  156. /* 3 */
  157. COMBA_FORWARD;
  158. MULADD(at[0], at[8]); MULADD(at[1], at[7]); MULADD(at[2], at[6]); MULADD(at[3], at[5]);
  159. COMBA_STORE(C->dp[3]);
  160. /* 4 */
  161. COMBA_FORWARD;
  162. MULADD(at[0], at[9]); MULADD(at[1], at[8]); MULADD(at[2], at[7]); MULADD(at[3], at[6]); MULADD(at[4], at[5]);
  163. COMBA_STORE(C->dp[4]);
  164. /* 5 */
  165. COMBA_FORWARD;
  166. MULADD(at[1], at[9]); MULADD(at[2], at[8]); MULADD(at[3], at[7]); MULADD(at[4], at[6]);
  167. COMBA_STORE(C->dp[5]);
  168. /* 6 */
  169. COMBA_FORWARD;
  170. MULADD(at[2], at[9]); MULADD(at[3], at[8]); MULADD(at[4], at[7]);
  171. COMBA_STORE(C->dp[6]);
  172. /* 7 */
  173. COMBA_FORWARD;
  174. MULADD(at[3], at[9]); MULADD(at[4], at[8]);
  175. COMBA_STORE(C->dp[7]);
  176. /* 8 */
  177. COMBA_FORWARD;
  178. MULADD(at[4], at[9]);
  179. COMBA_STORE(C->dp[8]);
  180. COMBA_STORE2(C->dp[9]);
  181. C->used = 10;
  182. C->sign = A->sign ^ B->sign;
  183. fp_clamp(C);
  184. COMBA_FINI;
  185. break;
  186. case 6:
  187. XMEMCPY(at, A->dp, 6 * sizeof(fp_digit));
  188. XMEMCPY(at+6, B->dp, 6 * sizeof(fp_digit));
  189. COMBA_START;
  190. COMBA_CLEAR;
  191. /* 0 */
  192. MULADD(at[0], at[6]);
  193. COMBA_STORE(C->dp[0]);
  194. /* 1 */
  195. COMBA_FORWARD;
  196. MULADD(at[0], at[7]); MULADD(at[1], at[6]);
  197. COMBA_STORE(C->dp[1]);
  198. /* 2 */
  199. COMBA_FORWARD;
  200. MULADD(at[0], at[8]); MULADD(at[1], at[7]); MULADD(at[2], at[6]);
  201. COMBA_STORE(C->dp[2]);
  202. /* 3 */
  203. COMBA_FORWARD;
  204. MULADD(at[0], at[9]); MULADD(at[1], at[8]); MULADD(at[2], at[7]); MULADD(at[3], at[6]);
  205. COMBA_STORE(C->dp[3]);
  206. /* 4 */
  207. COMBA_FORWARD;
  208. MULADD(at[0], at[10]); MULADD(at[1], at[9]); MULADD(at[2], at[8]); MULADD(at[3], at[7]); MULADD(at[4], at[6]);
  209. COMBA_STORE(C->dp[4]);
  210. /* 5 */
  211. COMBA_FORWARD;
  212. MULADD(at[0], at[11]); MULADD(at[1], at[10]); MULADD(at[2], at[9]); MULADD(at[3], at[8]); MULADD(at[4], at[7]); MULADD(at[5], at[6]);
  213. COMBA_STORE(C->dp[5]);
  214. /* 6 */
  215. COMBA_FORWARD;
  216. MULADD(at[1], at[11]); MULADD(at[2], at[10]); MULADD(at[3], at[9]); MULADD(at[4], at[8]); MULADD(at[5], at[7]);
  217. COMBA_STORE(C->dp[6]);
  218. /* 7 */
  219. COMBA_FORWARD;
  220. MULADD(at[2], at[11]); MULADD(at[3], at[10]); MULADD(at[4], at[9]); MULADD(at[5], at[8]);
  221. COMBA_STORE(C->dp[7]);
  222. /* 8 */
  223. COMBA_FORWARD;
  224. MULADD(at[3], at[11]); MULADD(at[4], at[10]); MULADD(at[5], at[9]);
  225. COMBA_STORE(C->dp[8]);
  226. /* 9 */
  227. COMBA_FORWARD;
  228. MULADD(at[4], at[11]); MULADD(at[5], at[10]);
  229. COMBA_STORE(C->dp[9]);
  230. /* 10 */
  231. COMBA_FORWARD;
  232. MULADD(at[5], at[11]);
  233. COMBA_STORE(C->dp[10]);
  234. COMBA_STORE2(C->dp[11]);
  235. C->used = 12;
  236. C->sign = A->sign ^ B->sign;
  237. fp_clamp(C);
  238. COMBA_FINI;
  239. break;
  240. case 7:
  241. XMEMCPY(at, A->dp, 7 * sizeof(fp_digit));
  242. XMEMCPY(at+7, B->dp, 7 * sizeof(fp_digit));
  243. COMBA_START;
  244. COMBA_CLEAR;
  245. /* 0 */
  246. MULADD(at[0], at[7]);
  247. COMBA_STORE(C->dp[0]);
  248. /* 1 */
  249. COMBA_FORWARD;
  250. MULADD(at[0], at[8]); MULADD(at[1], at[7]);
  251. COMBA_STORE(C->dp[1]);
  252. /* 2 */
  253. COMBA_FORWARD;
  254. MULADD(at[0], at[9]); MULADD(at[1], at[8]); MULADD(at[2], at[7]);
  255. COMBA_STORE(C->dp[2]);
  256. /* 3 */
  257. COMBA_FORWARD;
  258. MULADD(at[0], at[10]); MULADD(at[1], at[9]); MULADD(at[2], at[8]); MULADD(at[3], at[7]);
  259. COMBA_STORE(C->dp[3]);
  260. /* 4 */
  261. COMBA_FORWARD;
  262. MULADD(at[0], at[11]); MULADD(at[1], at[10]); MULADD(at[2], at[9]); MULADD(at[3], at[8]); MULADD(at[4], at[7]);
  263. COMBA_STORE(C->dp[4]);
  264. /* 5 */
  265. COMBA_FORWARD;
  266. MULADD(at[0], at[12]); MULADD(at[1], at[11]); MULADD(at[2], at[10]); MULADD(at[3], at[9]); MULADD(at[4], at[8]); MULADD(at[5], at[7]);
  267. COMBA_STORE(C->dp[5]);
  268. /* 6 */
  269. COMBA_FORWARD;
  270. MULADD(at[0], at[13]); MULADD(at[1], at[12]); MULADD(at[2], at[11]); MULADD(at[3], at[10]); MULADD(at[4], at[9]); MULADD(at[5], at[8]); MULADD(at[6], at[7]);
  271. COMBA_STORE(C->dp[6]);
  272. /* 7 */
  273. COMBA_FORWARD;
  274. MULADD(at[1], at[13]); MULADD(at[2], at[12]); MULADD(at[3], at[11]); MULADD(at[4], at[10]); MULADD(at[5], at[9]); MULADD(at[6], at[8]);
  275. COMBA_STORE(C->dp[7]);
  276. /* 8 */
  277. COMBA_FORWARD;
  278. MULADD(at[2], at[13]); MULADD(at[3], at[12]); MULADD(at[4], at[11]); MULADD(at[5], at[10]); MULADD(at[6], at[9]);
  279. COMBA_STORE(C->dp[8]);
  280. /* 9 */
  281. COMBA_FORWARD;
  282. MULADD(at[3], at[13]); MULADD(at[4], at[12]); MULADD(at[5], at[11]); MULADD(at[6], at[10]);
  283. COMBA_STORE(C->dp[9]);
  284. /* 10 */
  285. COMBA_FORWARD;
  286. MULADD(at[4], at[13]); MULADD(at[5], at[12]); MULADD(at[6], at[11]);
  287. COMBA_STORE(C->dp[10]);
  288. /* 11 */
  289. COMBA_FORWARD;
  290. MULADD(at[5], at[13]); MULADD(at[6], at[12]);
  291. COMBA_STORE(C->dp[11]);
  292. /* 12 */
  293. COMBA_FORWARD;
  294. MULADD(at[6], at[13]);
  295. COMBA_STORE(C->dp[12]);
  296. COMBA_STORE2(C->dp[13]);
  297. C->used = 14;
  298. C->sign = A->sign ^ B->sign;
  299. fp_clamp(C);
  300. COMBA_FINI;
  301. break;
  302. case 8:
  303. XMEMCPY(at, A->dp, 8 * sizeof(fp_digit));
  304. XMEMCPY(at+8, B->dp, 8 * sizeof(fp_digit));
  305. COMBA_START;
  306. COMBA_CLEAR;
  307. /* 0 */
  308. MULADD(at[0], at[8]);
  309. COMBA_STORE(C->dp[0]);
  310. /* 1 */
  311. COMBA_FORWARD;
  312. MULADD(at[0], at[9]); MULADD(at[1], at[8]);
  313. COMBA_STORE(C->dp[1]);
  314. /* 2 */
  315. COMBA_FORWARD;
  316. MULADD(at[0], at[10]); MULADD(at[1], at[9]); MULADD(at[2], at[8]);
  317. COMBA_STORE(C->dp[2]);
  318. /* 3 */
  319. COMBA_FORWARD;
  320. MULADD(at[0], at[11]); MULADD(at[1], at[10]); MULADD(at[2], at[9]); MULADD(at[3], at[8]);
  321. COMBA_STORE(C->dp[3]);
  322. /* 4 */
  323. COMBA_FORWARD;
  324. MULADD(at[0], at[12]); MULADD(at[1], at[11]); MULADD(at[2], at[10]); MULADD(at[3], at[9]); MULADD(at[4], at[8]);
  325. COMBA_STORE(C->dp[4]);
  326. /* 5 */
  327. COMBA_FORWARD;
  328. MULADD(at[0], at[13]); MULADD(at[1], at[12]); MULADD(at[2], at[11]); MULADD(at[3], at[10]); MULADD(at[4], at[9]); MULADD(at[5], at[8]);
  329. COMBA_STORE(C->dp[5]);
  330. /* 6 */
  331. COMBA_FORWARD;
  332. MULADD(at[0], at[14]); MULADD(at[1], at[13]); MULADD(at[2], at[12]); MULADD(at[3], at[11]); MULADD(at[4], at[10]); MULADD(at[5], at[9]); MULADD(at[6], at[8]);
  333. COMBA_STORE(C->dp[6]);
  334. /* 7 */
  335. COMBA_FORWARD;
  336. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]); MULADD(at[3], at[12]); MULADD(at[4], at[11]); MULADD(at[5], at[10]); MULADD(at[6], at[9]); MULADD(at[7], at[8]);
  337. COMBA_STORE(C->dp[7]);
  338. /* 8 */
  339. COMBA_FORWARD;
  340. MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]); MULADD(at[4], at[12]); MULADD(at[5], at[11]); MULADD(at[6], at[10]); MULADD(at[7], at[9]);
  341. COMBA_STORE(C->dp[8]);
  342. /* 9 */
  343. COMBA_FORWARD;
  344. MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]); MULADD(at[5], at[12]); MULADD(at[6], at[11]); MULADD(at[7], at[10]);
  345. COMBA_STORE(C->dp[9]);
  346. /* 10 */
  347. COMBA_FORWARD;
  348. MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]); MULADD(at[6], at[12]); MULADD(at[7], at[11]);
  349. COMBA_STORE(C->dp[10]);
  350. /* 11 */
  351. COMBA_FORWARD;
  352. MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]);
  353. COMBA_STORE(C->dp[11]);
  354. /* 12 */
  355. COMBA_FORWARD;
  356. MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]);
  357. COMBA_STORE(C->dp[12]);
  358. /* 13 */
  359. COMBA_FORWARD;
  360. MULADD(at[6], at[15]); MULADD(at[7], at[14]);
  361. COMBA_STORE(C->dp[13]);
  362. /* 14 */
  363. COMBA_FORWARD;
  364. MULADD(at[7], at[15]);
  365. COMBA_STORE(C->dp[14]);
  366. COMBA_STORE2(C->dp[15]);
  367. C->used = 16;
  368. C->sign = A->sign ^ B->sign;
  369. fp_clamp(C);
  370. COMBA_FINI;
  371. break;
  372. case 9:
  373. XMEMCPY(at, A->dp, 9 * sizeof(fp_digit));
  374. XMEMCPY(at+9, B->dp, 9 * sizeof(fp_digit));
  375. COMBA_START;
  376. COMBA_CLEAR;
  377. /* 0 */
  378. MULADD(at[0], at[9]);
  379. COMBA_STORE(C->dp[0]);
  380. /* 1 */
  381. COMBA_FORWARD;
  382. MULADD(at[0], at[10]); MULADD(at[1], at[9]);
  383. COMBA_STORE(C->dp[1]);
  384. /* 2 */
  385. COMBA_FORWARD;
  386. MULADD(at[0], at[11]); MULADD(at[1], at[10]); MULADD(at[2], at[9]);
  387. COMBA_STORE(C->dp[2]);
  388. /* 3 */
  389. COMBA_FORWARD;
  390. MULADD(at[0], at[12]); MULADD(at[1], at[11]); MULADD(at[2], at[10]); MULADD(at[3], at[9]);
  391. COMBA_STORE(C->dp[3]);
  392. /* 4 */
  393. COMBA_FORWARD;
  394. MULADD(at[0], at[13]); MULADD(at[1], at[12]); MULADD(at[2], at[11]); MULADD(at[3], at[10]); MULADD(at[4], at[9]);
  395. COMBA_STORE(C->dp[4]);
  396. /* 5 */
  397. COMBA_FORWARD;
  398. MULADD(at[0], at[14]); MULADD(at[1], at[13]); MULADD(at[2], at[12]); MULADD(at[3], at[11]); MULADD(at[4], at[10]); MULADD(at[5], at[9]);
  399. COMBA_STORE(C->dp[5]);
  400. /* 6 */
  401. COMBA_FORWARD;
  402. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]); MULADD(at[3], at[12]); MULADD(at[4], at[11]); MULADD(at[5], at[10]); MULADD(at[6], at[9]);
  403. COMBA_STORE(C->dp[6]);
  404. /* 7 */
  405. COMBA_FORWARD;
  406. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]); MULADD(at[4], at[12]); MULADD(at[5], at[11]); MULADD(at[6], at[10]); MULADD(at[7], at[9]);
  407. COMBA_STORE(C->dp[7]);
  408. /* 8 */
  409. COMBA_FORWARD;
  410. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]); MULADD(at[5], at[12]); MULADD(at[6], at[11]); MULADD(at[7], at[10]); MULADD(at[8], at[9]);
  411. COMBA_STORE(C->dp[8]);
  412. /* 9 */
  413. COMBA_FORWARD;
  414. MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]); MULADD(at[6], at[12]); MULADD(at[7], at[11]); MULADD(at[8], at[10]);
  415. COMBA_STORE(C->dp[9]);
  416. /* 10 */
  417. COMBA_FORWARD;
  418. MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]); MULADD(at[8], at[11]);
  419. COMBA_STORE(C->dp[10]);
  420. /* 11 */
  421. COMBA_FORWARD;
  422. MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]); MULADD(at[8], at[12]);
  423. COMBA_STORE(C->dp[11]);
  424. /* 12 */
  425. COMBA_FORWARD;
  426. MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]); MULADD(at[8], at[13]);
  427. COMBA_STORE(C->dp[12]);
  428. /* 13 */
  429. COMBA_FORWARD;
  430. MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]);
  431. COMBA_STORE(C->dp[13]);
  432. /* 14 */
  433. COMBA_FORWARD;
  434. MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]);
  435. COMBA_STORE(C->dp[14]);
  436. /* 15 */
  437. COMBA_FORWARD;
  438. MULADD(at[7], at[17]); MULADD(at[8], at[16]);
  439. COMBA_STORE(C->dp[15]);
  440. /* 16 */
  441. COMBA_FORWARD;
  442. MULADD(at[8], at[17]);
  443. COMBA_STORE(C->dp[16]);
  444. COMBA_STORE2(C->dp[17]);
  445. C->used = 18;
  446. C->sign = A->sign ^ B->sign;
  447. fp_clamp(C);
  448. COMBA_FINI;
  449. break;
  450. case 10:
  451. XMEMCPY(at, A->dp, 10 * sizeof(fp_digit));
  452. XMEMCPY(at+10, B->dp, 10 * sizeof(fp_digit));
  453. COMBA_START;
  454. COMBA_CLEAR;
  455. /* 0 */
  456. MULADD(at[0], at[10]);
  457. COMBA_STORE(C->dp[0]);
  458. /* 1 */
  459. COMBA_FORWARD;
  460. MULADD(at[0], at[11]); MULADD(at[1], at[10]);
  461. COMBA_STORE(C->dp[1]);
  462. /* 2 */
  463. COMBA_FORWARD;
  464. MULADD(at[0], at[12]); MULADD(at[1], at[11]); MULADD(at[2], at[10]);
  465. COMBA_STORE(C->dp[2]);
  466. /* 3 */
  467. COMBA_FORWARD;
  468. MULADD(at[0], at[13]); MULADD(at[1], at[12]); MULADD(at[2], at[11]); MULADD(at[3], at[10]);
  469. COMBA_STORE(C->dp[3]);
  470. /* 4 */
  471. COMBA_FORWARD;
  472. MULADD(at[0], at[14]); MULADD(at[1], at[13]); MULADD(at[2], at[12]); MULADD(at[3], at[11]); MULADD(at[4], at[10]);
  473. COMBA_STORE(C->dp[4]);
  474. /* 5 */
  475. COMBA_FORWARD;
  476. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]); MULADD(at[3], at[12]); MULADD(at[4], at[11]); MULADD(at[5], at[10]);
  477. COMBA_STORE(C->dp[5]);
  478. /* 6 */
  479. COMBA_FORWARD;
  480. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]); MULADD(at[4], at[12]); MULADD(at[5], at[11]); MULADD(at[6], at[10]);
  481. COMBA_STORE(C->dp[6]);
  482. /* 7 */
  483. COMBA_FORWARD;
  484. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]); MULADD(at[5], at[12]); MULADD(at[6], at[11]); MULADD(at[7], at[10]);
  485. COMBA_STORE(C->dp[7]);
  486. /* 8 */
  487. COMBA_FORWARD;
  488. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]); MULADD(at[6], at[12]); MULADD(at[7], at[11]); MULADD(at[8], at[10]);
  489. COMBA_STORE(C->dp[8]);
  490. /* 9 */
  491. COMBA_FORWARD;
  492. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]); MULADD(at[8], at[11]); MULADD(at[9], at[10]);
  493. COMBA_STORE(C->dp[9]);
  494. /* 10 */
  495. COMBA_FORWARD;
  496. MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]); MULADD(at[8], at[12]); MULADD(at[9], at[11]);
  497. COMBA_STORE(C->dp[10]);
  498. /* 11 */
  499. COMBA_FORWARD;
  500. MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]); MULADD(at[8], at[13]); MULADD(at[9], at[12]);
  501. COMBA_STORE(C->dp[11]);
  502. /* 12 */
  503. COMBA_FORWARD;
  504. MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]); MULADD(at[9], at[13]);
  505. COMBA_STORE(C->dp[12]);
  506. /* 13 */
  507. COMBA_FORWARD;
  508. MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]); MULADD(at[9], at[14]);
  509. COMBA_STORE(C->dp[13]);
  510. /* 14 */
  511. COMBA_FORWARD;
  512. MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]);
  513. COMBA_STORE(C->dp[14]);
  514. /* 15 */
  515. COMBA_FORWARD;
  516. MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]);
  517. COMBA_STORE(C->dp[15]);
  518. /* 16 */
  519. COMBA_FORWARD;
  520. MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]);
  521. COMBA_STORE(C->dp[16]);
  522. /* 17 */
  523. COMBA_FORWARD;
  524. MULADD(at[8], at[19]); MULADD(at[9], at[18]);
  525. COMBA_STORE(C->dp[17]);
  526. /* 18 */
  527. COMBA_FORWARD;
  528. MULADD(at[9], at[19]);
  529. COMBA_STORE(C->dp[18]);
  530. COMBA_STORE2(C->dp[19]);
  531. C->used = 20;
  532. C->sign = A->sign ^ B->sign;
  533. fp_clamp(C);
  534. COMBA_FINI;
  535. break;
  536. case 11:
  537. XMEMCPY(at, A->dp, 11 * sizeof(fp_digit));
  538. XMEMCPY(at+11, B->dp, 11 * sizeof(fp_digit));
  539. COMBA_START;
  540. COMBA_CLEAR;
  541. /* 0 */
  542. MULADD(at[0], at[11]);
  543. COMBA_STORE(C->dp[0]);
  544. /* 1 */
  545. COMBA_FORWARD;
  546. MULADD(at[0], at[12]); MULADD(at[1], at[11]);
  547. COMBA_STORE(C->dp[1]);
  548. /* 2 */
  549. COMBA_FORWARD;
  550. MULADD(at[0], at[13]); MULADD(at[1], at[12]); MULADD(at[2], at[11]);
  551. COMBA_STORE(C->dp[2]);
  552. /* 3 */
  553. COMBA_FORWARD;
  554. MULADD(at[0], at[14]); MULADD(at[1], at[13]); MULADD(at[2], at[12]); MULADD(at[3], at[11]);
  555. COMBA_STORE(C->dp[3]);
  556. /* 4 */
  557. COMBA_FORWARD;
  558. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]); MULADD(at[3], at[12]); MULADD(at[4], at[11]);
  559. COMBA_STORE(C->dp[4]);
  560. /* 5 */
  561. COMBA_FORWARD;
  562. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]); MULADD(at[4], at[12]); MULADD(at[5], at[11]);
  563. COMBA_STORE(C->dp[5]);
  564. /* 6 */
  565. COMBA_FORWARD;
  566. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]); MULADD(at[5], at[12]); MULADD(at[6], at[11]);
  567. COMBA_STORE(C->dp[6]);
  568. /* 7 */
  569. COMBA_FORWARD;
  570. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]); MULADD(at[6], at[12]); MULADD(at[7], at[11]);
  571. COMBA_STORE(C->dp[7]);
  572. /* 8 */
  573. COMBA_FORWARD;
  574. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]); MULADD(at[8], at[11]);
  575. COMBA_STORE(C->dp[8]);
  576. /* 9 */
  577. COMBA_FORWARD;
  578. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]); MULADD(at[8], at[12]); MULADD(at[9], at[11]);
  579. COMBA_STORE(C->dp[9]);
  580. /* 10 */
  581. COMBA_FORWARD;
  582. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]); MULADD(at[8], at[13]); MULADD(at[9], at[12]); MULADD(at[10], at[11]);
  583. COMBA_STORE(C->dp[10]);
  584. /* 11 */
  585. COMBA_FORWARD;
  586. MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]); MULADD(at[9], at[13]); MULADD(at[10], at[12]);
  587. COMBA_STORE(C->dp[11]);
  588. /* 12 */
  589. COMBA_FORWARD;
  590. MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]); MULADD(at[9], at[14]); MULADD(at[10], at[13]);
  591. COMBA_STORE(C->dp[12]);
  592. /* 13 */
  593. COMBA_FORWARD;
  594. MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]); MULADD(at[10], at[14]);
  595. COMBA_STORE(C->dp[13]);
  596. /* 14 */
  597. COMBA_FORWARD;
  598. MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]); MULADD(at[10], at[15]);
  599. COMBA_STORE(C->dp[14]);
  600. /* 15 */
  601. COMBA_FORWARD;
  602. MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]);
  603. COMBA_STORE(C->dp[15]);
  604. /* 16 */
  605. COMBA_FORWARD;
  606. MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]);
  607. COMBA_STORE(C->dp[16]);
  608. /* 17 */
  609. COMBA_FORWARD;
  610. MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]);
  611. COMBA_STORE(C->dp[17]);
  612. /* 18 */
  613. COMBA_FORWARD;
  614. MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]);
  615. COMBA_STORE(C->dp[18]);
  616. /* 19 */
  617. COMBA_FORWARD;
  618. MULADD(at[9], at[21]); MULADD(at[10], at[20]);
  619. COMBA_STORE(C->dp[19]);
  620. /* 20 */
  621. COMBA_FORWARD;
  622. MULADD(at[10], at[21]);
  623. COMBA_STORE(C->dp[20]);
  624. COMBA_STORE2(C->dp[21]);
  625. C->used = 22;
  626. C->sign = A->sign ^ B->sign;
  627. fp_clamp(C);
  628. COMBA_FINI;
  629. break;
  630. case 12:
  631. XMEMCPY(at, A->dp, 12 * sizeof(fp_digit));
  632. XMEMCPY(at+12, B->dp, 12 * sizeof(fp_digit));
  633. COMBA_START;
  634. COMBA_CLEAR;
  635. /* 0 */
  636. MULADD(at[0], at[12]);
  637. COMBA_STORE(C->dp[0]);
  638. /* 1 */
  639. COMBA_FORWARD;
  640. MULADD(at[0], at[13]); MULADD(at[1], at[12]);
  641. COMBA_STORE(C->dp[1]);
  642. /* 2 */
  643. COMBA_FORWARD;
  644. MULADD(at[0], at[14]); MULADD(at[1], at[13]); MULADD(at[2], at[12]);
  645. COMBA_STORE(C->dp[2]);
  646. /* 3 */
  647. COMBA_FORWARD;
  648. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]); MULADD(at[3], at[12]);
  649. COMBA_STORE(C->dp[3]);
  650. /* 4 */
  651. COMBA_FORWARD;
  652. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]); MULADD(at[4], at[12]);
  653. COMBA_STORE(C->dp[4]);
  654. /* 5 */
  655. COMBA_FORWARD;
  656. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]); MULADD(at[5], at[12]);
  657. COMBA_STORE(C->dp[5]);
  658. /* 6 */
  659. COMBA_FORWARD;
  660. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]); MULADD(at[6], at[12]);
  661. COMBA_STORE(C->dp[6]);
  662. /* 7 */
  663. COMBA_FORWARD;
  664. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]); MULADD(at[7], at[12]);
  665. COMBA_STORE(C->dp[7]);
  666. /* 8 */
  667. COMBA_FORWARD;
  668. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]); MULADD(at[8], at[12]);
  669. COMBA_STORE(C->dp[8]);
  670. /* 9 */
  671. COMBA_FORWARD;
  672. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]); MULADD(at[8], at[13]); MULADD(at[9], at[12]);
  673. COMBA_STORE(C->dp[9]);
  674. /* 10 */
  675. COMBA_FORWARD;
  676. MULADD(at[0], at[22]); MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]); MULADD(at[9], at[13]); MULADD(at[10], at[12]);
  677. COMBA_STORE(C->dp[10]);
  678. /* 11 */
  679. COMBA_FORWARD;
  680. MULADD(at[0], at[23]); MULADD(at[1], at[22]); MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]); MULADD(at[9], at[14]); MULADD(at[10], at[13]); MULADD(at[11], at[12]);
  681. COMBA_STORE(C->dp[11]);
  682. /* 12 */
  683. COMBA_FORWARD;
  684. MULADD(at[1], at[23]); MULADD(at[2], at[22]); MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]); MULADD(at[10], at[14]); MULADD(at[11], at[13]);
  685. COMBA_STORE(C->dp[12]);
  686. /* 13 */
  687. COMBA_FORWARD;
  688. MULADD(at[2], at[23]); MULADD(at[3], at[22]); MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]); MULADD(at[10], at[15]); MULADD(at[11], at[14]);
  689. COMBA_STORE(C->dp[13]);
  690. /* 14 */
  691. COMBA_FORWARD;
  692. MULADD(at[3], at[23]); MULADD(at[4], at[22]); MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]); MULADD(at[11], at[15]);
  693. COMBA_STORE(C->dp[14]);
  694. /* 15 */
  695. COMBA_FORWARD;
  696. MULADD(at[4], at[23]); MULADD(at[5], at[22]); MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]); MULADD(at[11], at[16]);
  697. COMBA_STORE(C->dp[15]);
  698. /* 16 */
  699. COMBA_FORWARD;
  700. MULADD(at[5], at[23]); MULADD(at[6], at[22]); MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]); MULADD(at[11], at[17]);
  701. COMBA_STORE(C->dp[16]);
  702. /* 17 */
  703. COMBA_FORWARD;
  704. MULADD(at[6], at[23]); MULADD(at[7], at[22]); MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]); MULADD(at[11], at[18]);
  705. COMBA_STORE(C->dp[17]);
  706. /* 18 */
  707. COMBA_FORWARD;
  708. MULADD(at[7], at[23]); MULADD(at[8], at[22]); MULADD(at[9], at[21]); MULADD(at[10], at[20]); MULADD(at[11], at[19]);
  709. COMBA_STORE(C->dp[18]);
  710. /* 19 */
  711. COMBA_FORWARD;
  712. MULADD(at[8], at[23]); MULADD(at[9], at[22]); MULADD(at[10], at[21]); MULADD(at[11], at[20]);
  713. COMBA_STORE(C->dp[19]);
  714. /* 20 */
  715. COMBA_FORWARD;
  716. MULADD(at[9], at[23]); MULADD(at[10], at[22]); MULADD(at[11], at[21]);
  717. COMBA_STORE(C->dp[20]);
  718. /* 21 */
  719. COMBA_FORWARD;
  720. MULADD(at[10], at[23]); MULADD(at[11], at[22]);
  721. COMBA_STORE(C->dp[21]);
  722. /* 22 */
  723. COMBA_FORWARD;
  724. MULADD(at[11], at[23]);
  725. COMBA_STORE(C->dp[22]);
  726. COMBA_STORE2(C->dp[23]);
  727. C->used = 24;
  728. C->sign = A->sign ^ B->sign;
  729. fp_clamp(C);
  730. COMBA_FINI;
  731. break;
  732. case 13:
  733. XMEMCPY(at, A->dp, 13 * sizeof(fp_digit));
  734. XMEMCPY(at+13, B->dp, 13 * sizeof(fp_digit));
  735. COMBA_START;
  736. COMBA_CLEAR;
  737. /* 0 */
  738. MULADD(at[0], at[13]);
  739. COMBA_STORE(C->dp[0]);
  740. /* 1 */
  741. COMBA_FORWARD;
  742. MULADD(at[0], at[14]); MULADD(at[1], at[13]);
  743. COMBA_STORE(C->dp[1]);
  744. /* 2 */
  745. COMBA_FORWARD;
  746. MULADD(at[0], at[15]); MULADD(at[1], at[14]); MULADD(at[2], at[13]);
  747. COMBA_STORE(C->dp[2]);
  748. /* 3 */
  749. COMBA_FORWARD;
  750. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]); MULADD(at[3], at[13]);
  751. COMBA_STORE(C->dp[3]);
  752. /* 4 */
  753. COMBA_FORWARD;
  754. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]); MULADD(at[4], at[13]);
  755. COMBA_STORE(C->dp[4]);
  756. /* 5 */
  757. COMBA_FORWARD;
  758. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]); MULADD(at[5], at[13]);
  759. COMBA_STORE(C->dp[5]);
  760. /* 6 */
  761. COMBA_FORWARD;
  762. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]); MULADD(at[6], at[13]);
  763. COMBA_STORE(C->dp[6]);
  764. /* 7 */
  765. COMBA_FORWARD;
  766. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]); MULADD(at[7], at[13]);
  767. COMBA_STORE(C->dp[7]);
  768. /* 8 */
  769. COMBA_FORWARD;
  770. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]); MULADD(at[8], at[13]);
  771. COMBA_STORE(C->dp[8]);
  772. /* 9 */
  773. COMBA_FORWARD;
  774. MULADD(at[0], at[22]); MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]); MULADD(at[9], at[13]);
  775. COMBA_STORE(C->dp[9]);
  776. /* 10 */
  777. COMBA_FORWARD;
  778. MULADD(at[0], at[23]); MULADD(at[1], at[22]); MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]); MULADD(at[9], at[14]); MULADD(at[10], at[13]);
  779. COMBA_STORE(C->dp[10]);
  780. /* 11 */
  781. COMBA_FORWARD;
  782. MULADD(at[0], at[24]); MULADD(at[1], at[23]); MULADD(at[2], at[22]); MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]); MULADD(at[10], at[14]); MULADD(at[11], at[13]);
  783. COMBA_STORE(C->dp[11]);
  784. /* 12 */
  785. COMBA_FORWARD;
  786. MULADD(at[0], at[25]); MULADD(at[1], at[24]); MULADD(at[2], at[23]); MULADD(at[3], at[22]); MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]); MULADD(at[10], at[15]); MULADD(at[11], at[14]); MULADD(at[12], at[13]);
  787. COMBA_STORE(C->dp[12]);
  788. /* 13 */
  789. COMBA_FORWARD;
  790. MULADD(at[1], at[25]); MULADD(at[2], at[24]); MULADD(at[3], at[23]); MULADD(at[4], at[22]); MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]); MULADD(at[11], at[15]); MULADD(at[12], at[14]);
  791. COMBA_STORE(C->dp[13]);
  792. /* 14 */
  793. COMBA_FORWARD;
  794. MULADD(at[2], at[25]); MULADD(at[3], at[24]); MULADD(at[4], at[23]); MULADD(at[5], at[22]); MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]); MULADD(at[11], at[16]); MULADD(at[12], at[15]);
  795. COMBA_STORE(C->dp[14]);
  796. /* 15 */
  797. COMBA_FORWARD;
  798. MULADD(at[3], at[25]); MULADD(at[4], at[24]); MULADD(at[5], at[23]); MULADD(at[6], at[22]); MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]); MULADD(at[11], at[17]); MULADD(at[12], at[16]);
  799. COMBA_STORE(C->dp[15]);
  800. /* 16 */
  801. COMBA_FORWARD;
  802. MULADD(at[4], at[25]); MULADD(at[5], at[24]); MULADD(at[6], at[23]); MULADD(at[7], at[22]); MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]); MULADD(at[11], at[18]); MULADD(at[12], at[17]);
  803. COMBA_STORE(C->dp[16]);
  804. /* 17 */
  805. COMBA_FORWARD;
  806. MULADD(at[5], at[25]); MULADD(at[6], at[24]); MULADD(at[7], at[23]); MULADD(at[8], at[22]); MULADD(at[9], at[21]); MULADD(at[10], at[20]); MULADD(at[11], at[19]); MULADD(at[12], at[18]);
  807. COMBA_STORE(C->dp[17]);
  808. /* 18 */
  809. COMBA_FORWARD;
  810. MULADD(at[6], at[25]); MULADD(at[7], at[24]); MULADD(at[8], at[23]); MULADD(at[9], at[22]); MULADD(at[10], at[21]); MULADD(at[11], at[20]); MULADD(at[12], at[19]);
  811. COMBA_STORE(C->dp[18]);
  812. /* 19 */
  813. COMBA_FORWARD;
  814. MULADD(at[7], at[25]); MULADD(at[8], at[24]); MULADD(at[9], at[23]); MULADD(at[10], at[22]); MULADD(at[11], at[21]); MULADD(at[12], at[20]);
  815. COMBA_STORE(C->dp[19]);
  816. /* 20 */
  817. COMBA_FORWARD;
  818. MULADD(at[8], at[25]); MULADD(at[9], at[24]); MULADD(at[10], at[23]); MULADD(at[11], at[22]); MULADD(at[12], at[21]);
  819. COMBA_STORE(C->dp[20]);
  820. /* 21 */
  821. COMBA_FORWARD;
  822. MULADD(at[9], at[25]); MULADD(at[10], at[24]); MULADD(at[11], at[23]); MULADD(at[12], at[22]);
  823. COMBA_STORE(C->dp[21]);
  824. /* 22 */
  825. COMBA_FORWARD;
  826. MULADD(at[10], at[25]); MULADD(at[11], at[24]); MULADD(at[12], at[23]);
  827. COMBA_STORE(C->dp[22]);
  828. /* 23 */
  829. COMBA_FORWARD;
  830. MULADD(at[11], at[25]); MULADD(at[12], at[24]);
  831. COMBA_STORE(C->dp[23]);
  832. /* 24 */
  833. COMBA_FORWARD;
  834. MULADD(at[12], at[25]);
  835. COMBA_STORE(C->dp[24]);
  836. COMBA_STORE2(C->dp[25]);
  837. C->used = 26;
  838. C->sign = A->sign ^ B->sign;
  839. fp_clamp(C);
  840. COMBA_FINI;
  841. break;
  842. case 14:
  843. XMEMCPY(at, A->dp, 14 * sizeof(fp_digit));
  844. XMEMCPY(at+14, B->dp, 14 * sizeof(fp_digit));
  845. COMBA_START;
  846. COMBA_CLEAR;
  847. /* 0 */
  848. MULADD(at[0], at[14]);
  849. COMBA_STORE(C->dp[0]);
  850. /* 1 */
  851. COMBA_FORWARD;
  852. MULADD(at[0], at[15]); MULADD(at[1], at[14]);
  853. COMBA_STORE(C->dp[1]);
  854. /* 2 */
  855. COMBA_FORWARD;
  856. MULADD(at[0], at[16]); MULADD(at[1], at[15]); MULADD(at[2], at[14]);
  857. COMBA_STORE(C->dp[2]);
  858. /* 3 */
  859. COMBA_FORWARD;
  860. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]); MULADD(at[3], at[14]);
  861. COMBA_STORE(C->dp[3]);
  862. /* 4 */
  863. COMBA_FORWARD;
  864. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]); MULADD(at[4], at[14]);
  865. COMBA_STORE(C->dp[4]);
  866. /* 5 */
  867. COMBA_FORWARD;
  868. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]); MULADD(at[5], at[14]);
  869. COMBA_STORE(C->dp[5]);
  870. /* 6 */
  871. COMBA_FORWARD;
  872. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]); MULADD(at[6], at[14]);
  873. COMBA_STORE(C->dp[6]);
  874. /* 7 */
  875. COMBA_FORWARD;
  876. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]); MULADD(at[7], at[14]);
  877. COMBA_STORE(C->dp[7]);
  878. /* 8 */
  879. COMBA_FORWARD;
  880. MULADD(at[0], at[22]); MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]); MULADD(at[8], at[14]);
  881. COMBA_STORE(C->dp[8]);
  882. /* 9 */
  883. COMBA_FORWARD;
  884. MULADD(at[0], at[23]); MULADD(at[1], at[22]); MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]); MULADD(at[9], at[14]);
  885. COMBA_STORE(C->dp[9]);
  886. /* 10 */
  887. COMBA_FORWARD;
  888. MULADD(at[0], at[24]); MULADD(at[1], at[23]); MULADD(at[2], at[22]); MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]); MULADD(at[10], at[14]);
  889. COMBA_STORE(C->dp[10]);
  890. /* 11 */
  891. COMBA_FORWARD;
  892. MULADD(at[0], at[25]); MULADD(at[1], at[24]); MULADD(at[2], at[23]); MULADD(at[3], at[22]); MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]); MULADD(at[10], at[15]); MULADD(at[11], at[14]);
  893. COMBA_STORE(C->dp[11]);
  894. /* 12 */
  895. COMBA_FORWARD;
  896. MULADD(at[0], at[26]); MULADD(at[1], at[25]); MULADD(at[2], at[24]); MULADD(at[3], at[23]); MULADD(at[4], at[22]); MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]); MULADD(at[11], at[15]); MULADD(at[12], at[14]);
  897. COMBA_STORE(C->dp[12]);
  898. /* 13 */
  899. COMBA_FORWARD;
  900. MULADD(at[0], at[27]); MULADD(at[1], at[26]); MULADD(at[2], at[25]); MULADD(at[3], at[24]); MULADD(at[4], at[23]); MULADD(at[5], at[22]); MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]); MULADD(at[11], at[16]); MULADD(at[12], at[15]); MULADD(at[13], at[14]);
  901. COMBA_STORE(C->dp[13]);
  902. /* 14 */
  903. COMBA_FORWARD;
  904. MULADD(at[1], at[27]); MULADD(at[2], at[26]); MULADD(at[3], at[25]); MULADD(at[4], at[24]); MULADD(at[5], at[23]); MULADD(at[6], at[22]); MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]); MULADD(at[11], at[17]); MULADD(at[12], at[16]); MULADD(at[13], at[15]);
  905. COMBA_STORE(C->dp[14]);
  906. /* 15 */
  907. COMBA_FORWARD;
  908. MULADD(at[2], at[27]); MULADD(at[3], at[26]); MULADD(at[4], at[25]); MULADD(at[5], at[24]); MULADD(at[6], at[23]); MULADD(at[7], at[22]); MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]); MULADD(at[11], at[18]); MULADD(at[12], at[17]); MULADD(at[13], at[16]);
  909. COMBA_STORE(C->dp[15]);
  910. /* 16 */
  911. COMBA_FORWARD;
  912. MULADD(at[3], at[27]); MULADD(at[4], at[26]); MULADD(at[5], at[25]); MULADD(at[6], at[24]); MULADD(at[7], at[23]); MULADD(at[8], at[22]); MULADD(at[9], at[21]); MULADD(at[10], at[20]); MULADD(at[11], at[19]); MULADD(at[12], at[18]); MULADD(at[13], at[17]);
  913. COMBA_STORE(C->dp[16]);
  914. /* 17 */
  915. COMBA_FORWARD;
  916. MULADD(at[4], at[27]); MULADD(at[5], at[26]); MULADD(at[6], at[25]); MULADD(at[7], at[24]); MULADD(at[8], at[23]); MULADD(at[9], at[22]); MULADD(at[10], at[21]); MULADD(at[11], at[20]); MULADD(at[12], at[19]); MULADD(at[13], at[18]);
  917. COMBA_STORE(C->dp[17]);
  918. /* 18 */
  919. COMBA_FORWARD;
  920. MULADD(at[5], at[27]); MULADD(at[6], at[26]); MULADD(at[7], at[25]); MULADD(at[8], at[24]); MULADD(at[9], at[23]); MULADD(at[10], at[22]); MULADD(at[11], at[21]); MULADD(at[12], at[20]); MULADD(at[13], at[19]);
  921. COMBA_STORE(C->dp[18]);
  922. /* 19 */
  923. COMBA_FORWARD;
  924. MULADD(at[6], at[27]); MULADD(at[7], at[26]); MULADD(at[8], at[25]); MULADD(at[9], at[24]); MULADD(at[10], at[23]); MULADD(at[11], at[22]); MULADD(at[12], at[21]); MULADD(at[13], at[20]);
  925. COMBA_STORE(C->dp[19]);
  926. /* 20 */
  927. COMBA_FORWARD;
  928. MULADD(at[7], at[27]); MULADD(at[8], at[26]); MULADD(at[9], at[25]); MULADD(at[10], at[24]); MULADD(at[11], at[23]); MULADD(at[12], at[22]); MULADD(at[13], at[21]);
  929. COMBA_STORE(C->dp[20]);
  930. /* 21 */
  931. COMBA_FORWARD;
  932. MULADD(at[8], at[27]); MULADD(at[9], at[26]); MULADD(at[10], at[25]); MULADD(at[11], at[24]); MULADD(at[12], at[23]); MULADD(at[13], at[22]);
  933. COMBA_STORE(C->dp[21]);
  934. /* 22 */
  935. COMBA_FORWARD;
  936. MULADD(at[9], at[27]); MULADD(at[10], at[26]); MULADD(at[11], at[25]); MULADD(at[12], at[24]); MULADD(at[13], at[23]);
  937. COMBA_STORE(C->dp[22]);
  938. /* 23 */
  939. COMBA_FORWARD;
  940. MULADD(at[10], at[27]); MULADD(at[11], at[26]); MULADD(at[12], at[25]); MULADD(at[13], at[24]);
  941. COMBA_STORE(C->dp[23]);
  942. /* 24 */
  943. COMBA_FORWARD;
  944. MULADD(at[11], at[27]); MULADD(at[12], at[26]); MULADD(at[13], at[25]);
  945. COMBA_STORE(C->dp[24]);
  946. /* 25 */
  947. COMBA_FORWARD;
  948. MULADD(at[12], at[27]); MULADD(at[13], at[26]);
  949. COMBA_STORE(C->dp[25]);
  950. /* 26 */
  951. COMBA_FORWARD;
  952. MULADD(at[13], at[27]);
  953. COMBA_STORE(C->dp[26]);
  954. COMBA_STORE2(C->dp[27]);
  955. C->used = 28;
  956. C->sign = A->sign ^ B->sign;
  957. fp_clamp(C);
  958. COMBA_FINI;
  959. break;
  960. case 15:
  961. XMEMCPY(at, A->dp, 15 * sizeof(fp_digit));
  962. XMEMCPY(at+15, B->dp, 15 * sizeof(fp_digit));
  963. COMBA_START;
  964. COMBA_CLEAR;
  965. /* 0 */
  966. MULADD(at[0], at[15]);
  967. COMBA_STORE(C->dp[0]);
  968. /* 1 */
  969. COMBA_FORWARD;
  970. MULADD(at[0], at[16]); MULADD(at[1], at[15]);
  971. COMBA_STORE(C->dp[1]);
  972. /* 2 */
  973. COMBA_FORWARD;
  974. MULADD(at[0], at[17]); MULADD(at[1], at[16]); MULADD(at[2], at[15]);
  975. COMBA_STORE(C->dp[2]);
  976. /* 3 */
  977. COMBA_FORWARD;
  978. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]); MULADD(at[3], at[15]);
  979. COMBA_STORE(C->dp[3]);
  980. /* 4 */
  981. COMBA_FORWARD;
  982. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]); MULADD(at[4], at[15]);
  983. COMBA_STORE(C->dp[4]);
  984. /* 5 */
  985. COMBA_FORWARD;
  986. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]); MULADD(at[5], at[15]);
  987. COMBA_STORE(C->dp[5]);
  988. /* 6 */
  989. COMBA_FORWARD;
  990. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]); MULADD(at[6], at[15]);
  991. COMBA_STORE(C->dp[6]);
  992. /* 7 */
  993. COMBA_FORWARD;
  994. MULADD(at[0], at[22]); MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]); MULADD(at[7], at[15]);
  995. COMBA_STORE(C->dp[7]);
  996. /* 8 */
  997. COMBA_FORWARD;
  998. MULADD(at[0], at[23]); MULADD(at[1], at[22]); MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]); MULADD(at[8], at[15]);
  999. COMBA_STORE(C->dp[8]);
  1000. /* 9 */
  1001. COMBA_FORWARD;
  1002. MULADD(at[0], at[24]); MULADD(at[1], at[23]); MULADD(at[2], at[22]); MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]); MULADD(at[9], at[15]);
  1003. COMBA_STORE(C->dp[9]);
  1004. /* 10 */
  1005. COMBA_FORWARD;
  1006. MULADD(at[0], at[25]); MULADD(at[1], at[24]); MULADD(at[2], at[23]); MULADD(at[3], at[22]); MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]); MULADD(at[10], at[15]);
  1007. COMBA_STORE(C->dp[10]);
  1008. /* 11 */
  1009. COMBA_FORWARD;
  1010. MULADD(at[0], at[26]); MULADD(at[1], at[25]); MULADD(at[2], at[24]); MULADD(at[3], at[23]); MULADD(at[4], at[22]); MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]); MULADD(at[11], at[15]);
  1011. COMBA_STORE(C->dp[11]);
  1012. /* 12 */
  1013. COMBA_FORWARD;
  1014. MULADD(at[0], at[27]); MULADD(at[1], at[26]); MULADD(at[2], at[25]); MULADD(at[3], at[24]); MULADD(at[4], at[23]); MULADD(at[5], at[22]); MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]); MULADD(at[11], at[16]); MULADD(at[12], at[15]);
  1015. COMBA_STORE(C->dp[12]);
  1016. /* 13 */
  1017. COMBA_FORWARD;
  1018. MULADD(at[0], at[28]); MULADD(at[1], at[27]); MULADD(at[2], at[26]); MULADD(at[3], at[25]); MULADD(at[4], at[24]); MULADD(at[5], at[23]); MULADD(at[6], at[22]); MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]); MULADD(at[11], at[17]); MULADD(at[12], at[16]); MULADD(at[13], at[15]);
  1019. COMBA_STORE(C->dp[13]);
  1020. /* 14 */
  1021. COMBA_FORWARD;
  1022. MULADD(at[0], at[29]); MULADD(at[1], at[28]); MULADD(at[2], at[27]); MULADD(at[3], at[26]); MULADD(at[4], at[25]); MULADD(at[5], at[24]); MULADD(at[6], at[23]); MULADD(at[7], at[22]); MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]); MULADD(at[11], at[18]); MULADD(at[12], at[17]); MULADD(at[13], at[16]); MULADD(at[14], at[15]);
  1023. COMBA_STORE(C->dp[14]);
  1024. /* 15 */
  1025. COMBA_FORWARD;
  1026. MULADD(at[1], at[29]); MULADD(at[2], at[28]); MULADD(at[3], at[27]); MULADD(at[4], at[26]); MULADD(at[5], at[25]); MULADD(at[6], at[24]); MULADD(at[7], at[23]); MULADD(at[8], at[22]); MULADD(at[9], at[21]); MULADD(at[10], at[20]); MULADD(at[11], at[19]); MULADD(at[12], at[18]); MULADD(at[13], at[17]); MULADD(at[14], at[16]);
  1027. COMBA_STORE(C->dp[15]);
  1028. /* 16 */
  1029. COMBA_FORWARD;
  1030. MULADD(at[2], at[29]); MULADD(at[3], at[28]); MULADD(at[4], at[27]); MULADD(at[5], at[26]); MULADD(at[6], at[25]); MULADD(at[7], at[24]); MULADD(at[8], at[23]); MULADD(at[9], at[22]); MULADD(at[10], at[21]); MULADD(at[11], at[20]); MULADD(at[12], at[19]); MULADD(at[13], at[18]); MULADD(at[14], at[17]);
  1031. COMBA_STORE(C->dp[16]);
  1032. /* 17 */
  1033. COMBA_FORWARD;
  1034. MULADD(at[3], at[29]); MULADD(at[4], at[28]); MULADD(at[5], at[27]); MULADD(at[6], at[26]); MULADD(at[7], at[25]); MULADD(at[8], at[24]); MULADD(at[9], at[23]); MULADD(at[10], at[22]); MULADD(at[11], at[21]); MULADD(at[12], at[20]); MULADD(at[13], at[19]); MULADD(at[14], at[18]);
  1035. COMBA_STORE(C->dp[17]);
  1036. /* 18 */
  1037. COMBA_FORWARD;
  1038. MULADD(at[4], at[29]); MULADD(at[5], at[28]); MULADD(at[6], at[27]); MULADD(at[7], at[26]); MULADD(at[8], at[25]); MULADD(at[9], at[24]); MULADD(at[10], at[23]); MULADD(at[11], at[22]); MULADD(at[12], at[21]); MULADD(at[13], at[20]); MULADD(at[14], at[19]);
  1039. COMBA_STORE(C->dp[18]);
  1040. /* 19 */
  1041. COMBA_FORWARD;
  1042. MULADD(at[5], at[29]); MULADD(at[6], at[28]); MULADD(at[7], at[27]); MULADD(at[8], at[26]); MULADD(at[9], at[25]); MULADD(at[10], at[24]); MULADD(at[11], at[23]); MULADD(at[12], at[22]); MULADD(at[13], at[21]); MULADD(at[14], at[20]);
  1043. COMBA_STORE(C->dp[19]);
  1044. /* 20 */
  1045. COMBA_FORWARD;
  1046. MULADD(at[6], at[29]); MULADD(at[7], at[28]); MULADD(at[8], at[27]); MULADD(at[9], at[26]); MULADD(at[10], at[25]); MULADD(at[11], at[24]); MULADD(at[12], at[23]); MULADD(at[13], at[22]); MULADD(at[14], at[21]);
  1047. COMBA_STORE(C->dp[20]);
  1048. /* 21 */
  1049. COMBA_FORWARD;
  1050. MULADD(at[7], at[29]); MULADD(at[8], at[28]); MULADD(at[9], at[27]); MULADD(at[10], at[26]); MULADD(at[11], at[25]); MULADD(at[12], at[24]); MULADD(at[13], at[23]); MULADD(at[14], at[22]);
  1051. COMBA_STORE(C->dp[21]);
  1052. /* 22 */
  1053. COMBA_FORWARD;
  1054. MULADD(at[8], at[29]); MULADD(at[9], at[28]); MULADD(at[10], at[27]); MULADD(at[11], at[26]); MULADD(at[12], at[25]); MULADD(at[13], at[24]); MULADD(at[14], at[23]);
  1055. COMBA_STORE(C->dp[22]);
  1056. /* 23 */
  1057. COMBA_FORWARD;
  1058. MULADD(at[9], at[29]); MULADD(at[10], at[28]); MULADD(at[11], at[27]); MULADD(at[12], at[26]); MULADD(at[13], at[25]); MULADD(at[14], at[24]);
  1059. COMBA_STORE(C->dp[23]);
  1060. /* 24 */
  1061. COMBA_FORWARD;
  1062. MULADD(at[10], at[29]); MULADD(at[11], at[28]); MULADD(at[12], at[27]); MULADD(at[13], at[26]); MULADD(at[14], at[25]);
  1063. COMBA_STORE(C->dp[24]);
  1064. /* 25 */
  1065. COMBA_FORWARD;
  1066. MULADD(at[11], at[29]); MULADD(at[12], at[28]); MULADD(at[13], at[27]); MULADD(at[14], at[26]);
  1067. COMBA_STORE(C->dp[25]);
  1068. /* 26 */
  1069. COMBA_FORWARD;
  1070. MULADD(at[12], at[29]); MULADD(at[13], at[28]); MULADD(at[14], at[27]);
  1071. COMBA_STORE(C->dp[26]);
  1072. /* 27 */
  1073. COMBA_FORWARD;
  1074. MULADD(at[13], at[29]); MULADD(at[14], at[28]);
  1075. COMBA_STORE(C->dp[27]);
  1076. /* 28 */
  1077. COMBA_FORWARD;
  1078. MULADD(at[14], at[29]);
  1079. COMBA_STORE(C->dp[28]);
  1080. COMBA_STORE2(C->dp[29]);
  1081. C->used = 30;
  1082. C->sign = A->sign ^ B->sign;
  1083. fp_clamp(C);
  1084. COMBA_FINI;
  1085. break;
  1086. case 16:
  1087. XMEMCPY(at, A->dp, 16 * sizeof(fp_digit));
  1088. XMEMCPY(at+16, B->dp, 16 * sizeof(fp_digit));
  1089. COMBA_START;
  1090. COMBA_CLEAR;
  1091. /* 0 */
  1092. MULADD(at[0], at[16]);
  1093. COMBA_STORE(C->dp[0]);
  1094. /* 1 */
  1095. COMBA_FORWARD;
  1096. MULADD(at[0], at[17]); MULADD(at[1], at[16]);
  1097. COMBA_STORE(C->dp[1]);
  1098. /* 2 */
  1099. COMBA_FORWARD;
  1100. MULADD(at[0], at[18]); MULADD(at[1], at[17]); MULADD(at[2], at[16]);
  1101. COMBA_STORE(C->dp[2]);
  1102. /* 3 */
  1103. COMBA_FORWARD;
  1104. MULADD(at[0], at[19]); MULADD(at[1], at[18]); MULADD(at[2], at[17]); MULADD(at[3], at[16]);
  1105. COMBA_STORE(C->dp[3]);
  1106. /* 4 */
  1107. COMBA_FORWARD;
  1108. MULADD(at[0], at[20]); MULADD(at[1], at[19]); MULADD(at[2], at[18]); MULADD(at[3], at[17]); MULADD(at[4], at[16]);
  1109. COMBA_STORE(C->dp[4]);
  1110. /* 5 */
  1111. COMBA_FORWARD;
  1112. MULADD(at[0], at[21]); MULADD(at[1], at[20]); MULADD(at[2], at[19]); MULADD(at[3], at[18]); MULADD(at[4], at[17]); MULADD(at[5], at[16]);
  1113. COMBA_STORE(C->dp[5]);
  1114. /* 6 */
  1115. COMBA_FORWARD;
  1116. MULADD(at[0], at[22]); MULADD(at[1], at[21]); MULADD(at[2], at[20]); MULADD(at[3], at[19]); MULADD(at[4], at[18]); MULADD(at[5], at[17]); MULADD(at[6], at[16]);
  1117. COMBA_STORE(C->dp[6]);
  1118. /* 7 */
  1119. COMBA_FORWARD;
  1120. MULADD(at[0], at[23]); MULADD(at[1], at[22]); MULADD(at[2], at[21]); MULADD(at[3], at[20]); MULADD(at[4], at[19]); MULADD(at[5], at[18]); MULADD(at[6], at[17]); MULADD(at[7], at[16]);
  1121. COMBA_STORE(C->dp[7]);
  1122. /* 8 */
  1123. COMBA_FORWARD;
  1124. MULADD(at[0], at[24]); MULADD(at[1], at[23]); MULADD(at[2], at[22]); MULADD(at[3], at[21]); MULADD(at[4], at[20]); MULADD(at[5], at[19]); MULADD(at[6], at[18]); MULADD(at[7], at[17]); MULADD(at[8], at[16]);
  1125. COMBA_STORE(C->dp[8]);
  1126. /* 9 */
  1127. COMBA_FORWARD;
  1128. MULADD(at[0], at[25]); MULADD(at[1], at[24]); MULADD(at[2], at[23]); MULADD(at[3], at[22]); MULADD(at[4], at[21]); MULADD(at[5], at[20]); MULADD(at[6], at[19]); MULADD(at[7], at[18]); MULADD(at[8], at[17]); MULADD(at[9], at[16]);
  1129. COMBA_STORE(C->dp[9]);
  1130. /* 10 */
  1131. COMBA_FORWARD;
  1132. MULADD(at[0], at[26]); MULADD(at[1], at[25]); MULADD(at[2], at[24]); MULADD(at[3], at[23]); MULADD(at[4], at[22]); MULADD(at[5], at[21]); MULADD(at[6], at[20]); MULADD(at[7], at[19]); MULADD(at[8], at[18]); MULADD(at[9], at[17]); MULADD(at[10], at[16]);
  1133. COMBA_STORE(C->dp[10]);
  1134. /* 11 */
  1135. COMBA_FORWARD;
  1136. MULADD(at[0], at[27]); MULADD(at[1], at[26]); MULADD(at[2], at[25]); MULADD(at[3], at[24]); MULADD(at[4], at[23]); MULADD(at[5], at[22]); MULADD(at[6], at[21]); MULADD(at[7], at[20]); MULADD(at[8], at[19]); MULADD(at[9], at[18]); MULADD(at[10], at[17]); MULADD(at[11], at[16]);
  1137. COMBA_STORE(C->dp[11]);
  1138. /* 12 */
  1139. COMBA_FORWARD;
  1140. MULADD(at[0], at[28]); MULADD(at[1], at[27]); MULADD(at[2], at[26]); MULADD(at[3], at[25]); MULADD(at[4], at[24]); MULADD(at[5], at[23]); MULADD(at[6], at[22]); MULADD(at[7], at[21]); MULADD(at[8], at[20]); MULADD(at[9], at[19]); MULADD(at[10], at[18]); MULADD(at[11], at[17]); MULADD(at[12], at[16]);
  1141. COMBA_STORE(C->dp[12]);
  1142. /* 13 */
  1143. COMBA_FORWARD;
  1144. MULADD(at[0], at[29]); MULADD(at[1], at[28]); MULADD(at[2], at[27]); MULADD(at[3], at[26]); MULADD(at[4], at[25]); MULADD(at[5], at[24]); MULADD(at[6], at[23]); MULADD(at[7], at[22]); MULADD(at[8], at[21]); MULADD(at[9], at[20]); MULADD(at[10], at[19]); MULADD(at[11], at[18]); MULADD(at[12], at[17]); MULADD(at[13], at[16]);
  1145. COMBA_STORE(C->dp[13]);
  1146. /* 14 */
  1147. COMBA_FORWARD;
  1148. MULADD(at[0], at[30]); MULADD(at[1], at[29]); MULADD(at[2], at[28]); MULADD(at[3], at[27]); MULADD(at[4], at[26]); MULADD(at[5], at[25]); MULADD(at[6], at[24]); MULADD(at[7], at[23]); MULADD(at[8], at[22]); MULADD(at[9], at[21]); MULADD(at[10], at[20]); MULADD(at[11], at[19]); MULADD(at[12], at[18]); MULADD(at[13], at[17]); MULADD(at[14], at[16]);
  1149. COMBA_STORE(C->dp[14]);
  1150. /* 15 */
  1151. COMBA_FORWARD;
  1152. MULADD(at[0], at[31]); MULADD(at[1], at[30]); MULADD(at[2], at[29]); MULADD(at[3], at[28]); MULADD(at[4], at[27]); MULADD(at[5], at[26]); MULADD(at[6], at[25]); MULADD(at[7], at[24]); MULADD(at[8], at[23]); MULADD(at[9], at[22]); MULADD(at[10], at[21]); MULADD(at[11], at[20]); MULADD(at[12], at[19]); MULADD(at[13], at[18]); MULADD(at[14], at[17]); MULADD(at[15], at[16]);
  1153. COMBA_STORE(C->dp[15]);
  1154. /* 16 */
  1155. COMBA_FORWARD;
  1156. MULADD(at[1], at[31]); MULADD(at[2], at[30]); MULADD(at[3], at[29]); MULADD(at[4], at[28]); MULADD(at[5], at[27]); MULADD(at[6], at[26]); MULADD(at[7], at[25]); MULADD(at[8], at[24]); MULADD(at[9], at[23]); MULADD(at[10], at[22]); MULADD(at[11], at[21]); MULADD(at[12], at[20]); MULADD(at[13], at[19]); MULADD(at[14], at[18]); MULADD(at[15], at[17]);
  1157. COMBA_STORE(C->dp[16]);
  1158. /* 17 */
  1159. COMBA_FORWARD;
  1160. MULADD(at[2], at[31]); MULADD(at[3], at[30]); MULADD(at[4], at[29]); MULADD(at[5], at[28]); MULADD(at[6], at[27]); MULADD(at[7], at[26]); MULADD(at[8], at[25]); MULADD(at[9], at[24]); MULADD(at[10], at[23]); MULADD(at[11], at[22]); MULADD(at[12], at[21]); MULADD(at[13], at[20]); MULADD(at[14], at[19]); MULADD(at[15], at[18]);
  1161. COMBA_STORE(C->dp[17]);
  1162. /* 18 */
  1163. COMBA_FORWARD;
  1164. MULADD(at[3], at[31]); MULADD(at[4], at[30]); MULADD(at[5], at[29]); MULADD(at[6], at[28]); MULADD(at[7], at[27]); MULADD(at[8], at[26]); MULADD(at[9], at[25]); MULADD(at[10], at[24]); MULADD(at[11], at[23]); MULADD(at[12], at[22]); MULADD(at[13], at[21]); MULADD(at[14], at[20]); MULADD(at[15], at[19]);
  1165. COMBA_STORE(C->dp[18]);
  1166. /* 19 */
  1167. COMBA_FORWARD;
  1168. MULADD(at[4], at[31]); MULADD(at[5], at[30]); MULADD(at[6], at[29]); MULADD(at[7], at[28]); MULADD(at[8], at[27]); MULADD(at[9], at[26]); MULADD(at[10], at[25]); MULADD(at[11], at[24]); MULADD(at[12], at[23]); MULADD(at[13], at[22]); MULADD(at[14], at[21]); MULADD(at[15], at[20]);
  1169. COMBA_STORE(C->dp[19]);
  1170. /* 20 */
  1171. COMBA_FORWARD;
  1172. MULADD(at[5], at[31]); MULADD(at[6], at[30]); MULADD(at[7], at[29]); MULADD(at[8], at[28]); MULADD(at[9], at[27]); MULADD(at[10], at[26]); MULADD(at[11], at[25]); MULADD(at[12], at[24]); MULADD(at[13], at[23]); MULADD(at[14], at[22]); MULADD(at[15], at[21]);
  1173. COMBA_STORE(C->dp[20]);
  1174. /* 21 */
  1175. COMBA_FORWARD;
  1176. MULADD(at[6], at[31]); MULADD(at[7], at[30]); MULADD(at[8], at[29]); MULADD(at[9], at[28]); MULADD(at[10], at[27]); MULADD(at[11], at[26]); MULADD(at[12], at[25]); MULADD(at[13], at[24]); MULADD(at[14], at[23]); MULADD(at[15], at[22]);
  1177. COMBA_STORE(C->dp[21]);
  1178. /* 22 */
  1179. COMBA_FORWARD;
  1180. MULADD(at[7], at[31]); MULADD(at[8], at[30]); MULADD(at[9], at[29]); MULADD(at[10], at[28]); MULADD(at[11], at[27]); MULADD(at[12], at[26]); MULADD(at[13], at[25]); MULADD(at[14], at[24]); MULADD(at[15], at[23]);
  1181. COMBA_STORE(C->dp[22]);
  1182. /* 23 */
  1183. COMBA_FORWARD;
  1184. MULADD(at[8], at[31]); MULADD(at[9], at[30]); MULADD(at[10], at[29]); MULADD(at[11], at[28]); MULADD(at[12], at[27]); MULADD(at[13], at[26]); MULADD(at[14], at[25]); MULADD(at[15], at[24]);
  1185. COMBA_STORE(C->dp[23]);
  1186. /* 24 */
  1187. COMBA_FORWARD;
  1188. MULADD(at[9], at[31]); MULADD(at[10], at[30]); MULADD(at[11], at[29]); MULADD(at[12], at[28]); MULADD(at[13], at[27]); MULADD(at[14], at[26]); MULADD(at[15], at[25]);
  1189. COMBA_STORE(C->dp[24]);
  1190. /* 25 */
  1191. COMBA_FORWARD;
  1192. MULADD(at[10], at[31]); MULADD(at[11], at[30]); MULADD(at[12], at[29]); MULADD(at[13], at[28]); MULADD(at[14], at[27]); MULADD(at[15], at[26]);
  1193. COMBA_STORE(C->dp[25]);
  1194. /* 26 */
  1195. COMBA_FORWARD;
  1196. MULADD(at[11], at[31]); MULADD(at[12], at[30]); MULADD(at[13], at[29]); MULADD(at[14], at[28]); MULADD(at[15], at[27]);
  1197. COMBA_STORE(C->dp[26]);
  1198. /* 27 */
  1199. COMBA_FORWARD;
  1200. MULADD(at[12], at[31]); MULADD(at[13], at[30]); MULADD(at[14], at[29]); MULADD(at[15], at[28]);
  1201. COMBA_STORE(C->dp[27]);
  1202. /* 28 */
  1203. COMBA_FORWARD;
  1204. MULADD(at[13], at[31]); MULADD(at[14], at[30]); MULADD(at[15], at[29]);
  1205. COMBA_STORE(C->dp[28]);
  1206. /* 29 */
  1207. COMBA_FORWARD;
  1208. MULADD(at[14], at[31]); MULADD(at[15], at[30]);
  1209. COMBA_STORE(C->dp[29]);
  1210. /* 30 */
  1211. COMBA_FORWARD;
  1212. MULADD(at[15], at[31]);
  1213. COMBA_STORE(C->dp[30]);
  1214. COMBA_STORE2(C->dp[31]);
  1215. C->used = 32;
  1216. C->sign = A->sign ^ B->sign;
  1217. fp_clamp(C);
  1218. COMBA_FINI;
  1219. break;
  1220. default:
  1221. break;
  1222. }
  1223. #ifdef WOLFSSL_SMALL_STACK
  1224. XFREE(at, NULL, DYNAMIC_TYPE_TMP_BUFFER);
  1225. #endif
  1226. return FP_OKAY;
  1227. }
  1228. #endif