/*
 * Copyright 1998-2003 Sun Microsystems, Inc.  All Rights Reserved.
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
 *
 * This code is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 only, as
 * published by the Free Software Foundation.  Sun designates this
 * particular file as subject to the "Classpath" exception as provided
 * by Sun in the LICENSE file that accompanied this code.
 *
 * This code is distributed in the hope that it will be useful, but WITHOUT
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 * version 2 for more details (a copy is included in the LICENSE file that
 * accompanied this code).
 *
 * You should have received a copy of the GNU General Public License version
 * 2 along with this work; if not, write to the Free Software Foundation,
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
 *
 * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
 * CA 95054 USA or visit www.sun.com if you need additional information or
 * have any questions.
 */



#include "vis_proto.h"
#include "mlib_image.h"
#include "mlib_v_ImageLookUpFunc.h"

/***************************************************************/
static void mlib_v_ImageLookUp_S32_S16_124_D1(const mlib_s32 * src,
                                              mlib_s16 * dst,
                                              mlib_s32 xsize,
                                              const mlib_s16 * table0,
                                              const mlib_s16 * table1,
                                              const mlib_s16 * table2,
                                              const mlib_s16 * table3);

static void mlib_v_ImageLookUp_S32_S16_3_D1(const mlib_s32 * src,
                                            mlib_s16 * dst,
                                            mlib_s32 xsize,
                                            const mlib_s16 * table0,
                                            const mlib_s16 * table1,
                                            const mlib_s16 * table2);

/***************************************************************/

#define VIS_LD_U16_I(X, Y)      vis_ld_u16_i((void *)(X), (Y))

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_124_D1(const mlib_s32 * src,
                                       mlib_s16 * dst,
                                       mlib_s32 xsize,
                                       const mlib_s16 * table0,
                                       const mlib_s16 * table1,
                                       const mlib_s16 * table2,
                                       const mlib_s16 * table3)
{
  mlib_s32 *sp;                        /* pointer to source data */
  mlib_s32 s0, s1, s2, s3;             /* source data */
  mlib_s16 *dl;                        /* pointer to start of destination */
  mlib_s16 *dend;                      /* pointer to end of destination */
  mlib_d64 *dp;                        /* aligned pointer to destination */
  mlib_d64 t0, t1, t2;                 /* destination data */
  mlib_d64 t3, acc0;                   /* destination data */
  mlib_s32 emask;                      /* edge mask */
  mlib_s32 i, num;                     /* loop variable */

  dl = dst;
  sp = (void *)src;
  dp = (mlib_d64 *) dl;
  dend = dl + xsize - 1;

  vis_alignaddr((void *)0, 6);

  if (xsize >= 4) {

    s0 = sp[0];
    s1 = sp[1];
    s2 = sp[2];
    s3 = sp[3];
    sp += 4;

#pragma pipeloop(0)
    for (i = 0; i <= xsize - 8; i += 4, sp += 4) {
      t3 = VIS_LD_U16_I(table3, ((mlib_addr) 2 * s3));
      t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
      t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t3, acc0);
      acc0 = vis_faligndata(t2, acc0);
      acc0 = vis_faligndata(t1, acc0);
      acc0 = vis_faligndata(t0, acc0);
      s0 = sp[0];
      s1 = sp[1];
      s2 = sp[2];
      s3 = sp[3];
      *dp++ = acc0;
    }

    t3 = VIS_LD_U16_I(table3, ((mlib_addr) 2 * s3));
    t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
    t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
    t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
    acc0 = vis_faligndata(t3, acc0);
    acc0 = vis_faligndata(t2, acc0);
    acc0 = vis_faligndata(t1, acc0);
    acc0 = vis_faligndata(t0, acc0);
    *dp++ = acc0;
  }

  if ((mlib_addr) dp <= (mlib_addr) dend) {

    num = (mlib_s32) ((mlib_s16 *) dend - (mlib_s16 *) dp);
    sp += num;
    num++;

    if (num == 1) {
      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }
    else if (num == 2) {
      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }
    else if (num == 3) {
      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }

    emask = vis_edge16(dp, dend);
    vis_pst_16(acc0, dp, emask);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_1(const mlib_s32 * src,
                                  mlib_s32 slb,
                                  mlib_s16 * dst,
                                  mlib_s32 dlb,
                                  mlib_s32 xsize,
                                  mlib_s32 ysize, const mlib_s16 ** table)
{
  mlib_s32 *sl;
  mlib_s16 *dl;
  const mlib_s16 *tab = &table[0][(mlib_u32) 2147483648u];
  mlib_s32 j, i;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j++) {
    mlib_s32 *sp = sl;
    mlib_s16 *dp = dl;
    mlib_s32 off, size = xsize;

    off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);

    off = (off < size) ? off : size;

    for (i = 0; i < off; i++, sp++) {
      *dp++ = tab[sp[0]];
      size--;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab, tab, tab, tab);
    }

    sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_2(const mlib_s32 * src,
                                  mlib_s32 slb,
                                  mlib_s16 * dst,
                                  mlib_s32 dlb,
                                  mlib_s32 xsize,
                                  mlib_s32 ysize, const mlib_s16 ** table)
{
  mlib_s32 *sl;
  mlib_s16 *dl;
  const mlib_s16 *tab;
  mlib_s32 j, i;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j++) {
    mlib_s32 *sp = sl;
    mlib_s16 *dp = dl;
    mlib_s32 off, size = xsize * 2;
    const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
    const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];

    off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);

    off = (off < size) ? off : size;

    for (i = 0; i < off - 1; i += 2, sp += 2) {
      *dp++ = tab0[sp[0]];
      *dp++ = tab1[sp[1]];
      size -= 2;
    }

    if ((off & 1) != 0) {
      *dp++ = tab0[sp[0]];
      size--;
      sp++;
      tab = tab0;
      tab0 = tab1;
      tab1 = tab;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab0, tab1, tab0, tab1);
    }

    sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_4(const mlib_s32 * src,
                                  mlib_s32 slb,
                                  mlib_s16 * dst,
                                  mlib_s32 dlb,
                                  mlib_s32 xsize,
                                  mlib_s32 ysize, const mlib_s16 ** table)
{
  mlib_s32 *sl;
  mlib_s16 *dl;
  const mlib_s16 *tab;
  mlib_s32 j;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j++) {
    mlib_s32 *sp = sl;
    mlib_s16 *dp = dl;
    const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
    const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
    const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
    const mlib_s16 *tab3 = &table[3][(mlib_u32) 2147483648u];
    mlib_s32 off, size = xsize * 4;

    off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);

    off = (off < size) ? off : size;

    if (off == 1) {
      *dp++ = tab0[sp[0]];
      tab = tab0;
      tab0 = tab1;
      tab1 = tab2;
      tab2 = tab3;
      tab3 = tab;
      size--;
      sp++;
    }
    else if (off == 2) {
      *dp++ = tab0[sp[0]];
      *dp++ = tab1[sp[1]];
      tab = tab0;
      tab0 = tab2;
      tab2 = tab;
      tab = tab1;
      tab1 = tab3;
      tab3 = tab;
      size -= 2;
      sp += 2;
    }
    else if (off == 3) {
      *dp++ = tab0[sp[0]];
      *dp++ = tab1[sp[1]];
      *dp++ = tab2[sp[2]];
      tab = tab3;
      tab3 = tab2;
      tab2 = tab1;
      tab1 = tab0;
      tab0 = tab;
      size -= 3;
      sp += 3;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S32_S16_124_D1(sp, dp, size, tab0, tab1, tab2, tab3);
    }

    sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_3_D1(const mlib_s32 * src,
                                     mlib_s16 * dst,
                                     mlib_s32 xsize,
                                     const mlib_s16 * table0,
                                     const mlib_s16 * table1,
                                     const mlib_s16 * table2)
{
  mlib_s32 *sp;                        /* pointer to source data */
  mlib_s32 s0, s1, s2, s3;             /* source data */
  mlib_s16 *dl;                        /* pointer to start of destination */
  mlib_s16 *dend;                      /* pointer to end of destination */
  mlib_d64 *dp;                        /* aligned pointer to destination */
  mlib_d64 t0, t1, t2, t3;             /* destination data */
  mlib_d64 acc0;                       /* destination data */
  mlib_s32 emask;                      /* edge mask */
  mlib_s32 i, num;                     /* loop variable */
  const mlib_s16 *table;

  dl = dst;
  sp = (void *)src;
  dp = (mlib_d64 *) dl;
  dend = dl + xsize - 1;

  vis_alignaddr((void *)0, 6);

  if (xsize >= 4) {

    s0 = sp[0];
    s1 = sp[1];
    s2 = sp[2];
    s3 = sp[3];
    sp += 4;

#pragma pipeloop(0)
    for (i = 0; i <= xsize - 8; i += 4, sp += 4) {
      t3 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s3));
      t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
      t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t3, acc0);
      acc0 = vis_faligndata(t2, acc0);
      acc0 = vis_faligndata(t1, acc0);
      acc0 = vis_faligndata(t0, acc0);
      s0 = sp[0];
      s1 = sp[1];
      s2 = sp[2];
      s3 = sp[3];
      *dp++ = acc0;
      table = table0;
      table0 = table1;
      table1 = table2;
      table2 = table;
    }

    t3 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s3));
    t2 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s2));
    t1 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s1));
    t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
    acc0 = vis_faligndata(t3, acc0);
    acc0 = vis_faligndata(t2, acc0);
    acc0 = vis_faligndata(t1, acc0);
    acc0 = vis_faligndata(t0, acc0);
    *dp++ = acc0;
    table = table0;
    table0 = table1;
    table1 = table2;
    table2 = table;
  }

  if ((mlib_addr) dp <= (mlib_addr) dend) {

    num = (mlib_s32) ((mlib_s16 *) dend - (mlib_s16 *) dp);
    sp += num;
    num++;

    if (num == 1) {
      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }
    else if (num == 2) {
      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }
    else if (num == 3) {
      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table2, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;
      sp--;

      t0 = VIS_LD_U16_I(table1, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);

      s0 = *sp;

      t0 = VIS_LD_U16_I(table0, ((mlib_addr) 2 * s0));
      acc0 = vis_faligndata(t0, acc0);
    }

    emask = vis_edge16(dp, dend);
    vis_pst_16(acc0, dp, emask);
  }
}

/***************************************************************/
void mlib_v_ImageLookUp_S32_S16_3(const mlib_s32 * src,
                                  mlib_s32 slb,
                                  mlib_s16 * dst,
                                  mlib_s32 dlb,
                                  mlib_s32 xsize,
                                  mlib_s32 ysize, const mlib_s16 ** table)
{
  mlib_s32 *sl;
  mlib_s16 *dl;
  const mlib_s16 *tab;
  mlib_s32 j, i;

  sl = (void *)src;
  dl = dst;

  /* row loop */
  for (j = 0; j < ysize; j++) {
    mlib_s32 *sp = sl;
    mlib_s16 *dp = dl;
    const mlib_s16 *tab0 = &table[0][(mlib_u32) 2147483648u];
    const mlib_s16 *tab1 = &table[1][(mlib_u32) 2147483648u];
    const mlib_s16 *tab2 = &table[2][(mlib_u32) 2147483648u];
    mlib_s32 off, size = xsize * 3;

    off = (mlib_s32) (((8 - ((mlib_addr) dp & 7)) & 7) >> 1);

    off = (off < size) ? off : size;

    for (i = 0; i < off - 2; i += 3, sp += 3) {
      *dp++ = tab0[sp[0]];
      *dp++ = tab1[sp[1]];
      *dp++ = tab2[sp[2]];
      size -= 3;
    }

    off -= i;

    if (off == 1) {
      *dp++ = tab0[sp[0]];
      tab = tab0;
      tab0 = tab1;
      tab1 = tab2;
      tab2 = tab;
      size--;
      sp++;
    }
    else if (off == 2) {
      *dp++ = tab0[sp[0]];
      *dp++ = tab1[sp[1]];
      tab = tab2;
      tab2 = tab1;
      tab1 = tab0;
      tab0 = tab;
      size -= 2;
      sp += 2;
    }

    if (size > 0) {
      mlib_v_ImageLookUp_S32_S16_3_D1(sp, dp, size, tab0, tab1, tab2);
    }

    sl = (mlib_s32 *) ((mlib_u8 *) sl + slb);
    dl = (mlib_s16 *) ((mlib_u8 *) dl + dlb);
  }
}

/***************************************************************/
