/*
 * 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);
}
