fp_mul_comba_small_set.i 63 KB

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