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.

ztrmm_uncopy_8.c 19 kB

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