/*
 * AltiVec optimizations for libjpeg-turbo
 *
 * Copyright (C) 2014-2015, D. R. Commander.  All Rights Reserved.
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

/* SLOW INTEGER INVERSE DCT */

#include "jsimd_altivec.h"


#define F_0_298 2446   /* FIX(0.298631336) */
#define F_0_390 3196   /* FIX(0.390180644) */
#define F_0_541 4433   /* FIX(0.541196100) */
#define F_0_765 6270   /* FIX(0.765366865) */
#define F_0_899 7373   /* FIX(0.899976223) */
#define F_1_175 9633   /* FIX(1.175875602) */
#define F_1_501 12299  /* FIX(1.501321110) */
#define F_1_847 15137  /* FIX(1.847759065) */
#define F_1_961 16069  /* FIX(1.961570560) */
#define F_2_053 16819  /* FIX(2.053119869) */
#define F_2_562 20995  /* FIX(2.562915447) */
#define F_3_072 25172  /* FIX(3.072711026) */

#define CONST_BITS 13
#define PASS1_BITS 2
#define DESCALE_P1 (CONST_BITS - PASS1_BITS)
#define DESCALE_P2 (CONST_BITS + PASS1_BITS + 3)


#define DO_IDCT(in, PASS)  \
{  \
  /* Even part  \
   *  \
   * (Original)  \
   * z1 = (z2 + z3) * 0.541196100;  \
   * tmp2 = z1 + z3 * -1.847759065;  \
   * tmp3 = z1 + z2 * 0.765366865;  \
   *  \
   * (This implementation)  \
   * tmp2 = z2 * 0.541196100 + z3 * (0.541196100 - 1.847759065);  \
   * tmp3 = z2 * (0.541196100 + 0.765366865) + z3 * 0.541196100;  \
   */  \
  \
  in##26l = vec_mergeh(in##2, in##6);  \
  in##26h = vec_mergel(in##2, in##6);  \
  \
  tmp3l = vec_msums(in##26l, pw_f130_f054, pd_zero);  \
  tmp3h = vec_msums(in##26h, pw_f130_f054, pd_zero);  \
  tmp2l = vec_msums(in##26l, pw_f054_mf130, pd_zero);  \
  tmp2h = vec_msums(in##26h, pw_f054_mf130, pd_zero);  \
  \
  tmp0 = vec_add(in##0, in##4);  \
  tmp1 = vec_sub(in##0, in##4);  \
  \
  tmp0l = vec_unpackh(tmp0);  \
  tmp0h = vec_unpackl(tmp0);  \
  tmp0l = vec_sl(tmp0l, const_bits);  \
  tmp0h = vec_sl(tmp0h, const_bits);  \
  tmp0l = vec_add(tmp0l, pd_descale_p##PASS);  \
  tmp0h = vec_add(tmp0h, pd_descale_p##PASS);  \
  \
  tmp10l = vec_add(tmp0l, tmp3l);  \
  tmp10h = vec_add(tmp0h, tmp3h);  \
  tmp13l = vec_sub(tmp0l, tmp3l);  \
  tmp13h = vec_sub(tmp0h, tmp3h);  \
  \
  tmp1l = vec_unpackh(tmp1);  \
  tmp1h = vec_unpackl(tmp1);  \
  tmp1l = vec_sl(tmp1l, const_bits);  \
  tmp1h = vec_sl(tmp1h, const_bits);  \
  tmp1l = vec_add(tmp1l, pd_descale_p##PASS);  \
  tmp1h = vec_add(tmp1h, pd_descale_p##PASS);  \
  \
  tmp11l = vec_add(tmp1l, tmp2l);  \
  tmp11h = vec_add(tmp1h, tmp2h);  \
  tmp12l = vec_sub(tmp1l, tmp2l);  \
  tmp12h = vec_sub(tmp1h, tmp2h);  \
  \
  /* Odd part */  \
  \
  z3 = vec_add(in##3, in##7);  \
  z4 = vec_add(in##1, in##5);  \
  \
  /* (Original)  \
   * z5 = (z3 + z4) * 1.175875602;  \
   * z3 = z3 * -1.961570560;  z4 = z4 * -0.390180644;  \
   * z3 += z5;  z4 += z5;  \
   *  \
   * (This implementation)  \
   * z3 = z3 * (1.175875602 - 1.961570560) + z4 * 1.175875602;  \
   * z4 = z3 * 1.175875602 + z4 * (1.175875602 - 0.390180644);  \
   */  \
  \
  z34l = vec_mergeh(z3, z4);  \
  z34h = vec_mergel(z3, z4);  \
  \
  z3l = vec_msums(z34l, pw_mf078_f117, pd_zero);  \
  z3h = vec_msums(z34h, pw_mf078_f117, pd_zero);  \
  z4l = vec_msums(z34l, pw_f117_f078, pd_zero);  \
  z4h = vec_msums(z34h, pw_f117_f078, pd_zero);  \
  \
  /* (Original)  \
   * z1 = tmp0 + tmp3;  z2 = tmp1 + tmp2;  \
   * tmp0 = tmp0 * 0.298631336;  tmp1 = tmp1 * 2.053119869;  \
   * tmp2 = tmp2 * 3.072711026;  tmp3 = tmp3 * 1.501321110;  \
   * z1 = z1 * -0.899976223;  z2 = z2 * -2.562915447;  \
   * tmp0 += z1 + z3;  tmp1 += z2 + z4;  \
   * tmp2 += z2 + z3;  tmp3 += z1 + z4;  \
   *  \
   * (This implementation)  \
   * tmp0 = tmp0 * (0.298631336 - 0.899976223) + tmp3 * -0.899976223;  \
   * tmp1 = tmp1 * (2.053119869 - 2.562915447) + tmp2 * -2.562915447;  \
   * tmp2 = tmp1 * -2.562915447 + tmp2 * (3.072711026 - 2.562915447);  \
   * tmp3 = tmp0 * -0.899976223 + tmp3 * (1.501321110 - 0.899976223);  \
   * tmp0 += z3;  tmp1 += z4;  \
   * tmp2 += z3;  tmp3 += z4;  \
   */  \
  \
  in##71l = vec_mergeh(in##7, in##1);  \
  in##71h = vec_mergel(in##7, in##1);  \
  \
  tmp0l = vec_msums(in##71l, pw_mf060_mf089, z3l);  \
  tmp0h = vec_msums(in##71h, pw_mf060_mf089, z3h);  \
  tmp3l = vec_msums(in##71l, pw_mf089_f060, z4l);  \
  tmp3h = vec_msums(in##71h, pw_mf089_f060, z4h);  \
  \
  in##53l = vec_mergeh(in##5, in##3);  \
  in##53h = vec_mergel(in##5, in##3);  \
  \
  tmp1l = vec_msums(in##53l, pw_mf050_mf256, z4l);  \
  tmp1h = vec_msums(in##53h, pw_mf050_mf256, z4h);  \
  tmp2l = vec_msums(in##53l, pw_mf256_f050, z3l);  \
  tmp2h = vec_msums(in##53h, pw_mf256_f050, z3h);  \
  \
  /* Final output stage */  \
  \
  out0l = vec_add(tmp10l, tmp3l);  \
  out0h = vec_add(tmp10h, tmp3h);  \
  out7l = vec_sub(tmp10l, tmp3l);  \
  out7h = vec_sub(tmp10h, tmp3h);  \
  \
  out0l = vec_sra(out0l, descale_p##PASS);  \
  out0h = vec_sra(out0h, descale_p##PASS);  \
  out7l = vec_sra(out7l, descale_p##PASS);  \
  out7h = vec_sra(out7h, descale_p##PASS);  \
  \
  out0 = vec_pack(out0l, out0h);  \
  out7 = vec_pack(out7l, out7h);  \
  \
  out1l = vec_add(tmp11l, tmp2l);  \
  out1h = vec_add(tmp11h, tmp2h);  \
  out6l = vec_sub(tmp11l, tmp2l);  \
  out6h = vec_sub(tmp11h, tmp2h);  \
  \
  out1l = vec_sra(out1l, descale_p##PASS);  \
  out1h = vec_sra(out1h, descale_p##PASS);  \
  out6l = vec_sra(out6l, descale_p##PASS);  \
  out6h = vec_sra(out6h, descale_p##PASS);  \
  \
  out1 = vec_pack(out1l, out1h);  \
  out6 = vec_pack(out6l, out6h);  \
  \
  out2l = vec_add(tmp12l, tmp1l);  \
  out2h = vec_add(tmp12h, tmp1h);  \
  out5l = vec_sub(tmp12l, tmp1l);  \
  out5h = vec_sub(tmp12h, tmp1h);  \
  \
  out2l = vec_sra(out2l, descale_p##PASS);  \
  out2h = vec_sra(out2h, descale_p##PASS);  \
  out5l = vec_sra(out5l, descale_p##PASS);  \
  out5h = vec_sra(out5h, descale_p##PASS);  \
  \
  out2 = vec_pack(out2l, out2h);  \
  out5 = vec_pack(out5l, out5h);  \
  \
  out3l = vec_add(tmp13l, tmp0l);  \
  out3h = vec_add(tmp13h, tmp0h);  \
  out4l = vec_sub(tmp13l, tmp0l);  \
  out4h = vec_sub(tmp13h, tmp0h);  \
  \
  out3l = vec_sra(out3l, descale_p##PASS);  \
  out3h = vec_sra(out3h, descale_p##PASS);  \
  out4l = vec_sra(out4l, descale_p##PASS);  \
  out4h = vec_sra(out4h, descale_p##PASS);  \
  \
  out3 = vec_pack(out3l, out3h);  \
  out4 = vec_pack(out4l, out4h);  \
}


void
jsimd_idct_islow_altivec (void *dct_table_, JCOEFPTR coef_block,
                          JSAMPARRAY output_buf, JDIMENSION output_col)
{
  short *dct_table = (short *)dct_table_;
  int *outptr;

  __vector short row0, row1, row2, row3, row4, row5, row6, row7,
    col0, col1, col2, col3, col4, col5, col6, col7,
    quant0, quant1, quant2, quant3, quant4, quant5, quant6, quant7,
    tmp0, tmp1, tmp2, tmp3, z3, z4,
    z34l, z34h, col71l, col71h, col26l, col26h, col53l, col53h,
    row71l, row71h, row26l, row26h, row53l, row53h,
    out0, out1, out2, out3, out4, out5, out6, out7;
  __vector int tmp0l, tmp0h, tmp1l, tmp1h, tmp2l, tmp2h, tmp3l, tmp3h,
    tmp10l, tmp10h, tmp11l, tmp11h, tmp12l, tmp12h, tmp13l, tmp13h,
    z3l, z3h, z4l, z4h,
    out0l, out0h, out1l, out1h, out2l, out2h, out3l, out3h, out4l, out4h,
    out5l, out5h, out6l, out6h, out7l, out7h;
  __vector signed char outb;

  /* Constants */
  __vector short pw_zero = { __8X(0) },
    pw_f130_f054 = { __4X2(F_0_541 + F_0_765, F_0_541) },
    pw_f054_mf130 = { __4X2(F_0_541, F_0_541 - F_1_847) },
    pw_mf078_f117 = { __4X2(F_1_175 - F_1_961, F_1_175) },
    pw_f117_f078 = { __4X2(F_1_175, F_1_175 - F_0_390) },
    pw_mf060_mf089 = { __4X2(F_0_298 - F_0_899, -F_0_899) },
    pw_mf089_f060 = { __4X2(-F_0_899, F_1_501 - F_0_899) },
    pw_mf050_mf256 = { __4X2(F_2_053 - F_2_562, -F_2_562) },
    pw_mf256_f050 = { __4X2(-F_2_562, F_3_072 - F_2_562) };
  __vector unsigned short pass1_bits = { __8X(PASS1_BITS) };
  __vector int pd_zero = { __4X(0) },
    pd_descale_p1 = { __4X(1 << (DESCALE_P1 - 1)) },
    pd_descale_p2 = { __4X(1 << (DESCALE_P2 - 1)) };
  __vector unsigned int descale_p1 = { __4X(DESCALE_P1) },
    descale_p2 = { __4X(DESCALE_P2) },
    const_bits = { __4X(CONST_BITS) };
  __vector signed char pb_centerjsamp = { __16X(CENTERJSAMPLE) };

  /* Pass 1: process columns */

  col0 = vec_ld(0, coef_block);
  col1 = vec_ld(16, coef_block);
  col2 = vec_ld(32, coef_block);
  col3 = vec_ld(48, coef_block);
  col4 = vec_ld(64, coef_block);
  col5 = vec_ld(80, coef_block);
  col6 = vec_ld(96, coef_block);
  col7 = vec_ld(112, coef_block);

  tmp1 = vec_or(col1, col2);
  tmp2 = vec_or(col3, col4);
  tmp1 = vec_or(tmp1, tmp2);
  tmp3 = vec_or(col5, col6);
  tmp3 = vec_or(tmp3, col7);
  tmp1 = vec_or(tmp1, tmp3);

  quant0 = vec_ld(0, dct_table);
  col0 = vec_mladd(col0, quant0, pw_zero);

  if (vec_all_eq(tmp1, pw_zero)) {
    /* AC terms all zero */

    col0 = vec_sl(col0, pass1_bits);

    row0 = vec_splat(col0, 0);
    row1 = vec_splat(col0, 1);
    row2 = vec_splat(col0, 2);
    row3 = vec_splat(col0, 3);
    row4 = vec_splat(col0, 4);
    row5 = vec_splat(col0, 5);
    row6 = vec_splat(col0, 6);
    row7 = vec_splat(col0, 7);

  } else {

    quant1 = vec_ld(16, dct_table);
    quant2 = vec_ld(32, dct_table);
    quant3 = vec_ld(48, dct_table);
    quant4 = vec_ld(64, dct_table);
    quant5 = vec_ld(80, dct_table);
    quant6 = vec_ld(96, dct_table);
    quant7 = vec_ld(112, dct_table);

    col1 = vec_mladd(col1, quant1, pw_zero);
    col2 = vec_mladd(col2, quant2, pw_zero);
    col3 = vec_mladd(col3, quant3, pw_zero);
    col4 = vec_mladd(col4, quant4, pw_zero);
    col5 = vec_mladd(col5, quant5, pw_zero);
    col6 = vec_mladd(col6, quant6, pw_zero);
    col7 = vec_mladd(col7, quant7, pw_zero);

    DO_IDCT(col, 1);

    TRANSPOSE(out, row);
  }

  /* Pass 2: process rows */

  DO_IDCT(row, 2);

  TRANSPOSE(out, col);

  outb = vec_packs(col0, col0);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[0] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col1, col1);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[1] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col2, col2);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[2] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col3, col3);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[3] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col4, col4);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[4] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col5, col5);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[5] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col6, col6);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[6] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);

  outb = vec_packs(col7, col7);
  outb = vec_add(outb, pb_centerjsamp);
  outptr = (int *)(output_buf[7] + output_col);
  vec_ste((__vector int)outb, 0, outptr);
  vec_ste((__vector int)outb, 4, outptr);
}
