Blame src/libmpg123/synth_altivec.c

Packit c32a2d
/*
Packit c32a2d
	decode.c: decoding samples...
Packit c32a2d
Packit c32a2d
	copyright 1995-2009 by the mpg123 project - free software under the terms of the LGPL 2.1
Packit c32a2d
	see COPYING and AUTHORS files in distribution or http://mpg123.org
Packit c32a2d
	initially written by Michael Hipp
Packit c32a2d
	altivec optimization by tmkk
Packit c32a2d
*/
Packit c32a2d
Packit c32a2d
#include "mpg123lib_intern.h"
Packit c32a2d
Packit c32a2d
#ifndef __APPLE__
Packit c32a2d
#include <altivec.h>
Packit c32a2d
#endif
Packit c32a2d
Packit c32a2d
/* A macro for normal synth functions */
Packit c32a2d
#define SYNTH_ALTIVEC(B0STEP) \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0); \
Packit c32a2d
	 \
Packit c32a2d
	vsum = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum = vec_madd(v2,v7,vsum); \
Packit c32a2d
	vsum = vec_madd(v3,v8,vsum); \
Packit c32a2d
	vsum = vec_madd(v4,v9,vsum); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0 += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0); \
Packit c32a2d
	 \
Packit c32a2d
	vsum2 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum2 = vec_madd(v2,v7,vsum2); \
Packit c32a2d
	vsum2 = vec_madd(v3,v8,vsum2); \
Packit c32a2d
	vsum2 = vec_madd(v4,v9,vsum2); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0 += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0); \
Packit c32a2d
	 \
Packit c32a2d
	vsum3 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum3 = vec_madd(v2,v7,vsum3); \
Packit c32a2d
	vsum3 = vec_madd(v3,v8,vsum3); \
Packit c32a2d
	vsum3 = vec_madd(v4,v9,vsum3); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0 += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0); \
Packit c32a2d
	 \
Packit c32a2d
	vsum4 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum4 = vec_madd(v2,v7,vsum4); \
Packit c32a2d
	vsum4 = vec_madd(v3,v8,vsum4); \
Packit c32a2d
	vsum4 = vec_madd(v4,v9,vsum4); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0 += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_mergeh(vsum,vsum3); \
Packit c32a2d
	v2 = vec_mergeh(vsum2,vsum4); \
Packit c32a2d
	v3 = vec_mergel(vsum,vsum3); \
Packit c32a2d
	v4 = vec_mergel(vsum2,vsum4); \
Packit c32a2d
	v5 = vec_mergeh(v1,v2); \
Packit c32a2d
	v6 = vec_mergel(v1,v2); \
Packit c32a2d
	v7 = vec_mergeh(v3,v4); \
Packit c32a2d
	v8 = vec_mergel(v3,v4);
Packit c32a2d
Packit c32a2d
/* A macro for stereo synth functions */
Packit c32a2d
#define SYNTH_STEREO_ALTIVEC(B0STEP) \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0l); \
Packit c32a2d
	v10 = vec_ld(0,b0r); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0l); \
Packit c32a2d
	v11 = vec_ld(16,b0r); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0l); \
Packit c32a2d
	v12 = vec_ld(32,b0r); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0l); \
Packit c32a2d
	v13 = vec_ld(48,b0r); \
Packit c32a2d
	 \
Packit c32a2d
	vsum = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum5 = vec_madd(v1,v10,vzero); \
Packit c32a2d
	vsum = vec_madd(v2,v7,vsum); \
Packit c32a2d
	vsum5 = vec_madd(v2,v11,vsum5); \
Packit c32a2d
	vsum = vec_madd(v3,v8,vsum); \
Packit c32a2d
	vsum5 = vec_madd(v3,v12,vsum5); \
Packit c32a2d
	vsum = vec_madd(v4,v9,vsum); \
Packit c32a2d
	vsum5 = vec_madd(v4,v13,vsum5); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0l += B0STEP; \
Packit c32a2d
	b0r += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0l); \
Packit c32a2d
	v10 = vec_ld(0,b0r); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0l); \
Packit c32a2d
	v11 = vec_ld(16,b0r); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0l); \
Packit c32a2d
	v12 = vec_ld(32,b0r); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0l); \
Packit c32a2d
	v13 = vec_ld(48,b0r); \
Packit c32a2d
	 \
Packit c32a2d
	vsum2 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum6 = vec_madd(v1,v10,vzero); \
Packit c32a2d
	vsum2 = vec_madd(v2,v7,vsum2); \
Packit c32a2d
	vsum6 = vec_madd(v2,v11,vsum6); \
Packit c32a2d
	vsum2 = vec_madd(v3,v8,vsum2); \
Packit c32a2d
	vsum6 = vec_madd(v3,v12,vsum6); \
Packit c32a2d
	vsum2 = vec_madd(v4,v9,vsum2); \
Packit c32a2d
	vsum6 = vec_madd(v4,v13,vsum6); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0l += B0STEP; \
Packit c32a2d
	b0r += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0l); \
Packit c32a2d
	v10 = vec_ld(0,b0r); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0l); \
Packit c32a2d
	v11 = vec_ld(16,b0r); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0l); \
Packit c32a2d
	v12 = vec_ld(32,b0r); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0l); \
Packit c32a2d
	v13 = vec_ld(48,b0r); \
Packit c32a2d
	 \
Packit c32a2d
	vsum3 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum7 = vec_madd(v1,v10,vzero); \
Packit c32a2d
	vsum3 = vec_madd(v2,v7,vsum3); \
Packit c32a2d
	vsum7 = vec_madd(v2,v11,vsum7); \
Packit c32a2d
	vsum3 = vec_madd(v3,v8,vsum3); \
Packit c32a2d
	vsum7 = vec_madd(v3,v12,vsum7); \
Packit c32a2d
	vsum3 = vec_madd(v4,v9,vsum3); \
Packit c32a2d
	vsum7 = vec_madd(v4,v13,vsum7); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0l += B0STEP; \
Packit c32a2d
	b0r += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_ld(0,window); \
Packit c32a2d
	v2 = vec_ld(16,window); \
Packit c32a2d
	v3 = vec_ld(32,window); \
Packit c32a2d
	v4 = vec_ld(48,window); \
Packit c32a2d
	v5 = vec_ld(64,window); \
Packit c32a2d
	v1 = vec_perm(v1,v2,vperm1); \
Packit c32a2d
	v6 = vec_ld(0,b0l); \
Packit c32a2d
	v10 = vec_ld(0,b0r); \
Packit c32a2d
	v2 = vec_perm(v2,v3,vperm1); \
Packit c32a2d
	v7 = vec_ld(16,b0l); \
Packit c32a2d
	v11 = vec_ld(16,b0r); \
Packit c32a2d
	v3 = vec_perm(v3,v4,vperm1); \
Packit c32a2d
	v8 = vec_ld(32,b0l); \
Packit c32a2d
	v12 = vec_ld(32,b0r); \
Packit c32a2d
	v4 = vec_perm(v4,v5,vperm1); \
Packit c32a2d
	v9 = vec_ld(48,b0l); \
Packit c32a2d
	v13 = vec_ld(48,b0r); \
Packit c32a2d
	 \
Packit c32a2d
	vsum4 = vec_madd(v1,v6,vzero); \
Packit c32a2d
	vsum8 = vec_madd(v1,v10,vzero); \
Packit c32a2d
	vsum4 = vec_madd(v2,v7,vsum4); \
Packit c32a2d
	vsum8 = vec_madd(v2,v11,vsum8); \
Packit c32a2d
	vsum4 = vec_madd(v3,v8,vsum4); \
Packit c32a2d
	vsum8 = vec_madd(v3,v12,vsum8); \
Packit c32a2d
	vsum4 = vec_madd(v4,v9,vsum4); \
Packit c32a2d
	vsum8 = vec_madd(v4,v13,vsum8); \
Packit c32a2d
	 \
Packit c32a2d
	window += 32; \
Packit c32a2d
	b0l += B0STEP; \
Packit c32a2d
	b0r += B0STEP; \
Packit c32a2d
	 \
Packit c32a2d
	v1 = vec_mergeh(vsum,vsum3); \
Packit c32a2d
	v5 = vec_mergeh(vsum5,vsum7); \
Packit c32a2d
	v2 = vec_mergeh(vsum2,vsum4); \
Packit c32a2d
	v6 = vec_mergeh(vsum6,vsum8); \
Packit c32a2d
	v3 = vec_mergel(vsum,vsum3); \
Packit c32a2d
	v7 = vec_mergel(vsum5,vsum7); \
Packit c32a2d
	v4 = vec_mergel(vsum2,vsum4); \
Packit c32a2d
	v8 = vec_mergel(vsum6,vsum8); \
Packit c32a2d
	vsum = vec_mergeh(v1,v2); \
Packit c32a2d
	vsum5 = vec_mergeh(v5,v6); \
Packit c32a2d
	vsum2 = vec_mergel(v1,v2); \
Packit c32a2d
	vsum6 = vec_mergel(v5,v6); \
Packit c32a2d
	vsum3 = vec_mergeh(v3,v4); \
Packit c32a2d
	vsum7 = vec_mergeh(v7,v8); \
Packit c32a2d
	vsum4 = vec_mergel(v3,v4); \
Packit c32a2d
	vsum8 = vec_mergel(v7,v8);
Packit c32a2d
Packit c32a2d
int synth_1to1_altivec(real *bandPtr,int channel,mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int clip; 
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
Packit c32a2d
#endif
Packit c32a2d
	if(!channel)
Packit c32a2d
	{
Packit c32a2d
		fr->bo--;
Packit c32a2d
		fr->bo &= 0xf;
Packit c32a2d
		buf = fr->real_buffs[0];
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[1];
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		ALIGNED(16) int clip_tmp[4];
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9;
Packit c32a2d
		vector unsigned char vperm1,vperm2,vperm3,vperm4;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vmin,vmax,vzero;
Packit c32a2d
		vector signed int vclip;
Packit c32a2d
		vector signed short vsample1,vsample2;
Packit c32a2d
		vector unsigned int vshift;
Packit c32a2d
		vclip = vec_xor(vclip,vclip);
Packit c32a2d
		vzero = vec_xor(vzero,vzero);
Packit c32a2d
		vshift = vec_splat_u32(-1); /* 31 */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vmax = (vector float)(32767.0f);
Packit c32a2d
		vmin = (vector float)(-32768.0f);
Packit c32a2d
		vperm4 = (vector unsigned char)(0,1,18,19,2,3,22,23,4,5,26,27,6,7,30,31);
Packit c32a2d
#else
Packit c32a2d
		vmax = (vector float){32767.0f,32767.0f,32767.0f,32767.0f};
Packit c32a2d
		vmin = (vector float){-32768.0f,-32768.0f,-32768.0f,-32768.0f};
Packit c32a2d
		vperm4 = (vector unsigned char){0,1,18,19,2,3,22,23,4,5,26,27,6,7,30,31};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsl(0,samples);
Packit c32a2d
		vperm3 = vec_lvsr(0,samples);
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(v5,v6);
Packit c32a2d
			v9 = vec_sub(v7,v8);
Packit c32a2d
			vsum = vec_add(vsum,v9);
Packit c32a2d
			
Packit c32a2d
			v3 = vec_round(vsum);
Packit c32a2d
			v3 = (vector float)vec_cts(v3,0);
Packit c32a2d
			v1 = (vector float)vec_cmpgt(vsum,vmax);
Packit c32a2d
			v2 = (vector float)vec_cmplt(vsum,vmin);
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(15,samples);
Packit c32a2d
			v3 = (vector float)vec_packs((vector signed int)v3,(vector signed int)v3);
Packit c32a2d
			v4 = (vector float)vec_perm(vsample1,vsample2,vperm2);
Packit c32a2d
			v5 = (vector float)vec_perm(v3,v4,vperm4);
Packit c32a2d
			v6 = (vector float)vec_perm(vsample2,vsample1,vperm2);
Packit c32a2d
			v7 = (vector float)vec_perm(v5,v6,vperm3);
Packit c32a2d
			v8 = (vector float)vec_perm(v6,v5,vperm3);
Packit c32a2d
			vec_st((vector signed short)v7,15,samples);
Packit c32a2d
			vec_st((vector signed short)v8,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v1, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v2, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(v5,v6);
Packit c32a2d
			v9 = vec_add(v7,v8);
Packit c32a2d
			vsum = vec_add(vsum,v9);
Packit c32a2d
			
Packit c32a2d
			v3 = vec_round(vsum);
Packit c32a2d
			v3 = (vector float)vec_cts(v3,0);
Packit c32a2d
			v1 = (vector float)vec_cmpgt(vsum,vmax);
Packit c32a2d
			v2 = (vector float)vec_cmplt(vsum,vmin);
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(15,samples);
Packit c32a2d
			v3 = (vector float)vec_packs((vector signed int)v3,(vector signed int)v3);
Packit c32a2d
			v4 = (vector float)vec_perm(vsample1,vsample2,vperm2);
Packit c32a2d
			v5 = (vector float)vec_perm(v3,v4,vperm4);
Packit c32a2d
			v6 = (vector float)vec_perm(vsample2,vsample1,vperm2);
Packit c32a2d
			v7 = (vector float)vec_perm(v5,v6,vperm3);
Packit c32a2d
			v8 = (vector float)vec_perm(v6,v5,vperm3);
Packit c32a2d
			vec_st((vector signed short)v7,15,samples);
Packit c32a2d
			vec_st((vector signed short)v8,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v1, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v2, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		vec_st(vclip,0,clip_tmp);
Packit c32a2d
		clip = clip_tmp[3];
Packit c32a2d
	}
Packit c32a2d
	if(final) fr->buffer.fill += 128;
Packit c32a2d
	
Packit c32a2d
	return clip;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_stereo_altivec(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	short *samples = (short *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int clip; 
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		ALIGNED(16) int clip_tmp[4];
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13;
Packit c32a2d
		vector unsigned char vperm1,vperm2;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vsum5,vsum6,vsum7,vsum8,vmin,vmax,vzero;
Packit c32a2d
		vector signed int vclip;
Packit c32a2d
		vector unsigned int vshift;
Packit c32a2d
		vector signed short vprev;
Packit c32a2d
		vclip = vec_xor(vclip,vclip);
Packit c32a2d
		vzero = vec_xor(vzero,vzero);
Packit c32a2d
		vshift = vec_splat_u32(-1); /* 31 */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vmax = (vector float)(32767.0f);
Packit c32a2d
		vmin = (vector float)(-32768.0f);
Packit c32a2d
#else
Packit c32a2d
		vmax = (vector float){32767.0f,32767.0f,32767.0f,32767.0f};
Packit c32a2d
		vmin = (vector float){-32768.0f,-32768.0f,-32768.0f,-32768.0f};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsr(0,samples);
Packit c32a2d
		vprev = vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_sub(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_sub(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_sub(vsum7,vsum8);
Packit c32a2d
			vsum = vec_add(vsum,vsum3);
Packit c32a2d
			vsum2 = vec_add(vsum2,vsum4);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_round(vsum);
Packit c32a2d
			v2 = vec_round(vsum2);
Packit c32a2d
			v1 = (vector float)vec_cts(v1,0);
Packit c32a2d
			v2 = (vector float)vec_cts(v2,0);
Packit c32a2d
			v3 = vec_mergeh(v1, v2);
Packit c32a2d
			v4 = vec_mergel(v1, v2);
Packit c32a2d
			v5 = (vector float)vec_packs((vector signed int)v3,(vector signed int)v4);
Packit c32a2d
			v6 = (vector float)vec_perm(vprev,(vector signed short)v5,vperm2);
Packit c32a2d
			vprev = (vector signed short)v5;
Packit c32a2d
			v1 = (vector float)vec_cmpgt(vsum,vmax);
Packit c32a2d
			v2 = (vector float)vec_cmplt(vsum,vmin);
Packit c32a2d
			v3 = (vector float)vec_cmpgt(vsum2,vmax);
Packit c32a2d
			v4 = (vector float)vec_cmplt(vsum2,vmin);
Packit c32a2d
			vec_st((vector signed short)v6,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v1, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v2, vshift);
Packit c32a2d
			v3 = (vector float)vec_sr((vector unsigned int)v3, vshift);
Packit c32a2d
			v4 = (vector float)vec_sr((vector unsigned int)v4, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			v2 = (vector float)vec_add((vector unsigned int)v3,(vector unsigned int)v4);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
			vclip = vec_sums((vector signed int)v2,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_add(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_add(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_add(vsum7,vsum8);
Packit c32a2d
			vsum = vec_add(vsum,vsum3);
Packit c32a2d
			vsum2 = vec_add(vsum2,vsum4);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_round(vsum);
Packit c32a2d
			v2 = vec_round(vsum2);
Packit c32a2d
			v1 = (vector float)vec_cts(v1,0);
Packit c32a2d
			v2 = (vector float)vec_cts(v2,0);
Packit c32a2d
			v3 = vec_mergeh(v1, v2);
Packit c32a2d
			v4 = vec_mergel(v1, v2);
Packit c32a2d
			v5 = (vector float)vec_packs((vector signed int)v3,(vector signed int)v4);
Packit c32a2d
			v6 = (vector float)vec_perm(vprev,(vector signed short)v5,vperm2);
Packit c32a2d
			vprev = (vector signed short)v5;
Packit c32a2d
			v1 = (vector float)vec_cmpgt(vsum,vmax);
Packit c32a2d
			v2 = (vector float)vec_cmplt(vsum,vmin);
Packit c32a2d
			v3 = (vector float)vec_cmpgt(vsum2,vmax);
Packit c32a2d
			v4 = (vector float)vec_cmplt(vsum2,vmin);
Packit c32a2d
			vec_st((vector signed short)v6,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v1, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v2, vshift);
Packit c32a2d
			v3 = (vector float)vec_sr((vector unsigned int)v3, vshift);
Packit c32a2d
			v4 = (vector float)vec_sr((vector unsigned int)v4, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			v2 = (vector float)vec_add((vector unsigned int)v3,(vector unsigned int)v4);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
			vclip = vec_sums((vector signed int)v2,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		if((size_t)samples & 0xf)
Packit c32a2d
		{
Packit c32a2d
			v1 = (vector float)vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
			v2 = (vector float)vec_perm(vprev,(vector signed short)v1,vperm2);
Packit c32a2d
			vec_st((vector signed short)v2,0,samples);
Packit c32a2d
		}
Packit c32a2d
Packit c32a2d
		vec_st(vclip,0,clip_tmp);
Packit c32a2d
		clip = clip_tmp[3];
Packit c32a2d
	}
Packit c32a2d
	fr->buffer.fill += 128;
Packit c32a2d
	
Packit c32a2d
	return clip;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_real_altivec(real *bandPtr,int channel,mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
Packit c32a2d
#endif
Packit c32a2d
	if(!channel)
Packit c32a2d
	{
Packit c32a2d
		fr->bo--;
Packit c32a2d
		fr->bo &= 0xf;
Packit c32a2d
		buf = fr->real_buffs[0];
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[1];
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9;
Packit c32a2d
		vector unsigned char vperm1,vperm2,vperm3,vperm4, vperm5;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vscale,vzero;
Packit c32a2d
		vector float vsample1,vsample2,vsample3;
Packit c32a2d
		vzero = vec_xor(vzero, vzero);
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vscale = (vector float)(1.0f/32768.0f);
Packit c32a2d
		vperm4 = (vector unsigned char)(0,1,2,3,20,21,22,23,4,5,6,7,28,29,30,31);
Packit c32a2d
		vperm5 = (vector unsigned char)(8,9,10,11,20,21,22,23,12,13,14,15,28,29,30,31);
Packit c32a2d
#else
Packit c32a2d
		vscale = (vector float){1.0f/32768.0f,1.0f/32768.0f,1.0f/32768.0f,1.0f/32768.0f};
Packit c32a2d
		vperm4 = (vector unsigned char){0,1,2,3,20,21,22,23,4,5,6,7,28,29,30,31};
Packit c32a2d
		vperm5 = (vector unsigned char){8,9,10,11,20,21,22,23,12,13,14,15,28,29,30,31};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsl(0,samples);
Packit c32a2d
		vperm3 = vec_lvsr(0,samples);
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(v5,v6);
Packit c32a2d
			v9 = vec_sub(v7,v8);
Packit c32a2d
			vsum = vec_add(vsum,v9);
Packit c32a2d
			vsum = vec_madd(vsum, vscale, vzero);
Packit c32a2d
			
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(16,samples);
Packit c32a2d
			vsample3 = vec_ld(31,samples);
Packit c32a2d
			v1 = vec_perm(vsample1, vsample2, vperm2);
Packit c32a2d
			v2 = vec_perm(vsample2, vsample3, vperm2);
Packit c32a2d
			v1 = vec_perm(vsum, v1, vperm4);
Packit c32a2d
			v2 = vec_perm(vsum, v2, vperm5);
Packit c32a2d
			v3 = vec_perm(vsample3, vsample2, vperm2);
Packit c32a2d
			v4 = vec_perm(vsample2, vsample1, vperm2);
Packit c32a2d
			v5 = vec_perm(v2, v3, vperm3);
Packit c32a2d
			v6 = vec_perm(v1, v2, vperm3);
Packit c32a2d
			v7 = vec_perm(v4, v1, vperm3);
Packit c32a2d
			vec_st(v5,31,samples);
Packit c32a2d
			vec_st(v6,16,samples);
Packit c32a2d
			vec_st(v7,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(v5,v6);
Packit c32a2d
			v9 = vec_add(v7,v8);
Packit c32a2d
			vsum = vec_add(vsum,v9);
Packit c32a2d
			vsum = vec_madd(vsum, vscale, vzero);
Packit c32a2d
			
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(16,samples);
Packit c32a2d
			vsample3 = vec_ld(31,samples);
Packit c32a2d
			v1 = vec_perm(vsample1, vsample2, vperm2);
Packit c32a2d
			v2 = vec_perm(vsample2, vsample3, vperm2);
Packit c32a2d
			v1 = vec_perm(vsum, v1, vperm4);
Packit c32a2d
			v2 = vec_perm(vsum, v2, vperm5);
Packit c32a2d
			v3 = vec_perm(vsample3, vsample2, vperm2);
Packit c32a2d
			v4 = vec_perm(vsample2, vsample1, vperm2);
Packit c32a2d
			v5 = vec_perm(v2, v3, vperm3);
Packit c32a2d
			v6 = vec_perm(v1, v2, vperm3);
Packit c32a2d
			v7 = vec_perm(v4, v1, vperm3);
Packit c32a2d
			vec_st(v5,31,samples);
Packit c32a2d
			vec_st(v6,16,samples);
Packit c32a2d
			vec_st(v7,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
	
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_fltst_altivec(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	real *samples = (real *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13;
Packit c32a2d
		vector unsigned char vperm1,vperm2;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vsum5,vsum6,vsum7,vsum8,vscale,vzero;
Packit c32a2d
		vector float vprev;
Packit c32a2d
		vzero = vec_xor(vzero,vzero);
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vscale = (vector float)(1.0f/32768.0f);
Packit c32a2d
#else
Packit c32a2d
		vscale = (vector float){1.0f/32768.0f,1.0f/32768.0f,1.0f/32768.0f,1.0f/32768.0f};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsr(0,samples);
Packit c32a2d
		vprev = vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_sub(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_sub(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_sub(vsum7,vsum8);
Packit c32a2d
			vsum = vec_add(vsum,vsum3);
Packit c32a2d
			vsum2 = vec_add(vsum2,vsum4);
Packit c32a2d
			vsum = vec_madd(vsum, vscale, vzero);
Packit c32a2d
			vsum2 = vec_madd(vsum2, vscale, vzero);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_mergeh(vsum, vsum2);
Packit c32a2d
			v2 = vec_mergel(vsum, vsum2);
Packit c32a2d
			v3 = vec_perm(vprev,v1,vperm2);
Packit c32a2d
			v4 = vec_perm(v1,v2,vperm2);
Packit c32a2d
			vprev = v2;
Packit c32a2d
			vec_st(v3,0,samples);
Packit c32a2d
			vec_st(v4,16,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_add(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_add(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_add(vsum7,vsum8);
Packit c32a2d
			vsum = vec_add(vsum,vsum3);
Packit c32a2d
			vsum2 = vec_add(vsum2,vsum4);
Packit c32a2d
			vsum = vec_madd(vsum, vscale, vzero);
Packit c32a2d
			vsum2 = vec_madd(vsum2, vscale, vzero);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_mergeh(vsum, vsum2);
Packit c32a2d
			v2 = vec_mergel(vsum, vsum2);
Packit c32a2d
			v3 = vec_perm(vprev,v1,vperm2);
Packit c32a2d
			v4 = vec_perm(v1,v2,vperm2);
Packit c32a2d
			vprev = v2;
Packit c32a2d
			vec_st(v3,0,samples);
Packit c32a2d
			vec_st(v4,16,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		if((size_t)samples & 0xf)
Packit c32a2d
		{
Packit c32a2d
			v1 = (vector float)vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
			v2 = (vector float)vec_perm(vprev,v1,vperm2);
Packit c32a2d
			vec_st(v2,0,samples);
Packit c32a2d
		}
Packit c32a2d
	}
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
	
Packit c32a2d
	return 0;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
int synth_1to1_s32_altivec(real *bandPtr,int channel,mpg123_handle *fr, int final)
Packit c32a2d
{
Packit c32a2d
	int32_t *samples = (int32_t *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0, **buf;
Packit c32a2d
	int clip;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings) do_equalizer(bandPtr,channel,fr->equalizer);
Packit c32a2d
#endif
Packit c32a2d
	if(!channel)
Packit c32a2d
	{
Packit c32a2d
		fr->bo--;
Packit c32a2d
		fr->bo &= 0xf;
Packit c32a2d
		buf = fr->real_buffs[0];
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		samples++;
Packit c32a2d
		buf = fr->real_buffs[1];
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(buf[1]+((fr->bo+1)&0xf),buf[0]+fr->bo,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0 = buf[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(buf[0]+fr->bo,buf[1]+fr->bo+1,bandPtr);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		ALIGNED(16) int clip_tmp[4];
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9;
Packit c32a2d
		vector unsigned char vperm1,vperm2,vperm3,vperm4,vperm5;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vmax,vmin,vzero;
Packit c32a2d
		vector signed int vsample1,vsample2,vsample3;
Packit c32a2d
		vector unsigned int vshift;
Packit c32a2d
		vector signed int vclip;
Packit c32a2d
		vzero = vec_xor(vzero, vzero);
Packit c32a2d
		vclip = vec_xor(vclip, vclip);
Packit c32a2d
		vshift = vec_splat_u32(-1); /* 31 */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vmax = (vector float)(32767.999f);
Packit c32a2d
		vmin = (vector float)(-32768.0f);
Packit c32a2d
		vperm4 = (vector unsigned char)(0,1,2,3,20,21,22,23,4,5,6,7,28,29,30,31);
Packit c32a2d
		vperm5 = (vector unsigned char)(8,9,10,11,20,21,22,23,12,13,14,15,28,29,30,31);
Packit c32a2d
#else
Packit c32a2d
		vmax = (vector float){32767.999f,32767.999f,32767.999f,32767.999f};
Packit c32a2d
		vmin = (vector float){-32768.0f,-32768.0f,-32768.0f,-32768.0f};
Packit c32a2d
		vperm4 = (vector unsigned char){0,1,2,3,20,21,22,23,4,5,6,7,28,29,30,31};
Packit c32a2d
		vperm5 = (vector unsigned char){8,9,10,11,20,21,22,23,12,13,14,15,28,29,30,31};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsl(0,samples);
Packit c32a2d
		vperm3 = vec_lvsr(0,samples);
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(v5,v6);
Packit c32a2d
			v9 = vec_sub(v7,v8);
Packit c32a2d
			v1 = vec_add(vsum,v9);
Packit c32a2d
			vsum = (vector float)vec_cts(v1,16);
Packit c32a2d
			v8 = (vector float)vec_cmpgt(v1,vmax);
Packit c32a2d
			v9 = (vector float)vec_cmplt(v1,vmin);
Packit c32a2d
			
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(16,samples);
Packit c32a2d
			vsample3 = vec_ld(31,samples);
Packit c32a2d
			v1 = (vector float)vec_perm(vsample1, vsample2, vperm2);
Packit c32a2d
			v2 = (vector float)vec_perm(vsample2, vsample3, vperm2);
Packit c32a2d
			v1 = vec_perm(vsum, v1, vperm4);
Packit c32a2d
			v2 = vec_perm(vsum, v2, vperm5);
Packit c32a2d
			v3 = (vector float)vec_perm(vsample3, vsample2, vperm2);
Packit c32a2d
			v4 = (vector float)vec_perm(vsample2, vsample1, vperm2);
Packit c32a2d
			v5 = vec_perm(v2, v3, vperm3);
Packit c32a2d
			v6 = vec_perm(v1, v2, vperm3);
Packit c32a2d
			v7 = vec_perm(v4, v1, vperm3);
Packit c32a2d
			vec_st((vector signed int)v5,31,samples);
Packit c32a2d
			vec_st((vector signed int)v6,16,samples);
Packit c32a2d
			vec_st((vector signed int)v7,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v8, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v9, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(v5,v6);
Packit c32a2d
			v9 = vec_add(v7,v8);
Packit c32a2d
			v1 = vec_add(vsum,v9);
Packit c32a2d
			vsum = (vector float)vec_cts(v1,16);
Packit c32a2d
			v8 = (vector float)vec_cmpgt(v1,vmax);
Packit c32a2d
			v9 = (vector float)vec_cmplt(v1,vmin);
Packit c32a2d
			
Packit c32a2d
			vsample1 = vec_ld(0,samples);
Packit c32a2d
			vsample2 = vec_ld(16,samples);
Packit c32a2d
			vsample3 = vec_ld(31,samples);
Packit c32a2d
			v1 = (vector float)vec_perm(vsample1, vsample2, vperm2);
Packit c32a2d
			v2 = (vector float)vec_perm(vsample2, vsample3, vperm2);
Packit c32a2d
			v1 = vec_perm(vsum, v1, vperm4);
Packit c32a2d
			v2 = vec_perm(vsum, v2, vperm5);
Packit c32a2d
			v3 = (vector float)vec_perm(vsample3, vsample2, vperm2);
Packit c32a2d
			v4 = (vector float)vec_perm(vsample2, vsample1, vperm2);
Packit c32a2d
			v5 = vec_perm(v2, v3, vperm3);
Packit c32a2d
			v6 = vec_perm(v1, v2, vperm3);
Packit c32a2d
			v7 = vec_perm(v4, v1, vperm3);
Packit c32a2d
			vec_st((vector signed int)v5,31,samples);
Packit c32a2d
			vec_st((vector signed int)v6,16,samples);
Packit c32a2d
			vec_st((vector signed int)v7,0,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v8, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v9, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		vec_st(vclip,0,clip_tmp);
Packit c32a2d
		clip = clip_tmp[3];
Packit c32a2d
	}
Packit c32a2d
	if(final) fr->buffer.fill += 256;
Packit c32a2d
	
Packit c32a2d
	return clip;
Packit c32a2d
}
Packit c32a2d
Packit c32a2d
Packit c32a2d
int synth_1to1_s32_stereo_altivec(real *bandPtr_l, real *bandPtr_r, mpg123_handle *fr)
Packit c32a2d
{
Packit c32a2d
	int32_t *samples = (int32_t *) (fr->buffer.data+fr->buffer.fill);
Packit c32a2d
	
Packit c32a2d
	real *b0l, *b0r, **bufl, **bufr;
Packit c32a2d
	int clip;
Packit c32a2d
	int bo1;
Packit c32a2d
#ifndef NO_EQUALIZER
Packit c32a2d
	if(fr->have_eq_settings)
Packit c32a2d
	{
Packit c32a2d
		do_equalizer(bandPtr_l,0,fr->equalizer);
Packit c32a2d
		do_equalizer(bandPtr_r,1,fr->equalizer);
Packit c32a2d
	}
Packit c32a2d
#endif
Packit c32a2d
	fr->bo--;
Packit c32a2d
	fr->bo &= 0xf;
Packit c32a2d
	bufl = fr->real_buffs[0];
Packit c32a2d
	bufr = fr->real_buffs[1];
Packit c32a2d
	
Packit c32a2d
	if(fr->bo & 0x1)
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[0];
Packit c32a2d
		b0r = bufr[0];
Packit c32a2d
		bo1 = fr->bo;
Packit c32a2d
		dct64_altivec(bufl[1]+((fr->bo+1)&0xf),bufl[0]+fr->bo,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[1]+((fr->bo+1)&0xf),bufr[0]+fr->bo,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	else
Packit c32a2d
	{
Packit c32a2d
		b0l = bufl[1];
Packit c32a2d
		b0r = bufr[1];
Packit c32a2d
		bo1 = fr->bo+1;
Packit c32a2d
		dct64_altivec(bufl[0]+fr->bo,bufl[1]+fr->bo+1,bandPtr_l);
Packit c32a2d
		dct64_altivec(bufr[0]+fr->bo,bufr[1]+fr->bo+1,bandPtr_r);
Packit c32a2d
	}
Packit c32a2d
	
Packit c32a2d
	
Packit c32a2d
	{
Packit c32a2d
		register int j;
Packit c32a2d
		real *window = fr->decwin + 16 - bo1;
Packit c32a2d
		
Packit c32a2d
		ALIGNED(16) int clip_tmp[4];
Packit c32a2d
		vector float v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12,v13;
Packit c32a2d
		vector unsigned char vperm1,vperm2;
Packit c32a2d
		vector float vsum,vsum2,vsum3,vsum4,vsum5,vsum6,vsum7,vsum8,vmax,vmin,vzero;
Packit c32a2d
		vector float vprev;
Packit c32a2d
		vector unsigned int vshift;
Packit c32a2d
		vector signed int vclip;
Packit c32a2d
		vzero = vec_xor(vzero, vzero);
Packit c32a2d
		vclip = vec_xor(vclip, vclip);
Packit c32a2d
		vshift = vec_splat_u32(-1); /* 31 */
Packit c32a2d
#ifdef __APPLE__
Packit c32a2d
		vmax = (vector float)(32767.999f);
Packit c32a2d
		vmin = (vector float)(-32768.0f);
Packit c32a2d
#else
Packit c32a2d
		vmax = (vector float){32767.999f,32767.999f,32767.999f,32767.999f};
Packit c32a2d
		vmin = (vector float){-32768.0f,-32768.0f,-32768.0f,-32768.0f};
Packit c32a2d
#endif
Packit c32a2d
		
Packit c32a2d
		vperm1 = vec_lvsl(0,window);
Packit c32a2d
		vperm2 = vec_lvsr(0,samples);
Packit c32a2d
		vprev = (vector float)vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_sub(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_sub(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_sub(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_sub(vsum7,vsum8);
Packit c32a2d
			v1 = vec_add(vsum,vsum3);
Packit c32a2d
			v2 = vec_add(vsum2,vsum4);
Packit c32a2d
			vsum = (vector float)vec_cts(v1,16);
Packit c32a2d
			vsum2 = (vector float)vec_cts(v2,16);
Packit c32a2d
			v5 = (vector float)vec_cmpgt(v1,vmax);
Packit c32a2d
			v6 = (vector float)vec_cmplt(v1,vmin);
Packit c32a2d
			v7 = (vector float)vec_cmpgt(v2,vmax);
Packit c32a2d
			v8 = (vector float)vec_cmplt(v2,vmin);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_mergeh(vsum, vsum2);
Packit c32a2d
			v2 = vec_mergel(vsum, vsum2);
Packit c32a2d
			v3 = vec_perm(vprev,v1,vperm2);
Packit c32a2d
			v4 = vec_perm(v1,v2,vperm2);
Packit c32a2d
			vprev = v2;
Packit c32a2d
			vec_st((vector signed int)v3,0,samples);
Packit c32a2d
			vec_st((vector signed int)v4,16,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v5, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v6, vshift);
Packit c32a2d
			v3 = (vector float)vec_sr((vector unsigned int)v7, vshift);
Packit c32a2d
			v4 = (vector float)vec_sr((vector unsigned int)v8, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			v2 = (vector float)vec_add((vector unsigned int)v3,(vector unsigned int)v4);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
			vclip = vec_sums((vector signed int)v2,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		for (j=4;j;j--)
Packit c32a2d
		{
Packit c32a2d
			SYNTH_STEREO_ALTIVEC(-16);
Packit c32a2d
			
Packit c32a2d
			vsum = vec_add(vsum,vsum2);
Packit c32a2d
			vsum2 = vec_add(vsum5,vsum6);
Packit c32a2d
			vsum3 = vec_add(vsum3,vsum4);
Packit c32a2d
			vsum4 = vec_add(vsum7,vsum8);
Packit c32a2d
			v1 = vec_add(vsum,vsum3);
Packit c32a2d
			v2 = vec_add(vsum2,vsum4);
Packit c32a2d
			vsum = (vector float)vec_cts(v1,16);
Packit c32a2d
			vsum2 = (vector float)vec_cts(v2,16);
Packit c32a2d
			v5 = (vector float)vec_cmpgt(v1,vmax);
Packit c32a2d
			v6 = (vector float)vec_cmplt(v1,vmin);
Packit c32a2d
			v7 = (vector float)vec_cmpgt(v2,vmax);
Packit c32a2d
			v8 = (vector float)vec_cmplt(v2,vmin);
Packit c32a2d
			
Packit c32a2d
			v1 = vec_mergeh(vsum, vsum2);
Packit c32a2d
			v2 = vec_mergel(vsum, vsum2);
Packit c32a2d
			v3 = vec_perm(vprev,v1,vperm2);
Packit c32a2d
			v4 = vec_perm(v1,v2,vperm2);
Packit c32a2d
			vprev = v2;
Packit c32a2d
			vec_st((vector signed int)v3,0,samples);
Packit c32a2d
			vec_st((vector signed int)v4,16,samples);
Packit c32a2d
			samples += 8;
Packit c32a2d
			
Packit c32a2d
			v1 = (vector float)vec_sr((vector unsigned int)v5, vshift);
Packit c32a2d
			v2 = (vector float)vec_sr((vector unsigned int)v6, vshift);
Packit c32a2d
			v3 = (vector float)vec_sr((vector unsigned int)v7, vshift);
Packit c32a2d
			v4 = (vector float)vec_sr((vector unsigned int)v8, vshift);
Packit c32a2d
			v1 = (vector float)vec_add((vector unsigned int)v1,(vector unsigned int)v2);
Packit c32a2d
			v2 = (vector float)vec_add((vector unsigned int)v3,(vector unsigned int)v4);
Packit c32a2d
			vclip = vec_sums((vector signed int)v1,vclip);
Packit c32a2d
			vclip = vec_sums((vector signed int)v2,vclip);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		if((size_t)samples & 0xf)
Packit c32a2d
		{
Packit c32a2d
			v1 = (vector float)vec_perm(vec_ld(0,samples),vec_ld(0,samples),vec_lvsl(0,samples));
Packit c32a2d
			v2 = (vector float)vec_perm(vprev,v1,vperm2);
Packit c32a2d
			vec_st((vector signed int)v2,0,samples);
Packit c32a2d
		}
Packit c32a2d
		
Packit c32a2d
		vec_st(vclip,0,clip_tmp);
Packit c32a2d
		clip = clip_tmp[3];
Packit c32a2d
	}
Packit c32a2d
	fr->buffer.fill += 256;
Packit c32a2d
	
Packit c32a2d
	return clip;
Packit c32a2d
}