You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

zgemm3m_tcopy_8.c 28 kB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093
  1. /*********************************************************************/
  2. /* Copyright 2009, 2010 The University of Texas at Austin. */
  3. /* All rights reserved. */
  4. /* */
  5. /* Redistribution and use in source and binary forms, with or */
  6. /* without modification, are permitted provided that the following */
  7. /* conditions are met: */
  8. /* */
  9. /* 1. Redistributions of source code must retain the above */
  10. /* copyright notice, this list of conditions and the following */
  11. /* disclaimer. */
  12. /* */
  13. /* 2. Redistributions in binary form must reproduce the above */
  14. /* copyright notice, this list of conditions and the following */
  15. /* disclaimer in the documentation and/or other materials */
  16. /* provided with the distribution. */
  17. /* */
  18. /* THIS SOFTWARE IS PROVIDED BY THE UNIVERSITY OF TEXAS AT */
  19. /* AUSTIN ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, */
  20. /* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF */
  21. /* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE */
  22. /* DISCLAIMED. IN NO EVENT SHALL THE UNIVERSITY OF TEXAS AT */
  23. /* AUSTIN OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, */
  24. /* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES */
  25. /* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE */
  26. /* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR */
  27. /* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF */
  28. /* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT */
  29. /* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT */
  30. /* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE */
  31. /* POSSIBILITY OF SUCH DAMAGE. */
  32. /* */
  33. /* The views and conclusions contained in the software and */
  34. /* documentation are those of the authors and should not be */
  35. /* interpreted as representing official policies, either expressed */
  36. /* or implied, of The University of Texas at Austin. */
  37. /*********************************************************************/
  38. #include <stdio.h>
  39. #include "common.h"
  40. #ifndef USE_ALPHA
  41. #define REAL_PART(a, b) (a)
  42. #define IMAGE_PART(a, b) (b)
  43. #else
  44. #define REAL_PART(a, b) (alpha_r * (a) - alpha_i * (b))
  45. #define IMAGE_PART(a, b) (alpha_i * (a) + alpha_r * (b))
  46. #endif
  47. #if defined(REAL_ONLY)
  48. #define CMULT(a, b) (REAL_PART(a, b))
  49. #elif defined(IMAGE_ONLY)
  50. #define CMULT(a, b) (IMAGE_PART(a, b))
  51. #else
  52. #define CMULT(a, b) (REAL_PART(a, b) + IMAGE_PART(a, b))
  53. #endif
  54. int CNAME(BLASLONG m, BLASLONG n, FLOAT *a, BLASLONG lda,
  55. #ifdef USE_ALPHA
  56. FLOAT alpha_r, FLOAT alpha_i,
  57. #endif
  58. FLOAT *b){
  59. BLASLONG i, j;
  60. FLOAT *a_offset, *a_offset1, *a_offset2, *a_offset3, *a_offset4;
  61. FLOAT *a_offset5, *a_offset6, *a_offset7, *a_offset8;
  62. FLOAT *b_offset, *b_offset1, *b_offset2, *b_offset3, *b_offset4;
  63. FLOAT a1, a2, a3, a4, a5, a6, a7, a8;
  64. FLOAT a9, a10, a11, a12, a13, a14, a15, a16;
  65. /* silence compiler warnings about unused-but-set variables:
  66. depending on compile-time arguments either the odd or the
  67. even-numbered variables will not be used */
  68. (void)a1;
  69. (void)a2;
  70. (void)a3;
  71. (void)a4;
  72. (void)a5;
  73. (void)a6;
  74. (void)a7;
  75. (void)a8;
  76. (void)a9;
  77. (void)a10;
  78. (void)a11;
  79. (void)a12;
  80. (void)a13;
  81. (void)a14;
  82. (void)a15;
  83. (void)a16;
  84. #if 0
  85. #ifdef REAL_ONLY
  86. fprintf(stderr, "TNS Real ");
  87. #elif defined(IMAGE_ONLY)
  88. fprintf(stderr, "TNS Image ");
  89. #else
  90. fprintf(stderr, "TNS Both ");
  91. #endif
  92. #ifdef ICOPY
  93. fprintf(stderr, " ICOPY %ld x %ld\n", m, n);
  94. #else
  95. fprintf(stderr, " OCOPY %ld x %ld\n", m, n);
  96. #endif
  97. #endif
  98. a_offset = a;
  99. b_offset = b;
  100. lda *= 2;
  101. b_offset2 = b + m * (n & ~7);
  102. b_offset3 = b + m * (n & ~3);
  103. b_offset4 = b + m * (n & ~1);
  104. j = (m >> 3);
  105. if (j > 0){
  106. do{
  107. a_offset1 = a_offset;
  108. a_offset2 = a_offset1 + lda;
  109. a_offset3 = a_offset2 + lda;
  110. a_offset4 = a_offset3 + lda;
  111. a_offset5 = a_offset4 + lda;
  112. a_offset6 = a_offset5 + lda;
  113. a_offset7 = a_offset6 + lda;
  114. a_offset8 = a_offset7 + lda;
  115. a_offset += 8 * lda;
  116. b_offset1 = b_offset;
  117. b_offset += 64;
  118. i = (n >> 3);
  119. if (i > 0){
  120. do{
  121. a1 = *(a_offset1 + 0);
  122. a2 = *(a_offset1 + 1);
  123. a3 = *(a_offset1 + 2);
  124. a4 = *(a_offset1 + 3);
  125. a5 = *(a_offset1 + 4);
  126. a6 = *(a_offset1 + 5);
  127. a7 = *(a_offset1 + 6);
  128. a8 = *(a_offset1 + 7);
  129. a9 = *(a_offset1 + 8);
  130. a10 = *(a_offset1 + 9);
  131. a11 = *(a_offset1 + 10);
  132. a12 = *(a_offset1 + 11);
  133. a13 = *(a_offset1 + 12);
  134. a14 = *(a_offset1 + 13);
  135. a15 = *(a_offset1 + 14);
  136. a16 = *(a_offset1 + 15);
  137. *(b_offset1 + 0) = CMULT(a1, a2);
  138. *(b_offset1 + 1) = CMULT(a3, a4);
  139. *(b_offset1 + 2) = CMULT(a5, a6);
  140. *(b_offset1 + 3) = CMULT(a7, a8);
  141. *(b_offset1 + 4) = CMULT(a9, a10);
  142. *(b_offset1 + 5) = CMULT(a11, a12);
  143. *(b_offset1 + 6) = CMULT(a13, a14);
  144. *(b_offset1 + 7) = CMULT(a15, a16);
  145. a1 = *(a_offset2 + 0);
  146. a2 = *(a_offset2 + 1);
  147. a3 = *(a_offset2 + 2);
  148. a4 = *(a_offset2 + 3);
  149. a5 = *(a_offset2 + 4);
  150. a6 = *(a_offset2 + 5);
  151. a7 = *(a_offset2 + 6);
  152. a8 = *(a_offset2 + 7);
  153. a9 = *(a_offset2 + 8);
  154. a10 = *(a_offset2 + 9);
  155. a11 = *(a_offset2 + 10);
  156. a12 = *(a_offset2 + 11);
  157. a13 = *(a_offset2 + 12);
  158. a14 = *(a_offset2 + 13);
  159. a15 = *(a_offset2 + 14);
  160. a16 = *(a_offset2 + 15);
  161. *(b_offset1 + 8) = CMULT(a1, a2);
  162. *(b_offset1 + 9) = CMULT(a3, a4);
  163. *(b_offset1 + 10) = CMULT(a5, a6);
  164. *(b_offset1 + 11) = CMULT(a7, a8);
  165. *(b_offset1 + 12) = CMULT(a9, a10);
  166. *(b_offset1 + 13) = CMULT(a11, a12);
  167. *(b_offset1 + 14) = CMULT(a13, a14);
  168. *(b_offset1 + 15) = CMULT(a15, a16);
  169. a1 = *(a_offset3 + 0);
  170. a2 = *(a_offset3 + 1);
  171. a3 = *(a_offset3 + 2);
  172. a4 = *(a_offset3 + 3);
  173. a5 = *(a_offset3 + 4);
  174. a6 = *(a_offset3 + 5);
  175. a7 = *(a_offset3 + 6);
  176. a8 = *(a_offset3 + 7);
  177. a9 = *(a_offset3 + 8);
  178. a10 = *(a_offset3 + 9);
  179. a11 = *(a_offset3 + 10);
  180. a12 = *(a_offset3 + 11);
  181. a13 = *(a_offset3 + 12);
  182. a14 = *(a_offset3 + 13);
  183. a15 = *(a_offset3 + 14);
  184. a16 = *(a_offset3 + 15);
  185. *(b_offset1 + 16) = CMULT(a1, a2);
  186. *(b_offset1 + 17) = CMULT(a3, a4);
  187. *(b_offset1 + 18) = CMULT(a5, a6);
  188. *(b_offset1 + 19) = CMULT(a7, a8);
  189. *(b_offset1 + 20) = CMULT(a9, a10);
  190. *(b_offset1 + 21) = CMULT(a11, a12);
  191. *(b_offset1 + 22) = CMULT(a13, a14);
  192. *(b_offset1 + 23) = CMULT(a15, a16);
  193. a1 = *(a_offset4 + 0);
  194. a2 = *(a_offset4 + 1);
  195. a3 = *(a_offset4 + 2);
  196. a4 = *(a_offset4 + 3);
  197. a5 = *(a_offset4 + 4);
  198. a6 = *(a_offset4 + 5);
  199. a7 = *(a_offset4 + 6);
  200. a8 = *(a_offset4 + 7);
  201. a9 = *(a_offset4 + 8);
  202. a10 = *(a_offset4 + 9);
  203. a11 = *(a_offset4 + 10);
  204. a12 = *(a_offset4 + 11);
  205. a13 = *(a_offset4 + 12);
  206. a14 = *(a_offset4 + 13);
  207. a15 = *(a_offset4 + 14);
  208. a16 = *(a_offset4 + 15);
  209. *(b_offset1 + 24) = CMULT(a1, a2);
  210. *(b_offset1 + 25) = CMULT(a3, a4);
  211. *(b_offset1 + 26) = CMULT(a5, a6);
  212. *(b_offset1 + 27) = CMULT(a7, a8);
  213. *(b_offset1 + 28) = CMULT(a9, a10);
  214. *(b_offset1 + 29) = CMULT(a11, a12);
  215. *(b_offset1 + 30) = CMULT(a13, a14);
  216. *(b_offset1 + 31) = CMULT(a15, a16);
  217. a1 = *(a_offset5 + 0);
  218. a2 = *(a_offset5 + 1);
  219. a3 = *(a_offset5 + 2);
  220. a4 = *(a_offset5 + 3);
  221. a5 = *(a_offset5 + 4);
  222. a6 = *(a_offset5 + 5);
  223. a7 = *(a_offset5 + 6);
  224. a8 = *(a_offset5 + 7);
  225. a9 = *(a_offset5 + 8);
  226. a10 = *(a_offset5 + 9);
  227. a11 = *(a_offset5 + 10);
  228. a12 = *(a_offset5 + 11);
  229. a13 = *(a_offset5 + 12);
  230. a14 = *(a_offset5 + 13);
  231. a15 = *(a_offset5 + 14);
  232. a16 = *(a_offset5 + 15);
  233. *(b_offset1 + 32) = CMULT(a1, a2);
  234. *(b_offset1 + 33) = CMULT(a3, a4);
  235. *(b_offset1 + 34) = CMULT(a5, a6);
  236. *(b_offset1 + 35) = CMULT(a7, a8);
  237. *(b_offset1 + 36) = CMULT(a9, a10);
  238. *(b_offset1 + 37) = CMULT(a11, a12);
  239. *(b_offset1 + 38) = CMULT(a13, a14);
  240. *(b_offset1 + 39) = CMULT(a15, a16);
  241. a1 = *(a_offset6 + 0);
  242. a2 = *(a_offset6 + 1);
  243. a3 = *(a_offset6 + 2);
  244. a4 = *(a_offset6 + 3);
  245. a5 = *(a_offset6 + 4);
  246. a6 = *(a_offset6 + 5);
  247. a7 = *(a_offset6 + 6);
  248. a8 = *(a_offset6 + 7);
  249. a9 = *(a_offset6 + 8);
  250. a10 = *(a_offset6 + 9);
  251. a11 = *(a_offset6 + 10);
  252. a12 = *(a_offset6 + 11);
  253. a13 = *(a_offset6 + 12);
  254. a14 = *(a_offset6 + 13);
  255. a15 = *(a_offset6 + 14);
  256. a16 = *(a_offset6 + 15);
  257. *(b_offset1 + 40) = CMULT(a1, a2);
  258. *(b_offset1 + 41) = CMULT(a3, a4);
  259. *(b_offset1 + 42) = CMULT(a5, a6);
  260. *(b_offset1 + 43) = CMULT(a7, a8);
  261. *(b_offset1 + 44) = CMULT(a9, a10);
  262. *(b_offset1 + 45) = CMULT(a11, a12);
  263. *(b_offset1 + 46) = CMULT(a13, a14);
  264. *(b_offset1 + 47) = CMULT(a15, a16);
  265. a1 = *(a_offset7 + 0);
  266. a2 = *(a_offset7 + 1);
  267. a3 = *(a_offset7 + 2);
  268. a4 = *(a_offset7 + 3);
  269. a5 = *(a_offset7 + 4);
  270. a6 = *(a_offset7 + 5);
  271. a7 = *(a_offset7 + 6);
  272. a8 = *(a_offset7 + 7);
  273. a9 = *(a_offset7 + 8);
  274. a10 = *(a_offset7 + 9);
  275. a11 = *(a_offset7 + 10);
  276. a12 = *(a_offset7 + 11);
  277. a13 = *(a_offset7 + 12);
  278. a14 = *(a_offset7 + 13);
  279. a15 = *(a_offset7 + 14);
  280. a16 = *(a_offset7 + 15);
  281. *(b_offset1 + 48) = CMULT(a1, a2);
  282. *(b_offset1 + 49) = CMULT(a3, a4);
  283. *(b_offset1 + 50) = CMULT(a5, a6);
  284. *(b_offset1 + 51) = CMULT(a7, a8);
  285. *(b_offset1 + 52) = CMULT(a9, a10);
  286. *(b_offset1 + 53) = CMULT(a11, a12);
  287. *(b_offset1 + 54) = CMULT(a13, a14);
  288. *(b_offset1 + 55) = CMULT(a15, a16);
  289. a1 = *(a_offset8 + 0);
  290. a2 = *(a_offset8 + 1);
  291. a3 = *(a_offset8 + 2);
  292. a4 = *(a_offset8 + 3);
  293. a5 = *(a_offset8 + 4);
  294. a6 = *(a_offset8 + 5);
  295. a7 = *(a_offset8 + 6);
  296. a8 = *(a_offset8 + 7);
  297. a9 = *(a_offset8 + 8);
  298. a10 = *(a_offset8 + 9);
  299. a11 = *(a_offset8 + 10);
  300. a12 = *(a_offset8 + 11);
  301. a13 = *(a_offset8 + 12);
  302. a14 = *(a_offset8 + 13);
  303. a15 = *(a_offset8 + 14);
  304. a16 = *(a_offset8 + 15);
  305. *(b_offset1 + 56) = CMULT(a1, a2);
  306. *(b_offset1 + 57) = CMULT(a3, a4);
  307. *(b_offset1 + 58) = CMULT(a5, a6);
  308. *(b_offset1 + 59) = CMULT(a7, a8);
  309. *(b_offset1 + 60) = CMULT(a9, a10);
  310. *(b_offset1 + 61) = CMULT(a11, a12);
  311. *(b_offset1 + 62) = CMULT(a13, a14);
  312. *(b_offset1 + 63) = CMULT(a15, a16);
  313. a_offset1 += 16;
  314. a_offset2 += 16;
  315. a_offset3 += 16;
  316. a_offset4 += 16;
  317. a_offset5 += 16;
  318. a_offset6 += 16;
  319. a_offset7 += 16;
  320. a_offset8 += 16;
  321. b_offset1 += m * 8;
  322. i --;
  323. }while(i > 0);
  324. }
  325. if (n & 4){
  326. a1 = *(a_offset1 + 0);
  327. a2 = *(a_offset1 + 1);
  328. a3 = *(a_offset1 + 2);
  329. a4 = *(a_offset1 + 3);
  330. a5 = *(a_offset1 + 4);
  331. a6 = *(a_offset1 + 5);
  332. a7 = *(a_offset1 + 6);
  333. a8 = *(a_offset1 + 7);
  334. *(b_offset2 + 0) = CMULT(a1, a2);
  335. *(b_offset2 + 1) = CMULT(a3, a4);
  336. *(b_offset2 + 2) = CMULT(a5, a6);
  337. *(b_offset2 + 3) = CMULT(a7, a8);
  338. a1 = *(a_offset2 + 0);
  339. a2 = *(a_offset2 + 1);
  340. a3 = *(a_offset2 + 2);
  341. a4 = *(a_offset2 + 3);
  342. a5 = *(a_offset2 + 4);
  343. a6 = *(a_offset2 + 5);
  344. a7 = *(a_offset2 + 6);
  345. a8 = *(a_offset2 + 7);
  346. *(b_offset2 + 4) = CMULT(a1, a2);
  347. *(b_offset2 + 5) = CMULT(a3, a4);
  348. *(b_offset2 + 6) = CMULT(a5, a6);
  349. *(b_offset2 + 7) = CMULT(a7, a8);
  350. a1 = *(a_offset3 + 0);
  351. a2 = *(a_offset3 + 1);
  352. a3 = *(a_offset3 + 2);
  353. a4 = *(a_offset3 + 3);
  354. a5 = *(a_offset3 + 4);
  355. a6 = *(a_offset3 + 5);
  356. a7 = *(a_offset3 + 6);
  357. a8 = *(a_offset3 + 7);
  358. *(b_offset2 + 8) = CMULT(a1, a2);
  359. *(b_offset2 + 9) = CMULT(a3, a4);
  360. *(b_offset2 + 10) = CMULT(a5, a6);
  361. *(b_offset2 + 11) = CMULT(a7, a8);
  362. a1 = *(a_offset4 + 0);
  363. a2 = *(a_offset4 + 1);
  364. a3 = *(a_offset4 + 2);
  365. a4 = *(a_offset4 + 3);
  366. a5 = *(a_offset4 + 4);
  367. a6 = *(a_offset4 + 5);
  368. a7 = *(a_offset4 + 6);
  369. a8 = *(a_offset4 + 7);
  370. *(b_offset2 + 12) = CMULT(a1, a2);
  371. *(b_offset2 + 13) = CMULT(a3, a4);
  372. *(b_offset2 + 14) = CMULT(a5, a6);
  373. *(b_offset2 + 15) = CMULT(a7, a8);
  374. a1 = *(a_offset5 + 0);
  375. a2 = *(a_offset5 + 1);
  376. a3 = *(a_offset5 + 2);
  377. a4 = *(a_offset5 + 3);
  378. a5 = *(a_offset5 + 4);
  379. a6 = *(a_offset5 + 5);
  380. a7 = *(a_offset5 + 6);
  381. a8 = *(a_offset5 + 7);
  382. *(b_offset2 + 16) = CMULT(a1, a2);
  383. *(b_offset2 + 17) = CMULT(a3, a4);
  384. *(b_offset2 + 18) = CMULT(a5, a6);
  385. *(b_offset2 + 19) = CMULT(a7, a8);
  386. a1 = *(a_offset6 + 0);
  387. a2 = *(a_offset6 + 1);
  388. a3 = *(a_offset6 + 2);
  389. a4 = *(a_offset6 + 3);
  390. a5 = *(a_offset6 + 4);
  391. a6 = *(a_offset6 + 5);
  392. a7 = *(a_offset6 + 6);
  393. a8 = *(a_offset6 + 7);
  394. *(b_offset2 + 20) = CMULT(a1, a2);
  395. *(b_offset2 + 21) = CMULT(a3, a4);
  396. *(b_offset2 + 22) = CMULT(a5, a6);
  397. *(b_offset2 + 23) = CMULT(a7, a8);
  398. a1 = *(a_offset7 + 0);
  399. a2 = *(a_offset7 + 1);
  400. a3 = *(a_offset7 + 2);
  401. a4 = *(a_offset7 + 3);
  402. a5 = *(a_offset7 + 4);
  403. a6 = *(a_offset7 + 5);
  404. a7 = *(a_offset7 + 6);
  405. a8 = *(a_offset7 + 7);
  406. *(b_offset2 + 24) = CMULT(a1, a2);
  407. *(b_offset2 + 25) = CMULT(a3, a4);
  408. *(b_offset2 + 26) = CMULT(a5, a6);
  409. *(b_offset2 + 27) = CMULT(a7, a8);
  410. a1 = *(a_offset8 + 0);
  411. a2 = *(a_offset8 + 1);
  412. a3 = *(a_offset8 + 2);
  413. a4 = *(a_offset8 + 3);
  414. a5 = *(a_offset8 + 4);
  415. a6 = *(a_offset8 + 5);
  416. a7 = *(a_offset8 + 6);
  417. a8 = *(a_offset8 + 7);
  418. *(b_offset2 + 28) = CMULT(a1, a2);
  419. *(b_offset2 + 29) = CMULT(a3, a4);
  420. *(b_offset2 + 30) = CMULT(a5, a6);
  421. *(b_offset2 + 31) = CMULT(a7, a8);
  422. a_offset1 += 8;
  423. a_offset2 += 8;
  424. a_offset3 += 8;
  425. a_offset4 += 8;
  426. a_offset5 += 8;
  427. a_offset6 += 8;
  428. a_offset7 += 8;
  429. a_offset8 += 8;
  430. b_offset2 += 32;
  431. }
  432. if (n & 2){
  433. a1 = *(a_offset1 + 0);
  434. a2 = *(a_offset1 + 1);
  435. a3 = *(a_offset1 + 2);
  436. a4 = *(a_offset1 + 3);
  437. *(b_offset3 + 0) = CMULT(a1, a2);
  438. *(b_offset3 + 1) = CMULT(a3, a4);
  439. a1 = *(a_offset2 + 0);
  440. a2 = *(a_offset2 + 1);
  441. a3 = *(a_offset2 + 2);
  442. a4 = *(a_offset2 + 3);
  443. *(b_offset3 + 2) = CMULT(a1, a2);
  444. *(b_offset3 + 3) = CMULT(a3, a4);
  445. a1 = *(a_offset3 + 0);
  446. a2 = *(a_offset3 + 1);
  447. a3 = *(a_offset3 + 2);
  448. a4 = *(a_offset3 + 3);
  449. *(b_offset3 + 4) = CMULT(a1, a2);
  450. *(b_offset3 + 5) = CMULT(a3, a4);
  451. a1 = *(a_offset4 + 0);
  452. a2 = *(a_offset4 + 1);
  453. a3 = *(a_offset4 + 2);
  454. a4 = *(a_offset4 + 3);
  455. *(b_offset3 + 6) = CMULT(a1, a2);
  456. *(b_offset3 + 7) = CMULT(a3, a4);
  457. a1 = *(a_offset5 + 0);
  458. a2 = *(a_offset5 + 1);
  459. a3 = *(a_offset5 + 2);
  460. a4 = *(a_offset5 + 3);
  461. *(b_offset3 + 8) = CMULT(a1, a2);
  462. *(b_offset3 + 9) = CMULT(a3, a4);
  463. a1 = *(a_offset6 + 0);
  464. a2 = *(a_offset6 + 1);
  465. a3 = *(a_offset6 + 2);
  466. a4 = *(a_offset6 + 3);
  467. *(b_offset3 + 10) = CMULT(a1, a2);
  468. *(b_offset3 + 11) = CMULT(a3, a4);
  469. a1 = *(a_offset7 + 0);
  470. a2 = *(a_offset7 + 1);
  471. a3 = *(a_offset7 + 2);
  472. a4 = *(a_offset7 + 3);
  473. *(b_offset3 + 12) = CMULT(a1, a2);
  474. *(b_offset3 + 13) = CMULT(a3, a4);
  475. a1 = *(a_offset8 + 0);
  476. a2 = *(a_offset8 + 1);
  477. a3 = *(a_offset8 + 2);
  478. a4 = *(a_offset8 + 3);
  479. *(b_offset3 + 14) = CMULT(a1, a2);
  480. *(b_offset3 + 15) = CMULT(a3, a4);
  481. a_offset1 += 4;
  482. a_offset2 += 4;
  483. a_offset3 += 4;
  484. a_offset4 += 4;
  485. a_offset5 += 4;
  486. a_offset6 += 4;
  487. a_offset7 += 4;
  488. a_offset8 += 4;
  489. b_offset3 += 16;
  490. }
  491. if (n & 1){
  492. a1 = *(a_offset1 + 0);
  493. a2 = *(a_offset1 + 1);
  494. *(b_offset4 + 0) = CMULT(a1, a2);
  495. a1 = *(a_offset2 + 0);
  496. a2 = *(a_offset2 + 1);
  497. *(b_offset4 + 1) = CMULT(a1, a2);
  498. a1 = *(a_offset3 + 0);
  499. a2 = *(a_offset3 + 1);
  500. *(b_offset4 + 2) = CMULT(a1, a2);
  501. a1 = *(a_offset4 + 0);
  502. a2 = *(a_offset4 + 1);
  503. *(b_offset4 + 3) = CMULT(a1, a2);
  504. a1 = *(a_offset5 + 0);
  505. a2 = *(a_offset5 + 1);
  506. *(b_offset4 + 4) = CMULT(a1, a2);
  507. a1 = *(a_offset6 + 0);
  508. a2 = *(a_offset6 + 1);
  509. *(b_offset4 + 5) = CMULT(a1, a2);
  510. a1 = *(a_offset7 + 0);
  511. a2 = *(a_offset7 + 1);
  512. *(b_offset4 + 6) = CMULT(a1, a2);
  513. a1 = *(a_offset8 + 0);
  514. a2 = *(a_offset8 + 1);
  515. *(b_offset4 + 7) = CMULT(a1, a2);
  516. b_offset4 += 8;
  517. }
  518. j--;
  519. }while(j > 0);
  520. }
  521. if (m & 4){
  522. a_offset1 = a_offset;
  523. a_offset2 = a_offset1 + lda;
  524. a_offset3 = a_offset2 + lda;
  525. a_offset4 = a_offset3 + lda;
  526. a_offset += 4 * lda;
  527. b_offset1 = b_offset;
  528. b_offset += 32;
  529. i = (n >> 3);
  530. if (i > 0){
  531. do{
  532. a1 = *(a_offset1 + 0);
  533. a2 = *(a_offset1 + 1);
  534. a3 = *(a_offset1 + 2);
  535. a4 = *(a_offset1 + 3);
  536. a5 = *(a_offset1 + 4);
  537. a6 = *(a_offset1 + 5);
  538. a7 = *(a_offset1 + 6);
  539. a8 = *(a_offset1 + 7);
  540. a9 = *(a_offset1 + 8);
  541. a10 = *(a_offset1 + 9);
  542. a11 = *(a_offset1 + 10);
  543. a12 = *(a_offset1 + 11);
  544. a13 = *(a_offset1 + 12);
  545. a14 = *(a_offset1 + 13);
  546. a15 = *(a_offset1 + 14);
  547. a16 = *(a_offset1 + 15);
  548. *(b_offset1 + 0) = CMULT(a1, a2);
  549. *(b_offset1 + 1) = CMULT(a3, a4);
  550. *(b_offset1 + 2) = CMULT(a5, a6);
  551. *(b_offset1 + 3) = CMULT(a7, a8);
  552. *(b_offset1 + 4) = CMULT(a9, a10);
  553. *(b_offset1 + 5) = CMULT(a11, a12);
  554. *(b_offset1 + 6) = CMULT(a13, a14);
  555. *(b_offset1 + 7) = CMULT(a15, a16);
  556. a1 = *(a_offset2 + 0);
  557. a2 = *(a_offset2 + 1);
  558. a3 = *(a_offset2 + 2);
  559. a4 = *(a_offset2 + 3);
  560. a5 = *(a_offset2 + 4);
  561. a6 = *(a_offset2 + 5);
  562. a7 = *(a_offset2 + 6);
  563. a8 = *(a_offset2 + 7);
  564. a9 = *(a_offset2 + 8);
  565. a10 = *(a_offset2 + 9);
  566. a11 = *(a_offset2 + 10);
  567. a12 = *(a_offset2 + 11);
  568. a13 = *(a_offset2 + 12);
  569. a14 = *(a_offset2 + 13);
  570. a15 = *(a_offset2 + 14);
  571. a16 = *(a_offset2 + 15);
  572. *(b_offset1 + 8) = CMULT(a1, a2);
  573. *(b_offset1 + 9) = CMULT(a3, a4);
  574. *(b_offset1 + 10) = CMULT(a5, a6);
  575. *(b_offset1 + 11) = CMULT(a7, a8);
  576. *(b_offset1 + 12) = CMULT(a9, a10);
  577. *(b_offset1 + 13) = CMULT(a11, a12);
  578. *(b_offset1 + 14) = CMULT(a13, a14);
  579. *(b_offset1 + 15) = CMULT(a15, a16);
  580. a1 = *(a_offset3 + 0);
  581. a2 = *(a_offset3 + 1);
  582. a3 = *(a_offset3 + 2);
  583. a4 = *(a_offset3 + 3);
  584. a5 = *(a_offset3 + 4);
  585. a6 = *(a_offset3 + 5);
  586. a7 = *(a_offset3 + 6);
  587. a8 = *(a_offset3 + 7);
  588. a9 = *(a_offset3 + 8);
  589. a10 = *(a_offset3 + 9);
  590. a11 = *(a_offset3 + 10);
  591. a12 = *(a_offset3 + 11);
  592. a13 = *(a_offset3 + 12);
  593. a14 = *(a_offset3 + 13);
  594. a15 = *(a_offset3 + 14);
  595. a16 = *(a_offset3 + 15);
  596. *(b_offset1 + 16) = CMULT(a1, a2);
  597. *(b_offset1 + 17) = CMULT(a3, a4);
  598. *(b_offset1 + 18) = CMULT(a5, a6);
  599. *(b_offset1 + 19) = CMULT(a7, a8);
  600. *(b_offset1 + 20) = CMULT(a9, a10);
  601. *(b_offset1 + 21) = CMULT(a11, a12);
  602. *(b_offset1 + 22) = CMULT(a13, a14);
  603. *(b_offset1 + 23) = CMULT(a15, a16);
  604. a1 = *(a_offset4 + 0);
  605. a2 = *(a_offset4 + 1);
  606. a3 = *(a_offset4 + 2);
  607. a4 = *(a_offset4 + 3);
  608. a5 = *(a_offset4 + 4);
  609. a6 = *(a_offset4 + 5);
  610. a7 = *(a_offset4 + 6);
  611. a8 = *(a_offset4 + 7);
  612. a9 = *(a_offset4 + 8);
  613. a10 = *(a_offset4 + 9);
  614. a11 = *(a_offset4 + 10);
  615. a12 = *(a_offset4 + 11);
  616. a13 = *(a_offset4 + 12);
  617. a14 = *(a_offset4 + 13);
  618. a15 = *(a_offset4 + 14);
  619. a16 = *(a_offset4 + 15);
  620. *(b_offset1 + 24) = CMULT(a1, a2);
  621. *(b_offset1 + 25) = CMULT(a3, a4);
  622. *(b_offset1 + 26) = CMULT(a5, a6);
  623. *(b_offset1 + 27) = CMULT(a7, a8);
  624. *(b_offset1 + 28) = CMULT(a9, a10);
  625. *(b_offset1 + 29) = CMULT(a11, a12);
  626. *(b_offset1 + 30) = CMULT(a13, a14);
  627. *(b_offset1 + 31) = CMULT(a15, a16);
  628. a_offset1 += 16;
  629. a_offset2 += 16;
  630. a_offset3 += 16;
  631. a_offset4 += 16;
  632. b_offset1 += m * 8;
  633. i --;
  634. }while(i > 0);
  635. }
  636. if (n & 4){
  637. a1 = *(a_offset1 + 0);
  638. a2 = *(a_offset1 + 1);
  639. a3 = *(a_offset1 + 2);
  640. a4 = *(a_offset1 + 3);
  641. a5 = *(a_offset1 + 4);
  642. a6 = *(a_offset1 + 5);
  643. a7 = *(a_offset1 + 6);
  644. a8 = *(a_offset1 + 7);
  645. *(b_offset2 + 0) = CMULT(a1, a2);
  646. *(b_offset2 + 1) = CMULT(a3, a4);
  647. *(b_offset2 + 2) = CMULT(a5, a6);
  648. *(b_offset2 + 3) = CMULT(a7, a8);
  649. a1 = *(a_offset2 + 0);
  650. a2 = *(a_offset2 + 1);
  651. a3 = *(a_offset2 + 2);
  652. a4 = *(a_offset2 + 3);
  653. a5 = *(a_offset2 + 4);
  654. a6 = *(a_offset2 + 5);
  655. a7 = *(a_offset2 + 6);
  656. a8 = *(a_offset2 + 7);
  657. *(b_offset2 + 4) = CMULT(a1, a2);
  658. *(b_offset2 + 5) = CMULT(a3, a4);
  659. *(b_offset2 + 6) = CMULT(a5, a6);
  660. *(b_offset2 + 7) = CMULT(a7, a8);
  661. a1 = *(a_offset3 + 0);
  662. a2 = *(a_offset3 + 1);
  663. a3 = *(a_offset3 + 2);
  664. a4 = *(a_offset3 + 3);
  665. a5 = *(a_offset3 + 4);
  666. a6 = *(a_offset3 + 5);
  667. a7 = *(a_offset3 + 6);
  668. a8 = *(a_offset3 + 7);
  669. *(b_offset2 + 8) = CMULT(a1, a2);
  670. *(b_offset2 + 9) = CMULT(a3, a4);
  671. *(b_offset2 + 10) = CMULT(a5, a6);
  672. *(b_offset2 + 11) = CMULT(a7, a8);
  673. a1 = *(a_offset4 + 0);
  674. a2 = *(a_offset4 + 1);
  675. a3 = *(a_offset4 + 2);
  676. a4 = *(a_offset4 + 3);
  677. a5 = *(a_offset4 + 4);
  678. a6 = *(a_offset4 + 5);
  679. a7 = *(a_offset4 + 6);
  680. a8 = *(a_offset4 + 7);
  681. *(b_offset2 + 12) = CMULT(a1, a2);
  682. *(b_offset2 + 13) = CMULT(a3, a4);
  683. *(b_offset2 + 14) = CMULT(a5, a6);
  684. *(b_offset2 + 15) = CMULT(a7, a8);
  685. a_offset1 += 8;
  686. a_offset2 += 8;
  687. a_offset3 += 8;
  688. a_offset4 += 8;
  689. b_offset2 += 16;
  690. }
  691. if (n & 2){
  692. a1 = *(a_offset1 + 0);
  693. a2 = *(a_offset1 + 1);
  694. a3 = *(a_offset1 + 2);
  695. a4 = *(a_offset1 + 3);
  696. *(b_offset3 + 0) = CMULT(a1, a2);
  697. *(b_offset3 + 1) = CMULT(a3, a4);
  698. a1 = *(a_offset2 + 0);
  699. a2 = *(a_offset2 + 1);
  700. a3 = *(a_offset2 + 2);
  701. a4 = *(a_offset2 + 3);
  702. *(b_offset3 + 2) = CMULT(a1, a2);
  703. *(b_offset3 + 3) = CMULT(a3, a4);
  704. a1 = *(a_offset3 + 0);
  705. a2 = *(a_offset3 + 1);
  706. a3 = *(a_offset3 + 2);
  707. a4 = *(a_offset3 + 3);
  708. *(b_offset3 + 4) = CMULT(a1, a2);
  709. *(b_offset3 + 5) = CMULT(a3, a4);
  710. a1 = *(a_offset4 + 0);
  711. a2 = *(a_offset4 + 1);
  712. a3 = *(a_offset4 + 2);
  713. a4 = *(a_offset4 + 3);
  714. *(b_offset3 + 6) = CMULT(a1, a2);
  715. *(b_offset3 + 7) = CMULT(a3, a4);
  716. a_offset1 += 4;
  717. a_offset2 += 4;
  718. a_offset3 += 4;
  719. a_offset4 += 4;
  720. b_offset3 += 8;
  721. }
  722. if (n & 1){
  723. a1 = *(a_offset1 + 0);
  724. a2 = *(a_offset1 + 1);
  725. *(b_offset4 + 0) = CMULT(a1, a2);
  726. a1 = *(a_offset2 + 0);
  727. a2 = *(a_offset2 + 1);
  728. *(b_offset4 + 1) = CMULT(a1, a2);
  729. a1 = *(a_offset3 + 0);
  730. a2 = *(a_offset3 + 1);
  731. *(b_offset4 + 2) = CMULT(a1, a2);
  732. a1 = *(a_offset4 + 0);
  733. a2 = *(a_offset4 + 1);
  734. *(b_offset4 + 3) = CMULT(a1, a2);
  735. b_offset4 += 4;
  736. }
  737. }
  738. if (m & 2){
  739. a_offset1 = a_offset;
  740. a_offset2 = a_offset1 + lda;
  741. a_offset += 2 * lda;
  742. b_offset1 = b_offset;
  743. b_offset += 16;
  744. i = (n >> 3);
  745. if (i > 0){
  746. do{
  747. a1 = *(a_offset1 + 0);
  748. a2 = *(a_offset1 + 1);
  749. a3 = *(a_offset1 + 2);
  750. a4 = *(a_offset1 + 3);
  751. a5 = *(a_offset1 + 4);
  752. a6 = *(a_offset1 + 5);
  753. a7 = *(a_offset1 + 6);
  754. a8 = *(a_offset1 + 7);
  755. a9 = *(a_offset1 + 8);
  756. a10 = *(a_offset1 + 9);
  757. a11 = *(a_offset1 + 10);
  758. a12 = *(a_offset1 + 11);
  759. a13 = *(a_offset1 + 12);
  760. a14 = *(a_offset1 + 13);
  761. a15 = *(a_offset1 + 14);
  762. a16 = *(a_offset1 + 15);
  763. *(b_offset1 + 0) = CMULT(a1, a2);
  764. *(b_offset1 + 1) = CMULT(a3, a4);
  765. *(b_offset1 + 2) = CMULT(a5, a6);
  766. *(b_offset1 + 3) = CMULT(a7, a8);
  767. *(b_offset1 + 4) = CMULT(a9, a10);
  768. *(b_offset1 + 5) = CMULT(a11, a12);
  769. *(b_offset1 + 6) = CMULT(a13, a14);
  770. *(b_offset1 + 7) = CMULT(a15, a16);
  771. a1 = *(a_offset2 + 0);
  772. a2 = *(a_offset2 + 1);
  773. a3 = *(a_offset2 + 2);
  774. a4 = *(a_offset2 + 3);
  775. a5 = *(a_offset2 + 4);
  776. a6 = *(a_offset2 + 5);
  777. a7 = *(a_offset2 + 6);
  778. a8 = *(a_offset2 + 7);
  779. a9 = *(a_offset2 + 8);
  780. a10 = *(a_offset2 + 9);
  781. a11 = *(a_offset2 + 10);
  782. a12 = *(a_offset2 + 11);
  783. a13 = *(a_offset2 + 12);
  784. a14 = *(a_offset2 + 13);
  785. a15 = *(a_offset2 + 14);
  786. a16 = *(a_offset2 + 15);
  787. *(b_offset1 + 8) = CMULT(a1, a2);
  788. *(b_offset1 + 9) = CMULT(a3, a4);
  789. *(b_offset1 + 10) = CMULT(a5, a6);
  790. *(b_offset1 + 11) = CMULT(a7, a8);
  791. *(b_offset1 + 12) = CMULT(a9, a10);
  792. *(b_offset1 + 13) = CMULT(a11, a12);
  793. *(b_offset1 + 14) = CMULT(a13, a14);
  794. *(b_offset1 + 15) = CMULT(a15, a16);
  795. a_offset1 += 16;
  796. a_offset2 += 16;
  797. b_offset1 += m * 8;
  798. i --;
  799. }while(i > 0);
  800. }
  801. if (n & 4){
  802. a1 = *(a_offset1 + 0);
  803. a2 = *(a_offset1 + 1);
  804. a3 = *(a_offset1 + 2);
  805. a4 = *(a_offset1 + 3);
  806. a5 = *(a_offset1 + 4);
  807. a6 = *(a_offset1 + 5);
  808. a7 = *(a_offset1 + 6);
  809. a8 = *(a_offset1 + 7);
  810. *(b_offset2 + 0) = CMULT(a1, a2);
  811. *(b_offset2 + 1) = CMULT(a3, a4);
  812. *(b_offset2 + 2) = CMULT(a5, a6);
  813. *(b_offset2 + 3) = CMULT(a7, a8);
  814. a1 = *(a_offset2 + 0);
  815. a2 = *(a_offset2 + 1);
  816. a3 = *(a_offset2 + 2);
  817. a4 = *(a_offset2 + 3);
  818. a5 = *(a_offset2 + 4);
  819. a6 = *(a_offset2 + 5);
  820. a7 = *(a_offset2 + 6);
  821. a8 = *(a_offset2 + 7);
  822. *(b_offset2 + 4) = CMULT(a1, a2);
  823. *(b_offset2 + 5) = CMULT(a3, a4);
  824. *(b_offset2 + 6) = CMULT(a5, a6);
  825. *(b_offset2 + 7) = CMULT(a7, a8);
  826. a_offset1 += 8;
  827. a_offset2 += 8;
  828. b_offset2 += 8;
  829. }
  830. if (n & 2){
  831. a1 = *(a_offset1 + 0);
  832. a2 = *(a_offset1 + 1);
  833. a3 = *(a_offset1 + 2);
  834. a4 = *(a_offset1 + 3);
  835. *(b_offset3 + 0) = CMULT(a1, a2);
  836. *(b_offset3 + 1) = CMULT(a3, a4);
  837. a1 = *(a_offset2 + 0);
  838. a2 = *(a_offset2 + 1);
  839. a3 = *(a_offset2 + 2);
  840. a4 = *(a_offset2 + 3);
  841. *(b_offset3 + 2) = CMULT(a1, a2);
  842. *(b_offset3 + 3) = CMULT(a3, a4);
  843. a_offset1 += 4;
  844. a_offset2 += 4;
  845. b_offset3 += 4;
  846. }
  847. if (n & 1){
  848. a1 = *(a_offset1 + 0);
  849. a2 = *(a_offset1 + 1);
  850. *(b_offset4 + 0) = CMULT(a1, a2);
  851. a1 = *(a_offset2 + 0);
  852. a2 = *(a_offset2 + 1);
  853. *(b_offset4 + 1) = CMULT(a1, a2);
  854. b_offset4 += 2;
  855. }
  856. }
  857. if (m & 1){
  858. a_offset1 = a_offset;
  859. b_offset1 = b_offset;
  860. i = (n >> 3);
  861. if (i > 0){
  862. do{
  863. a1 = *(a_offset1 + 0);
  864. a2 = *(a_offset1 + 1);
  865. a3 = *(a_offset1 + 2);
  866. a4 = *(a_offset1 + 3);
  867. a5 = *(a_offset1 + 4);
  868. a6 = *(a_offset1 + 5);
  869. a7 = *(a_offset1 + 6);
  870. a8 = *(a_offset1 + 7);
  871. a9 = *(a_offset1 + 8);
  872. a10 = *(a_offset1 + 9);
  873. a11 = *(a_offset1 + 10);
  874. a12 = *(a_offset1 + 11);
  875. a13 = *(a_offset1 + 12);
  876. a14 = *(a_offset1 + 13);
  877. a15 = *(a_offset1 + 14);
  878. a16 = *(a_offset1 + 15);
  879. *(b_offset1 + 0) = CMULT(a1, a2);
  880. *(b_offset1 + 1) = CMULT(a3, a4);
  881. *(b_offset1 + 2) = CMULT(a5, a6);
  882. *(b_offset1 + 3) = CMULT(a7, a8);
  883. *(b_offset1 + 4) = CMULT(a9, a10);
  884. *(b_offset1 + 5) = CMULT(a11, a12);
  885. *(b_offset1 + 6) = CMULT(a13, a14);
  886. *(b_offset1 + 7) = CMULT(a15, a16);
  887. a_offset1 += 16;
  888. b_offset1 += m * 8;
  889. i --;
  890. }while(i > 0);
  891. }
  892. if (n & 4){
  893. a1 = *(a_offset1 + 0);
  894. a2 = *(a_offset1 + 1);
  895. a3 = *(a_offset1 + 2);
  896. a4 = *(a_offset1 + 3);
  897. a5 = *(a_offset1 + 4);
  898. a6 = *(a_offset1 + 5);
  899. a7 = *(a_offset1 + 6);
  900. a8 = *(a_offset1 + 7);
  901. *(b_offset2 + 0) = CMULT(a1, a2);
  902. *(b_offset2 + 1) = CMULT(a3, a4);
  903. *(b_offset2 + 2) = CMULT(a5, a6);
  904. *(b_offset2 + 3) = CMULT(a7, a8);
  905. a_offset1 += 8;
  906. // b_offset2 += 4;
  907. }
  908. if (n & 2){
  909. a1 = *(a_offset1 + 0);
  910. a2 = *(a_offset1 + 1);
  911. a3 = *(a_offset1 + 2);
  912. a4 = *(a_offset1 + 3);
  913. *(b_offset3 + 0) = CMULT(a1, a2);
  914. *(b_offset3 + 1) = CMULT(a3, a4);
  915. a_offset1 += 4;
  916. // b_offset3 += 2;
  917. }
  918. if (n & 1){
  919. a1 = *(a_offset1 + 0);
  920. a2 = *(a_offset1 + 1);
  921. *(b_offset4 + 0) = CMULT(a1, a2);
  922. }
  923. }
  924. return 0;
  925. }