153a5a1b3Sopenharmony_ci/* Copyright (C) 2007 Hong Zhiqian */
253a5a1b3Sopenharmony_ci/**
353a5a1b3Sopenharmony_ci   @file _kiss_fft_guts_tm.h
453a5a1b3Sopenharmony_ci   @author Hong Zhiqian
553a5a1b3Sopenharmony_ci   @brief Various compatibility routines for Speex (TriMedia version)
653a5a1b3Sopenharmony_ci*/
753a5a1b3Sopenharmony_ci/*
853a5a1b3Sopenharmony_ci   Redistribution and use in source and binary forms, with or without
953a5a1b3Sopenharmony_ci   modification, are permitted provided that the following conditions
1053a5a1b3Sopenharmony_ci   are met:
1153a5a1b3Sopenharmony_ci
1253a5a1b3Sopenharmony_ci   - Redistributions of source code must retain the above copyright
1353a5a1b3Sopenharmony_ci   notice, this list of conditions and the following disclaimer.
1453a5a1b3Sopenharmony_ci
1553a5a1b3Sopenharmony_ci   - Redistributions in binary form must reproduce the above copyright
1653a5a1b3Sopenharmony_ci   notice, this list of conditions and the following disclaimer in the
1753a5a1b3Sopenharmony_ci   documentation and/or other materials provided with the distribution.
1853a5a1b3Sopenharmony_ci
1953a5a1b3Sopenharmony_ci   - Neither the name of the Xiph.org Foundation nor the names of its
2053a5a1b3Sopenharmony_ci   contributors may be used to endorse or promote products derived from
2153a5a1b3Sopenharmony_ci   this software without specific prior written permission.
2253a5a1b3Sopenharmony_ci
2353a5a1b3Sopenharmony_ci   THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2453a5a1b3Sopenharmony_ci   ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2553a5a1b3Sopenharmony_ci   LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2653a5a1b3Sopenharmony_ci   A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR
2753a5a1b3Sopenharmony_ci   CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
2853a5a1b3Sopenharmony_ci   EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2953a5a1b3Sopenharmony_ci   PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
3053a5a1b3Sopenharmony_ci   PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
3153a5a1b3Sopenharmony_ci   LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
3253a5a1b3Sopenharmony_ci   NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
3353a5a1b3Sopenharmony_ci   SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3453a5a1b3Sopenharmony_ci*/
3553a5a1b3Sopenharmony_ci
3653a5a1b3Sopenharmony_ci#ifndef _KISS_FFT_GUTS_TM_
3753a5a1b3Sopenharmony_ci#define _KISS_FFT_GUTS_TM_
3853a5a1b3Sopenharmony_ci
3953a5a1b3Sopenharmony_ci#ifdef TM_ASM
4053a5a1b3Sopenharmony_ci
4153a5a1b3Sopenharmony_ci#include <ops/custom_defs.h>
4253a5a1b3Sopenharmony_ci
4353a5a1b3Sopenharmony_ci#ifdef FIXED_POINT
4453a5a1b3Sopenharmony_ci
4553a5a1b3Sopenharmony_ci#undef	sround
4653a5a1b3Sopenharmony_ci#define sround(x)	sex16(((x) + (1<<(FRACBITS-1)) ) >> FRACBITS)
4753a5a1b3Sopenharmony_ci
4853a5a1b3Sopenharmony_ci#undef	MIN
4953a5a1b3Sopenharmony_ci#undef	MAX
5053a5a1b3Sopenharmony_ci#define MIN(a,b)	imin(a,b)
5153a5a1b3Sopenharmony_ci#define	MAX(a,b)	imax(a,b)
5253a5a1b3Sopenharmony_ci
5353a5a1b3Sopenharmony_ci#define TM_MUL(res,a,b)																\
5453a5a1b3Sopenharmony_ci	{	register int a0, a1, b0, b1;												\
5553a5a1b3Sopenharmony_ci																					\
5653a5a1b3Sopenharmony_ci		a0	 = sex16((a));															\
5753a5a1b3Sopenharmony_ci		a1	 = asri(16,(a));														\
5853a5a1b3Sopenharmony_ci		b0	 = sex16((b));															\
5953a5a1b3Sopenharmony_ci		b1	 = asri(16,(b));														\
6053a5a1b3Sopenharmony_ci		(res)= pack16lsb(															\
6153a5a1b3Sopenharmony_ci			sround(ifir16((a),funshift2((b),(b)))),									\
6253a5a1b3Sopenharmony_ci			sround(a0*b0-a1*b1));													\
6353a5a1b3Sopenharmony_ci	}																				\
6453a5a1b3Sopenharmony_ci
6553a5a1b3Sopenharmony_ci#define TM_ADD(res,a,b)																\
6653a5a1b3Sopenharmony_ci	{	(res)=dspidualadd((a),(b));													\
6753a5a1b3Sopenharmony_ci	}																				\
6853a5a1b3Sopenharmony_ci
6953a5a1b3Sopenharmony_ci#define TM_SUB(res,a,b)																\
7053a5a1b3Sopenharmony_ci	{	(res)=dspidualsub((a),(b));													\
7153a5a1b3Sopenharmony_ci	}																				\
7253a5a1b3Sopenharmony_ci
7353a5a1b3Sopenharmony_ci#define TM_SHR(res,a,shift)															\
7453a5a1b3Sopenharmony_ci	{	(res)=dualasr((a),(shift));													\
7553a5a1b3Sopenharmony_ci	}																				\
7653a5a1b3Sopenharmony_ci
7753a5a1b3Sopenharmony_ci#define TM_DIV(res,c,frac)															\
7853a5a1b3Sopenharmony_ci	{	register int c1, c0;														\
7953a5a1b3Sopenharmony_ci																					\
8053a5a1b3Sopenharmony_ci		c1 = asri(16,(c));															\
8153a5a1b3Sopenharmony_ci		c0 = sex16((c));															\
8253a5a1b3Sopenharmony_ci		(res) = pack16lsb(sround(c1 * (32767/(frac))), sround(c0 * (32767/(frac))));\
8353a5a1b3Sopenharmony_ci	}																				\
8453a5a1b3Sopenharmony_ci
8553a5a1b3Sopenharmony_ci#define TM_NEGMSB(res, a)															\
8653a5a1b3Sopenharmony_ci	{	(res) = pack16lsb((ineg(asri(16,(a)))), (a));								\
8753a5a1b3Sopenharmony_ci	}																				\
8853a5a1b3Sopenharmony_ci
8953a5a1b3Sopenharmony_ci#else
9053a5a1b3Sopenharmony_ci
9153a5a1b3Sopenharmony_ci#undef	MIN
9253a5a1b3Sopenharmony_ci#undef	MAX
9353a5a1b3Sopenharmony_ci#define MIN(a,b)	fmin(a,b)
9453a5a1b3Sopenharmony_ci#define MAX(a,b)	fmax(a,b)
9553a5a1b3Sopenharmony_ci
9653a5a1b3Sopenharmony_ci#endif
9753a5a1b3Sopenharmony_ci#endif
9853a5a1b3Sopenharmony_ci
9953a5a1b3Sopenharmony_ci#undef	CHECKBUF
10053a5a1b3Sopenharmony_ci#define CHECKBUF(buf,nbuf,n)													\
10153a5a1b3Sopenharmony_ci    {																			\
10253a5a1b3Sopenharmony_ci        if ( nbuf < (size_t)(n) ) {												\
10353a5a1b3Sopenharmony_ci            speex_free(buf);													\
10453a5a1b3Sopenharmony_ci            buf = (kiss_fft_cpx*)KISS_FFT_MALLOC(sizeof(kiss_fft_cpx)*(n)); 	\
10553a5a1b3Sopenharmony_ci            nbuf = (size_t)(n);													\
10653a5a1b3Sopenharmony_ci        }																		\
10753a5a1b3Sopenharmony_ci	}																			\
10853a5a1b3Sopenharmony_ci
10953a5a1b3Sopenharmony_ci#undef	 C_ADD
11053a5a1b3Sopenharmony_ci#define  C_ADD( res, a,b)														\
11153a5a1b3Sopenharmony_ci   {																			\
11253a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((a).r,+,(b).r)										\
11353a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((a).i,+,(b).i)										\
11453a5a1b3Sopenharmony_ci	    (res).r=(a).r+(b).r;  (res).i=(a).i+(b).i;								\
11553a5a1b3Sopenharmony_ci    }																			\
11653a5a1b3Sopenharmony_ci
11753a5a1b3Sopenharmony_ci
11853a5a1b3Sopenharmony_ci#undef	 C_SUB
11953a5a1b3Sopenharmony_ci#define  C_SUB( res, a,b)														\
12053a5a1b3Sopenharmony_ci    {																			\
12153a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((a).r,-,(b).r)										\
12253a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((a).i,-,(b).i)										\
12353a5a1b3Sopenharmony_ci	    (res).r=(a).r-(b).r;  (res).i=(a).i-(b).i;								\
12453a5a1b3Sopenharmony_ci    }																			\
12553a5a1b3Sopenharmony_ci
12653a5a1b3Sopenharmony_ci#undef	C_ADDTO
12753a5a1b3Sopenharmony_ci#define C_ADDTO( res , a)														\
12853a5a1b3Sopenharmony_ci    {																			\
12953a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((res).r,+,(a).r)										\
13053a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((res).i,+,(a).i)										\
13153a5a1b3Sopenharmony_ci	    (res).r += (a).r;  (res).i += (a).i;									\
13253a5a1b3Sopenharmony_ci    }																			\
13353a5a1b3Sopenharmony_ci
13453a5a1b3Sopenharmony_ci#undef	C_SUBFROM
13553a5a1b3Sopenharmony_ci#define C_SUBFROM( res, a)														\
13653a5a1b3Sopenharmony_ci    {																			\
13753a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((res).r,-,(a).r)										\
13853a5a1b3Sopenharmony_ci	    CHECK_OVERFLOW_OP((res).i,-,(a).i)										\
13953a5a1b3Sopenharmony_ci	    (res).r -= (a).r;  (res).i -= (a).i;									\
14053a5a1b3Sopenharmony_ci	}																			\
14153a5a1b3Sopenharmony_ci
14253a5a1b3Sopenharmony_ci#undef	 kf_cexp
14353a5a1b3Sopenharmony_ci#define  kf_cexp(x,phase)														\
14453a5a1b3Sopenharmony_ci	{	(x)->r = KISS_FFT_COS(phase);											\
14553a5a1b3Sopenharmony_ci		(x)->i = KISS_FFT_SIN(phase); }											\
14653a5a1b3Sopenharmony_ci
14753a5a1b3Sopenharmony_ci#undef	 kf_cexp2
14853a5a1b3Sopenharmony_ci#define  kf_cexp2(x,phase)														\
14953a5a1b3Sopenharmony_ci    {	(x)->r = spx_cos_norm((phase));											\
15053a5a1b3Sopenharmony_ci		(x)->i = spx_cos_norm((phase)-32768); }									\
15153a5a1b3Sopenharmony_ci
15253a5a1b3Sopenharmony_ci
15353a5a1b3Sopenharmony_ci#ifdef FIXED_POINT
15453a5a1b3Sopenharmony_ci
15553a5a1b3Sopenharmony_ci#undef	C_MUL
15653a5a1b3Sopenharmony_ci#define C_MUL(m,a,b)															\
15753a5a1b3Sopenharmony_ci	{	(m).r = sround( smul((a).r,(b).r) - smul((a).i,(b).i) );				\
15853a5a1b3Sopenharmony_ci		(m).i = sround( smul((a).r,(b).i) + smul((a).i,(b).r) ); }				\
15953a5a1b3Sopenharmony_ci
16053a5a1b3Sopenharmony_ci#undef	C_FIXDIV
16153a5a1b3Sopenharmony_ci#define C_FIXDIV(c,div)															\
16253a5a1b3Sopenharmony_ci	{   DIVSCALAR( (c).r , div);												\
16353a5a1b3Sopenharmony_ci		DIVSCALAR( (c).i  , div); }												\
16453a5a1b3Sopenharmony_ci
16553a5a1b3Sopenharmony_ci#undef	C_MULBYSCALAR
16653a5a1b3Sopenharmony_ci#define C_MULBYSCALAR( c, s )													\
16753a5a1b3Sopenharmony_ci    {	(c).r =  sround( smul( (c).r , s ) ) ;									\
16853a5a1b3Sopenharmony_ci        (c).i =  sround( smul( (c).i , s ) ) ; }								\
16953a5a1b3Sopenharmony_ci
17053a5a1b3Sopenharmony_ci#else
17153a5a1b3Sopenharmony_ci
17253a5a1b3Sopenharmony_ci#undef	C_MUL
17353a5a1b3Sopenharmony_ci#define C_MUL(m,a,b)															\
17453a5a1b3Sopenharmony_ci	{	(m).r = (a).r*(b).r - (a).i*(b).i;										\
17553a5a1b3Sopenharmony_ci        (m).i = (a).r*(b).i + (a).i*(b).r; }									\
17653a5a1b3Sopenharmony_ci
17753a5a1b3Sopenharmony_ci
17853a5a1b3Sopenharmony_ci#undef	C_MULBYSCALAR
17953a5a1b3Sopenharmony_ci#define C_MULBYSCALAR( c, s )													\
18053a5a1b3Sopenharmony_ci    {	(c).r *= (s);															\
18153a5a1b3Sopenharmony_ci        (c).i *= (s); }															\
18253a5a1b3Sopenharmony_ci
18353a5a1b3Sopenharmony_ci
18453a5a1b3Sopenharmony_ci
18553a5a1b3Sopenharmony_ci#endif
18653a5a1b3Sopenharmony_ci
18753a5a1b3Sopenharmony_ci#endif
18853a5a1b3Sopenharmony_ci
189