blob: 655aaeacb621fb8416417671697fb4d0e45e0f64 [file] [log] [blame]
/* ------------------------------------------------------------------
* Copyright (C) 1998-2009 PacketVideo
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
* express or implied.
* See the License for the specific language governing permissions
* and limitations under the License.
* -------------------------------------------------------------------
*/
#ifndef __FILTER__
#define __FILTER__
#include "oscl_types.h"
void analysis_filter_4(analysis_filter_t *, sbc_t *);
void analysis_filter_8(analysis_filter_t *, sbc_t *);
#ifdef ARM
__inline Int FMULT(Int a, Int b)
{
Int temp;
__asm
{
smulwb temp, a, b
mov temp, temp, asl #1
}
return (temp);
}
__inline Int FMULT_1(Int a, Int b)
{
Int tmp1;
Int tmp2;
__asm
{
smull tmp1, tmp2, a, b
mov tmp2, tmp2, asl #2
mov tmp1, tmp1, lsr #30
orr tmp2, tmp1, tmp2
}
return (tmp2);
}
__inline Int FMULT_2(Int a, Int b)
{
Int tmp1;
Int tmp2;
__asm
{
smull tmp1, tmp2, a, b
mov tmp2, tmp2, asl #16
mov tmp1, tmp1, lsr #16
orr tmp2, tmp1, tmp2
}
return (tmp2);
}
#elif defined (NO_64BIT_SUPPORT)
#define MASKLOW16 0xFFFF
__inline Int MULT(Int a, Int b, Int shift)
{
Int flag = 0; /* carries negative sign, if any */
Int c;
Int high32bits;
Int med_32bits_a;
Int med_32bits_b;
UInt low32bits;
UInt Result_low32bits;
Int carry;
UInt temp;
if (a < 0)
{
a = -a;
flag ^= 1;
}
if (b < 0)
{
b = -b;
flag ^= 1;
}
low32bits = a & MASKLOW16; /* temporary storage */
Result_low32bits = b & MASKLOW16; /* temporary storage */
high32bits = ((a >> 16) * (b >> 16)); /* Top 32 bits of resulting 64 */
med_32bits_a = ((a >> 16) * Result_low32bits); /* Midlle 32 bits (16 to 48) of resulting 64 */
med_32bits_b = ((Int)low32bits * (b >> 16));
low32bits = ((UInt)low32bits * Result_low32bits);/* Lower 32 bits of resulting 64 */
/* carry on evaluation */
temp = (UInt)(med_32bits_a << 16) + (UInt)(med_32bits_b << 16);
carry = ((temp < (UInt)(med_32bits_a << 16)) || (temp < (UInt)(med_32bits_b << 16)));
Result_low32bits = temp + low32bits;
carry += ((Result_low32bits < temp) || (Result_low32bits < low32bits));
high32bits = high32bits + (med_32bits_a >> 16) + (med_32bits_b >> 16) + carry;
c = ((high32bits << (32 - shift)) | (Result_low32bits >> (shift)));
return (flag ? -c : c);
}
#define FMULT(a,b) MULT(a, b, 15)
#define FMULT_1(a,b) MULT(a, b, 30)
#define FMULT_2(a,b) MULT(a, b, 16)
#else
#define FMULT(a, b) (Int)(((Int64)(a) * (b)) >> 15) //Output is kept in Q15 format.
#define FMULT_1(a, b) (Int)(((Int64)(a) * (b)) >> 30) //Output is kept in Q15 format.
#define FMULT_2(a, b) (Int)(((Int64)(a) * (b)) >> 16)
#endif
#endif /* __FILTER__ */