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

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