jdk/src/solaris/native/sun/awt/medialib/mlib_v_ImageLookUpS32S16Func.c
changeset 2 90ce3da70b43
child 5506 202f599c92aa
equal deleted inserted replaced
0:fd16c54261b3 2:90ce3da70b43
       
     1 /*
       
     2  * Copyright 1998-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 
       
    26 
       
    27 
       
    28 #include "vis_proto.h"
       
    29 #include "mlib_image.h"
       
    30 #include "mlib_v_ImageLookUpFunc.h"
       
    31 
       
    32 /***************************************************************/
       
    33 static void mlib_v_ImageLookUp_S32_S16_124_D1(const mlib_s32 * src,
       
    34                                               mlib_s16 * dst,
       
    35                                               mlib_s32 xsize,
       
    36                                               const mlib_s16 * table0,
       
    37                                               const mlib_s16 * table1,
       
    38                                               const mlib_s16 * table2,
       
    39                                               const mlib_s16 * table3);
       
    40 
       
    41 static void mlib_v_ImageLookUp_S32_S16_3_D1(const mlib_s32 * src,
       
    42                                             mlib_s16 * dst,
       
    43                                             mlib_s32 xsize,
       
    44                                             const mlib_s16 * table0,
       
    45                                             const mlib_s16 * table1,
       
    46                                             const mlib_s16 * table2);
       
    47 
       
    48 /***************************************************************/
       
    49 
       
    50 #define VIS_LD_U16_I(X, Y)      vis_ld_u16_i((void *)(X), (Y))
       
    51 
       
    52 /***************************************************************/
       
    53 void mlib_v_ImageLookUp_S32_S16_124_D1(const mlib_s32 * src,
       
    54                                        mlib_s16 * dst,
       
    55                                        mlib_s32 xsize,
       
    56                                        const mlib_s16 * table0,
       
    57                                        const mlib_s16 * table1,
       
    58                                        const mlib_s16 * table2,
       
    59                                        const mlib_s16 * table3)
       
    60 {
       
    61   mlib_s32 *sp;                        /* pointer to source data */
       
    62   mlib_s32 s0, s1, s2, s3;             /* source data */
       
    63   mlib_s16 *dl;                        /* pointer to start of destination */
       
    64   mlib_s16 *dend;                      /* pointer to end of destination */
       
    65   mlib_d64 *dp;                        /* aligned pointer to destination */
       
    66   mlib_d64 t0, t1, t2;                 /* destination data */
       
    67   mlib_d64 t3, acc0;                   /* destination data */
       
    68   mlib_s32 emask;                      /* edge mask */
       
    69   mlib_s32 i, num;                     /* loop variable */
       
    70 
       
    71   dl = dst;
       
    72   sp = (void *)src;
       
    73   dp = (mlib_d64 *) dl;
       
    74   dend = dl + xsize - 1;
       
    75 
       
    76   vis_alignaddr((void *)0, 6);
       
    77 
       
    78   if (xsize >= 4) {
       
    79 
       
    80     s0 = sp[0];
       
    81     s1 = sp[1];
       
    82     s2 = sp[2];
       
    83     s3 = sp[3];
       
    84     sp += 4;
       
    85 
       
    86 #pragma pipeloop(0)
       
    87     for (i = 0; i <= xsize - 8; i += 4, sp += 4) {
       
    88       t3 = VIS_LD_U16_I(table3, ((mlib_addr) 2 * s3));
       
    89       t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
       
    90       t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
       
    91       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
    92       acc0 = vis_faligndata(t3, acc0);
       
    93       acc0 = vis_faligndata(t2, acc0);
       
    94       acc0 = vis_faligndata(t1, acc0);
       
    95       acc0 = vis_faligndata(t0, acc0);
       
    96       s0 = sp[0];
       
    97       s1 = sp[1];
       
    98       s2 = sp[2];
       
    99       s3 = sp[3];
       
   100       *dp++ = acc0;
       
   101     }
       
   102 
       
   103     t3 = VIS_LD_U16_I(table3, ((mlib_addr) 2 * s3));
       
   104     t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
       
   105     t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
       
   106     t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   107     acc0 = vis_faligndata(t3, acc0);
       
   108     acc0 = vis_faligndata(t2, acc0);
       
   109     acc0 = vis_faligndata(t1, acc0);
       
   110     acc0 = vis_faligndata(t0, acc0);
       
   111     *dp++ = acc0;
       
   112   }
       
   113 
       
   114   if ((mlib_addr) dp <= (mlib_addr) dend) {
       
   115 
       
   116     num = (mlib_s32) ((mlib_s16 *) dend - (mlib_s16 *) dp);
       
   117     sp += num;
       
   118     num++;
       
   119 
       
   120     if (num == 1) {
       
   121       s0 = *sp;
       
   122 
       
   123       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   124       acc0 = vis_faligndata(t0, acc0);
       
   125     }
       
   126     else if (num == 2) {
       
   127       s0 = *sp;
       
   128       sp--;
       
   129 
       
   130       t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
       
   131       acc0 = vis_faligndata(t0, acc0);
       
   132 
       
   133       s0 = *sp;
       
   134 
       
   135       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   136       acc0 = vis_faligndata(t0, acc0);
       
   137     }
       
   138     else if (num == 3) {
       
   139       s0 = *sp;
       
   140       sp--;
       
   141 
       
   142       t0 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s0));
       
   143       acc0 = vis_faligndata(t0, acc0);
       
   144 
       
   145       s0 = *sp;
       
   146       sp--;
       
   147 
       
   148       t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
       
   149       acc0 = vis_faligndata(t0, acc0);
       
   150 
       
   151       s0 = *sp;
       
   152 
       
   153       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   154       acc0 = vis_faligndata(t0, acc0);
       
   155     }
       
   156 
       
   157     emask = vis_edge16(dp, dend);
       
   158     vis_pst_16(acc0, dp, emask);
       
   159   }
       
   160 }
       
   161 
       
   162 /***************************************************************/
       
   163 void mlib_v_ImageLookUp_S32_S16_1(const mlib_s32 * src,
       
   164                                   mlib_s32 slb,
       
   165                                   mlib_s16 * dst,
       
   166                                   mlib_s32 dlb,
       
   167                                   mlib_s32 xsize,
       
   168                                   mlib_s32 ysize, const mlib_s16 ** table)
       
   169 {
       
   170   mlib_s32 *sl;
       
   171   mlib_s16 *dl;
       
   172   const mlib_s16 *tab = &table[0][(mlib_u32) 2147483648u];
       
   173   mlib_s32 j, i;
       
   174 
       
   175   sl = (void *)src;
       
   176   dl = dst;
       
   177 
       
   178   /* row loop */
       
   179   for (j = 0; j < ysize; j++) {
       
   180     mlib_s32 *sp = sl;
       
   181     mlib_s16 *dp = dl;
       
   182     mlib_s32 off, size = xsize;
       
   183 
       
   184     off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);
       
   185 
       
   186     off = (off < size) ? off : size;
       
   187 
       
   188     for (i = 0; i < off; i++, sp++) {
       
   189       *dp++ = tab[sp[0]];
       
   190       size--;
       
   191     }
       
   192 
       
   193     if (size > 0) {
       
   194       mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab, tab, tab, tab);
       
   195     }
       
   196 
       
   197     sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
       
   198     dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
       
   199   }
       
   200 }
       
   201 
       
   202 /***************************************************************/
       
   203 void mlib_v_ImageLookUp_S32_S16_2(const mlib_s32 * src,
       
   204                                   mlib_s32 slb,
       
   205                                   mlib_s16 * dst,
       
   206                                   mlib_s32 dlb,
       
   207                                   mlib_s32 xsize,
       
   208                                   mlib_s32 ysize, const mlib_s16 ** table)
       
   209 {
       
   210   mlib_s32 *sl;
       
   211   mlib_s16 *dl;
       
   212   const mlib_s16 *tab;
       
   213   mlib_s32 j, i;
       
   214 
       
   215   sl = (void *)src;
       
   216   dl = dst;
       
   217 
       
   218   /* row loop */
       
   219   for (j = 0; j < ysize; j++) {
       
   220     mlib_s32 *sp = sl;
       
   221     mlib_s16 *dp = dl;
       
   222     mlib_s32 off, size = xsize * 2;
       
   223     const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
       
   224     const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
       
   225 
       
   226     off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);
       
   227 
       
   228     off = (off < size) ? off : size;
       
   229 
       
   230     for (i = 0; i < off - 1; i += 2, sp += 2) {
       
   231       *dp++ = tab0[sp[0]];
       
   232       *dp++ = tab1[sp[1]];
       
   233       size -= 2;
       
   234     }
       
   235 
       
   236     if ((off & 1) != 0) {
       
   237       *dp++ = tab0[sp[0]];
       
   238       size--;
       
   239       sp++;
       
   240       tab = tab0;
       
   241       tab0 = tab1;
       
   242       tab1 = tab;
       
   243     }
       
   244 
       
   245     if (size > 0) {
       
   246       mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab0, tab1, tab0, tab1);
       
   247     }
       
   248 
       
   249     sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
       
   250     dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
       
   251   }
       
   252 }
       
   253 
       
   254 /***************************************************************/
       
   255 void mlib_v_ImageLookUp_S32_S16_4(const mlib_s32 * src,
       
   256                                   mlib_s32 slb,
       
   257                                   mlib_s16 * dst,
       
   258                                   mlib_s32 dlb,
       
   259                                   mlib_s32 xsize,
       
   260                                   mlib_s32 ysize, const mlib_s16 ** table)
       
   261 {
       
   262   mlib_s32 *sl;
       
   263   mlib_s16 *dl;
       
   264   const mlib_s16 *tab;
       
   265   mlib_s32 j;
       
   266 
       
   267   sl = (void *)src;
       
   268   dl = dst;
       
   269 
       
   270   /* row loop */
       
   271   for (j = 0; j < ysize; j++) {
       
   272     mlib_s32 *sp = sl;
       
   273     mlib_s16 *dp = dl;
       
   274     const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
       
   275     const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
       
   276     const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
       
   277     const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
       
   278     mlib_s32 off, size = xsize * 4;
       
   279 
       
   280     off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);
       
   281 
       
   282     off = (off < size) ? off : size;
       
   283 
       
   284     if (off == 1) {
       
   285       *dp++ = tab0[sp[0]];
       
   286       tab = tab0;
       
   287       tab0 = tab1;
       
   288       tab1 = tab2;
       
   289       tab2 = tab3;
       
   290       tab3 = tab;
       
   291       size--;
       
   292       sp++;
       
   293     }
       
   294     else if (off == 2) {
       
   295       *dp++ = tab0[sp[0]];
       
   296       *dp++ = tab1[sp[1]];
       
   297       tab = tab0;
       
   298       tab0 = tab2;
       
   299       tab2 = tab;
       
   300       tab = tab1;
       
   301       tab1 = tab3;
       
   302       tab3 = tab;
       
   303       size -= 2;
       
   304       sp += 2;
       
   305     }
       
   306     else if (off == 3) {
       
   307       *dp++ = tab0[sp[0]];
       
   308       *dp++ = tab1[sp[1]];
       
   309       *dp++ = tab2[sp[2]];
       
   310       tab = tab3;
       
   311       tab3 = tab2;
       
   312       tab2 = tab1;
       
   313       tab1 = tab0;
       
   314       tab0 = tab;
       
   315       size -= 3;
       
   316       sp += 3;
       
   317     }
       
   318 
       
   319     if (size > 0) {
       
   320       mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab0, tab1, tab2, tab3);
       
   321     }
       
   322 
       
   323     sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
       
   324     dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
       
   325   }
       
   326 }
       
   327 
       
   328 /***************************************************************/
       
   329 void mlib_v_ImageLookUp_S32_S16_3_D1(const mlib_s32 * src,
       
   330                                      mlib_s16 * dst,
       
   331                                      mlib_s32 xsize,
       
   332                                      const mlib_s16 * table0,
       
   333                                      const mlib_s16 * table1,
       
   334                                      const mlib_s16 * table2)
       
   335 {
       
   336   mlib_s32 *sp;                        /* pointer to source data */
       
   337   mlib_s32 s0, s1, s2, s3;             /* source data */
       
   338   mlib_s16 *dl;                        /* pointer to start of destination */
       
   339   mlib_s16 *dend;                      /* pointer to end of destination */
       
   340   mlib_d64 *dp;                        /* aligned pointer to destination */
       
   341   mlib_d64 t0, t1, t2, t3;             /* destination data */
       
   342   mlib_d64 acc0;                       /* destination data */
       
   343   mlib_s32 emask;                      /* edge mask */
       
   344   mlib_s32 i, num;                     /* loop variable */
       
   345   const mlib_s16 *table;
       
   346 
       
   347   dl = dst;
       
   348   sp = (void *)src;
       
   349   dp = (mlib_d64 *) dl;
       
   350   dend = dl + xsize - 1;
       
   351 
       
   352   vis_alignaddr((void *)0, 6);
       
   353 
       
   354   if (xsize >= 4) {
       
   355 
       
   356     s0 = sp[0];
       
   357     s1 = sp[1];
       
   358     s2 = sp[2];
       
   359     s3 = sp[3];
       
   360     sp += 4;
       
   361 
       
   362 #pragma pipeloop(0)
       
   363     for (i = 0; i <= xsize - 8; i += 4, sp += 4) {
       
   364       t3 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s3));
       
   365       t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
       
   366       t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
       
   367       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   368       acc0 = vis_faligndata(t3, acc0);
       
   369       acc0 = vis_faligndata(t2, acc0);
       
   370       acc0 = vis_faligndata(t1, acc0);
       
   371       acc0 = vis_faligndata(t0, acc0);
       
   372       s0 = sp[0];
       
   373       s1 = sp[1];
       
   374       s2 = sp[2];
       
   375       s3 = sp[3];
       
   376       *dp++ = acc0;
       
   377       table = table0;
       
   378       table0 = table1;
       
   379       table1 = table2;
       
   380       table2 = table;
       
   381     }
       
   382 
       
   383     t3 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s3));
       
   384     t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
       
   385     t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
       
   386     t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   387     acc0 = vis_faligndata(t3, acc0);
       
   388     acc0 = vis_faligndata(t2, acc0);
       
   389     acc0 = vis_faligndata(t1, acc0);
       
   390     acc0 = vis_faligndata(t0, acc0);
       
   391     *dp++ = acc0;
       
   392     table = table0;
       
   393     table0 = table1;
       
   394     table1 = table2;
       
   395     table2 = table;
       
   396   }
       
   397 
       
   398   if ((mlib_addr) dp <= (mlib_addr) dend) {
       
   399 
       
   400     num = (mlib_s32) ((mlib_s16 *) dend - (mlib_s16 *) dp);
       
   401     sp += num;
       
   402     num++;
       
   403 
       
   404     if (num == 1) {
       
   405       s0 = *sp;
       
   406 
       
   407       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   408       acc0 = vis_faligndata(t0, acc0);
       
   409     }
       
   410     else if (num == 2) {
       
   411       s0 = *sp;
       
   412       sp--;
       
   413 
       
   414       t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
       
   415       acc0 = vis_faligndata(t0, acc0);
       
   416 
       
   417       s0 = *sp;
       
   418 
       
   419       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   420       acc0 = vis_faligndata(t0, acc0);
       
   421     }
       
   422     else if (num == 3) {
       
   423       s0 = *sp;
       
   424       sp--;
       
   425 
       
   426       t0 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s0));
       
   427       acc0 = vis_faligndata(t0, acc0);
       
   428 
       
   429       s0 = *sp;
       
   430       sp--;
       
   431 
       
   432       t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
       
   433       acc0 = vis_faligndata(t0, acc0);
       
   434 
       
   435       s0 = *sp;
       
   436 
       
   437       t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
       
   438       acc0 = vis_faligndata(t0, acc0);
       
   439     }
       
   440 
       
   441     emask = vis_edge16(dp, dend);
       
   442     vis_pst_16(acc0, dp, emask);
       
   443   }
       
   444 }
       
   445 
       
   446 /***************************************************************/
       
   447 void mlib_v_ImageLookUp_S32_S16_3(const mlib_s32 * src,
       
   448                                   mlib_s32 slb,
       
   449                                   mlib_s16 * dst,
       
   450                                   mlib_s32 dlb,
       
   451                                   mlib_s32 xsize,
       
   452                                   mlib_s32 ysize, const mlib_s16 ** table)
       
   453 {
       
   454   mlib_s32 *sl;
       
   455   mlib_s16 *dl;
       
   456   const mlib_s16 *tab;
       
   457   mlib_s32 j, i;
       
   458 
       
   459   sl = (void *)src;
       
   460   dl = dst;
       
   461 
       
   462   /* row loop */
       
   463   for (j = 0; j < ysize; j++) {
       
   464     mlib_s32 *sp = sl;
       
   465     mlib_s16 *dp = dl;
       
   466     const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
       
   467     const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
       
   468     const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
       
   469     mlib_s32 off, size = xsize * 3;
       
   470 
       
   471     off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);
       
   472 
       
   473     off = (off < size) ? off : size;
       
   474 
       
   475     for (i = 0; i < off - 2; i += 3, sp += 3) {
       
   476       *dp++ = tab0[sp[0]];
       
   477       *dp++ = tab1[sp[1]];
       
   478       *dp++ = tab2[sp[2]];
       
   479       size -= 3;
       
   480     }
       
   481 
       
   482     off -= i;
       
   483 
       
   484     if (off == 1) {
       
   485       *dp++ = tab0[sp[0]];
       
   486       tab = tab0;
       
   487       tab0 = tab1;
       
   488       tab1 = tab2;
       
   489       tab2 = tab;
       
   490       size--;
       
   491       sp++;
       
   492     }
       
   493     else if (off == 2) {
       
   494       *dp++ = tab0[sp[0]];
       
   495       *dp++ = tab1[sp[1]];
       
   496       tab = tab2;
       
   497       tab2 = tab1;
       
   498       tab1 = tab0;
       
   499       tab0 = tab;
       
   500       size -= 2;
       
   501       sp += 2;
       
   502     }
       
   503 
       
   504     if (size > 0) {
       
   505       mlib_v_ImageLookUp_S32_S16_3_D1(sp, dp, size, tab0, tab1, tab2);
       
   506     }
       
   507 
       
   508     sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
       
   509     dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
       
   510   }
       
   511 }
       
   512 
       
   513 /***************************************************************/