1 /*
   2  * Copyright (c) 1999, 2020, Oracle and/or its affiliates. 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.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle 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 Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  * questions.
  24  */
  25 
  26 
  27 /*
  28  * FUNCTION
  29  *      mlib_ImageLookUp_U8D64 - table lookup
  30  *      mlib_ImageLookUp_S16D64 - table lookup
  31  *      mlib_ImageLookUp_U16D64 - table lookup
  32  *      mlib_ImageLookUp_S32D64 - table lookup
  33  *
  34  * SYNOPSIS
  35  *      void mlib_ImageLookUp_U8_D64(src, slb,
  36  *                                   dst, dlb,
  37  *                                   xsize, ysize,
  38  *                                   csize, table)
  39  *
  40  *      void mlib_ImageLookUp_S16_D64(src, slb,
  41  *                                    dst, dlb,
  42  *                                    xsize, ysize,
  43  *                                    csize, table)
  44  *
  45  *      void mlib_ImageLookUp_U16_D64(src, slb,
  46  *                                    dst, dlb,
  47  *                                    xsize, ysize,
  48  *                                    csize, table)
  49  *
  50  *      void mlib_ImageLookUp_S32_D64(src, slb,
  51  *                                    dst, dlb,
  52  *                                    xsize, ysize,
  53  *                                    csize, table)
  54  *
  55  * ARGUMENT
  56  *      src     pointer to input image (BYTE, SHORT, USHORT, INT)
  57  *      slb     stride of input image (in pixels)
  58  *      dst     pointer to output image (DOUBLE)
  59  *      dlb     stride of output image (in pixels)
  60  *      xsize   image width
  61  *      ysize   image height
  62  *      csize   number of channels
  63  *      table   lookup table
  64  *
  65  * DESCRIPTION
  66  *      dst = table[src] (c, vis version)
  67  */
  68 
  69 #include "mlib_image.h"
  70 #include "mlib_ImageLookUp.h"
  71 
  72 /***************************************************************/
  73 #define MLIB_C_IMAGELOOKUP(DTYPE, STYPE, TABLE)                 \
  74 {                                                               \
  75   mlib_s32 i, j, k;                                             \
  76                                                                 \
  77   if (xsize < 2) {                                              \
  78     for(j = 0; j < ysize; j++, dst += dlb, src += slb){         \
  79       for(k = 0; k < csize; k++) {                              \
  80         DTYPE *da = dst + k;                                    \
  81         const STYPE *sa = src + k;                              \
  82         DTYPE *tab = (DTYPE*) TABLE[k];                         \
  83                                                                 \
  84         for(i = 0; i < xsize; i++, da += csize, sa += csize)    \
  85         *da=tab[*sa];                                           \
  86       }                                                         \
  87     }                                                           \
  88   } else {                                                      \
  89     for(j = 0; j < ysize; j++, dst += dlb, src += slb) {        \
  90       for(k = 0; k < csize; k++) {                              \
  91         DTYPE *da = dst + k;                                    \
  92         const STYPE *sa = src + k;                              \
  93         DTYPE *tab = (DTYPE*) TABLE[k];                         \
  94         mlib_s32 s0, s1;                                        \
  95         DTYPE t0, t1;                                           \
  96                                                                 \
  97         s0 = (mlib_s32)sa[0];                                   \
  98         s1 = (mlib_s32)sa[csize];                               \
  99         sa += 2*csize;                                          \
 100                                                                 \
 101         for(i = 0;                                              \
 102             i < xsize - 3;                                      \
 103             i+=2, da += 2*csize, sa += 2*csize) {               \
 104           t0 = tab[s0];                                         \
 105           t1 = tab[s1];                                         \
 106           s0 = (mlib_s32)sa[0];                                 \
 107           s1 = (mlib_s32)sa[csize];                             \
 108           da[0] = (DTYPE)t0;                                    \
 109           da[csize] = (DTYPE)t1;                                \
 110         }                                                       \
 111         t0 = tab[s0];                                           \
 112         t1 = tab[s1];                                           \
 113         da[0] = (DTYPE)t0;                                      \
 114         da[csize] = (DTYPE)t1;                                  \
 115         if (xsize & 1) da[2*csize] = tab[sa[0]];                \
 116       }                                                         \
 117     }                                                           \
 118   }                                                             \
 119 }
 120 
 121 /***************************************************************/
 122 #define MLIB_C_IMAGELOOKUPSI(DTYPE, STYPE, TABLE)               \
 123 {                                                               \
 124   mlib_s32 i, j, k;                                             \
 125                                                                 \
 126   if (xsize < 2) {                                              \
 127     for(j = 0; j < ysize; j++, dst += dlb, src += slb){         \
 128       for(k = 0; k < csize; k++) {                              \
 129         DTYPE *da = dst + k;                                    \
 130         const STYPE *sa = (void *)src;                                  \
 131         DTYPE *tab = (DTYPE*) TABLE[k];                         \
 132                                                                 \
 133         for(i = 0; i < xsize; i++, da += csize, sa ++)          \
 134         *da=tab[*sa];                                           \
 135       }                                                         \
 136     }                                                           \
 137   } else {                                                      \
 138     for(j = 0; j < ysize; j++, dst += dlb, src += slb) {        \
 139       for(k = 0; k < csize; k++) {                              \
 140         DTYPE *da = dst + k;                                    \
 141         const STYPE *sa = (void *)src;                                  \
 142         DTYPE *tab = (DTYPE*) TABLE[k];                         \
 143         mlib_s32 s0, s1;                                        \
 144         DTYPE t0, t1;                                           \
 145                                                                 \
 146         s0 = (mlib_s32)sa[0];                                   \
 147         s1 = (mlib_s32)sa[1];                                   \
 148         sa += 2;                                                \
 149                                                                 \
 150         for(i = 0;                                              \
 151             i < xsize - 3;                                      \
 152             i+=2, da += 2*csize, sa += 2) {                     \
 153           t0 = tab[s0];                                         \
 154           t1 = tab[s1];                                         \
 155           s0 = (mlib_s32)sa[0];                                 \
 156           s1 = (mlib_s32)sa[1];                                 \
 157           da[0] = (DTYPE)t0;                                    \
 158           da[csize] = (DTYPE)t1;                                \
 159         }                                                       \
 160         t0 = tab[s0];                                           \
 161         t1 = tab[s1];                                           \
 162         da[0] = (DTYPE)t0;                                      \
 163         da[csize] = (DTYPE)t1;                                  \
 164         if (xsize & 1) da[2*csize] = tab[sa[0]];                \
 165       }                                                         \
 166     }                                                           \
 167   }                                                             \
 168 }
 169 
 170 /***************************************************************/
 171 #ifdef _LITTLE_ENDIAN
 172 
 173 #define READ_U8_D64(table0, table1, table2, table3)             \
 174   t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 << 3) & 0x7F8));    \
 175   t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 5) & 0x7F8));    \
 176   t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 13)  & 0x7F8));  \
 177   t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 >> 21)  & 0x7F8))
 178 
 179 #else
 180 
 181 #define READ_U8_D64(table0, table1, table2, table3)             \
 182   t0 = *(mlib_d64*)((mlib_u8*)table0 + ((s0 >> 21) & 0x7F8));   \
 183   t1 = *(mlib_d64*)((mlib_u8*)table1 + ((s0 >> 13) & 0x7F8));   \
 184   t2 = *(mlib_d64*)((mlib_u8*)table2 + ((s0 >> 5)  & 0x7F8));   \
 185   t3 = *(mlib_d64*)((mlib_u8*)table3 + ((s0 << 3)  & 0x7F8))
 186 
 187 #endif /* _LITTLE_ENDIAN */
 188 
 189 /***************************************************************/
 190 void mlib_ImageLookUp_U8_D64(const mlib_u8  *src,
 191                              mlib_s32       slb,
 192                              mlib_d64       *dst,
 193                              mlib_s32       dlb,
 194                              mlib_s32       xsize,
 195                              mlib_s32       ysize,
 196                              mlib_s32       csize,
 197                              const mlib_d64 **table)
 198 {
 199 
 200   if (xsize * csize < 7) {
 201     MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u8, table);
 202   }
 203   else if (csize == 1) {
 204     mlib_s32 i, j;
 205 
 206     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 207       mlib_u32 *sa;
 208       mlib_d64 *tab = (mlib_d64 *) table[0];
 209       mlib_u32 s0;
 210       mlib_d64 t0, t1, t2, t3;
 211       mlib_s32 off;
 212       mlib_s32 size = xsize;
 213       mlib_d64 *dp = (mlib_d64 *) dst;
 214       mlib_u8 *sp = (void *)src;
 215 
 216       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 217 
 218       for (i = 0; i < off; i++, sp++) {
 219         *dp++ = tab[sp[0]];
 220         size--;
 221       }
 222 
 223       sa = (mlib_u32 *) sp;
 224 
 225       s0 = sa[0];
 226       sa++;
 227 
 228       for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
 229         READ_U8_D64(tab, tab, tab, tab);
 230         s0 = sa[0];
 231         dp[0] = t0;
 232         dp[1] = t1;
 233         dp[2] = t2;
 234         dp[3] = t3;
 235       }
 236 
 237       READ_U8_D64(tab, tab, tab, tab);
 238       dp[0] = t0;
 239       dp[1] = t1;
 240       dp[2] = t2;
 241       dp[3] = t3;
 242       dp += 4;
 243       sp = (mlib_u8 *) sa;
 244       i += 4;
 245       for (; i < size; i++, dp++, sp++)
 246         dp[0] = tab[sp[0]];
 247     }
 248   }
 249   else if (csize == 2) {
 250     mlib_s32 i, j;
 251 
 252     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 253       mlib_u32 *sa;
 254       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 255       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 256       mlib_d64 *tab;
 257       mlib_u32 s0;
 258       mlib_d64 t0, t1, t2, t3;
 259       mlib_s32 off;
 260       mlib_s32 size = xsize * 2;
 261       mlib_d64 *dp = (mlib_d64 *) dst;
 262       mlib_u8 *sp = (void *)src;
 263 
 264       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 265 
 266       for (i = 0; i < off - 1; i += 2, sp += 2) {
 267         *dp++ = tab0[sp[0]];
 268         *dp++ = tab1[sp[1]];
 269         size -= 2;
 270       }
 271 
 272       if ((off & 1) != 0) {
 273         *dp++ = tab0[*sp];
 274         size--;
 275         sp++;
 276         tab = tab0;
 277         tab0 = tab1;
 278         tab1 = tab;
 279       }
 280 
 281       sa = (mlib_u32 *) sp;
 282 
 283       s0 = sa[0];
 284       sa++;
 285 
 286       for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
 287         READ_U8_D64(tab0, tab1, tab0, tab1);
 288         s0 = sa[0];
 289         dp[0] = t0;
 290         dp[1] = t1;
 291         dp[2] = t2;
 292         dp[3] = t3;
 293       }
 294 
 295       READ_U8_D64(tab0, tab1, tab0, tab1);
 296       dp[0] = t0;
 297       dp[1] = t1;
 298       dp[2] = t2;
 299       dp[3] = t3;
 300       dp += 4;
 301       sp = (mlib_u8 *) sa;
 302       i += 4;
 303 
 304       for (; i < size - 1; i += 2, sp += 2) {
 305         *dp++ = tab0[sp[0]];
 306         *dp++ = tab1[sp[1]];
 307       }
 308 
 309       if (i < size)
 310         *dp = tab0[(*sp)];
 311     }
 312   }
 313   else if (csize == 3) {
 314     mlib_s32 i, j;
 315 
 316     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 317       mlib_u32 *sa;
 318       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 319       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 320       mlib_d64 *tab2 = (mlib_d64 *) table[2];
 321       mlib_d64 *tab;
 322       mlib_u32 s0;
 323       mlib_d64 t0, t1, t2, t3;
 324       mlib_s32 off;
 325       mlib_s32 size = xsize * 3;
 326       mlib_d64 *dp = (mlib_d64 *) dst;
 327       mlib_u8 *sp = (void *)src;
 328 
 329       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 330 
 331       if (off == 1) {
 332         *dp++ = tab0[(*sp)];
 333         tab = tab0;
 334         tab0 = tab1;
 335         tab1 = tab2;
 336         tab2 = tab;
 337         size--;
 338         sp++;
 339       }
 340       else if (off == 2) {
 341         *dp++ = tab0[sp[0]];
 342         *dp++ = tab1[sp[1]];
 343         tab = tab2;
 344         tab2 = tab1;
 345         tab1 = tab0;
 346         tab0 = tab;
 347         size -= 2;
 348         sp += 2;
 349       }
 350       else if (off == 3) {
 351         *dp++ = tab0[sp[0]];
 352         *dp++ = tab1[sp[1]];
 353         *dp++ = tab2[sp[2]];
 354         size -= 3;
 355         sp += 3;
 356       }
 357 
 358       sa = (mlib_u32 *) sp;
 359 
 360       s0 = sa[0];
 361       sa++;
 362 
 363       for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
 364         READ_U8_D64(tab0, tab1, tab2, tab0);
 365         tab = tab0;
 366         tab0 = tab1;
 367         tab1 = tab2;
 368         tab2 = tab;
 369         s0 = sa[0];
 370         dp[0] = t0;
 371         dp[1] = t1;
 372         dp[2] = t2;
 373         dp[3] = t3;
 374       }
 375 
 376       READ_U8_D64(tab0, tab1, tab2, tab0);
 377       dp[0] = t0;
 378       dp[1] = t1;
 379       dp[2] = t2;
 380       dp[3] = t3;
 381       dp += 4;
 382       sp = (mlib_u8 *) sa;
 383       i += 4;
 384 
 385       if (i < size) {
 386         *dp++ = tab1[(*sp)];
 387         i++;
 388         sp++;
 389       }
 390 
 391       if (i < size) {
 392         *dp++ = tab2[(*sp)];
 393         i++;
 394         sp++;
 395       }
 396 
 397       if (i < size) {
 398         *dp = tab0[(*sp)];
 399       }
 400     }
 401   }
 402   else if (csize == 4) {
 403     mlib_s32 i, j;
 404 
 405     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 406       mlib_u32 *sa;
 407       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 408       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 409       mlib_d64 *tab2 = (mlib_d64 *) table[2];
 410       mlib_d64 *tab3 = (mlib_d64 *) table[3];
 411       mlib_d64 *tab;
 412       mlib_u32 s0;
 413       mlib_d64 t0, t1, t2, t3;
 414       mlib_s32 off;
 415       mlib_s32 size = xsize * 4;
 416       mlib_d64 *dp = (mlib_d64 *) dst;
 417       mlib_u8 *sp = (void *)src;
 418 
 419       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 420 
 421       if (off == 1) {
 422         *dp++ = tab0[(*sp)];
 423         tab = tab0;
 424         tab0 = tab1;
 425         tab1 = tab2;
 426         tab2 = tab3;
 427         tab3 = tab;
 428         size--;
 429         sp++;
 430       }
 431       else if (off == 2) {
 432         *dp++ = tab0[sp[0]];
 433         *dp++ = tab1[sp[1]];
 434         tab = tab0;
 435         tab0 = tab2;
 436         tab2 = tab;
 437         tab = tab1;
 438         tab1 = tab3;
 439         tab3 = tab;
 440         size -= 2;
 441         sp += 2;
 442       }
 443       else if (off == 3) {
 444         *dp++ = tab0[sp[0]];
 445         *dp++ = tab1[sp[1]];
 446         *dp++ = tab2[sp[2]];
 447         tab = tab3;
 448         tab3 = tab2;
 449         tab2 = tab1;
 450         tab1 = tab0;
 451         tab0 = tab;
 452         size -= 3;
 453         sp += 3;
 454       }
 455 
 456       sa = (mlib_u32 *) sp;
 457 
 458       s0 = sa[0];
 459       sa++;
 460 
 461       for (i = 0; i < size - 7; i += 4, dp += 4, sa++) {
 462         READ_U8_D64(tab0, tab1, tab2, tab3);
 463         s0 = sa[0];
 464         dp[0] = t0;
 465         dp[1] = t1;
 466         dp[2] = t2;
 467         dp[3] = t3;
 468       }
 469 
 470       READ_U8_D64(tab0, tab1, tab2, tab3);
 471       dp[0] = t0;
 472       dp[1] = t1;
 473       dp[2] = t2;
 474       dp[3] = t3;
 475       dp += 4;
 476       sp = (mlib_u8 *) sa;
 477       i += 4;
 478 
 479       if (i < size) {
 480         *dp++ = tab0[(*sp)];
 481         i++;
 482         sp++;
 483       }
 484 
 485       if (i < size) {
 486         *dp++ = tab1[(*sp)];
 487         i++;
 488         sp++;
 489       }
 490 
 491       if (i < size) {
 492         *dp = tab2[(*sp)];
 493       }
 494     }
 495   }
 496 }
 497 
 498 /***************************************************************/
 499 void mlib_ImageLookUp_S16_D64(const mlib_s16 *src,
 500                               mlib_s32       slb,
 501                               mlib_d64       *dst,
 502                               mlib_s32       dlb,
 503                               mlib_s32       xsize,
 504                               mlib_s32       ysize,
 505                               mlib_s32       csize,
 506                               const mlib_d64 **table)
 507 {
 508   const mlib_d64 *table_base[4];
 509   mlib_s32 c;
 510 
 511   for (c = 0; c < csize; c++) {
 512     table_base[c] = &table[c][32768];
 513   }
 514 
 515   MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s16, table_base);
 516 }
 517 
 518 /***************************************************************/
 519 void mlib_ImageLookUp_U16_D64(const mlib_u16 *src,
 520                               mlib_s32       slb,
 521                               mlib_d64       *dst,
 522                               mlib_s32       dlb,
 523                               mlib_s32       xsize,
 524                               mlib_s32       ysize,
 525                               mlib_s32       csize,
 526                               const mlib_d64 **table)
 527 {
 528   const mlib_d64 *table_base[4];
 529   mlib_s32 c;
 530 
 531   for (c = 0; c < csize; c++) {
 532     table_base[c] = &table[c][0];
 533   }
 534 
 535   MLIB_C_IMAGELOOKUP(mlib_d64, mlib_u16, table_base);
 536 }
 537 
 538 /***************************************************************/
 539 void mlib_ImageLookUp_S32_D64(const mlib_s32 *src,
 540                               mlib_s32       slb,
 541                               mlib_d64       *dst,
 542                               mlib_s32       dlb,
 543                               mlib_s32       xsize,
 544                               mlib_s32       ysize,
 545                               mlib_s32       csize,
 546                               const mlib_d64 **table)
 547 {
 548   const mlib_d64 *table_base[4];
 549   mlib_u32 shift = TABLE_SHIFT_S32;
 550   mlib_s32 c;
 551 
 552   for (c = 0; c < csize; c++) {
 553     table_base[c] = &table[c][shift];
 554   }
 555 
 556   MLIB_C_IMAGELOOKUP(mlib_d64, mlib_s32, table_base);
 557 }
 558 
 559 /***************************************************************/
 560 void mlib_ImageLookUpSI_U8_D64(const mlib_u8  *src,
 561                                mlib_s32       slb,
 562                                mlib_d64       *dst,
 563                                mlib_s32       dlb,
 564                                mlib_s32       xsize,
 565                                mlib_s32       ysize,
 566                                mlib_s32       csize,
 567                                const mlib_d64 **table)
 568 {
 569 
 570   if (xsize < 7) {
 571     MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u8, table);
 572   }
 573   else if (csize == 2) {
 574     mlib_s32 i, j;
 575 
 576     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 577       mlib_u32 *sa;
 578       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 579       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 580       mlib_u32 s0;
 581       mlib_d64 t0, t1, t2, t3;
 582       mlib_s32 off;
 583       mlib_s32 size = xsize;
 584       mlib_d64 *dp = (mlib_d64 *) dst;
 585       mlib_u8 *sp = (void *)src;
 586 
 587       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 588 
 589       for (i = 0; i < off; i++, sp++) {
 590         *dp++ = tab0[sp[0]];
 591         *dp++ = tab1[sp[0]];
 592         size--;
 593       }
 594 
 595       sa = (mlib_u32 *) sp;
 596 
 597       s0 = sa[0];
 598       sa++;
 599 
 600       for (i = 0; i < size - 7; i += 4, dp += 8, sa++) {
 601 #ifdef _LITTLE_ENDIAN
 602         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 603         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 604         t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 605         t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 606 #else
 607         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 608         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 609         t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 610         t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 611 #endif /* _LITTLE_ENDIAN */
 612         dp[0] = t0;
 613         dp[1] = t1;
 614         dp[2] = t2;
 615         dp[3] = t3;
 616 #ifdef _LITTLE_ENDIAN
 617         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 618         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 619         t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 620         t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 621 #else
 622         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 623         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 624         t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 625         t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 626 #endif /* _LITTLE_ENDIAN */
 627         s0 = sa[0];
 628         dp[4] = t0;
 629         dp[5] = t1;
 630         dp[6] = t2;
 631         dp[7] = t3;
 632       }
 633 
 634 #ifdef _LITTLE_ENDIAN
 635       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 636       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 637       t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 638       t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 639 #else
 640       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 641       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 642       t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 643       t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 644 #endif /* _LITTLE_ENDIAN */
 645       dp[0] = t0;
 646       dp[1] = t1;
 647       dp[2] = t2;
 648       dp[3] = t3;
 649 #ifdef _LITTLE_ENDIAN
 650       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 651       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 652       t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 653       t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 654 #else
 655       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 656       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 657       t2 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 658       t3 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 659 #endif /* _LITTLE_ENDIAN */
 660       dp[4] = t0;
 661       dp[5] = t1;
 662       dp[6] = t2;
 663       dp[7] = t3;
 664       dp += 8;
 665       sp = (mlib_u8 *) sa;
 666       i += 4;
 667 
 668       for (; i < size; i++, sp++) {
 669         *dp++ = tab0[sp[0]];
 670         *dp++ = tab1[sp[0]];
 671       }
 672     }
 673   }
 674   else if (csize == 3) {
 675     mlib_s32 i, j;
 676 
 677     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 678       mlib_u32 *sa;
 679       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 680       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 681       mlib_d64 *tab2 = (mlib_d64 *) table[2];
 682       mlib_u32 s0;
 683       mlib_d64 t0, t1, t2, t3, t4, t5;
 684       mlib_s32 off;
 685       mlib_s32 size = xsize;
 686       mlib_d64 *dp = (mlib_d64 *) dst;
 687       mlib_u8 *sp = (void *)src;
 688 
 689       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 690 
 691       for (i = 0; i < off; i++, sp++) {
 692         *dp++ = tab0[sp[0]];
 693         *dp++ = tab1[sp[0]];
 694         *dp++ = tab2[sp[0]];
 695         size--;
 696       }
 697 
 698       sa = (mlib_u32 *) sp;
 699 
 700       s0 = sa[0];
 701       sa++;
 702 
 703       for (i = 0; i < size - 7; i += 4, dp += 12, sa++) {
 704 #ifdef _LITTLE_ENDIAN
 705         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 706         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 707         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 708         t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 709         t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 710         t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 711 #else
 712         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 713         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 714         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 715         t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 716         t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 717         t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 718 #endif /* _LITTLE_ENDIAN */
 719         dp[0] = t0;
 720         dp[1] = t1;
 721         dp[2] = t2;
 722         dp[3] = t3;
 723         dp[4] = t4;
 724         dp[5] = t5;
 725 #ifdef _LITTLE_ENDIAN
 726         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 727         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 728         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 729         t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 730         t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 731         t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 732 #else
 733         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 734         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 735         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 736         t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 737         t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 738         t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 739 #endif /* _LITTLE_ENDIAN */
 740         s0 = sa[0];
 741         dp[6] = t0;
 742         dp[7] = t1;
 743         dp[8] = t2;
 744         dp[9] = t3;
 745         dp[10] = t4;
 746         dp[11] = t5;
 747       }
 748 
 749 #ifdef _LITTLE_ENDIAN
 750       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 751       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 752       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 753       t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 754       t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 755       t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 756 #else
 757       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 758       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 759       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 760       t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 761       t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 762       t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 763 #endif /* _LITTLE_ENDIAN */
 764       dp[0] = t0;
 765       dp[1] = t1;
 766       dp[2] = t2;
 767       dp[3] = t3;
 768       dp[4] = t4;
 769       dp[5] = t5;
 770 #ifdef _LITTLE_ENDIAN
 771       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 772       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 773       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 774       t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 775       t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 776       t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 777 #else
 778       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 779       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 780       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 781       t3 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 782       t4 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 783       t5 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 784 #endif /* _LITTLE_ENDIAN */
 785       dp[6] = t0;
 786       dp[7] = t1;
 787       dp[8] = t2;
 788       dp[9] = t3;
 789       dp[10] = t4;
 790       dp[11] = t5;
 791       dp += 12;
 792       sp = (mlib_u8 *) sa;
 793       i += 4;
 794 
 795       for (; i < size; i++, sp++) {
 796         *dp++ = tab0[sp[0]];
 797         *dp++ = tab1[sp[0]];
 798         *dp++ = tab2[sp[0]];
 799       }
 800     }
 801   }
 802   else if (csize == 4) {
 803     mlib_s32 i, j;
 804 
 805     for (j = 0; j < ysize; j++, dst += dlb, src += slb) {
 806       mlib_u32 *sa;
 807       mlib_d64 *tab0 = (mlib_d64 *) table[0];
 808       mlib_d64 *tab1 = (mlib_d64 *) table[1];
 809       mlib_d64 *tab2 = (mlib_d64 *) table[2];
 810       mlib_d64 *tab3 = (mlib_d64 *) table[3];
 811       mlib_u32 s0;
 812       mlib_d64 t0, t1, t2, t3;
 813       mlib_s32 off;
 814       mlib_s32 size = xsize;
 815       mlib_d64 *dp = (mlib_d64 *) dst;
 816       mlib_u8 *sp = (void *)src;
 817 
 818       off = (mlib_s32) ((4 - ((mlib_addr) src & 3)) & 3);
 819 
 820       for (i = 0; i < off; i++, sp++) {
 821         *dp++ = tab0[sp[0]];
 822         *dp++ = tab1[sp[0]];
 823         *dp++ = tab2[sp[0]];
 824         *dp++ = tab3[sp[0]];
 825         size--;
 826       }
 827 
 828       sa = (mlib_u32 *) sp;
 829 
 830       s0 = sa[0];
 831       sa++;
 832 
 833       for (i = 0; i < size - 7; i += 4, dp += 16, sa++) {
 834 #ifdef _LITTLE_ENDIAN
 835         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 836         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 837         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 838         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
 839 #else
 840         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 841         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 842         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 843         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
 844 #endif /* _LITTLE_ENDIAN */
 845         dp[0] = t0;
 846         dp[1] = t1;
 847         dp[2] = t2;
 848         dp[3] = t3;
 849 #ifdef _LITTLE_ENDIAN
 850         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 851         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 852         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 853         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
 854 #else
 855         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 856         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 857         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 858         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
 859 #endif /* _LITTLE_ENDIAN */
 860         dp[4] = t0;
 861         dp[5] = t1;
 862         dp[6] = t2;
 863         dp[7] = t3;
 864 #ifdef _LITTLE_ENDIAN
 865         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 866         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 867         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 868         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
 869 #else
 870         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 871         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 872         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 873         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
 874 #endif /* _LITTLE_ENDIAN */
 875         dp[8] = t0;
 876         dp[9] = t1;
 877         dp[10] = t2;
 878         dp[11] = t3;
 879 #ifdef _LITTLE_ENDIAN
 880         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 881         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 882         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 883         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
 884 #else
 885         t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 886         t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 887         t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 888         t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
 889 #endif /* _LITTLE_ENDIAN */
 890         s0 = sa[0];
 891         dp[12] = t0;
 892         dp[13] = t1;
 893         dp[14] = t2;
 894         dp[15] = t3;
 895       }
 896 
 897 #ifdef _LITTLE_ENDIAN
 898       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 899       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 900       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 901       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
 902 #else
 903       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 904       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 905       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 906       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
 907 #endif /* _LITTLE_ENDIAN */
 908       dp[0] = t0;
 909       dp[1] = t1;
 910       dp[2] = t2;
 911       dp[3] = t3;
 912 #ifdef _LITTLE_ENDIAN
 913       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 914       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 915       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 916       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
 917 #else
 918       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 919       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 920       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 921       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
 922 #endif /* _LITTLE_ENDIAN */
 923       dp[4] = t0;
 924       dp[5] = t1;
 925       dp[6] = t2;
 926       dp[7] = t3;
 927 #ifdef _LITTLE_ENDIAN
 928       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 13) & 0x7F8));
 929       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 13) & 0x7F8));
 930       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 13) & 0x7F8));
 931       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 13) & 0x7F8));
 932 #else
 933       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 5) & 0x7F8));
 934       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 5) & 0x7F8));
 935       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 5) & 0x7F8));
 936       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 5) & 0x7F8));
 937 #endif /* _LITTLE_ENDIAN */
 938       dp[8] = t0;
 939       dp[9] = t1;
 940       dp[10] = t2;
 941       dp[11] = t3;
 942 #ifdef _LITTLE_ENDIAN
 943       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 >> 21) & 0x7F8));
 944       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 >> 21) & 0x7F8));
 945       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 >> 21) & 0x7F8));
 946       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 >> 21) & 0x7F8));
 947 #else
 948       t0 = *(mlib_d64 *) ((mlib_u8 *) tab0 + ((s0 << 3) & 0x7F8));
 949       t1 = *(mlib_d64 *) ((mlib_u8 *) tab1 + ((s0 << 3) & 0x7F8));
 950       t2 = *(mlib_d64 *) ((mlib_u8 *) tab2 + ((s0 << 3) & 0x7F8));
 951       t3 = *(mlib_d64 *) ((mlib_u8 *) tab3 + ((s0 << 3) & 0x7F8));
 952 #endif /* _LITTLE_ENDIAN */
 953       dp[12] = t0;
 954       dp[13] = t1;
 955       dp[14] = t2;
 956       dp[15] = t3;
 957       dp += 16;
 958       sp = (mlib_u8 *) sa;
 959       i += 4;
 960 
 961       for (; i < size; i++, sp++) {
 962         *dp++ = tab0[sp[0]];
 963         *dp++ = tab1[sp[0]];
 964         *dp++ = tab2[sp[0]];
 965         *dp++ = tab3[sp[0]];
 966       }
 967     }
 968   }
 969 }
 970 
 971 /***************************************************************/
 972 void mlib_ImageLookUpSI_S16_D64(const mlib_s16 *src,
 973                                 mlib_s32       slb,
 974                                 mlib_d64       *dst,
 975                                 mlib_s32       dlb,
 976                                 mlib_s32       xsize,
 977                                 mlib_s32       ysize,
 978                                 mlib_s32       csize,
 979                                 const mlib_d64 **table)
 980 {
 981   const mlib_d64 *table_base[4];
 982   mlib_s32 c;
 983 
 984   for (c = 0; c < csize; c++) {
 985     table_base[c] = &table[c][32768];
 986   }
 987 
 988   MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s16, table_base);
 989 }
 990 
 991 /***************************************************************/
 992 void mlib_ImageLookUpSI_U16_D64(const mlib_u16 *src,
 993                                 mlib_s32       slb,
 994                                 mlib_d64       *dst,
 995                                 mlib_s32       dlb,
 996                                 mlib_s32       xsize,
 997                                 mlib_s32       ysize,
 998                                 mlib_s32       csize,
 999                                 const mlib_d64 **table)
1000 {
1001   const mlib_d64 *table_base[4];
1002   mlib_s32 c;
1003 
1004   for (c = 0; c < csize; c++) {
1005     table_base[c] = &table[c][0];
1006   }
1007 
1008   MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_u16, table_base);
1009 }
1010 
1011 /***************************************************************/
1012 void mlib_ImageLookUpSI_S32_D64(const mlib_s32 *src,
1013                                 mlib_s32       slb,
1014                                 mlib_d64       *dst,
1015                                 mlib_s32       dlb,
1016                                 mlib_s32       xsize,
1017                                 mlib_s32       ysize,
1018                                 mlib_s32       csize,
1019                                 const mlib_d64 **table)
1020 {
1021   const mlib_d64 *table_base[4];
1022   mlib_u32 shift = TABLE_SHIFT_S32;
1023   mlib_s32 c;
1024 
1025   for (c = 0; c < csize; c++) {
1026     table_base[c] = &table[c][shift];
1027   }
1028 
1029   MLIB_C_IMAGELOOKUPSI(mlib_d64, mlib_s32, table_base);
1030 }
1031 
1032 /***************************************************************/