PageRenderTime 72ms CodeModel.GetById 15ms RepoModel.GetById 0ms app.codeStats 1ms

/MRI-J/jdk/src/share/native/sun/awt/medialib/mlib_c_ImageLookUp_f.c

http://github.com/GregBowyer/ManagedRuntimeInitiative
C | 3878 lines | 3360 code | 449 blank | 69 comment | 381 complexity | 35116b010c761e573bb7faf9db7564ac MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-3.0
  1. /*
  2. * Copyright 2003 Sun Microsystems, Inc. All Rights Reserved.
  3. * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
  4. *
  5. * This code is free software; you can redistribute it and/or modify it
  6. * under the terms of the GNU General Public License version 2 only, as
  7. * published by the Free Software Foundation. Sun designates this
  8. * particular file as subject to the "Classpath" exception as provided
  9. * by Sun in the LICENSE file that accompanied this code.
  10. *
  11. * This code is distributed in the hope that it will be useful, but WITHOUT
  12. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13. * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  14. * version 2 for more details (a copy is included in the LICENSE file that
  15. * accompanied this code).
  16. *
  17. * You should have received a copy of the GNU General Public License version
  18. * 2 along with this work; if not, write to the Free Software Foundation,
  19. * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20. *
  21. * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
  22. * CA 95054 USA or visit www.sun.com if you need additional information or
  23. * have any questions.
  24. */
  25. #include "mlib_image.h"
  26. #include "mlib_ImageLookUp.h"
  27. #include "mlib_c_ImageLookUp.h"
  28. /***************************************************************/
  29. #define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE) \
  30. { \
  31. mlib_s32 i, j, k; \
  32. \
  33. if (xsize < 2) { \
  34. for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
  35. for(k = 0; k < csize; k++) { \
  36. DTYPE *da = dst + k; \
  37. const STYPE *sa = src + k; \
  38. DTYPE *tab = (DTYPE*) TABLE[k]; \
  39. \
  40. for(i = 0; i < xsize; i++, da += csize, sa += csize) \
  41. *da=tab[*sa]; \
  42. } \
  43. } \
  44. } else { \
  45. for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
  46. for(k = 0; k < csize; k++) { \
  47. DTYPE *da = dst + k; \
  48. const STYPE *sa = src + k; \
  49. DTYPE *tab = (DTYPE*) TABLE[k]; \
  50. mlib_s32 s0, t0, s1, t1; \
  51. \
  52. s0 = (mlib_s32)sa[0]; \
  53. s1 = (mlib_s32)sa[csize]; \
  54. sa += 2*csize; \
  55. \
  56. for(i = 0; i < xsize - 3; i+=2, da += 2*csize, sa += 2*csize) { \
  57. t0 = (mlib_s32)tab[s0]; \
  58. t1 = (mlib_s32)tab[s1]; \
  59. s0 = (mlib_s32)sa[0]; \
  60. s1 = (mlib_s32)sa[csize]; \
  61. da[0] = (DTYPE)t0; \
  62. da[csize] = (DTYPE)t1; \
  63. } \
  64. t0 = (mlib_s32)tab[s0]; \
  65. t1 = (mlib_s32)tab[s1]; \
  66. da[0] = (DTYPE)t0; \
  67. da[csize] = (DTYPE)t1; \
  68. if (xsize & 1) da[2*csize] = tab[sa[0]]; \
  69. } \
  70. } \
  71. } \
  72. }
  73. /***************************************************************/
  74. #define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE) \
  75. { \
  76. mlib_s32 i, j, k; \
  77. \
  78. if (xsize < 2) { \
  79. for(j = 0; j < ysize; j++, dst += dlb, src += slb){ \
  80. for(k = 0; k < csize; k++) { \
  81. DTYPE *da = dst + k; \
  82. const STYPE *sa = (void *)src; \
  83. DTYPE *tab = (DTYPE*) TABLE[k]; \
  84. \
  85. for(i = 0; i < xsize; i++, da += csize, sa ++) \
  86. *da=tab[*sa]; \
  87. } \
  88. } \
  89. } else { \
  90. for(j = 0; j < ysize; j++, dst += dlb, src += slb) { \
  91. for(k = 0; k < csize; k++) { \
  92. DTYPE *da = dst + k; \
  93. const STYPE *sa = (void *)src; \
  94. DTYPE *tab = (DTYPE*) TABLE[k]; \
  95. mlib_s32 s0, t0, s1, t1; \
  96. \
  97. s0 = (mlib_s32)sa[0]; \
  98. s1 = (mlib_s32)sa[1]; \
  99. sa += 2; \
  100. \
  101. for(i = 0; i < xsize - 3; i+=2, da += 2*csize, sa += 2) { \
  102. t0 = (mlib_s32)tab[s0]; \
  103. t1 = (mlib_s32)tab[s1]; \
  104. s0 = (mlib_s32)sa[0]; \
  105. s1 = (mlib_s32)sa[1]; \
  106. da[0] = (DTYPE)t0; \
  107. da[csize] = (DTYPE)t1; \
  108. } \
  109. t0 = (mlib_s32)tab[s0]; \
  110. t1 = (mlib_s32)tab[s1]; \
  111. da[0] = (DTYPE)t0; \
  112. da[csize] = (DTYPE)t1; \
  113. if (xsize & 1) da[2*csize] = tab[sa[0]]; \
  114. } \
  115. } \
  116. } \
  117. }
  118. #ifdef _LITTLE_ENDIAN
  119. /***************************************************************/
  120. #define READ_U8_U8_ALIGN(table0, table1, table2, table3) \
  121. t3 = table0[s0 & 0xFF]; \
  122. t2 = table1[s0>>8]; \
  123. t1 = table2[s1 & 0xFF]; \
  124. t0 = table3[s1>>8]
  125. /***************************************************************/
  126. #define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
  127. t3 = table0[s0 >> 8]; \
  128. t2 = table1[s1 & 0xFF]; \
  129. t1 = table2[s1 >> 8]; \
  130. t0 = table3[s2 & 0xFF]
  131. /***************************************************************/
  132. #define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
  133. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 << 1) & 0x1FE)); \
  134. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
  135. t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 15) & 0x1FE)); \
  136. t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 >> 23) & 0x1FE))
  137. /***************************************************************/
  138. #define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
  139. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 7) & 0x1FE)); \
  140. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
  141. t3 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 23) & 0x1FE)); \
  142. t2 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 << 1) & 0x1FE))
  143. /***************************************************************/
  144. #define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
  145. t1 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 7) & 0x1FE)); \
  146. t0 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 15) & 0x1FE)); \
  147. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 >> 23) & 0x1FE))
  148. /***************************************************************/
  149. #define READ_U8_S32(table0, table1, table2, table3) \
  150. t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 << 2) & 0x3FC)); \
  151. t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 6) & 0x3FC)); \
  152. t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 14) & 0x3FC)); \
  153. t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 >> 22) & 0x3FC))
  154. #else /* _LITTLE_ENDIAN */
  155. /***********/
  156. #define READ_U8_U8_ALIGN(table0, table1, table2, table3) \
  157. t0 = table0[s0>>8]; \
  158. t1 = table1[s0 & 0xFF]; \
  159. t2 = table2[s1>>8]; \
  160. t3 = table3[s1 & 0xFF]
  161. /***************************************************************/
  162. #define READ_U8_U8_NOTALIGN(table0, table1, table2, table3) \
  163. t0 = table0[s0 & 0xFF]; \
  164. t1 = table1[s1 >> 8]; \
  165. t2 = table2[s1 & 0xFF]; \
  166. t3 = table3[s2 >> 8]
  167. /***************************************************************/
  168. #define READ_U8_S16_ALIGN(table0, table1, table2, table3) \
  169. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 23) & 0x1FE)); \
  170. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 15) & 0x1FE)); \
  171. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 >> 7) & 0x1FE)); \
  172. t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s0 << 1) & 0x1FE))
  173. /***************************************************************/
  174. #define READ_U8_S16_NOTALIGN(table0, table1, table2, table3) \
  175. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s0 >> 15) & 0x1FE)); \
  176. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s0 >> 7) & 0x1FE)); \
  177. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s0 << 1) & 0x1FE)); \
  178. t3 = *(mlib_u16*)((mlib_u8*)table3 + ((s1 >> 23) & 0x1FE))
  179. /***************************************************************/
  180. #define ADD_READ_U8_S16_NOTALIGN(table0, table1, table2) \
  181. t0 = *(mlib_u16*)((mlib_u8*)table0 + ((s1 >> 15) & 0x1FE)); \
  182. t1 = *(mlib_u16*)((mlib_u8*)table1 + ((s1 >> 7) & 0x1FE)); \
  183. t2 = *(mlib_u16*)((mlib_u8*)table2 + ((s1 << 1) & 0x1FE))
  184. /***************************************************************/
  185. #define READ_U8_S32(table0, table1, table2, table3) \
  186. t0 = *(mlib_u32*)((mlib_u8*)table0 + ((s0 >> 22) & 0x3FC)); \
  187. t1 = *(mlib_u32*)((mlib_u8*)table1 + ((s0 >> 14) & 0x3FC)); \
  188. t2 = *(mlib_u32*)((mlib_u8*)table2 + ((s0 >> 6) & 0x3FC)); \
  189. t3 = *(mlib_u32*)((mlib_u8*)table3 + ((s0 << 2) & 0x3FC))
  190. #endif /* _LITTLE_ENDIAN */
  191. /***************************************************************/
  192. void mlib_c_ImageLookUp_U8_U8(const mlib_u8 *src,
  193. mlib_s32 slb,
  194. mlib_u8 *dst,
  195. mlib_s32 dlb,
  196. mlib_s32 xsize,
  197. mlib_s32 ysize,
  198. mlib_s32 csize,
  199. const mlib_u8 **table)
  200. {
  201. if (xsize * csize < 9) {
  202. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u8, table);
  203. }
  204. else if (csize == 1) {
  205. mlib_s32 i, j;
  206. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  207. mlib_u32 *da;
  208. mlib_u16 *sa;
  209. mlib_u8 *tab = (mlib_u8 *) table[0];
  210. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  211. mlib_s32 off;
  212. mlib_s32 size = xsize;
  213. mlib_u8 *dp = dst, *sp = (void *)src;
  214. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  215. for (i = 0; i < off; i++, sp++) {
  216. *dp++ = tab[sp[0]];
  217. size--;
  218. }
  219. da = (mlib_u32 *) dp;
  220. if (((mlib_addr) sp & 1) == 0) {
  221. sa = (mlib_u16 *) sp;
  222. s0 = sa[0];
  223. s1 = sa[1];
  224. sa += 2;
  225. #ifdef __SUNPRO_C
  226. #pragma pipeloop(0)
  227. #endif /* __SUNPRO_C */
  228. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  229. READ_U8_U8_ALIGN(tab, tab, tab, tab);
  230. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  231. s0 = sa[0];
  232. s1 = sa[1];
  233. da[0] = t;
  234. }
  235. READ_U8_U8_ALIGN(tab, tab, tab, tab);
  236. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  237. da[0] = t;
  238. da++;
  239. dp = (mlib_u8 *) da;
  240. sp = (mlib_u8 *) sa;
  241. i += 4;
  242. for (; i < size; i++, dp++, sp++)
  243. dp[0] = tab[sp[0]];
  244. }
  245. else {
  246. sa = (mlib_u16 *) (sp - 1);
  247. s0 = sa[0];
  248. s1 = sa[1];
  249. s2 = sa[2];
  250. sa += 3;
  251. #ifdef __SUNPRO_C
  252. #pragma pipeloop(0)
  253. #endif /* __SUNPRO_C */
  254. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  255. READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
  256. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  257. s0 = s2;
  258. s1 = sa[0];
  259. s2 = sa[1];
  260. da[0] = t;
  261. }
  262. READ_U8_U8_NOTALIGN(tab, tab, tab, tab);
  263. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  264. da[0] = t;
  265. da++;
  266. dp = (mlib_u8 *) da;
  267. #ifdef _LITTLE_ENDIAN
  268. *dp++ = tab[s2 >> 8];
  269. #else
  270. *dp++ = tab[s2 & 0xFF];
  271. #endif /* _LITTLE_ENDIAN */
  272. sp = (mlib_u8 *) sa;
  273. i += 5;
  274. for (; i < size; i++, dp++, sp++)
  275. dp[0] = tab[sp[0]];
  276. }
  277. }
  278. }
  279. else if (csize == 2) {
  280. mlib_s32 i, j;
  281. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  282. mlib_u32 *da;
  283. mlib_u16 *sa;
  284. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  285. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  286. mlib_u8 *tab;
  287. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  288. mlib_s32 off;
  289. mlib_s32 size = xsize * 2;
  290. mlib_u8 *dp = dst, *sp = (void *)src;
  291. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  292. for (i = 0; i < off - 1; i += 2, sp += 2) {
  293. *dp++ = tab0[sp[0]];
  294. *dp++ = tab1[sp[1]];
  295. size -= 2;
  296. }
  297. if ((off & 1) != 0) {
  298. *dp++ = tab0[sp[0]];
  299. size--;
  300. sp++;
  301. tab = tab0;
  302. tab0 = tab1;
  303. tab1 = tab;
  304. }
  305. da = (mlib_u32 *) dp;
  306. if (((mlib_addr) sp & 1) == 0) {
  307. sa = (mlib_u16 *) sp;
  308. s0 = sa[0];
  309. s1 = sa[1];
  310. sa += 2;
  311. #ifdef __SUNPRO_C
  312. #pragma pipeloop(0)
  313. #endif /* __SUNPRO_C */
  314. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  315. READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
  316. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  317. s0 = sa[0];
  318. s1 = sa[1];
  319. da[0] = t;
  320. }
  321. READ_U8_U8_ALIGN(tab0, tab1, tab0, tab1);
  322. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  323. da[0] = t;
  324. da++;
  325. dp = (mlib_u8 *) da;
  326. sp = (mlib_u8 *) sa;
  327. i += 4;
  328. for (; i < size - 1; i += 2, sp += 2) {
  329. *dp++ = tab0[sp[0]];
  330. *dp++ = tab1[sp[1]];
  331. }
  332. if (i < size)
  333. *dp = tab0[(*sp)];
  334. }
  335. else {
  336. sa = (mlib_u16 *) (sp - 1);
  337. s0 = sa[0];
  338. s1 = sa[1];
  339. s2 = sa[2];
  340. sa += 3;
  341. #ifdef __SUNPRO_C
  342. #pragma pipeloop(0)
  343. #endif /* __SUNPRO_C */
  344. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  345. READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
  346. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  347. s0 = s2;
  348. s1 = sa[0];
  349. s2 = sa[1];
  350. da[0] = t;
  351. }
  352. READ_U8_U8_NOTALIGN(tab0, tab1, tab0, tab1);
  353. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  354. da[0] = t;
  355. da++;
  356. dp = (mlib_u8 *) da;
  357. #ifdef _LITTLE_ENDIAN
  358. *dp++ = tab0[s2 >> 8];
  359. #else
  360. *dp++ = tab0[s2 & 0xFF];
  361. #endif /* _LITTLE_ENDIAN */
  362. sp = (mlib_u8 *) sa;
  363. i += 5;
  364. for (; i < size - 1; i += 2, sp += 2) {
  365. *dp++ = tab1[sp[0]];
  366. *dp++ = tab0[sp[1]];
  367. }
  368. if (i < size)
  369. *dp = tab1[(*sp)];
  370. }
  371. }
  372. }
  373. else if (csize == 3) {
  374. mlib_s32 i, j;
  375. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  376. mlib_u32 *da;
  377. mlib_u16 *sa;
  378. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  379. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  380. mlib_u8 *tab2 = (mlib_u8 *) table[2];
  381. mlib_u8 *tab;
  382. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  383. mlib_s32 off;
  384. mlib_s32 size = xsize * 3;
  385. mlib_u8 *dp = dst, *sp = (void *)src;
  386. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  387. if (off == 1) {
  388. *dp++ = tab0[sp[0]];
  389. tab = tab0;
  390. tab0 = tab1;
  391. tab1 = tab2;
  392. tab2 = tab;
  393. size--;
  394. sp++;
  395. }
  396. else if (off == 2) {
  397. *dp++ = tab0[sp[0]];
  398. *dp++ = tab1[sp[1]];
  399. tab = tab2;
  400. tab2 = tab1;
  401. tab1 = tab0;
  402. tab0 = tab;
  403. size -= 2;
  404. sp += 2;
  405. }
  406. else if (off == 3) {
  407. *dp++ = tab0[sp[0]];
  408. *dp++ = tab1[sp[1]];
  409. *dp++ = tab2[sp[2]];
  410. size -= 3;
  411. sp += 3;
  412. }
  413. da = (mlib_u32 *) dp;
  414. if (((mlib_addr) sp & 1) == 0) {
  415. sa = (mlib_u16 *) sp;
  416. s0 = sa[0];
  417. s1 = sa[1];
  418. sa += 2;
  419. #ifdef __SUNPRO_C
  420. #pragma pipeloop(0)
  421. #endif /* __SUNPRO_C */
  422. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  423. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
  424. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  425. tab = tab0;
  426. tab0 = tab1;
  427. tab1 = tab2;
  428. tab2 = tab;
  429. s0 = sa[0];
  430. s1 = sa[1];
  431. da[0] = t;
  432. }
  433. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab0);
  434. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  435. da[0] = t;
  436. da++;
  437. dp = (mlib_u8 *) da;
  438. sp = (mlib_u8 *) sa;
  439. i += 4;
  440. if (i < size) {
  441. *dp++ = tab1[(*sp)];
  442. i++;
  443. sp++;
  444. }
  445. if (i < size) {
  446. *dp++ = tab2[(*sp)];
  447. i++;
  448. sp++;
  449. }
  450. if (i < size) {
  451. *dp++ = tab0[(*sp)];
  452. }
  453. }
  454. else {
  455. sa = (mlib_u16 *) (sp - 1);
  456. s0 = sa[0];
  457. s1 = sa[1];
  458. s2 = sa[2];
  459. sa += 3;
  460. #ifdef __SUNPRO_C
  461. #pragma pipeloop(0)
  462. #endif /* __SUNPRO_C */
  463. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  464. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
  465. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  466. tab = tab0;
  467. tab0 = tab1;
  468. tab1 = tab2;
  469. tab2 = tab;
  470. s0 = s2;
  471. s1 = sa[0];
  472. s2 = sa[1];
  473. da[0] = t;
  474. }
  475. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab0);
  476. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  477. da[0] = t;
  478. da++;
  479. dp = (mlib_u8 *) da;
  480. #ifdef _LITTLE_ENDIAN
  481. *dp++ = tab1[s2 >> 8];
  482. #else
  483. *dp++ = tab1[s2 & 0xFF];
  484. #endif /* _LITTLE_ENDIAN */
  485. sp = (mlib_u8 *) sa;
  486. i += 5;
  487. if (i < size) {
  488. *dp++ = tab2[(*sp)];
  489. i++;
  490. sp++;
  491. }
  492. if (i < size) {
  493. *dp++ = tab0[(*sp)];
  494. i++;
  495. sp++;
  496. }
  497. if (i < size) {
  498. *dp = tab1[(*sp)];
  499. }
  500. }
  501. }
  502. }
  503. else if (csize == 4) {
  504. mlib_s32 i, j;
  505. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  506. mlib_u32 *da;
  507. mlib_u16 *sa;
  508. mlib_u8 *tab0 = (mlib_u8 *) table[0];
  509. mlib_u8 *tab1 = (mlib_u8 *) table[1];
  510. mlib_u8 *tab2 = (mlib_u8 *) table[2];
  511. mlib_u8 *tab3 = (mlib_u8 *) table[3];
  512. mlib_u8 *tab;
  513. mlib_u32 s0, s1, s2, t0, t1, t2, t3, t;
  514. mlib_s32 off;
  515. mlib_s32 size = xsize * 4;
  516. mlib_u8 *dp = dst, *sp = (void *)src;
  517. off = (mlib_s32) ((4 - ((mlib_addr) dst & 3)) & 3);
  518. if (off == 1) {
  519. *dp++ = tab0[sp[0]];
  520. tab = tab0;
  521. tab0 = tab1;
  522. tab1 = tab2;
  523. tab2 = tab3;
  524. tab3 = tab;
  525. size--;
  526. sp++;
  527. }
  528. else if (off == 2) {
  529. *dp++ = tab0[sp[0]];
  530. *dp++ = tab1[sp[1]];
  531. tab = tab0;
  532. tab0 = tab2;
  533. tab2 = tab;
  534. tab = tab1;
  535. tab1 = tab3;
  536. tab3 = tab;
  537. size -= 2;
  538. sp += 2;
  539. }
  540. else if (off == 3) {
  541. *dp++ = tab0[sp[0]];
  542. *dp++ = tab1[sp[1]];
  543. *dp++ = tab2[sp[2]];
  544. tab = tab3;
  545. tab3 = tab2;
  546. tab2 = tab1;
  547. tab1 = tab0;
  548. tab0 = tab;
  549. size -= 3;
  550. sp += 3;
  551. }
  552. da = (mlib_u32 *) dp;
  553. if (((mlib_addr) sp & 1) == 0) {
  554. sa = (mlib_u16 *) sp;
  555. s0 = sa[0];
  556. s1 = sa[1];
  557. sa += 2;
  558. #ifdef __SUNPRO_C
  559. #pragma pipeloop(0)
  560. #endif /* __SUNPRO_C */
  561. for (i = 0; i < size - 7; i += 4, da++, sa += 2) {
  562. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
  563. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  564. s0 = sa[0];
  565. s1 = sa[1];
  566. da[0] = t;
  567. }
  568. READ_U8_U8_ALIGN(tab0, tab1, tab2, tab3);
  569. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  570. da[0] = t;
  571. da++;
  572. dp = (mlib_u8 *) da;
  573. sp = (mlib_u8 *) sa;
  574. i += 4;
  575. if (i < size) {
  576. *dp++ = tab0[(*sp)];
  577. i++;
  578. sp++;
  579. }
  580. if (i < size) {
  581. *dp++ = tab1[(*sp)];
  582. i++;
  583. sp++;
  584. }
  585. if (i < size) {
  586. *dp = tab2[(*sp)];
  587. }
  588. }
  589. else {
  590. sa = (mlib_u16 *) (sp - 1);
  591. s0 = sa[0];
  592. s1 = sa[1];
  593. s2 = sa[2];
  594. sa += 3;
  595. #ifdef __SUNPRO_C
  596. #pragma pipeloop(0)
  597. #endif /* __SUNPRO_C */
  598. for (i = 0; i < size - 8; i += 4, da++, sa += 2) {
  599. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
  600. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  601. s0 = s2;
  602. s1 = sa[0];
  603. s2 = sa[1];
  604. da[0] = t;
  605. }
  606. READ_U8_U8_NOTALIGN(tab0, tab1, tab2, tab3);
  607. t = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  608. da[0] = t;
  609. da++;
  610. dp = (mlib_u8 *) da;
  611. #ifdef _LITTLE_ENDIAN
  612. *dp++ = tab0[s2 >> 8];
  613. #else
  614. *dp++ = tab0[s2 & 0xFF];
  615. #endif /* _LITTLE_ENDIAN */
  616. sp = (mlib_u8 *) sa;
  617. i += 5;
  618. if (i < size) {
  619. *dp++ = tab1[(*sp)];
  620. i++;
  621. sp++;
  622. }
  623. if (i < size) {
  624. *dp++ = tab2[(*sp)];
  625. i++;
  626. sp++;
  627. }
  628. if (i < size) {
  629. *dp = tab3[(*sp)];
  630. }
  631. }
  632. }
  633. }
  634. }
  635. /***************************************************************/
  636. void mlib_c_ImageLookUp_S16_U8(const mlib_s16 *src,
  637. mlib_s32 slb,
  638. mlib_u8 *dst,
  639. mlib_s32 dlb,
  640. mlib_s32 xsize,
  641. mlib_s32 ysize,
  642. mlib_s32 csize,
  643. const mlib_u8 **table)
  644. {
  645. const mlib_u8 *table_base[4];
  646. mlib_s32 c;
  647. for (c = 0; c < csize; c++) {
  648. table_base[c] = &table[c][32768];
  649. }
  650. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s16, table_base);
  651. }
  652. /***************************************************************/
  653. void mlib_c_ImageLookUp_U16_U8(const mlib_u16 *src,
  654. mlib_s32 slb,
  655. mlib_u8 *dst,
  656. mlib_s32 dlb,
  657. mlib_s32 xsize,
  658. mlib_s32 ysize,
  659. mlib_s32 csize,
  660. const mlib_u8 **table)
  661. {
  662. const mlib_u8 *table_base[4];
  663. mlib_s32 c;
  664. for (c = 0; c < csize; c++) {
  665. table_base[c] = &table[c][0];
  666. }
  667. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_u16, table_base);
  668. }
  669. /***************************************************************/
  670. void mlib_c_ImageLookUp_S32_U8(const mlib_s32 *src,
  671. mlib_s32 slb,
  672. mlib_u8 *dst,
  673. mlib_s32 dlb,
  674. mlib_s32 xsize,
  675. mlib_s32 ysize,
  676. mlib_s32 csize,
  677. const mlib_u8 **table)
  678. {
  679. const mlib_u8 *table_base[4];
  680. mlib_s32 c;
  681. for (c = 0; c < csize; c++) {
  682. table_base[c] = &table[c][TABLE_SHIFT_S32];
  683. }
  684. MLIB_C_IMAGELOOKUP(mlib_u8, mlib_s32, table_base);
  685. }
  686. /***************************************************************/
  687. void mlib_c_ImageLookUp_U8_S16(const mlib_u8 *src,
  688. mlib_s32 slb,
  689. mlib_s16 *dst,
  690. mlib_s32 dlb,
  691. mlib_s32 xsize,
  692. mlib_s32 ysize,
  693. mlib_s32 csize,
  694. const mlib_s16 **table)
  695. {
  696. if (xsize * csize < 12) {
  697. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_u8, table);
  698. }
  699. else if (csize == 1) {
  700. mlib_s32 i, j;
  701. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  702. mlib_u32 *sa;
  703. mlib_u32 *da;
  704. mlib_u16 *tab = (mlib_u16 *) table[0];
  705. mlib_u32 s0, s1, t0, t1, t2, t3;
  706. mlib_u32 res1, res2;
  707. mlib_s32 off;
  708. mlib_s32 size = xsize;
  709. mlib_u16 *dp = (mlib_u16 *) dst;
  710. mlib_u8 *sp = (void *)src;
  711. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  712. for (i = 0; i < off; i++, sp++) {
  713. *dp++ = tab[sp[0]];
  714. size--;
  715. }
  716. sa = (mlib_u32 *) sp;
  717. if (((mlib_addr) dp & 3) == 0) {
  718. da = (mlib_u32 *) dp;
  719. s0 = sa[0];
  720. sa++;
  721. #ifdef __SUNPRO_C
  722. #pragma pipeloop(0)
  723. #endif /* __SUNPRO_C */
  724. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  725. READ_U8_S16_ALIGN(tab, tab, tab, tab);
  726. res1 = (t0 << 16) + t1;
  727. res2 = (t2 << 16) + t3;
  728. s0 = sa[0];
  729. da[0] = res1;
  730. da[1] = res2;
  731. }
  732. READ_U8_S16_ALIGN(tab, tab, tab, tab);
  733. res1 = (t0 << 16) + t1;
  734. res2 = (t2 << 16) + t3;
  735. da[0] = res1;
  736. da[1] = res2;
  737. da += 2;
  738. dp = (mlib_u16 *) da;
  739. sp = (mlib_u8 *) sa;
  740. i += 4;
  741. for (; i < size; i++, dp++, sp++)
  742. dp[0] = tab[sp[0]];
  743. }
  744. else {
  745. *dp++ = tab[(*sp)];
  746. size--;
  747. da = (mlib_u32 *) dp;
  748. s0 = sa[0];
  749. s1 = sa[1];
  750. sa += 2;
  751. #ifdef __SUNPRO_C
  752. #pragma pipeloop(0)
  753. #endif /* __SUNPRO_C */
  754. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  755. READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
  756. s0 = s1;
  757. res1 = (t0 << 16) + t1;
  758. res2 = (t2 << 16) + t3;
  759. s1 = sa[0];
  760. da[0] = res1;
  761. da[1] = res2;
  762. }
  763. READ_U8_S16_NOTALIGN(tab, tab, tab, tab);
  764. res1 = (t0 << 16) + t1;
  765. res2 = (t2 << 16) + t3;
  766. da[0] = res1;
  767. da[1] = res2;
  768. ADD_READ_U8_S16_NOTALIGN(tab, tab, tab);
  769. res1 = (t0 << 16) + t1;
  770. da[2] = res1;
  771. da += 3;
  772. dp = (mlib_u16 *) da;
  773. *dp++ = (mlib_u16) t2;
  774. sp = (mlib_u8 *) sa;
  775. i += 7;
  776. for (; i < size; i++, dp++, sp++)
  777. dp[0] = tab[sp[0]];
  778. }
  779. }
  780. }
  781. else if (csize == 2) {
  782. mlib_s32 i, j;
  783. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  784. mlib_u32 *sa;
  785. mlib_u32 *da;
  786. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  787. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  788. mlib_u16 *tab;
  789. mlib_u32 s0, s1, t0, t1, t2, t3;
  790. mlib_u32 res1, res2;
  791. mlib_s32 off;
  792. mlib_s32 size = xsize * 2;
  793. mlib_u16 *dp = (mlib_u16 *) dst;
  794. mlib_u8 *sp = (void *)src;
  795. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  796. for (i = 0; i < off - 1; i += 2, sp += 2) {
  797. *dp++ = tab0[sp[0]];
  798. *dp++ = tab1[sp[1]];
  799. size -= 2;
  800. }
  801. if ((off & 1) != 0) {
  802. *dp++ = tab0[*sp];
  803. size--;
  804. sp++;
  805. tab = tab0;
  806. tab0 = tab1;
  807. tab1 = tab;
  808. }
  809. sa = (mlib_u32 *) sp;
  810. if (((mlib_addr) dp & 3) == 0) {
  811. da = (mlib_u32 *) dp;
  812. s0 = sa[0];
  813. sa++;
  814. #ifdef __SUNPRO_C
  815. #pragma pipeloop(0)
  816. #endif /* __SUNPRO_C */
  817. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  818. READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
  819. res1 = (t0 << 16) + t1;
  820. res2 = (t2 << 16) + t3;
  821. s0 = sa[0];
  822. da[0] = res1;
  823. da[1] = res2;
  824. }
  825. READ_U8_S16_ALIGN(tab0, tab1, tab0, tab1);
  826. res1 = (t0 << 16) + t1;
  827. res2 = (t2 << 16) + t3;
  828. da[0] = res1;
  829. da[1] = res2;
  830. da += 2;
  831. dp = (mlib_u16 *) da;
  832. sp = (mlib_u8 *) sa;
  833. i += 4;
  834. for (; i < size - 1; i += 2, sp += 2) {
  835. *dp++ = tab0[sp[0]];
  836. *dp++ = tab1[sp[1]];
  837. }
  838. if (i < size)
  839. *dp = tab0[(*sp)];
  840. }
  841. else {
  842. *dp++ = tab0[(*sp)];
  843. size--;
  844. da = (mlib_u32 *) dp;
  845. s0 = sa[0];
  846. s1 = sa[1];
  847. sa += 2;
  848. #ifdef __SUNPRO_C
  849. #pragma pipeloop(0)
  850. #endif /* __SUNPRO_C */
  851. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  852. READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
  853. s0 = s1;
  854. res1 = (t0 << 16) + t1;
  855. res2 = (t2 << 16) + t3;
  856. s1 = sa[0];
  857. da[0] = res1;
  858. da[1] = res2;
  859. }
  860. READ_U8_S16_NOTALIGN(tab1, tab0, tab1, tab0);
  861. res1 = (t0 << 16) + t1;
  862. res2 = (t2 << 16) + t3;
  863. da[0] = res1;
  864. da[1] = res2;
  865. ADD_READ_U8_S16_NOTALIGN(tab1, tab0, tab1);
  866. res1 = (t0 << 16) + t1;
  867. da[2] = res1;
  868. da += 3;
  869. dp = (mlib_u16 *) da;
  870. *dp++ = (mlib_u16) t2;
  871. sp = (mlib_u8 *) sa;
  872. i += 7;
  873. for (; i < size - 1; i += 2, sp += 2) {
  874. *dp++ = tab0[sp[0]];
  875. *dp++ = tab1[sp[1]];
  876. }
  877. if (i < size)
  878. *dp = tab0[(*sp)];
  879. }
  880. }
  881. }
  882. else if (csize == 3) {
  883. mlib_s32 i, j;
  884. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  885. mlib_u32 *sa;
  886. mlib_u32 *da;
  887. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  888. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  889. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  890. mlib_u16 *tab;
  891. mlib_u32 s0, s1, t0, t1, t2, t3;
  892. mlib_u32 res1, res2;
  893. mlib_s32 off;
  894. mlib_s32 size = xsize * 3;
  895. mlib_u16 *dp = (mlib_u16 *) dst;
  896. mlib_u8 *sp = (void *)src;
  897. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  898. if (off == 1) {
  899. *dp++ = tab0[(*sp)];
  900. tab = tab0;
  901. tab0 = tab1;
  902. tab1 = tab2;
  903. tab2 = tab;
  904. size--;
  905. sp++;
  906. }
  907. else if (off == 2) {
  908. *dp++ = tab0[sp[0]];
  909. *dp++ = tab1[sp[1]];
  910. tab = tab2;
  911. tab2 = tab1;
  912. tab1 = tab0;
  913. tab0 = tab;
  914. size -= 2;
  915. sp += 2;
  916. }
  917. else if (off == 3) {
  918. *dp++ = tab0[sp[0]];
  919. *dp++ = tab1[sp[1]];
  920. *dp++ = tab2[sp[2]];
  921. size -= 3;
  922. sp += 3;
  923. }
  924. sa = (mlib_u32 *) sp;
  925. if (((mlib_addr) dp & 3) == 0) {
  926. da = (mlib_u32 *) dp;
  927. s0 = sa[0];
  928. sa++;
  929. #ifdef __SUNPRO_C
  930. #pragma pipeloop(0)
  931. #endif /* __SUNPRO_C */
  932. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  933. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
  934. res1 = (t0 << 16) + t1;
  935. res2 = (t2 << 16) + t3;
  936. tab = tab0;
  937. tab0 = tab1;
  938. tab1 = tab2;
  939. tab2 = tab;
  940. s0 = sa[0];
  941. da[0] = res1;
  942. da[1] = res2;
  943. }
  944. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab0);
  945. res1 = (t0 << 16) + t1;
  946. res2 = (t2 << 16) + t3;
  947. da[0] = res1;
  948. da[1] = res2;
  949. da += 2;
  950. dp = (mlib_u16 *) da;
  951. sp = (mlib_u8 *) sa;
  952. i += 4;
  953. if (i < size) {
  954. *dp++ = tab1[(*sp)];
  955. i++;
  956. sp++;
  957. }
  958. if (i < size) {
  959. *dp++ = tab2[(*sp)];
  960. i++;
  961. sp++;
  962. }
  963. if (i < size) {
  964. *dp = tab0[(*sp)];
  965. }
  966. }
  967. else {
  968. *dp++ = tab0[(*sp)];
  969. size--;
  970. da = (mlib_u32 *) dp;
  971. s0 = sa[0];
  972. s1 = sa[1];
  973. sa += 2;
  974. #ifdef __SUNPRO_C
  975. #pragma pipeloop(0)
  976. #endif /* __SUNPRO_C */
  977. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  978. READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
  979. s0 = s1;
  980. res1 = (t0 << 16) + t1;
  981. res2 = (t2 << 16) + t3;
  982. tab = tab0;
  983. tab0 = tab1;
  984. tab1 = tab2;
  985. tab2 = tab;
  986. s1 = sa[0];
  987. da[0] = res1;
  988. da[1] = res2;
  989. }
  990. READ_U8_S16_NOTALIGN(tab1, tab2, tab0, tab1);
  991. res1 = (t0 << 16) + t1;
  992. res2 = (t2 << 16) + t3;
  993. da[0] = res1;
  994. da[1] = res2;
  995. ADD_READ_U8_S16_NOTALIGN(tab2, tab0, tab1);
  996. res1 = (t0 << 16) + t1;
  997. da[2] = res1;
  998. da += 3;
  999. dp = (mlib_u16 *) da;
  1000. *dp++ = (mlib_u16) t2;
  1001. sp = (mlib_u8 *) sa;
  1002. i += 7;
  1003. if (i < size) {
  1004. *dp++ = tab2[(*sp)];
  1005. i++;
  1006. sp++;
  1007. }
  1008. if (i < size) {
  1009. *dp++ = tab0[(*sp)];
  1010. i++;
  1011. sp++;
  1012. }
  1013. if (i < size) {
  1014. *dp = tab1[(*sp)];
  1015. }
  1016. }
  1017. }
  1018. }
  1019. else if (csize == 4) {
  1020. mlib_s32 i, j;
  1021. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1022. mlib_u32 *sa;
  1023. mlib_u32 *da;
  1024. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  1025. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  1026. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  1027. mlib_u16 *tab3 = (mlib_u16 *) table[3];
  1028. mlib_u16 *tab;
  1029. mlib_u32 s0, s1, t0, t1, t2, t3;
  1030. mlib_u32 res1, res2;
  1031. mlib_s32 off;
  1032. mlib_s32 size = xsize * 4;
  1033. mlib_u16 *dp = (mlib_u16 *) dst;
  1034. mlib_u8 *sp = (void *)src;
  1035. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1036. if (off == 1) {
  1037. *dp++ = tab0[(*sp)];
  1038. tab = tab0;
  1039. tab0 = tab1;
  1040. tab1 = tab2;
  1041. tab2 = tab3;
  1042. tab3 = tab;
  1043. size--;
  1044. sp++;
  1045. }
  1046. else if (off == 2) {
  1047. *dp++ = tab0[sp[0]];
  1048. *dp++ = tab1[sp[1]];
  1049. tab = tab0;
  1050. tab0 = tab2;
  1051. tab2 = tab;
  1052. tab = tab1;
  1053. tab1 = tab3;
  1054. tab3 = tab;
  1055. size -= 2;
  1056. sp += 2;
  1057. }
  1058. else if (off == 3) {
  1059. *dp++ = tab0[sp[0]];
  1060. *dp++ = tab1[sp[1]];
  1061. *dp++ = tab2[sp[2]];
  1062. tab = tab3;
  1063. tab3 = tab2;
  1064. tab2 = tab1;
  1065. tab1 = tab0;
  1066. tab0 = tab;
  1067. size -= 3;
  1068. sp += 3;
  1069. }
  1070. sa = (mlib_u32 *) sp;
  1071. if (((mlib_addr) dp & 3) == 0) {
  1072. da = (mlib_u32 *) dp;
  1073. s0 = sa[0];
  1074. sa++;
  1075. #ifdef __SUNPRO_C
  1076. #pragma pipeloop(0)
  1077. #endif /* __SUNPRO_C */
  1078. for (i = 0; i < size - 7; i += 4, da += 2, sa++) {
  1079. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
  1080. res1 = (t0 << 16) + t1;
  1081. res2 = (t2 << 16) + t3;
  1082. s0 = sa[0];
  1083. da[0] = res1;
  1084. da[1] = res2;
  1085. }
  1086. READ_U8_S16_ALIGN(tab0, tab1, tab2, tab3);
  1087. res1 = (t0 << 16) + t1;
  1088. res2 = (t2 << 16) + t3;
  1089. da[0] = res1;
  1090. da[1] = res2;
  1091. da += 2;
  1092. dp = (mlib_u16 *) da;
  1093. sp = (mlib_u8 *) sa;
  1094. i += 4;
  1095. if (i < size) {
  1096. *dp++ = tab0[(*sp)];
  1097. i++;
  1098. sp++;
  1099. }
  1100. if (i < size) {
  1101. *dp++ = tab1[(*sp)];
  1102. i++;
  1103. sp++;
  1104. }
  1105. if (i < size) {
  1106. *dp = tab2[(*sp)];
  1107. }
  1108. }
  1109. else {
  1110. *dp++ = tab0[(*sp)];
  1111. size--;
  1112. da = (mlib_u32 *) dp;
  1113. s0 = sa[0];
  1114. s1 = sa[1];
  1115. sa += 2;
  1116. #ifdef __SUNPRO_C
  1117. #pragma pipeloop(0)
  1118. #endif /* __SUNPRO_C */
  1119. for (i = 0; i < size - 10; i += 4, da += 2, sa++) {
  1120. READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
  1121. s0 = s1;
  1122. res1 = (t0 << 16) + t1;
  1123. res2 = (t2 << 16) + t3;
  1124. s1 = sa[0];
  1125. da[0] = res1;
  1126. da[1] = res2;
  1127. }
  1128. READ_U8_S16_NOTALIGN(tab1, tab2, tab3, tab0);
  1129. res1 = (t0 << 16) + t1;
  1130. res2 = (t2 << 16) + t3;
  1131. da[0] = res1;
  1132. da[1] = res2;
  1133. ADD_READ_U8_S16_NOTALIGN(tab1, tab2, tab3);
  1134. res1 = (t0 << 16) + t1;
  1135. da[2] = res1;
  1136. da += 3;
  1137. dp = (mlib_u16 *) da;
  1138. *dp++ = (mlib_u16) t2;
  1139. sp = (mlib_u8 *) sa;
  1140. i += 7;
  1141. if (i < size) {
  1142. *dp++ = tab0[(*sp)];
  1143. i++;
  1144. sp++;
  1145. }
  1146. if (i < size) {
  1147. *dp++ = tab1[(*sp)];
  1148. i++;
  1149. sp++;
  1150. }
  1151. if (i < size) {
  1152. *dp = tab2[(*sp)];
  1153. }
  1154. }
  1155. }
  1156. }
  1157. }
  1158. /***************************************************************/
  1159. void mlib_c_ImageLookUp_S16_S16(const mlib_s16 *src,
  1160. mlib_s32 slb,
  1161. mlib_s16 *dst,
  1162. mlib_s32 dlb,
  1163. mlib_s32 xsize,
  1164. mlib_s32 ysize,
  1165. mlib_s32 csize,
  1166. const mlib_s16 **table)
  1167. {
  1168. const mlib_s16 *table_base[4];
  1169. mlib_s32 c;
  1170. for (c = 0; c < csize; c++) {
  1171. table_base[c] = &table[c][32768];
  1172. }
  1173. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s16, table_base);
  1174. }
  1175. /***************************************************************/
  1176. void mlib_c_ImageLookUp_U16_S16(const mlib_u16 *src,
  1177. mlib_s32 slb,
  1178. mlib_s16 *dst,
  1179. mlib_s32 dlb,
  1180. mlib_s32 xsize,
  1181. mlib_s32 ysize,
  1182. mlib_s32 csize,
  1183. const mlib_s16 **table)
  1184. {
  1185. const mlib_s16 *table_base[4];
  1186. mlib_s32 c;
  1187. for (c = 0; c < csize; c++) {
  1188. table_base[c] = &table[c][0];
  1189. }
  1190. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_u16, table_base);
  1191. }
  1192. /***************************************************************/
  1193. void mlib_c_ImageLookUp_S32_S16(const mlib_s32 *src,
  1194. mlib_s32 slb,
  1195. mlib_s16 *dst,
  1196. mlib_s32 dlb,
  1197. mlib_s32 xsize,
  1198. mlib_s32 ysize,
  1199. mlib_s32 csize,
  1200. const mlib_s16 **table)
  1201. {
  1202. const mlib_s16 *table_base[4];
  1203. mlib_s32 c;
  1204. for (c = 0; c < csize; c++) {
  1205. table_base[c] = &table[c][TABLE_SHIFT_S32];
  1206. }
  1207. MLIB_C_IMAGELOOKUP(mlib_s16, mlib_s32, table_base);
  1208. }
  1209. /***************************************************************/
  1210. void mlib_c_ImageLookUp_S16_U16(const mlib_s16 *src,
  1211. mlib_s32 slb,
  1212. mlib_u16 *dst,
  1213. mlib_s32 dlb,
  1214. mlib_s32 xsize,
  1215. mlib_s32 ysize,
  1216. mlib_s32 csize,
  1217. const mlib_s16 **table)
  1218. {
  1219. const mlib_s16 *table_base[4];
  1220. mlib_s32 c;
  1221. for (c = 0; c < csize; c++) {
  1222. table_base[c] = &table[c][32768];
  1223. }
  1224. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s16, table_base);
  1225. }
  1226. /***************************************************************/
  1227. void mlib_c_ImageLookUp_U16_U16(const mlib_u16 *src,
  1228. mlib_s32 slb,
  1229. mlib_u16 *dst,
  1230. mlib_s32 dlb,
  1231. mlib_s32 xsize,
  1232. mlib_s32 ysize,
  1233. mlib_s32 csize,
  1234. const mlib_s16 **table)
  1235. {
  1236. const mlib_s16 *table_base[4];
  1237. mlib_s32 c;
  1238. for (c = 0; c < csize; c++) {
  1239. table_base[c] = &table[c][0];
  1240. }
  1241. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_u16, table_base);
  1242. }
  1243. /***************************************************************/
  1244. void mlib_c_ImageLookUp_S32_U16(const mlib_s32 *src,
  1245. mlib_s32 slb,
  1246. mlib_u16 *dst,
  1247. mlib_s32 dlb,
  1248. mlib_s32 xsize,
  1249. mlib_s32 ysize,
  1250. mlib_s32 csize,
  1251. const mlib_s16 **table)
  1252. {
  1253. const mlib_s16 *table_base[4];
  1254. mlib_s32 c;
  1255. for (c = 0; c < csize; c++) {
  1256. table_base[c] = &table[c][TABLE_SHIFT_S32];
  1257. }
  1258. MLIB_C_IMAGELOOKUP(mlib_u16, mlib_s32, table_base);
  1259. }
  1260. /***************************************************************/
  1261. void mlib_c_ImageLookUp_U8_S32(const mlib_u8 *src,
  1262. mlib_s32 slb,
  1263. mlib_s32 *dst,
  1264. mlib_s32 dlb,
  1265. mlib_s32 xsize,
  1266. mlib_s32 ysize,
  1267. mlib_s32 csize,
  1268. const mlib_s32 **table)
  1269. {
  1270. if (xsize * csize < 7) {
  1271. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_u8, table);
  1272. }
  1273. else if (csize == 1) {
  1274. mlib_s32 i, j;
  1275. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1276. mlib_u32 *sa;
  1277. mlib_u32 *tab = (mlib_u32 *) table[0];
  1278. mlib_u32 s0, t0, t1, t2, t3;
  1279. mlib_s32 off;
  1280. mlib_s32 size = xsize;
  1281. mlib_u32 *dp = (mlib_u32 *) dst;
  1282. mlib_u8 *sp = (void *)src;
  1283. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1284. for (i = 0; i < off; i++, sp++) {
  1285. *dp++ = tab[sp[0]];
  1286. size--;
  1287. }
  1288. sa = (mlib_u32 *) sp;
  1289. s0 = sa[0];
  1290. sa++;
  1291. #ifdef __SUNPRO_C
  1292. #pragma pipeloop(0)
  1293. #endif /* __SUNPRO_C */
  1294. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1295. READ_U8_S32(tab, tab, tab, tab);
  1296. s0 = sa[0];
  1297. dp[0] = t0;
  1298. dp[1] = t1;
  1299. dp[2] = t2;
  1300. dp[3] = t3;
  1301. }
  1302. READ_U8_S32(tab, tab, tab, tab);
  1303. dp[0] = t0;
  1304. dp[1] = t1;
  1305. dp[2] = t2;
  1306. dp[3] = t3;
  1307. dp += 4;
  1308. sp = (mlib_u8 *) sa;
  1309. i += 4;
  1310. for (; i < size; i++, dp++, sp++)
  1311. dp[0] = tab[sp[0]];
  1312. }
  1313. }
  1314. else if (csize == 2) {
  1315. mlib_s32 i, j;
  1316. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1317. mlib_u32 *sa;
  1318. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1319. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1320. mlib_u32 *tab;
  1321. mlib_u32 s0, t0, t1, t2, t3;
  1322. mlib_s32 off;
  1323. mlib_s32 size = xsize * 2;
  1324. mlib_u32 *dp = (mlib_u32 *) dst;
  1325. mlib_u8 *sp = (void *)src;
  1326. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1327. for (i = 0; i < off - 1; i += 2, sp += 2) {
  1328. *dp++ = tab0[sp[0]];
  1329. *dp++ = tab1[sp[1]];
  1330. size -= 2;
  1331. }
  1332. if ((off & 1) != 0) {
  1333. *dp++ = tab0[*sp];
  1334. size--;
  1335. sp++;
  1336. tab = tab0;
  1337. tab0 = tab1;
  1338. tab1 = tab;
  1339. }
  1340. sa = (mlib_u32 *) sp;
  1341. s0 = sa[0];
  1342. sa++;
  1343. #ifdef __SUNPRO_C
  1344. #pragma pipeloop(0)
  1345. #endif /* __SUNPRO_C */
  1346. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1347. READ_U8_S32(tab0, tab1, tab0, tab1);
  1348. s0 = sa[0];
  1349. dp[0] = t0;
  1350. dp[1] = t1;
  1351. dp[2] = t2;
  1352. dp[3] = t3;
  1353. }
  1354. READ_U8_S32(tab0, tab1, tab0, tab1);
  1355. dp[0] = t0;
  1356. dp[1] = t1;
  1357. dp[2] = t2;
  1358. dp[3] = t3;
  1359. dp += 4;
  1360. sp = (mlib_u8 *) sa;
  1361. i += 4;
  1362. for (; i < size - 1; i += 2, sp += 2) {
  1363. *dp++ = tab0[sp[0]];
  1364. *dp++ = tab1[sp[1]];
  1365. }
  1366. if (i < size)
  1367. *dp = tab0[(*sp)];
  1368. }
  1369. }
  1370. else if (csize == 3) {
  1371. mlib_s32 i, j;
  1372. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1373. mlib_u32 *sa;
  1374. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1375. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1376. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  1377. mlib_u32 *tab;
  1378. mlib_u32 s0, t0, t1, t2, t3;
  1379. mlib_s32 off;
  1380. mlib_s32 size = xsize * 3;
  1381. mlib_u32 *dp = (mlib_u32 *) dst;
  1382. mlib_u8 *sp = (void *)src;
  1383. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1384. if (off == 1) {
  1385. *dp++ = tab0[(*sp)];
  1386. tab = tab0;
  1387. tab0 = tab1;
  1388. tab1 = tab2;
  1389. tab2 = tab;
  1390. size--;
  1391. sp++;
  1392. }
  1393. else if (off == 2) {
  1394. *dp++ = tab0[sp[0]];
  1395. *dp++ = tab1[sp[1]];
  1396. tab = tab2;
  1397. tab2 = tab1;
  1398. tab1 = tab0;
  1399. tab0 = tab;
  1400. size -= 2;
  1401. sp += 2;
  1402. }
  1403. else if (off == 3) {
  1404. *dp++ = tab0[sp[0]];
  1405. *dp++ = tab1[sp[1]];
  1406. *dp++ = tab2[sp[2]];
  1407. size -= 3;
  1408. sp += 3;
  1409. }
  1410. sa = (mlib_u32 *) sp;
  1411. s0 = sa[0];
  1412. sa++;
  1413. #ifdef __SUNPRO_C
  1414. #pragma pipeloop(0)
  1415. #endif /* __SUNPRO_C */
  1416. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1417. READ_U8_S32(tab0, tab1, tab2, tab0);
  1418. tab = tab0;
  1419. tab0 = tab1;
  1420. tab1 = tab2;
  1421. tab2 = tab;
  1422. s0 = sa[0];
  1423. dp[0] = t0;
  1424. dp[1] = t1;
  1425. dp[2] = t2;
  1426. dp[3] = t3;
  1427. }
  1428. READ_U8_S32(tab0, tab1, tab2, tab0);
  1429. dp[0] = t0;
  1430. dp[1] = t1;
  1431. dp[2] = t2;
  1432. dp[3] = t3;
  1433. dp += 4;
  1434. sp = (mlib_u8 *) sa;
  1435. i += 4;
  1436. if (i < size) {
  1437. *dp++ = tab1[(*sp)];
  1438. i++;
  1439. sp++;
  1440. }
  1441. if (i < size) {
  1442. *dp++ = tab2[(*sp)];
  1443. i++;
  1444. sp++;
  1445. }
  1446. if (i < size) {
  1447. *dp = tab0[(*sp)];
  1448. }
  1449. }
  1450. }
  1451. else if (csize == 4) {
  1452. mlib_s32 i, j;
  1453. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1454. mlib_u32 *sa;
  1455. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  1456. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  1457. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  1458. mlib_u32 *tab3 = (mlib_u32 *) table[3];
  1459. mlib_u32 *tab;
  1460. mlib_u32 s0, t0, t1, t2, t3;
  1461. mlib_s32 off;
  1462. mlib_s32 size = xsize * 4;
  1463. mlib_u32 *dp = (mlib_u32 *) dst;
  1464. mlib_u8 *sp = (void *)src;
  1465. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  1466. if (off == 1) {
  1467. *dp++ = tab0[(*sp)];
  1468. tab = tab0;
  1469. tab0 = tab1;
  1470. tab1 = tab2;
  1471. tab2 = tab3;
  1472. tab3 = tab;
  1473. size--;
  1474. sp++;
  1475. }
  1476. else if (off == 2) {
  1477. *dp++ = tab0[sp[0]];
  1478. *dp++ = tab1[sp[1]];
  1479. tab = tab0;
  1480. tab0 = tab2;
  1481. tab2 = tab;
  1482. tab = tab1;
  1483. tab1 = tab3;
  1484. tab3 = tab;
  1485. size -= 2;
  1486. sp += 2;
  1487. }
  1488. else if (off == 3) {
  1489. *dp++ = tab0[sp[0]];
  1490. *dp++ = tab1[sp[1]];
  1491. *dp++ = tab2[sp[2]];
  1492. tab = tab3;
  1493. tab3 = tab2;
  1494. tab2 = tab1;
  1495. tab1 = tab0;
  1496. tab0 = tab;
  1497. size -= 3;
  1498. sp += 3;
  1499. }
  1500. sa = (mlib_u32 *) sp;
  1501. s0 = sa[0];
  1502. sa++;
  1503. #ifdef __SUNPRO_C
  1504. #pragma pipeloop(0)
  1505. #endif /* __SUNPRO_C */
  1506. for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
  1507. READ_U8_S32(tab0, tab1, tab2, tab3);
  1508. s0 = sa[0];
  1509. dp[0] = t0;
  1510. dp[1] = t1;
  1511. dp[2] = t2;
  1512. dp[3] = t3;
  1513. }
  1514. READ_U8_S32(tab0, tab1, tab2, tab3);
  1515. dp[0] = t0;
  1516. dp[1] = t1;
  1517. dp[2] = t2;
  1518. dp[3] = t3;
  1519. dp += 4;
  1520. sp = (mlib_u8 *) sa;
  1521. i += 4;
  1522. if (i < size) {
  1523. *dp++ = tab0[(*sp)];
  1524. i++;
  1525. sp++;
  1526. }
  1527. if (i < size) {
  1528. *dp++ = tab1[(*sp)];
  1529. i++;
  1530. sp++;
  1531. }
  1532. if (i < size) {
  1533. *dp = tab2[(*sp)];
  1534. }
  1535. }
  1536. }
  1537. }
  1538. /***************************************************************/
  1539. void mlib_c_ImageLookUp_S16_S32(const mlib_s16 *src,
  1540. mlib_s32 slb,
  1541. mlib_s32 *dst,
  1542. mlib_s32 dlb,
  1543. mlib_s32 xsize,
  1544. mlib_s32 ysize,
  1545. mlib_s32 csize,
  1546. const mlib_s32 **table)
  1547. {
  1548. const mlib_s32 *table_base[4];
  1549. mlib_s32 c;
  1550. for (c = 0; c < csize; c++) {
  1551. table_base[c] = &table[c][32768];
  1552. }
  1553. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_s16, table_base);
  1554. }
  1555. /***************************************************************/
  1556. void mlib_c_ImageLookUp_U16_S32(const mlib_u16 *src,
  1557. mlib_s32 slb,
  1558. mlib_s32 *dst,
  1559. mlib_s32 dlb,
  1560. mlib_s32 xsize,
  1561. mlib_s32 ysize,
  1562. mlib_s32 csize,
  1563. const mlib_s32 **table)
  1564. {
  1565. const mlib_s32 *table_base[4];
  1566. mlib_s32 c;
  1567. for (c = 0; c < csize; c++) {
  1568. table_base[c] = &table[c][0];
  1569. }
  1570. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_u16, table_base);
  1571. }
  1572. /***************************************************************/
  1573. void mlib_c_ImageLookUp_S32_S32(const mlib_s32 *src,
  1574. mlib_s32 slb,
  1575. mlib_s32 *dst,
  1576. mlib_s32 dlb,
  1577. mlib_s32 xsize,
  1578. mlib_s32 ysize,
  1579. mlib_s32 csize,
  1580. const mlib_s32 **table)
  1581. {
  1582. const mlib_s32 *table_base[4];
  1583. mlib_s32 c;
  1584. for (c = 0; c < csize; c++) {
  1585. table_base[c] = &table[c][TABLE_SHIFT_S32];
  1586. }
  1587. MLIB_C_IMAGELOOKUP(mlib_s32, mlib_s32, table_base);
  1588. }
  1589. /***************************************************************/
  1590. void mlib_c_ImageLookUpSI_U8_U8(const mlib_u8 *src,
  1591. mlib_s32 slb,
  1592. mlib_u8 *dst,
  1593. mlib_s32 dlb,
  1594. mlib_s32 xsize,
  1595. mlib_s32 ysize,
  1596. mlib_s32 csize,
  1597. const mlib_u8 **table)
  1598. {
  1599. if ((xsize < 8) || ((xsize * ysize) < 250)) {
  1600. MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_u8, table);
  1601. }
  1602. else if (csize == 2) {
  1603. mlib_u16 tab[256];
  1604. const mlib_u8 *tab0 = table[0];
  1605. const mlib_u8 *tab1 = table[1];
  1606. mlib_s32 i, j, s0, s1, s2;
  1607. s0 = tab0[0];
  1608. s1 = tab1[0];
  1609. for (i = 1; i < 256; i++) {
  1610. #ifdef _LITTLE_ENDIAN
  1611. s2 = (s1 << 8) + s0;
  1612. #else
  1613. s2 = (s0 << 8) + s1;
  1614. #endif /* _LITTLE_ENDIAN */
  1615. s0 = tab0[i];
  1616. s1 = tab1[i];
  1617. tab[i - 1] = (mlib_u16) s2;
  1618. }
  1619. #ifdef _LITTLE_ENDIAN
  1620. s2 = (s1 << 8) + s0;
  1621. #else
  1622. s2 = (s0 << 8) + s1;
  1623. #endif /* _LITTLE_ENDIAN */
  1624. tab[255] = (mlib_u16) s2;
  1625. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1626. mlib_s32 *da;
  1627. mlib_u8 *dp = dst;
  1628. mlib_u8 *sa = (void *)src;
  1629. mlib_s32 s0, t0, s1, t1, t, t2, off;
  1630. mlib_s32 size = xsize;
  1631. if (((mlib_addr) dp & 1) == 0) {
  1632. if (((mlib_addr) dp & 3) != 0) {
  1633. *((mlib_u16 *) dp) = tab[sa[0]];
  1634. sa++;
  1635. size--;
  1636. dp += 2;
  1637. }
  1638. da = (mlib_s32 *) dp;
  1639. s0 = sa[0];
  1640. s1 = sa[1];
  1641. sa += 2;
  1642. #ifdef __SUNPRO_C
  1643. #pragma pipeloop(0)
  1644. #endif /* __SUNPRO_C */
  1645. for (i = 0; i < size - 3; i += 2, da++, sa += 2) {
  1646. t0 = tab[s0];
  1647. t1 = tab[s1];
  1648. #ifdef _LITTLE_ENDIAN
  1649. t = (t1 << 16) + t0;
  1650. #else
  1651. t = (t0 << 16) + t1;
  1652. #endif /* _LITTLE_ENDIAN */
  1653. s0 = sa[0];
  1654. s1 = sa[1];
  1655. da[0] = t;
  1656. }
  1657. t0 = tab[s0];
  1658. t1 = tab[s1];
  1659. #ifdef _LITTLE_ENDIAN
  1660. t = (t1 << 16) + t0;
  1661. #else
  1662. t = (t0 << 16) + t1;
  1663. #endif /* _LITTLE_ENDIAN */
  1664. da[0] = t;
  1665. da++;
  1666. if (size & 1)
  1667. *((mlib_u16 *) da) = tab[sa[0]];
  1668. }
  1669. else {
  1670. off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
  1671. if (off > 1) {
  1672. t0 = tab[sa[0]];
  1673. #ifdef _LITTLE_ENDIAN
  1674. dp[1] = (t0 >> 8);
  1675. dp[0] = t0;
  1676. #else
  1677. dp[0] = (t0 >> 8);
  1678. dp[1] = t0;
  1679. #endif /* _LITTLE_ENDIAN */
  1680. sa++;
  1681. size--;
  1682. dp += 2;
  1683. }
  1684. t0 = tab[sa[0]];
  1685. sa++;
  1686. #ifdef _LITTLE_ENDIAN
  1687. *dp++ = t0;
  1688. #else
  1689. *dp++ = (t0 >> 8);
  1690. #endif /* _LITTLE_ENDIAN */
  1691. da = (mlib_s32 *) dp;
  1692. s0 = sa[0];
  1693. s1 = sa[1];
  1694. sa += 2;
  1695. #ifdef __SUNPRO_C
  1696. #pragma pipeloop(0)
  1697. #endif /* __SUNPRO_C */
  1698. for (i = 0; i < size - 4; i += 2, da++, sa += 2) {
  1699. t1 = tab[s0];
  1700. t2 = tab[s1];
  1701. #ifdef _LITTLE_ENDIAN
  1702. t = (t0 >> 8) + (t1 << 8) + (t2 << 24);
  1703. #else
  1704. t = (t0 << 24) + (t1 << 8) + (t2 >> 8);
  1705. #endif /* _LITTLE_ENDIAN */
  1706. t0 = t2;
  1707. s0 = sa[0];
  1708. s1 = sa[1];
  1709. da[0] = t;
  1710. }
  1711. t1 = tab[s0];
  1712. t2 = tab[s1];
  1713. #ifdef _LITTLE_ENDIAN
  1714. t = (t0 >> 8) + (t1 << 8) + (t2 << 24);
  1715. #else
  1716. t = (t0 << 24) + (t1 << 8) + (t2 >> 8);
  1717. #endif /* _LITTLE_ENDIAN */
  1718. da[0] = t;
  1719. da++;
  1720. dp = (mlib_u8 *) da;
  1721. #ifdef _LITTLE_ENDIAN
  1722. dp[0] = (t2 >> 8);
  1723. #else
  1724. dp[0] = t2;
  1725. #endif /* _LITTLE_ENDIAN */
  1726. if ((size & 1) == 0) {
  1727. t0 = tab[sa[0]];
  1728. #ifdef _LITTLE_ENDIAN
  1729. dp[2] = (t0 >> 8);
  1730. dp[1] = t0;
  1731. #else
  1732. dp[1] = (t0 >> 8);
  1733. dp[2] = t0;
  1734. #endif /* _LITTLE_ENDIAN */
  1735. }
  1736. }
  1737. }
  1738. }
  1739. else if (csize == 3) {
  1740. mlib_u32 tab[256];
  1741. const mlib_u8 *tab0 = table[0];
  1742. const mlib_u8 *tab1 = table[1];
  1743. const mlib_u8 *tab2 = table[2];
  1744. mlib_s32 i, j;
  1745. mlib_u32 s0, s1, s2, s3;
  1746. s0 = tab0[0];
  1747. s1 = tab1[0];
  1748. s2 = tab2[0];
  1749. for (i = 1; i < 256; i++) {
  1750. #ifdef _LITTLE_ENDIAN
  1751. s3 = (s2 << 24) + (s1 << 16) + (s0 << 8);
  1752. #else
  1753. s3 = (s0 << 16) + (s1 << 8) + s2;
  1754. #endif /* _LITTLE_ENDIAN */
  1755. s0 = tab0[i];
  1756. s1 = tab1[i];
  1757. s2 = tab2[i];
  1758. tab[i - 1] = s3;
  1759. }
  1760. #ifdef _LITTLE_ENDIAN
  1761. s3 = (s2 << 24) + (s1 << 16) + (s0 << 8);
  1762. #else
  1763. s3 = (s0 << 16) + (s1 << 8) + s2;
  1764. #endif /* _LITTLE_ENDIAN */
  1765. tab[255] = s3;
  1766. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1767. mlib_u32 *da;
  1768. mlib_u8 *dp = dst;
  1769. mlib_u8 *sa = (void *)src, *ptr;
  1770. mlib_u32 s0, s1, t0, t1;
  1771. mlib_u32 res1, res2;
  1772. mlib_s32 size = xsize, off;
  1773. off = (mlib_s32) ((mlib_addr) dp & 3);
  1774. #ifdef __SUNPRO_C
  1775. #pragma pipeloop(0)
  1776. #endif /* __SUNPRO_C */
  1777. for (i = 0; i < off; i++) {
  1778. ptr = (mlib_u8 *) (tab + sa[0]);
  1779. dp[0] = ptr[1];
  1780. dp[1] = ptr[2];
  1781. dp[2] = ptr[3];
  1782. dp += 3;
  1783. sa++;
  1784. }
  1785. size -= off;
  1786. da = (mlib_u32 *) dp;
  1787. s0 = sa[0];
  1788. s1 = sa[1];
  1789. sa += 2;
  1790. #ifdef __SUNPRO_C
  1791. #pragma pipeloop(0)
  1792. #endif /* __SUNPRO_C */
  1793. for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
  1794. t0 = tab[s0];
  1795. t1 = tab[s1];
  1796. #ifdef _LITTLE_ENDIAN
  1797. da[0] = (t0 >> 8) + (t1 << 16);
  1798. res2 = (t1 >> 16);
  1799. #else
  1800. da[0] = (t0 << 8) + (t1 >> 16);
  1801. res2 = (t1 << 16);
  1802. #endif /* _LITTLE_ENDIAN */
  1803. s0 = sa[0];
  1804. s1 = sa[1];
  1805. t0 = tab[s0];
  1806. t1 = tab[s1];
  1807. #ifdef _LITTLE_ENDIAN
  1808. res2 += (t0 << 8);
  1809. res1 = (t0 >> 24) + t1;
  1810. #else
  1811. res2 += (t0 >> 8);
  1812. res1 = (t0 << 24) + t1;
  1813. #endif /* _LITTLE_ENDIAN */
  1814. s0 = sa[2];
  1815. s1 = sa[3];
  1816. da[1] = res2;
  1817. da[2] = res1;
  1818. }
  1819. t0 = tab[s0];
  1820. t1 = tab[s1];
  1821. #ifdef _LITTLE_ENDIAN
  1822. da[0] = (t0 >> 8) + (t1 << 16);
  1823. res2 = (t1 >> 16);
  1824. #else
  1825. da[0] = (t0 << 8) + (t1 >> 16);
  1826. res2 = (t1 << 16);
  1827. #endif /* _LITTLE_ENDIAN */
  1828. s0 = sa[0];
  1829. s1 = sa[1];
  1830. t0 = tab[s0];
  1831. t1 = tab[s1];
  1832. #ifdef _LITTLE_ENDIAN
  1833. res2 += (t0 << 8);
  1834. res1 = (t0 >> 24) + t1;
  1835. #else
  1836. res2 += (t0 >> 8);
  1837. res1 = (t0 << 24) + t1;
  1838. #endif /* _LITTLE_ENDIAN */
  1839. da[1] = res2;
  1840. da[2] = res1;
  1841. da += 3;
  1842. sa += 2;
  1843. dp = (mlib_u8 *) da;
  1844. i += 4;
  1845. #ifdef __SUNPRO_C
  1846. #pragma pipeloop(0)
  1847. #endif /* __SUNPRO_C */
  1848. for (; i < size; i++) {
  1849. ptr = (mlib_u8 *) (tab + sa[0]);
  1850. dp[0] = ptr[1];
  1851. dp[1] = ptr[2];
  1852. dp[2] = ptr[3];
  1853. dp += 3;
  1854. sa++;
  1855. }
  1856. }
  1857. }
  1858. else if (csize == 4) {
  1859. mlib_u32 tab[256];
  1860. const mlib_u8 *tab0 = table[0];
  1861. const mlib_u8 *tab1 = table[1];
  1862. const mlib_u8 *tab2 = table[2];
  1863. const mlib_u8 *tab3 = table[3];
  1864. mlib_s32 i, j;
  1865. mlib_u32 s0, s1, s2, s3, s4;
  1866. s0 = tab0[0];
  1867. s1 = tab1[0];
  1868. s2 = tab2[0];
  1869. s3 = tab3[0];
  1870. for (i = 1; i < 256; i++) {
  1871. #ifdef _LITTLE_ENDIAN
  1872. s4 = (s3 << 24) + (s2 << 16) + (s1 << 8) + s0;
  1873. #else
  1874. s4 = (s0 << 24) + (s1 << 16) + (s2 << 8) + s3;
  1875. #endif /* _LITTLE_ENDIAN */
  1876. s0 = tab0[i];
  1877. s1 = tab1[i];
  1878. s2 = tab2[i];
  1879. s3 = tab3[i];
  1880. tab[i - 1] = s4;
  1881. }
  1882. #ifdef _LITTLE_ENDIAN
  1883. s4 = (s3 << 24) + (s2 << 16) + (s1 << 8) + s0;
  1884. #else
  1885. s4 = (s0 << 24) + (s1 << 16) + (s2 << 8) + s3;
  1886. #endif /* _LITTLE_ENDIAN */
  1887. tab[255] = s4;
  1888. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  1889. mlib_u32 *da;
  1890. mlib_u8 *dp = dst;
  1891. mlib_u8 *sa = (void *)src;
  1892. mlib_u32 s0, t0, s1, t1, t2;
  1893. mlib_s32 size = xsize, off;
  1894. mlib_u32 shift, shift1, res1, res2;
  1895. if (((mlib_addr) dp & 3) == 0) {
  1896. da = (mlib_u32 *) dp;
  1897. s0 = sa[0];
  1898. s1 = sa[1];
  1899. sa += 2;
  1900. #ifdef __SUNPRO_C
  1901. #pragma pipeloop(0)
  1902. #endif /* __SUNPRO_C */
  1903. for (i = 0; i < size - 3; i += 2, da += 2, sa += 2) {
  1904. t0 = tab[s0];
  1905. t1 = tab[s1];
  1906. s0 = sa[0];
  1907. s1 = sa[1];
  1908. da[0] = t0;
  1909. da[1] = t1;
  1910. }
  1911. t0 = tab[s0];
  1912. t1 = tab[s1];
  1913. da[0] = t0;
  1914. da[1] = t1;
  1915. if (size & 1)
  1916. da[2] = tab[sa[0]];
  1917. }
  1918. else {
  1919. off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
  1920. shift = 8 * off;
  1921. shift1 = 32 - shift;
  1922. for (i = 0; i < off; i++) {
  1923. dp[i] = table[i][sa[0]];
  1924. }
  1925. dp += i;
  1926. t0 = tab[sa[0]];
  1927. sa++;
  1928. da = (mlib_u32 *) dp;
  1929. s0 = sa[0];
  1930. s1 = sa[1];
  1931. sa += 2;
  1932. #ifdef __SUNPRO_C
  1933. #pragma pipeloop(0)
  1934. #endif /* __SUNPRO_C */
  1935. for (i = 0; i < size - 4; i += 2, da += 2, sa += 2) {
  1936. t1 = tab[s0];
  1937. t2 = tab[s1];
  1938. #ifdef _LITTLE_ENDIAN
  1939. res1 = (t0 >> shift) + (t1 << shift1);
  1940. res2 = (t1 >> shift) + (t2 << shift1);
  1941. #else
  1942. res1 = (t0 << shift) + (t1 >> shift1);
  1943. res2 = (t1 << shift) + (t2 >> shift1);
  1944. #endif /* _LITTLE_ENDIAN */
  1945. t0 = t2;
  1946. s0 = sa[0];
  1947. s1 = sa[1];
  1948. da[0] = res1;
  1949. da[1] = res2;
  1950. }
  1951. t1 = tab[s0];
  1952. t2 = tab[s1];
  1953. #ifdef _LITTLE_ENDIAN
  1954. res1 = (t0 >> shift) + (t1 << shift1);
  1955. res2 = (t1 >> shift) + (t2 << shift1);
  1956. #else
  1957. res1 = (t0 << shift) + (t1 >> shift1);
  1958. res2 = (t1 << shift) + (t2 >> shift1);
  1959. #endif /* _LITTLE_ENDIAN */
  1960. da[0] = res1;
  1961. da[1] = res2;
  1962. #ifdef _LITTLE_ENDIAN
  1963. t0 = (da[2] >> shift1);
  1964. da[2] = (t2 >> shift) + (t0 << shift1);
  1965. #else
  1966. t0 = (da[2] << shift1);
  1967. da[2] = (t2 << shift) + (t0 >> shift1);
  1968. #endif /* _LITTLE_ENDIAN */
  1969. da += 2;
  1970. dp = (mlib_u8 *) da + (4 - off);
  1971. if ((size & 1) == 0) {
  1972. t0 = tab[sa[0]];
  1973. #ifdef _LITTLE_ENDIAN
  1974. dp[3] = (mlib_u8) (t0 >> 24);
  1975. dp[2] = (mlib_u8) (t0 >> 16);
  1976. dp[1] = (mlib_u8) (t0 >> 8);
  1977. dp[0] = (mlib_u8) t0;
  1978. #else
  1979. dp[0] = (mlib_u8) (t0 >> 24);
  1980. dp[1] = (mlib_u8) (t0 >> 16);
  1981. dp[2] = (mlib_u8) (t0 >> 8);
  1982. dp[3] = (mlib_u8) t0;
  1983. #endif /* _LITTLE_ENDIAN */
  1984. }
  1985. }
  1986. }
  1987. }
  1988. }
  1989. /***************************************************************/
  1990. #ifdef _MSC_VER
  1991. #pragma optimize("", off)
  1992. #endif /* _MSC_VER */
  1993. void mlib_c_ImageLookUpSI_S16_U8(const mlib_s16 *src,
  1994. mlib_s32 slb,
  1995. mlib_u8 *dst,
  1996. mlib_s32 dlb,
  1997. mlib_s32 xsize,
  1998. mlib_s32 ysize,
  1999. mlib_s32 csize,
  2000. const mlib_u8 **table)
  2001. {
  2002. const mlib_u8 *table_base[4];
  2003. mlib_s32 c;
  2004. for (c = 0; c < csize; c++) {
  2005. table_base[c] = &table[c][32768];
  2006. }
  2007. if ((xsize < 8) || (csize == 2)) {
  2008. MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_s16, table_base);
  2009. }
  2010. else if (csize == 3) {
  2011. mlib_s32 i, j;
  2012. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2013. mlib_u32 *da;
  2014. mlib_u8 *dp = dst;
  2015. mlib_s16 *sa = (void *)src;
  2016. const mlib_u8 *tab0 = table_base[0];
  2017. const mlib_u8 *tab1 = table_base[1];
  2018. const mlib_u8 *tab2 = table_base[2];
  2019. mlib_s32 s0, s1;
  2020. mlib_u32 t0, t1, t2, t3, t4, t5;
  2021. mlib_u32 res1, res2;
  2022. mlib_s32 size = xsize, off;
  2023. off = (mlib_s32) ((mlib_addr) dp & 3);
  2024. #ifdef __SUNPRO_C
  2025. #pragma pipeloop(0)
  2026. #endif /* __SUNPRO_C */
  2027. for (i = 0; i < off; i++) {
  2028. s0 = *sa++;
  2029. dp[0] = tab0[s0];
  2030. dp[1] = tab1[s0];
  2031. dp[2] = tab2[s0];
  2032. dp += 3;
  2033. }
  2034. size -= off;
  2035. da = (mlib_u32 *) dp;
  2036. s0 = sa[0];
  2037. s1 = sa[1];
  2038. sa += 2;
  2039. #ifdef __SUNPRO_C
  2040. #pragma pipeloop(0)
  2041. #endif /* __SUNPRO_C */
  2042. for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
  2043. t0 = tab0[s0];
  2044. t1 = tab1[s0];
  2045. t2 = tab2[s0];
  2046. t3 = tab0[s1];
  2047. t4 = tab1[s1];
  2048. t5 = tab2[s1];
  2049. #ifdef _LITTLE_ENDIAN
  2050. da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2051. res2 = (t5 << 8) + t4;
  2052. #else
  2053. da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2054. res2 = (t4 << 24) + (t5 << 16);
  2055. #endif /* _LITTLE_ENDIAN */
  2056. s0 = sa[0];
  2057. s1 = sa[1];
  2058. t0 = tab0[s0];
  2059. t1 = tab1[s0];
  2060. t2 = tab2[s0];
  2061. t3 = tab0[s1];
  2062. t4 = tab1[s1];
  2063. t5 = tab2[s1];
  2064. #ifdef _LITTLE_ENDIAN
  2065. res2 += ((t1 << 24) + (t0 << 16));
  2066. res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
  2067. #else
  2068. res2 += ((t0 << 8) + t1);
  2069. res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
  2070. #endif /* _LITTLE_ENDIAN */
  2071. s0 = sa[2];
  2072. s1 = sa[3];
  2073. da[1] = res2;
  2074. da[2] = res1;
  2075. }
  2076. t0 = tab0[s0];
  2077. t1 = tab1[s0];
  2078. t2 = tab2[s0];
  2079. t3 = tab0[s1];
  2080. t4 = tab1[s1];
  2081. t5 = tab2[s1];
  2082. #ifdef _LITTLE_ENDIAN
  2083. da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2084. res2 = (t5 << 8) + t4;
  2085. #else
  2086. da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2087. res2 = (t4 << 24) + (t5 << 16);
  2088. #endif /* _LITTLE_ENDIAN */
  2089. s0 = sa[0];
  2090. s1 = sa[1];
  2091. t0 = tab0[s0];
  2092. t1 = tab1[s0];
  2093. t2 = tab2[s0];
  2094. t3 = tab0[s1];
  2095. t4 = tab1[s1];
  2096. t5 = tab2[s1];
  2097. #ifdef _LITTLE_ENDIAN
  2098. res2 += ((t1 << 24) + (t0 << 16));
  2099. res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
  2100. #else
  2101. res2 += ((t0 << 8) + t1);
  2102. res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
  2103. #endif /* _LITTLE_ENDIAN */
  2104. da[1] = res2;
  2105. da[2] = res1;
  2106. da += 3;
  2107. sa += 2;
  2108. dp = (mlib_u8 *) da;
  2109. i += 4;
  2110. #ifdef __SUNPRO_C
  2111. #pragma pipeloop(0)
  2112. #endif /* __SUNPRO_C */
  2113. for (; i < size; i++) {
  2114. s0 = *sa++;
  2115. dp[0] = tab0[s0];
  2116. dp[1] = tab1[s0];
  2117. dp[2] = tab2[s0];
  2118. dp += 3;
  2119. }
  2120. }
  2121. }
  2122. else if (csize == 4) {
  2123. mlib_s32 i, j;
  2124. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2125. mlib_u32 *da;
  2126. mlib_u8 *dp = dst;
  2127. mlib_s16 *sa = (void *)src;
  2128. const mlib_u8 *tab0 = table_base[0];
  2129. const mlib_u8 *tab1 = table_base[1];
  2130. const mlib_u8 *tab2 = table_base[2];
  2131. const mlib_u8 *tab3 = table_base[3];
  2132. mlib_s32 s0;
  2133. mlib_u32 t0, t1, t2, t3;
  2134. mlib_s32 size = xsize, off;
  2135. mlib_u32 shift, shift1, res1, res2, res;
  2136. if (((mlib_addr) dp & 3) == 0) {
  2137. da = (mlib_u32 *) dp;
  2138. s0 = sa[0];
  2139. sa++;
  2140. #ifdef __SUNPRO_C
  2141. #pragma pipeloop(0)
  2142. #endif /* __SUNPRO_C */
  2143. for (i = 0; i < size - 1; i++, da++, sa++) {
  2144. t0 = tab0[s0];
  2145. t1 = tab1[s0];
  2146. t2 = tab2[s0];
  2147. t3 = tab3[s0];
  2148. #ifdef _LITTLE_ENDIAN
  2149. res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2150. #else
  2151. res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2152. #endif /* _LITTLE_ENDIAN */
  2153. s0 = sa[0];
  2154. da[0] = res;
  2155. }
  2156. t0 = tab0[s0];
  2157. t1 = tab1[s0];
  2158. t2 = tab2[s0];
  2159. t3 = tab3[s0];
  2160. #ifdef _LITTLE_ENDIAN
  2161. res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2162. #else
  2163. res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2164. #endif /* _LITTLE_ENDIAN */
  2165. da[0] = res;
  2166. }
  2167. else {
  2168. off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
  2169. shift = 8 * off;
  2170. shift1 = 32 - shift;
  2171. s0 = *sa++;
  2172. for (i = 0; i < off; i++) {
  2173. dp[i] = table_base[i][s0];
  2174. }
  2175. dp += i;
  2176. da = (mlib_u32 *) dp;
  2177. t0 = tab0[s0];
  2178. t1 = tab1[s0];
  2179. t2 = tab2[s0];
  2180. t3 = tab3[s0];
  2181. #ifdef _LITTLE_ENDIAN
  2182. res1 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2183. #else
  2184. res1 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2185. #endif /* _LITTLE_ENDIAN */
  2186. s0 = sa[0];
  2187. sa++;
  2188. #ifdef __SUNPRO_C
  2189. #pragma pipeloop(0)
  2190. #endif /* __SUNPRO_C */
  2191. for (i = 0; i < size - 2; i++, da++, sa++) {
  2192. t0 = tab0[s0];
  2193. t1 = tab1[s0];
  2194. t2 = tab2[s0];
  2195. t3 = tab3[s0];
  2196. #ifdef _LITTLE_ENDIAN
  2197. res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2198. res = (res1 >> shift) + (res2 << shift1);
  2199. #else
  2200. res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2201. res = (res1 << shift) + (res2 >> shift1);
  2202. #endif /* _LITTLE_ENDIAN */
  2203. res1 = res2;
  2204. s0 = sa[0];
  2205. da[0] = res;
  2206. }
  2207. t0 = tab0[s0];
  2208. t1 = tab1[s0];
  2209. t2 = tab2[s0];
  2210. t3 = tab3[s0];
  2211. #ifdef _LITTLE_ENDIAN
  2212. res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2213. res = (res1 >> shift) + (res2 << shift1);
  2214. #else
  2215. res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2216. res = (res1 << shift) + (res2 >> shift1);
  2217. #endif /* _LITTLE_ENDIAN */
  2218. da[0] = res;
  2219. #ifdef _LITTLE_ENDIAN
  2220. res1 = (da[1] >> shift1);
  2221. da[1] = (res2 >> shift) + (res1 << shift1);
  2222. #else
  2223. res1 = (da[1] << shift1);
  2224. da[1] = (res2 << shift) + (res1 >> shift1);
  2225. #endif /* _LITTLE_ENDIAN */
  2226. }
  2227. }
  2228. }
  2229. }
  2230. #ifdef _MSC_VER
  2231. #pragma optimize("", on)
  2232. #endif /* _MSC_VER */
  2233. /***************************************************************/
  2234. void mlib_c_ImageLookUpSI_U16_U8(const mlib_u16 *src,
  2235. mlib_s32 slb,
  2236. mlib_u8 *dst,
  2237. mlib_s32 dlb,
  2238. mlib_s32 xsize,
  2239. mlib_s32 ysize,
  2240. mlib_s32 csize,
  2241. const mlib_u8 **table)
  2242. {
  2243. const mlib_u8 *table_base[4];
  2244. mlib_s32 c;
  2245. for (c = 0; c < csize; c++) {
  2246. table_base[c] = &table[c][0];
  2247. }
  2248. if ((xsize < 8) || (csize == 2)) {
  2249. MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_u16, table_base);
  2250. }
  2251. else if (csize == 3) {
  2252. mlib_s32 i, j;
  2253. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2254. mlib_u32 *da;
  2255. mlib_u8 *dp = dst;
  2256. mlib_u16 *sa = (void *)src;
  2257. const mlib_u8 *tab0 = table_base[0];
  2258. const mlib_u8 *tab1 = table_base[1];
  2259. const mlib_u8 *tab2 = table_base[2];
  2260. mlib_s32 s0, s1;
  2261. mlib_u32 t0, t1, t2, t3, t4, t5;
  2262. mlib_u32 res1, res2;
  2263. mlib_s32 size = xsize, off;
  2264. off = (mlib_s32) ((mlib_addr) dp & 3);
  2265. #ifdef __SUNPRO_C
  2266. #pragma pipeloop(0)
  2267. #endif /* __SUNPRO_C */
  2268. for (i = 0; i < off; i++) {
  2269. s0 = *sa++;
  2270. dp[0] = tab0[s0];
  2271. dp[1] = tab1[s0];
  2272. dp[2] = tab2[s0];
  2273. dp += 3;
  2274. }
  2275. size -= off;
  2276. da = (mlib_u32 *) dp;
  2277. s0 = sa[0];
  2278. s1 = sa[1];
  2279. sa += 2;
  2280. #ifdef __SUNPRO_C
  2281. #pragma pipeloop(0)
  2282. #endif /* __SUNPRO_C */
  2283. for (i = 0; i < size - 7; i += 4, da += 3, sa += 4) {
  2284. t0 = tab0[s0];
  2285. t1 = tab1[s0];
  2286. t2 = tab2[s0];
  2287. t3 = tab0[s1];
  2288. t4 = tab1[s1];
  2289. t5 = tab2[s1];
  2290. #ifdef _LITTLE_ENDIAN
  2291. da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2292. res2 = (t5 << 8) + t4;
  2293. #else
  2294. da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2295. res2 = (t4 << 24) + (t5 << 16);
  2296. #endif /* _LITTLE_ENDIAN */
  2297. s0 = sa[0];
  2298. s1 = sa[1];
  2299. t0 = tab0[s0];
  2300. t1 = tab1[s0];
  2301. t2 = tab2[s0];
  2302. t3 = tab0[s1];
  2303. t4 = tab1[s1];
  2304. t5 = tab2[s1];
  2305. #ifdef _LITTLE_ENDIAN
  2306. res2 += ((t1 << 24) + (t0 << 16));
  2307. res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
  2308. #else
  2309. res2 += ((t0 << 8) + t1);
  2310. res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
  2311. #endif /* _LITTLE_ENDIAN */
  2312. s0 = sa[2];
  2313. s1 = sa[3];
  2314. da[1] = res2;
  2315. da[2] = res1;
  2316. }
  2317. t0 = tab0[s0];
  2318. t1 = tab1[s0];
  2319. t2 = tab2[s0];
  2320. t3 = tab0[s1];
  2321. t4 = tab1[s1];
  2322. t5 = tab2[s1];
  2323. #ifdef _LITTLE_ENDIAN
  2324. da[0] = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2325. res2 = (t5 << 8) + t4;
  2326. #else
  2327. da[0] = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2328. res2 = (t4 << 24) + (t5 << 16);
  2329. #endif /* _LITTLE_ENDIAN */
  2330. s0 = sa[0];
  2331. s1 = sa[1];
  2332. t0 = tab0[s0];
  2333. t1 = tab1[s0];
  2334. t2 = tab2[s0];
  2335. t3 = tab0[s1];
  2336. t4 = tab1[s1];
  2337. t5 = tab2[s1];
  2338. #ifdef _LITTLE_ENDIAN
  2339. res2 += ((t1 << 24) + (t0 << 16));
  2340. res1 = (t5 << 24) + (t4 << 16) + (t3 << 8) + t2;
  2341. #else
  2342. res2 += ((t0 << 8) + t1);
  2343. res1 = (t2 << 24) + (t3 << 16) + (t4 << 8) + t5;
  2344. #endif /* _LITTLE_ENDIAN */
  2345. da[1] = res2;
  2346. da[2] = res1;
  2347. da += 3;
  2348. sa += 2;
  2349. dp = (mlib_u8 *) da;
  2350. i += 4;
  2351. #ifdef __SUNPRO_C
  2352. #pragma pipeloop(0)
  2353. #endif /* __SUNPRO_C */
  2354. for (; i < size; i++) {
  2355. s0 = *sa++;
  2356. dp[0] = tab0[s0];
  2357. dp[1] = tab1[s0];
  2358. dp[2] = tab2[s0];
  2359. dp += 3;
  2360. }
  2361. }
  2362. }
  2363. else if (csize == 4) {
  2364. mlib_s32 i, j;
  2365. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2366. mlib_u32 *da;
  2367. mlib_u8 *dp = dst;
  2368. mlib_u16 *sa = (void *)src;
  2369. const mlib_u8 *tab0 = table_base[0];
  2370. const mlib_u8 *tab1 = table_base[1];
  2371. const mlib_u8 *tab2 = table_base[2];
  2372. const mlib_u8 *tab3 = table_base[3];
  2373. mlib_s32 s0;
  2374. mlib_u32 t0, t1, t2, t3;
  2375. mlib_s32 size = xsize, off;
  2376. mlib_u32 shift, shift1, res1, res2, res;
  2377. if (((mlib_addr) dp & 3) == 0) {
  2378. da = (mlib_u32 *) dp;
  2379. s0 = sa[0];
  2380. sa++;
  2381. #ifdef __SUNPRO_C
  2382. #pragma pipeloop(0)
  2383. #endif /* __SUNPRO_C */
  2384. for (i = 0; i < size - 1; i++, da++, sa++) {
  2385. t0 = tab0[s0];
  2386. t1 = tab1[s0];
  2387. t2 = tab2[s0];
  2388. t3 = tab3[s0];
  2389. #ifdef _LITTLE_ENDIAN
  2390. res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2391. #else
  2392. res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2393. #endif /* _LITTLE_ENDIAN */
  2394. s0 = sa[0];
  2395. da[0] = res;
  2396. }
  2397. t0 = tab0[s0];
  2398. t1 = tab1[s0];
  2399. t2 = tab2[s0];
  2400. t3 = tab3[s0];
  2401. #ifdef _LITTLE_ENDIAN
  2402. res = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2403. #else
  2404. res = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2405. #endif /* _LITTLE_ENDIAN */
  2406. da[0] = res;
  2407. }
  2408. else {
  2409. off = (mlib_s32) (4 - ((mlib_addr) dp & 3));
  2410. shift = 8 * off;
  2411. shift1 = 32 - shift;
  2412. s0 = *sa++;
  2413. for (i = 0; i < off; i++) {
  2414. dp[i] = table_base[i][s0];
  2415. }
  2416. dp += i;
  2417. da = (mlib_u32 *) dp;
  2418. t0 = tab0[s0];
  2419. t1 = tab1[s0];
  2420. t2 = tab2[s0];
  2421. t3 = tab3[s0];
  2422. #ifdef _LITTLE_ENDIAN
  2423. res1 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2424. #else
  2425. res1 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2426. #endif /* _LITTLE_ENDIAN */
  2427. s0 = sa[0];
  2428. sa++;
  2429. #ifdef __SUNPRO_C
  2430. #pragma pipeloop(0)
  2431. #endif /* __SUNPRO_C */
  2432. for (i = 0; i < size - 2; i++, da++, sa++) {
  2433. t0 = tab0[s0];
  2434. t1 = tab1[s0];
  2435. t2 = tab2[s0];
  2436. t3 = tab3[s0];
  2437. #ifdef _LITTLE_ENDIAN
  2438. res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2439. res = (res1 >> shift) + (res2 << shift1);
  2440. #else
  2441. res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2442. res = (res1 << shift) + (res2 >> shift1);
  2443. #endif /* _LITTLE_ENDIAN */
  2444. res1 = res2;
  2445. s0 = sa[0];
  2446. da[0] = res;
  2447. }
  2448. t0 = tab0[s0];
  2449. t1 = tab1[s0];
  2450. t2 = tab2[s0];
  2451. t3 = tab3[s0];
  2452. #ifdef _LITTLE_ENDIAN
  2453. res2 = (t3 << 24) + (t2 << 16) + (t1 << 8) + t0;
  2454. res = (res1 >> shift) + (res2 << shift1);
  2455. #else
  2456. res2 = (t0 << 24) + (t1 << 16) + (t2 << 8) + t3;
  2457. res = (res1 << shift) + (res2 >> shift1);
  2458. #endif /* _LITTLE_ENDIAN */
  2459. da[0] = res;
  2460. #ifdef _LITTLE_ENDIAN
  2461. res1 = (da[1] >> shift1);
  2462. da[1] = (res2 >> shift) + (res1 << shift1);
  2463. #else
  2464. res1 = (da[1] << shift1);
  2465. da[1] = (res2 << shift) + (res1 >> shift1);
  2466. #endif /* _LITTLE_ENDIAN */
  2467. }
  2468. }
  2469. }
  2470. }
  2471. /***************************************************************/
  2472. void mlib_c_ImageLookUpSI_S32_U8(const mlib_s32 *src,
  2473. mlib_s32 slb,
  2474. mlib_u8 *dst,
  2475. mlib_s32 dlb,
  2476. mlib_s32 xsize,
  2477. mlib_s32 ysize,
  2478. mlib_s32 csize,
  2479. const mlib_u8 **table)
  2480. {
  2481. const mlib_u8 *table_base[4];
  2482. mlib_s32 c;
  2483. for (c = 0; c < csize; c++) {
  2484. table_base[c] = &table[c][TABLE_SHIFT_S32];
  2485. }
  2486. MLIB_C_IMAGELOOKUPSI(mlib_u8, mlib_s32, table_base);
  2487. }
  2488. /***************************************************************/
  2489. void mlib_c_ImageLookUpSI_U8_S16(const mlib_u8 *src,
  2490. mlib_s32 slb,
  2491. mlib_s16 *dst,
  2492. mlib_s32 dlb,
  2493. mlib_s32 xsize,
  2494. mlib_s32 ysize,
  2495. mlib_s32 csize,
  2496. const mlib_s16 **table)
  2497. {
  2498. if ((xsize < 4) || ((xsize * ysize) < 250)) {
  2499. MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_u8, table);
  2500. }
  2501. else if (csize == 2) {
  2502. mlib_u32 tab[256];
  2503. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  2504. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  2505. mlib_s32 i, j;
  2506. mlib_u32 s0, s1, s2;
  2507. s0 = tab0[0];
  2508. s1 = tab1[0];
  2509. for (i = 1; i < 256; i++) {
  2510. #ifdef _LITTLE_ENDIAN
  2511. s2 = (s1 << 16) + s0;
  2512. #else
  2513. s2 = (s0 << 16) + s1;
  2514. #endif /* _LITTLE_ENDIAN */
  2515. s0 = tab0[i];
  2516. s1 = tab1[i];
  2517. tab[i - 1] = s2;
  2518. }
  2519. #ifdef _LITTLE_ENDIAN
  2520. s2 = (s1 << 16) + s0;
  2521. #else
  2522. s2 = (s0 << 16) + s1;
  2523. #endif /* _LITTLE_ENDIAN */
  2524. tab[255] = s2;
  2525. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2526. mlib_u32 *da;
  2527. mlib_u16 *dp = (mlib_u16 *) dst;
  2528. mlib_u8 *sa = (void *)src;
  2529. mlib_u32 s0, t0, s1, t1, t2;
  2530. mlib_u32 res1, res2;
  2531. mlib_s32 size = xsize;
  2532. if (((mlib_addr) dp & 3) == 0) {
  2533. da = (mlib_u32 *) dp;
  2534. s0 = sa[0];
  2535. s1 = sa[1];
  2536. sa += 2;
  2537. #ifdef __SUNPRO_C
  2538. #pragma pipeloop(0)
  2539. #endif /* __SUNPRO_C */
  2540. for (i = 0; i < size - 3; i += 2, da += 2, sa += 2) {
  2541. t0 = tab[s0];
  2542. t1 = tab[s1];
  2543. s0 = sa[0];
  2544. s1 = sa[1];
  2545. da[0] = t0;
  2546. da[1] = t1;
  2547. }
  2548. t0 = tab[s0];
  2549. t1 = tab[s1];
  2550. da[0] = t0;
  2551. da[1] = t1;
  2552. if (size & 1)
  2553. da[2] = tab[sa[0]];
  2554. }
  2555. else {
  2556. t0 = tab[*sa++];
  2557. #ifdef _LITTLE_ENDIAN
  2558. *dp++ = (mlib_u16) (t0);
  2559. #else
  2560. *dp++ = (mlib_u16) (t0 >> 16);
  2561. #endif /* _LITTLE_ENDIAN */
  2562. da = (mlib_u32 *) dp;
  2563. s0 = sa[0];
  2564. s1 = sa[1];
  2565. sa += 2;
  2566. #ifdef __SUNPRO_C
  2567. #pragma pipeloop(0)
  2568. #endif /* __SUNPRO_C */
  2569. for (i = 0; i < size - 4; i += 2, da += 2, sa += 2) {
  2570. t1 = tab[s0];
  2571. t2 = tab[s1];
  2572. #ifdef _LITTLE_ENDIAN
  2573. res1 = (t0 >> 16) + (t1 << 16);
  2574. res2 = (t1 >> 16) + (t2 << 16);
  2575. #else
  2576. res1 = (t0 << 16) + (t1 >> 16);
  2577. res2 = (t1 << 16) + (t2 >> 16);
  2578. #endif /* _LITTLE_ENDIAN */
  2579. t0 = t2;
  2580. s0 = sa[0];
  2581. s1 = sa[1];
  2582. da[0] = res1;
  2583. da[1] = res2;
  2584. }
  2585. t1 = tab[s0];
  2586. t2 = tab[s1];
  2587. #ifdef _LITTLE_ENDIAN
  2588. res1 = (t0 >> 16) + (t1 << 16);
  2589. res2 = (t1 >> 16) + (t2 << 16);
  2590. #else
  2591. res1 = (t0 << 16) + (t1 >> 16);
  2592. res2 = (t1 << 16) + (t2 >> 16);
  2593. #endif /* _LITTLE_ENDIAN */
  2594. da[0] = res1;
  2595. da[1] = res2;
  2596. da += 2;
  2597. dp = (mlib_u16 *) da;
  2598. #ifdef _LITTLE_ENDIAN
  2599. dp[0] = (mlib_u16) (t2 >> 16);
  2600. #else
  2601. dp[0] = (mlib_u16) t2;
  2602. #endif /* _LITTLE_ENDIAN */
  2603. if ((size & 1) == 0) {
  2604. t0 = tab[sa[0]];
  2605. #ifdef _LITTLE_ENDIAN
  2606. dp[2] = (mlib_u16) (t0 >> 16);
  2607. dp[1] = (mlib_u16) t0;
  2608. #else
  2609. dp[1] = (mlib_u16) (t0 >> 16);
  2610. dp[2] = (mlib_u16) t0;
  2611. #endif /* _LITTLE_ENDIAN */
  2612. }
  2613. }
  2614. }
  2615. }
  2616. else if (csize == 3) {
  2617. mlib_u32 tab[512];
  2618. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  2619. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  2620. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  2621. mlib_s32 i, j;
  2622. mlib_u32 s0, s1, s2, s3, s4;
  2623. s0 = tab0[0];
  2624. s1 = tab1[0];
  2625. s2 = tab2[0];
  2626. for (i = 1; i < 256; i++) {
  2627. #ifdef _LITTLE_ENDIAN
  2628. s3 = (s0 << 16);
  2629. s4 = (s2 << 16) + s1;
  2630. #else
  2631. s3 = s0;
  2632. s4 = (s1 << 16) + s2;
  2633. #endif /* _LITTLE_ENDIAN */
  2634. s0 = tab0[i];
  2635. s1 = tab1[i];
  2636. s2 = tab2[i];
  2637. tab[2 * i - 2] = s3;
  2638. tab[2 * i - 1] = s4;
  2639. }
  2640. #ifdef _LITTLE_ENDIAN
  2641. s4 = (s2 << 16) + s1;
  2642. tab[510] = s0 << 16;
  2643. #else
  2644. s4 = (s1 << 16) + s2;
  2645. tab[510] = s0;
  2646. #endif /* _LITTLE_ENDIAN */
  2647. tab[511] = s4;
  2648. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2649. mlib_u32 *da;
  2650. mlib_u16 *dp = (mlib_u16 *) dst, *ptr;
  2651. mlib_u8 *sa = (void *)src;
  2652. mlib_u32 s0, s1, t0, t1, t2, t3;
  2653. mlib_u32 res1, res2;
  2654. mlib_s32 size = xsize, off;
  2655. off = (mlib_s32) ((mlib_addr) dp & 3);
  2656. if (off != 0) {
  2657. ptr = (mlib_u16 *) (tab + 2 * sa[0]);
  2658. dp[0] = ptr[1];
  2659. dp[1] = ptr[2];
  2660. dp[2] = ptr[3];
  2661. dp += 3;
  2662. sa++;
  2663. size--;
  2664. }
  2665. da = (mlib_u32 *) dp;
  2666. s0 = sa[0] << 3;
  2667. s1 = sa[1] << 3;
  2668. sa += 2;
  2669. #ifdef __SUNPRO_C
  2670. #pragma pipeloop(0)
  2671. #endif /* __SUNPRO_C */
  2672. for (i = 0; i < size - 3; i += 2, da += 3, sa += 2) {
  2673. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2674. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2675. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2676. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2677. #ifdef _LITTLE_ENDIAN
  2678. res1 = (t0 >> 16) + (t1 << 16);
  2679. res2 = (t1 >> 16) + t2;
  2680. #else
  2681. res1 = (t0 << 16) + (t1 >> 16);
  2682. res2 = (t1 << 16) + t2;
  2683. #endif /* _LITTLE_ENDIAN */
  2684. s0 = sa[0] << 3;
  2685. s1 = sa[1] << 3;
  2686. da[0] = res1;
  2687. da[1] = res2;
  2688. da[2] = t3;
  2689. }
  2690. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2691. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2692. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2693. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2694. #ifdef _LITTLE_ENDIAN
  2695. res1 = (t0 >> 16) + (t1 << 16);
  2696. res2 = (t1 >> 16) + t2;
  2697. #else
  2698. res1 = (t0 << 16) + (t1 >> 16);
  2699. res2 = (t1 << 16) + t2;
  2700. #endif /* _LITTLE_ENDIAN */
  2701. da[0] = res1;
  2702. da[1] = res2;
  2703. da[2] = t3;
  2704. da += 3;
  2705. dp = (mlib_u16 *) da;
  2706. i += 2;
  2707. if (i < size) {
  2708. ptr = (mlib_u16 *) (tab + 2 * sa[0]);
  2709. dp[0] = ptr[1];
  2710. dp[1] = ptr[2];
  2711. dp[2] = ptr[3];
  2712. }
  2713. }
  2714. }
  2715. else if (csize == 4) {
  2716. mlib_u32 tab[512];
  2717. mlib_u16 *tab0 = (mlib_u16 *) table[0];
  2718. mlib_u16 *tab1 = (mlib_u16 *) table[1];
  2719. mlib_u16 *tab2 = (mlib_u16 *) table[2];
  2720. mlib_u16 *tab3 = (mlib_u16 *) table[3];
  2721. mlib_s32 i, j;
  2722. mlib_u32 s0, s1, s2, s3, s4, s5;
  2723. s0 = tab0[0];
  2724. s1 = tab1[0];
  2725. s2 = tab2[0];
  2726. s3 = tab3[0];
  2727. for (i = 1; i < 256; i++) {
  2728. #ifdef _LITTLE_ENDIAN
  2729. s4 = (s1 << 16) + s0;
  2730. s5 = (s3 << 16) + s2;
  2731. #else
  2732. s4 = (s0 << 16) + s1;
  2733. s5 = (s2 << 16) + s3;
  2734. #endif /* _LITTLE_ENDIAN */
  2735. s0 = tab0[i];
  2736. s1 = tab1[i];
  2737. s2 = tab2[i];
  2738. s3 = tab3[i];
  2739. tab[2 * i - 2] = s4;
  2740. tab[2 * i - 1] = s5;
  2741. }
  2742. #ifdef _LITTLE_ENDIAN
  2743. s4 = (s1 << 16) + s0;
  2744. s5 = (s3 << 16) + s2;
  2745. #else
  2746. s4 = (s0 << 16) + s1;
  2747. s5 = (s2 << 16) + s3;
  2748. #endif /* _LITTLE_ENDIAN */
  2749. tab[510] = s4;
  2750. tab[511] = s5;
  2751. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  2752. mlib_u32 *da;
  2753. mlib_u16 *dp = (mlib_u16 *) dst;
  2754. mlib_u8 *sa = (void *)src;
  2755. mlib_u32 s0, t0, s1, t1, t2, t3, t4, t5;
  2756. mlib_s32 size = xsize;
  2757. mlib_u32 res1, res2, res3, res4;
  2758. if (((mlib_addr) dp & 3) == 0) {
  2759. da = (mlib_u32 *) dp;
  2760. s0 = sa[0] << 3;
  2761. s1 = sa[1] << 3;
  2762. sa += 2;
  2763. #ifdef __SUNPRO_C
  2764. #pragma pipeloop(0)
  2765. #endif /* __SUNPRO_C */
  2766. for (i = 0; i < size - 3; i += 2, da += 4, sa += 2) {
  2767. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2768. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2769. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2770. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2771. s0 = sa[0] << 3;
  2772. s1 = sa[1] << 3;
  2773. da[0] = t0;
  2774. da[1] = t1;
  2775. da[2] = t2;
  2776. da[3] = t3;
  2777. }
  2778. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2779. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2780. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2781. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2782. da[0] = t0;
  2783. da[1] = t1;
  2784. da[2] = t2;
  2785. da[3] = t3;
  2786. if (size & 1) {
  2787. da[4] = tab[2 * sa[0]];
  2788. da[5] = tab[2 * sa[0] + 1];
  2789. }
  2790. }
  2791. else {
  2792. t4 = tab[2 * sa[0]];
  2793. t5 = tab[2 * sa[0] + 1];
  2794. #ifdef _LITTLE_ENDIAN
  2795. *dp++ = (mlib_u16) (t4);
  2796. #else
  2797. *dp++ = (mlib_u16) (t4 >> 16);
  2798. #endif /* _LITTLE_ENDIAN */
  2799. sa++;
  2800. da = (mlib_u32 *) dp;
  2801. #ifdef _LITTLE_ENDIAN
  2802. *da++ = (t4 >> 16) + (t5 << 16);
  2803. #else
  2804. *da++ = (t4 << 16) + (t5 >> 16);
  2805. #endif /* _LITTLE_ENDIAN */
  2806. s0 = sa[0] << 3;
  2807. s1 = sa[1] << 3;
  2808. sa += 2;
  2809. #ifdef __SUNPRO_C
  2810. #pragma pipeloop(0)
  2811. #endif /* __SUNPRO_C */
  2812. for (i = 0; i < size - 4; i += 2, da += 4, sa += 2) {
  2813. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2814. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2815. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2816. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2817. #ifdef _LITTLE_ENDIAN
  2818. res1 = (t5 >> 16) + (t0 << 16);
  2819. res2 = (t0 >> 16) + (t1 << 16);
  2820. res3 = (t1 >> 16) + (t2 << 16);
  2821. res4 = (t2 >> 16) + (t3 << 16);
  2822. #else
  2823. res1 = (t5 << 16) + (t0 >> 16);
  2824. res2 = (t0 << 16) + (t1 >> 16);
  2825. res3 = (t1 << 16) + (t2 >> 16);
  2826. res4 = (t2 << 16) + (t3 >> 16);
  2827. #endif /* _LITTLE_ENDIAN */
  2828. s0 = sa[0] << 3;
  2829. s1 = sa[1] << 3;
  2830. da[0] = res1;
  2831. da[1] = res2;
  2832. da[2] = res3;
  2833. da[3] = res4;
  2834. t5 = t3;
  2835. }
  2836. t0 = *(mlib_u32 *) ((mlib_u8 *) tab + s0);
  2837. t1 = *(mlib_u32 *) ((mlib_u8 *) tab + s0 + 4);
  2838. t2 = *(mlib_u32 *) ((mlib_u8 *) tab + s1);
  2839. t3 = *(mlib_u32 *) ((mlib_u8 *) tab + s1 + 4);
  2840. #ifdef _LITTLE_ENDIAN
  2841. res1 = (t5 >> 16) + (t0 << 16);
  2842. res2 = (t0 >> 16) + (t1 << 16);
  2843. res3 = (t1 >> 16) + (t2 << 16);
  2844. res4 = (t2 >> 16) + (t3 << 16);
  2845. #else
  2846. res1 = (t5 << 16) + (t0 >> 16);
  2847. res2 = (t0 << 16) + (t1 >> 16);
  2848. res3 = (t1 << 16) + (t2 >> 16);
  2849. res4 = (t2 << 16) + (t3 >> 16);
  2850. #endif /* _LITTLE_ENDIAN */
  2851. da[0] = res1;
  2852. da[1] = res2;
  2853. da[2] = res3;
  2854. da[3] = res4;
  2855. da += 4;
  2856. dp = (mlib_u16 *) da;
  2857. #ifdef _LITTLE_ENDIAN
  2858. dp[0] = (mlib_u16) (t3 >> 16);
  2859. #else
  2860. dp[0] = (mlib_u16) t3;
  2861. #endif /* _LITTLE_ENDIAN */
  2862. if ((size & 1) == 0) {
  2863. t0 = tab[2 * sa[0]];
  2864. #ifdef _LITTLE_ENDIAN
  2865. dp[2] = (mlib_u16) (t0 >> 16);
  2866. dp[1] = (mlib_u16) t0;
  2867. #else
  2868. dp[1] = (mlib_u16) (t0 >> 16);
  2869. dp[2] = (mlib_u16) t0;
  2870. #endif /* _LITTLE_ENDIAN */
  2871. t0 = tab[2 * sa[0] + 1];
  2872. #ifdef _LITTLE_ENDIAN
  2873. dp[4] = (mlib_u16) (t0 >> 16);
  2874. dp[3] = (mlib_u16) t0;
  2875. #else
  2876. dp[3] = (mlib_u16) (t0 >> 16);
  2877. dp[4] = (mlib_u16) t0;
  2878. #endif /* _LITTLE_ENDIAN */
  2879. }
  2880. }
  2881. }
  2882. }
  2883. }
  2884. /***************************************************************/
  2885. void mlib_c_ImageLookUpSI_S16_S16(const mlib_s16 *src,
  2886. mlib_s32 slb,
  2887. mlib_s16 *dst,
  2888. mlib_s32 dlb,
  2889. mlib_s32 xsize,
  2890. mlib_s32 ysize,
  2891. mlib_s32 csize,
  2892. const mlib_s16 **table)
  2893. {
  2894. const mlib_s16 *table_base[4];
  2895. mlib_s32 c;
  2896. for (c = 0; c < csize; c++) {
  2897. table_base[c] = &table[c][32768];
  2898. }
  2899. MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_s16, table_base);
  2900. }
  2901. /***************************************************************/
  2902. void mlib_c_ImageLookUpSI_U16_S16(const mlib_u16 *src,
  2903. mlib_s32 slb,
  2904. mlib_s16 *dst,
  2905. mlib_s32 dlb,
  2906. mlib_s32 xsize,
  2907. mlib_s32 ysize,
  2908. mlib_s32 csize,
  2909. const mlib_s16 **table)
  2910. {
  2911. const mlib_s16 *table_base[4];
  2912. mlib_s32 c;
  2913. for (c = 0; c < csize; c++) {
  2914. table_base[c] = &table[c][0];
  2915. }
  2916. MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_u16, table_base);
  2917. }
  2918. /***************************************************************/
  2919. void mlib_c_ImageLookUpSI_S32_S16(const mlib_s32 *src,
  2920. mlib_s32 slb,
  2921. mlib_s16 *dst,
  2922. mlib_s32 dlb,
  2923. mlib_s32 xsize,
  2924. mlib_s32 ysize,
  2925. mlib_s32 csize,
  2926. const mlib_s16 **table)
  2927. {
  2928. const mlib_s16 *table_base[4];
  2929. mlib_s32 c;
  2930. for (c = 0; c < csize; c++) {
  2931. table_base[c] = &table[c][TABLE_SHIFT_S32];
  2932. }
  2933. MLIB_C_IMAGELOOKUPSI(mlib_s16, mlib_s32, table_base);
  2934. }
  2935. /***************************************************************/
  2936. void mlib_c_ImageLookUpSI_S16_U16(const mlib_s16 *src,
  2937. mlib_s32 slb,
  2938. mlib_u16 *dst,
  2939. mlib_s32 dlb,
  2940. mlib_s32 xsize,
  2941. mlib_s32 ysize,
  2942. mlib_s32 csize,
  2943. const mlib_u16 **table)
  2944. {
  2945. const mlib_u16 *table_base[4];
  2946. mlib_s32 c;
  2947. for (c = 0; c < csize; c++) {
  2948. table_base[c] = &table[c][32768];
  2949. }
  2950. MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_s16, table_base);
  2951. }
  2952. /***************************************************************/
  2953. void mlib_c_ImageLookUpSI_U16_U16(const mlib_u16 *src,
  2954. mlib_s32 slb,
  2955. mlib_u16 *dst,
  2956. mlib_s32 dlb,
  2957. mlib_s32 xsize,
  2958. mlib_s32 ysize,
  2959. mlib_s32 csize,
  2960. const mlib_u16 **table)
  2961. {
  2962. const mlib_u16 *table_base[4];
  2963. mlib_s32 c;
  2964. for (c = 0; c < csize; c++) {
  2965. table_base[c] = &table[c][0];
  2966. }
  2967. MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_u16, table_base);
  2968. }
  2969. /***************************************************************/
  2970. void mlib_c_ImageLookUpSI_S32_U16(const mlib_s32 *src,
  2971. mlib_s32 slb,
  2972. mlib_u16 *dst,
  2973. mlib_s32 dlb,
  2974. mlib_s32 xsize,
  2975. mlib_s32 ysize,
  2976. mlib_s32 csize,
  2977. const mlib_u16 **table)
  2978. {
  2979. const mlib_u16 *table_base[4];
  2980. mlib_s32 c;
  2981. for (c = 0; c < csize; c++) {
  2982. table_base[c] = &table[c][TABLE_SHIFT_S32];
  2983. }
  2984. MLIB_C_IMAGELOOKUPSI(mlib_u16, mlib_s32, table_base);
  2985. }
  2986. /***************************************************************/
  2987. void mlib_c_ImageLookUpSI_U8_S32(const mlib_u8 *src,
  2988. mlib_s32 slb,
  2989. mlib_s32 *dst,
  2990. mlib_s32 dlb,
  2991. mlib_s32 xsize,
  2992. mlib_s32 ysize,
  2993. mlib_s32 csize,
  2994. const mlib_s32 **table)
  2995. {
  2996. if (xsize < 7) {
  2997. MLIB_C_IMAGELOOKUPSI(mlib_s32, mlib_u8, table);
  2998. }
  2999. else if (csize == 2) {
  3000. mlib_s32 i, j;
  3001. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  3002. mlib_u32 *sa;
  3003. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  3004. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  3005. mlib_u32 s0, t0, t1, t2, t3;
  3006. mlib_s32 off;
  3007. mlib_s32 size = xsize;
  3008. mlib_u32 *dp = (mlib_u32 *) dst;
  3009. mlib_u8 *sp = (void *)src;
  3010. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  3011. for (i = 0; i < off; i++, sp++) {
  3012. *dp++ = tab0[sp[0]];
  3013. *dp++ = tab1[sp[0]];
  3014. size--;
  3015. }
  3016. sa = (mlib_u32 *) sp;
  3017. s0 = sa[0];
  3018. sa++;
  3019. #ifdef __SUNPRO_C
  3020. #pragma pipeloop(0)
  3021. #endif /* __SUNPRO_C */
  3022. for (i = 0; i < size - 7; i += 4, dp += 8, sa++) {
  3023. #ifdef _LITTLE_ENDIAN
  3024. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3025. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3026. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3027. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3028. #else
  3029. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3030. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3031. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3032. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3033. #endif /* _LITTLE_ENDIAN */
  3034. dp[0] = t0;
  3035. dp[1] = t1;
  3036. dp[2] = t2;
  3037. dp[3] = t3;
  3038. #ifdef _LITTLE_ENDIAN
  3039. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3040. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3041. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3042. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3043. #else
  3044. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3045. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3046. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3047. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3048. #endif /* _LITTLE_ENDIAN */
  3049. s0 = sa[0];
  3050. dp[4] = t0;
  3051. dp[5] = t1;
  3052. dp[6] = t2;
  3053. dp[7] = t3;
  3054. }
  3055. #ifdef _LITTLE_ENDIAN
  3056. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3057. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3058. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3059. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3060. #else
  3061. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3062. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3063. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3064. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3065. #endif /* _LITTLE_ENDIAN */
  3066. dp[0] = t0;
  3067. dp[1] = t1;
  3068. dp[2] = t2;
  3069. dp[3] = t3;
  3070. #ifdef _LITTLE_ENDIAN
  3071. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3072. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3073. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3074. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3075. #else
  3076. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3077. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3078. t2 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3079. t3 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3080. #endif /* _LITTLE_ENDIAN */
  3081. dp[4] = t0;
  3082. dp[5] = t1;
  3083. dp[6] = t2;
  3084. dp[7] = t3;
  3085. dp += 8;
  3086. sp = (mlib_u8 *) sa;
  3087. i += 4;
  3088. for (; i < size; i++, sp++) {
  3089. *dp++ = tab0[sp[0]];
  3090. *dp++ = tab1[sp[0]];
  3091. }
  3092. }
  3093. }
  3094. else if (csize == 3) {
  3095. mlib_s32 i, j;
  3096. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  3097. mlib_u32 *sa;
  3098. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  3099. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  3100. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  3101. mlib_u32 s0, t0, t1, t2, t3, t4, t5;
  3102. mlib_s32 off;
  3103. mlib_s32 size = xsize;
  3104. mlib_u32 *dp = (mlib_u32 *) dst;
  3105. mlib_u8 *sp = (void *)src;
  3106. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  3107. for (i = 0; i < off; i++, sp++) {
  3108. *dp++ = tab0[sp[0]];
  3109. *dp++ = tab1[sp[0]];
  3110. *dp++ = tab2[sp[0]];
  3111. size--;
  3112. }
  3113. sa = (mlib_u32 *) sp;
  3114. s0 = sa[0];
  3115. sa++;
  3116. #ifdef __SUNPRO_C
  3117. #pragma pipeloop(0)
  3118. #endif /* __SUNPRO_C */
  3119. for (i = 0; i < size - 7; i += 4, dp += 12, sa++) {
  3120. #ifdef _LITTLE_ENDIAN
  3121. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3122. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3123. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3124. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3125. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3126. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3127. #else
  3128. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3129. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3130. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3131. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3132. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3133. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3134. #endif /* _LITTLE_ENDIAN */
  3135. dp[0] = t0;
  3136. dp[1] = t1;
  3137. dp[2] = t2;
  3138. dp[3] = t3;
  3139. dp[4] = t4;
  3140. dp[5] = t5;
  3141. #ifdef _LITTLE_ENDIAN
  3142. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3143. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3144. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3145. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3146. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3147. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3148. #else
  3149. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3150. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3151. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3152. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3153. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3154. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3155. #endif /* _LITTLE_ENDIAN */
  3156. s0 = sa[0];
  3157. dp[6] = t0;
  3158. dp[7] = t1;
  3159. dp[8] = t2;
  3160. dp[9] = t3;
  3161. dp[10] = t4;
  3162. dp[11] = t5;
  3163. }
  3164. #ifdef _LITTLE_ENDIAN
  3165. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3166. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3167. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3168. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3169. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3170. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3171. #else
  3172. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3173. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3174. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3175. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3176. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3177. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3178. #endif /* _LITTLE_ENDIAN */
  3179. dp[0] = t0;
  3180. dp[1] = t1;
  3181. dp[2] = t2;
  3182. dp[3] = t3;
  3183. dp[4] = t4;
  3184. dp[5] = t5;
  3185. #ifdef _LITTLE_ENDIAN
  3186. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3187. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3188. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3189. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3190. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3191. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3192. #else
  3193. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3194. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3195. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3196. t3 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3197. t4 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3198. t5 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3199. #endif /* _LITTLE_ENDIAN */
  3200. dp[6] = t0;
  3201. dp[7] = t1;
  3202. dp[8] = t2;
  3203. dp[9] = t3;
  3204. dp[10] = t4;
  3205. dp[11] = t5;
  3206. dp += 12;
  3207. sp = (mlib_u8 *) sa;
  3208. i += 4;
  3209. for (; i < size; i++, sp++) {
  3210. *dp++ = tab0[sp[0]];
  3211. *dp++ = tab1[sp[0]];
  3212. *dp++ = tab2[sp[0]];
  3213. }
  3214. }
  3215. }
  3216. else if (csize == 4) {
  3217. mlib_s32 i, j;
  3218. for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
  3219. mlib_u32 *sa;
  3220. mlib_u32 *tab0 = (mlib_u32 *) table[0];
  3221. mlib_u32 *tab1 = (mlib_u32 *) table[1];
  3222. mlib_u32 *tab2 = (mlib_u32 *) table[2];
  3223. mlib_u32 *tab3 = (mlib_u32 *) table[3];
  3224. mlib_u32 s0, t0, t1, t2, t3;
  3225. mlib_s32 off;
  3226. mlib_s32 size = xsize;
  3227. mlib_u32 *dp = (mlib_u32 *) dst;
  3228. mlib_u8 *sp = (void *)src;
  3229. off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
  3230. for (i = 0; i < off; i++, sp++) {
  3231. *dp++ = tab0[sp[0]];
  3232. *dp++ = tab1[sp[0]];
  3233. *dp++ = tab2[sp[0]];
  3234. *dp++ = tab3[sp[0]];
  3235. size--;
  3236. }
  3237. sa = (mlib_u32 *) sp;
  3238. s0 = sa[0];
  3239. sa++;
  3240. #ifdef __SUNPRO_C
  3241. #pragma pipeloop(0)
  3242. #endif /* __SUNPRO_C */
  3243. for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {
  3244. #ifdef _LITTLE_ENDIAN
  3245. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3246. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3247. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3248. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 << 2) & 0x3FC));
  3249. #else
  3250. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3251. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3252. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3253. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 22) & 0x3FC));
  3254. #endif /* _LITTLE_ENDIAN */
  3255. dp[0] = t0;
  3256. dp[1] = t1;
  3257. dp[2] = t2;
  3258. dp[3] = t3;
  3259. #ifdef _LITTLE_ENDIAN
  3260. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3261. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3262. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3263. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 6) & 0x3FC));
  3264. #else
  3265. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3266. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3267. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3268. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 0x3FC));
  3269. #endif /* _LITTLE_ENDIAN */
  3270. dp[4] = t0;
  3271. dp[5] = t1;
  3272. dp[6] = t2;
  3273. dp[7] = t3;
  3274. #ifdef _LITTLE_ENDIAN
  3275. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3276. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3277. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3278. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 0x3FC));
  3279. #else
  3280. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3281. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3282. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3283. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 6) & 0x3FC));
  3284. #endif /* _LITTLE_ENDIAN */
  3285. dp[8] = t0;
  3286. dp[9] = t1;
  3287. dp[10] = t2;
  3288. dp[11] = t3;
  3289. #ifdef _LITTLE_ENDIAN
  3290. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3291. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3292. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3293. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 22) & 0x3FC));
  3294. #else
  3295. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3296. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3297. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3298. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 << 2) & 0x3FC));
  3299. #endif /* _LITTLE_ENDIAN */
  3300. s0 = sa[0];
  3301. dp[12] = t0;
  3302. dp[13] = t1;
  3303. dp[14] = t2;
  3304. dp[15] = t3;
  3305. }
  3306. #ifdef _LITTLE_ENDIAN
  3307. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3308. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3309. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3310. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 << 2) & 0x3FC));
  3311. #else
  3312. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3313. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3314. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3315. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 22) & 0x3FC));
  3316. #endif /* _LITTLE_ENDIAN */
  3317. dp[0] = t0;
  3318. dp[1] = t1;
  3319. dp[2] = t2;
  3320. dp[3] = t3;
  3321. #ifdef _LITTLE_ENDIAN
  3322. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3323. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3324. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3325. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 6) & 0x3FC));
  3326. #else
  3327. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3328. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3329. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3330. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 0x3FC));
  3331. #endif /* _LITTLE_ENDIAN */
  3332. dp[4] = t0;
  3333. dp[5] = t1;
  3334. dp[6] = t2;
  3335. dp[7] = t3;
  3336. #ifdef _LITTLE_ENDIAN
  3337. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 14) & 0x3FC));
  3338. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 14) & 0x3FC));
  3339. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 14) & 0x3FC));
  3340. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 14) & 0x3FC));
  3341. #else
  3342. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 6) & 0x3FC));
  3343. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 6) & 0x3FC));
  3344. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 6) & 0x3FC));
  3345. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 6) & 0x3FC));
  3346. #endif /* _LITTLE_ENDIAN */
  3347. dp[8] = t0;
  3348. dp[9] = t1;
  3349. dp[10] = t2;
  3350. dp[11] = t3;
  3351. #ifdef _LITTLE_ENDIAN
  3352. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 >> 22) & 0x3FC));
  3353. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 >> 22) & 0x3FC));
  3354. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 >> 22) & 0x3FC));
  3355. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 >> 22) & 0x3FC));
  3356. #else
  3357. t0 = *(mlib_u32 *) ((mlib_u8 *) tab0 + ((s0 << 2) & 0x3FC));
  3358. t1 = *(mlib_u32 *) ((mlib_u8 *) tab1 + ((s0 << 2) & 0x3FC));
  3359. t2 = *(mlib_u32 *) ((mlib_u8 *) tab2 + ((s0 << 2) & 0x3FC));
  3360. t3 = *(mlib_u32 *) ((mlib_u8 *) tab3 + ((s0 << 2) & 0x3FC));
  3361. #endif /* _LITTLE_ENDIAN */
  3362. dp[12] = t0;
  3363. dp[13] = t1;
  3364. dp[14] = t2;
  3365. dp[15] = t3;
  3366. dp += 16;
  3367. sp = (mlib_u8 *) sa;
  3368. i += 4;
  3369. for (; i < size; i++, sp++) {
  3370. *dp++ = tab0[sp[0]];
  3371. *dp++ = tab1[sp[0]];
  3372. *dp++ = tab2[sp[0]];
  3373. *dp++ = tab3[sp[0]];
  3374. }
  3375. }
  3376. }
  3377. }
  3378. /***************************************************************/
  3379. void mlib_c_ImageLookUpSI_S16_S32(const mlib_s16 *src,
  3380. mlib_s32 slb,
  3381. mlib_s32 *dst,
  3382. mlib_s32 dlb,
  3383. mlib_s32 xsize,
  3384. mlib_s32 ysize,
  3385. mlib_s32 csize,
  3386. const mlib_s32 **table)
  3387. {
  3388. const mlib_s32 *table_base[4];
  3389. mlib_s32 c;
  3390. for (c = 0; c < csize; c++) {
  3391. table_base[c] = &table[c][32768];
  3392. }
  3393. MLIB_C_IMAGELOOKUPSI(mlib_s32, mlib_s16, table_base);
  3394. }
  3395. /***************************************************************/
  3396. void mlib_c_ImageLookUpSI_U16_S32(const mlib_u16 *src,
  3397. mlib_s32 slb,
  3398. mlib_s32 *dst,
  3399. mlib_s32 dlb,
  3400. mlib_s32 xsize,
  3401. mlib_s32 ysize,
  3402. mlib_s32 csize,
  3403. const mlib_s32 **table)
  3404. {
  3405. const mlib_s32 *table_base[4];
  3406. mlib_s32 c;
  3407. for (c = 0; c < csize; c++) {
  3408. table_base[c] = &table[c][0];
  3409. }
  3410. MLIB_C_IMAGELOOKUPSI(mlib_s32, mlib_u16, table_base);
  3411. }
  3412. /***************************************************************/
  3413. void mlib_c_ImageLookUpSI_S32_S32(const mlib_s32 *src,
  3414. mlib_s32 slb,
  3415. mlib_s32 *dst,
  3416. mlib_s32 dlb,
  3417. mlib_s32 xsize,
  3418. mlib_s32 ysize,
  3419. mlib_s32 csize,
  3420. const mlib_s32 **table)
  3421. {
  3422. const mlib_s32 *table_base[4];
  3423. mlib_s32 c;
  3424. for (c = 0; c < csize; c++) {
  3425. table_base[c] = &table[c][TABLE_SHIFT_S32];
  3426. }
  3427. MLIB_C_IMAGELOOKUPSI(mlib_s32, mlib_s32, table_base);
  3428. }
  3429. /***************************************************************/