Swap the order of the IFAST and ISLOW FDCT functions so that it matches the order of the prototypes in jsimd.h and the stubs in jsimd_powerpc.c.

git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@1459 632fc199-4ca6-4c93-a231-07263d6284db
This commit is contained in:
DRC
2014-12-20 01:14:38 +00:00
parent 4efb529bb7
commit 864600d707

View File

@@ -71,149 +71,6 @@
}
/* FAST INTEGER FORWARD DCT
*
* This is similar to the SSE2 implementation, except that we left-shift the
* constants by 1 less bit (the -1 in IFAST_CONST_SHIFT.) This is because
* vec_madds(arg1, arg2, arg3) generates the 16-bit saturated sum of:
* the elements in arg3 + the most significant 17 bits of
* (the elements in arg1 * the elements in arg2).
*/
#define IFAST_F_0_382 98 /* FIX(0.382683433) */
#define IFAST_F_0_541 139 /* FIX(0.541196100) */
#define IFAST_F_0_707 181 /* FIX(0.707106781) */
#define IFAST_F_1_306 334 /* FIX(1.306562965) */
#define IFAST_CONST_BITS 8
#define IFAST_PRE_MULTIPLY_SCALE_BITS 2
#define IFAST_CONST_SHIFT \
(16 - IFAST_PRE_MULTIPLY_SCALE_BITS - IFAST_CONST_BITS - 1)
static const __vector short jconst_fdct_ifast __attribute__((aligned(16))) =
{
IFAST_F_0_382 << IFAST_CONST_SHIFT,
IFAST_F_0_541 << IFAST_CONST_SHIFT,
IFAST_F_0_707 << IFAST_CONST_SHIFT,
IFAST_F_1_306 << IFAST_CONST_SHIFT
};
#define DO_FDCT_IFAST() \
{ \
/* Even part */ \
\
tmp10 = vec_add(tmp0, tmp3); \
tmp13 = vec_sub(tmp0, tmp3); \
tmp11 = vec_add(tmp1, tmp2); \
tmp12 = vec_sub(tmp1, tmp2); \
\
out0 = vec_add(tmp10, tmp11); \
out4 = vec_sub(tmp10, tmp11); \
\
z1 = vec_add(tmp12, tmp13); \
z1 = vec_sl(z1, PRE_MULTIPLY_SCALE_BITS); \
z1 = vec_madds(z1, PW_0707, zero); \
\
out2 = vec_add(tmp13, z1); \
out6 = vec_sub(tmp13, z1); \
\
/* Odd part */ \
\
tmp10 = vec_add(tmp4, tmp5); \
tmp11 = vec_add(tmp5, tmp6); \
tmp12 = vec_add(tmp6, tmp7); \
\
tmp10 = vec_sl(tmp10, PRE_MULTIPLY_SCALE_BITS); \
tmp12 = vec_sl(tmp12, PRE_MULTIPLY_SCALE_BITS); \
z5 = vec_sub(tmp10, tmp12); \
z5 = vec_madds(z5, PW_0382, zero); \
\
z2 = vec_madds(tmp10, PW_0541, zero); \
z2 = vec_add(z2, z5); \
\
z4 = vec_madds(tmp12, PW_1306, zero); \
z4 = vec_add(z4, z5); \
\
tmp11 = vec_sl(tmp11, PRE_MULTIPLY_SCALE_BITS); \
z3 = vec_madds(tmp11, PW_0707, zero); \
\
z11 = vec_add(tmp7, z3); \
z13 = vec_sub(tmp7, z3); \
\
out5 = vec_add(z13, z2); \
out3 = vec_sub(z13, z2); \
out1 = vec_add(z11, z4); \
out7 = vec_sub(z11, z4); \
}
void
jsimd_fdct_ifast_altivec (DCTELEM *data)
{
__vector short row0, row1, row2, row3, row4, row5, row6, row7,
col0, col1, col2, col3, col4, col5, col6, col7,
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp10, tmp11, tmp12, tmp13,
z1, z2, z3, z4, z5, z11, z13,
out0, out1, out2, out3, out4, out5, out6, out7;
/* Constants */
__vector short zero = vec_splat_s16(0),
PW_0382 = vec_splat(jconst_fdct_ifast, 0),
PW_0541 = vec_splat(jconst_fdct_ifast, 1),
PW_0707 = vec_splat(jconst_fdct_ifast, 2),
PW_1306 = vec_splat(jconst_fdct_ifast, 3);
__vector unsigned short PRE_MULTIPLY_SCALE_BITS =
vec_splat_u16(IFAST_PRE_MULTIPLY_SCALE_BITS);
/* Pass 1: process rows. */
row0 = *(__vector short *)&data[0];
row1 = *(__vector short *)&data[8];
row2 = *(__vector short *)&data[16];
row3 = *(__vector short *)&data[24];
row4 = *(__vector short *)&data[32];
row5 = *(__vector short *)&data[40];
row6 = *(__vector short *)&data[48];
row7 = *(__vector short *)&data[56];
TRANSPOSE(row, col);
tmp0 = vec_add(col0, col7);
tmp7 = vec_sub(col0, col7);
tmp1 = vec_add(col1, col6);
tmp6 = vec_sub(col1, col6);
tmp2 = vec_add(col2, col5);
tmp5 = vec_sub(col2, col5);
tmp3 = vec_add(col3, col4);
tmp4 = vec_sub(col3, col4);
DO_FDCT_IFAST();
/* Pass 2: process columns. */
TRANSPOSE(out, row);
tmp0 = vec_add(row0, row7);
tmp7 = vec_sub(row0, row7);
tmp1 = vec_add(row1, row6);
tmp6 = vec_sub(row1, row6);
tmp2 = vec_add(row2, row5);
tmp5 = vec_sub(row2, row5);
tmp3 = vec_add(row3, row4);
tmp4 = vec_sub(row3, row4);
DO_FDCT_IFAST();
*(__vector short *)&data[0] = out0;
*(__vector short *)&data[8] = out1;
*(__vector short *)&data[16] = out2;
*(__vector short *)&data[24] = out3;
*(__vector short *)&data[32] = out4;
*(__vector short *)&data[40] = out5;
*(__vector short *)&data[48] = out6;
*(__vector short *)&data[56] = out7;
}
/* SLOW INTEGER FORWARD DCT */
#define ISLOW_F_0_298 2446 /* FIX(0.298631336) */
@@ -480,6 +337,149 @@ jsimd_fdct_islow_altivec (DCTELEM *data)
}
/* FAST INTEGER FORWARD DCT
*
* This is similar to the SSE2 implementation, except that we left-shift the
* constants by 1 less bit (the -1 in IFAST_CONST_SHIFT.) This is because
* vec_madds(arg1, arg2, arg3) generates the 16-bit saturated sum of:
* the elements in arg3 + the most significant 17 bits of
* (the elements in arg1 * the elements in arg2).
*/
#define IFAST_F_0_382 98 /* FIX(0.382683433) */
#define IFAST_F_0_541 139 /* FIX(0.541196100) */
#define IFAST_F_0_707 181 /* FIX(0.707106781) */
#define IFAST_F_1_306 334 /* FIX(1.306562965) */
#define IFAST_CONST_BITS 8
#define IFAST_PRE_MULTIPLY_SCALE_BITS 2
#define IFAST_CONST_SHIFT \
(16 - IFAST_PRE_MULTIPLY_SCALE_BITS - IFAST_CONST_BITS - 1)
static const __vector short jconst_fdct_ifast __attribute__((aligned(16))) =
{
IFAST_F_0_382 << IFAST_CONST_SHIFT,
IFAST_F_0_541 << IFAST_CONST_SHIFT,
IFAST_F_0_707 << IFAST_CONST_SHIFT,
IFAST_F_1_306 << IFAST_CONST_SHIFT
};
#define DO_FDCT_IFAST() \
{ \
/* Even part */ \
\
tmp10 = vec_add(tmp0, tmp3); \
tmp13 = vec_sub(tmp0, tmp3); \
tmp11 = vec_add(tmp1, tmp2); \
tmp12 = vec_sub(tmp1, tmp2); \
\
out0 = vec_add(tmp10, tmp11); \
out4 = vec_sub(tmp10, tmp11); \
\
z1 = vec_add(tmp12, tmp13); \
z1 = vec_sl(z1, PRE_MULTIPLY_SCALE_BITS); \
z1 = vec_madds(z1, PW_0707, zero); \
\
out2 = vec_add(tmp13, z1); \
out6 = vec_sub(tmp13, z1); \
\
/* Odd part */ \
\
tmp10 = vec_add(tmp4, tmp5); \
tmp11 = vec_add(tmp5, tmp6); \
tmp12 = vec_add(tmp6, tmp7); \
\
tmp10 = vec_sl(tmp10, PRE_MULTIPLY_SCALE_BITS); \
tmp12 = vec_sl(tmp12, PRE_MULTIPLY_SCALE_BITS); \
z5 = vec_sub(tmp10, tmp12); \
z5 = vec_madds(z5, PW_0382, zero); \
\
z2 = vec_madds(tmp10, PW_0541, zero); \
z2 = vec_add(z2, z5); \
\
z4 = vec_madds(tmp12, PW_1306, zero); \
z4 = vec_add(z4, z5); \
\
tmp11 = vec_sl(tmp11, PRE_MULTIPLY_SCALE_BITS); \
z3 = vec_madds(tmp11, PW_0707, zero); \
\
z11 = vec_add(tmp7, z3); \
z13 = vec_sub(tmp7, z3); \
\
out5 = vec_add(z13, z2); \
out3 = vec_sub(z13, z2); \
out1 = vec_add(z11, z4); \
out7 = vec_sub(z11, z4); \
}
void
jsimd_fdct_ifast_altivec (DCTELEM *data)
{
__vector short row0, row1, row2, row3, row4, row5, row6, row7,
col0, col1, col2, col3, col4, col5, col6, col7,
tmp0, tmp1, tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp10, tmp11, tmp12, tmp13,
z1, z2, z3, z4, z5, z11, z13,
out0, out1, out2, out3, out4, out5, out6, out7;
/* Constants */
__vector short zero = vec_splat_s16(0),
PW_0382 = vec_splat(jconst_fdct_ifast, 0),
PW_0541 = vec_splat(jconst_fdct_ifast, 1),
PW_0707 = vec_splat(jconst_fdct_ifast, 2),
PW_1306 = vec_splat(jconst_fdct_ifast, 3);
__vector unsigned short PRE_MULTIPLY_SCALE_BITS =
vec_splat_u16(IFAST_PRE_MULTIPLY_SCALE_BITS);
/* Pass 1: process rows. */
row0 = *(__vector short *)&data[0];
row1 = *(__vector short *)&data[8];
row2 = *(__vector short *)&data[16];
row3 = *(__vector short *)&data[24];
row4 = *(__vector short *)&data[32];
row5 = *(__vector short *)&data[40];
row6 = *(__vector short *)&data[48];
row7 = *(__vector short *)&data[56];
TRANSPOSE(row, col);
tmp0 = vec_add(col0, col7);
tmp7 = vec_sub(col0, col7);
tmp1 = vec_add(col1, col6);
tmp6 = vec_sub(col1, col6);
tmp2 = vec_add(col2, col5);
tmp5 = vec_sub(col2, col5);
tmp3 = vec_add(col3, col4);
tmp4 = vec_sub(col3, col4);
DO_FDCT_IFAST();
/* Pass 2: process columns. */
TRANSPOSE(out, row);
tmp0 = vec_add(row0, row7);
tmp7 = vec_sub(row0, row7);
tmp1 = vec_add(row1, row6);
tmp6 = vec_sub(row1, row6);
tmp2 = vec_add(row2, row5);
tmp5 = vec_sub(row2, row5);
tmp3 = vec_add(row3, row4);
tmp4 = vec_sub(row3, row4);
DO_FDCT_IFAST();
*(__vector short *)&data[0] = out0;
*(__vector short *)&data[8] = out1;
*(__vector short *)&data[16] = out2;
*(__vector short *)&data[24] = out3;
*(__vector short *)&data[32] = out4;
*(__vector short *)&data[40] = out5;
*(__vector short *)&data[48] = out6;
*(__vector short *)&data[56] = out7;
}
/* FAST INTEGER INVERSE DCT
*
* This is similar to the SSE2 implementation, except that we left-shift the