Home | History | Annotate | Download | only in src
      1 /* ------------------------------------------------------------------
      2  * Copyright (C) 1998-2009 PacketVideo
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
     13  * express or implied.
     14  * See the License for the specific language governing permissions
     15  * and limitations under the License.
     16  * -------------------------------------------------------------------
     17  */
     18 /*
     19 ------------------------------------------------------------------------------
     20    PacketVideo Corp.
     21    MP3 Decoder Library
     22 
     23    Pathname: ./cpp/include/pv_mp3dec_fxd_op_arm.h
     24 
     25      Date: 08/20/2007
     26 
     27 ------------------------------------------------------------------------------
     28  REVISION HISTORY
     29 
     30  Description:
     31 ------------------------------------------------------------------------------
     32  INCLUDE DESCRIPTION
     33 
     34  This file select the associated fixed point functions with the OS/ARCH.
     35 
     36 
     37 ------------------------------------------------------------------------------
     38 */
     39 
     40 #ifndef PV_MP3DEC_FXD_OP_ARM
     41 #define PV_MP3DEC_FXD_OP_ARM
     42 
     43 
     44 #ifdef __cplusplus
     45 extern "C"
     46 {
     47 #endif
     48 
     49 #include "pvmp3_audio_type_defs.h"
     50 
     51 
     52 #if (defined(PV_ARM_V5)||defined(PV_ARM_V4))
     53 
     54 
     55     __inline  Int32 fxp_mul32_Q30(const Int32 L_var1, const Int32 L_var2)
     56     {
     57 
     58         Int32 result64_hi;
     59         Int32 result64_lo;
     60         __asm
     61         {
     62             smull result64_lo, result64_hi, L_var2, L_var1
     63             mov   result64_lo, result64_lo, lsr #30
     64             add   result64_hi, result64_lo, result64_hi, asl  #2
     65         }
     66         return (result64_hi);
     67     }
     68 
     69     __inline  Int32 fxp_mac32_Q30(const Int32 L_var1, const Int32 L_var2, Int32 L_add)
     70     {
     71         Int32 result64_hi;
     72         Int32 result64_lo;
     73         __asm
     74         {
     75             smull result64_lo, result64_hi, L_var2, L_var1
     76             add L_add, L_add, result64_hi, asl  #2
     77             add L_add, L_add, result64_lo, lsr  #30
     78         }
     79         return (L_add);
     80     }
     81 
     82 
     83 
     84 #define Qfmt_31(a)   (Int32)(a*0x7FFFFFFF + (a>=0?0.5F:-0.5F))
     85 
     86 
     87 
     88     __inline  Int32 fxp_mul32_Q32(Int32 L_var1, const Int32 L_var2)
     89     {
     90         Int32 result64_hi;
     91         __asm
     92         {
     93             smull L_var1, result64_hi, L_var2, L_var1
     94         }
     95         return (result64_hi);
     96     }
     97 
     98     __inline  Int32 fxp_mul32_Q28(const Int32 L_var1, const Int32 L_var2)
     99     {
    100 
    101         Int32 result64_hi;
    102         Int32 result64_lo;
    103         __asm
    104         {
    105             smull result64_lo, result64_hi, L_var2, L_var1
    106             mov   result64_lo, result64_lo, lsr #28
    107             add   result64_hi, result64_lo, result64_hi, asl  #4
    108         }
    109         return (result64_hi);
    110     }
    111 
    112 
    113     __inline  Int32 fxp_mul32_Q27(const Int32 L_var1, const Int32 L_var2)
    114     {
    115 
    116         Int32 result64_hi;
    117         Int32 result64_lo;
    118         __asm
    119         {
    120             smull result64_lo, result64_hi, L_var2, L_var1
    121             mov   result64_lo, result64_lo, lsr #27
    122             add   result64_hi, result64_lo, result64_hi, asl  #5
    123         }
    124         return (result64_hi);
    125     }
    126 
    127 
    128     __inline  Int32 fxp_mul32_Q26(Int32 L_var1,  Int32 L_var2)
    129     {
    130 
    131         Int32 result64_hi;
    132         Int32 result64_lo;
    133         __asm
    134         {
    135             smull result64_lo, result64_hi, L_var2, L_var1
    136             mov   result64_lo, result64_lo, lsr #26
    137             add   result64_hi, result64_lo, result64_hi, asl  #6
    138         }
    139         return (result64_hi);
    140     }
    141 
    142 
    143 
    144     __inline  Int32 fxp_mac32_Q32(Int32 L_add,  Int32 L_var1, const Int32 L_var2)
    145     {
    146         __asm
    147         {
    148             smlal L_var1, L_add, L_var2, L_var1
    149         }
    150         return L_add;
    151     }
    152 
    153 
    154     __inline  Int32 fxp_msb32_Q32(Int32 L_sub,  Int32 L_var1, Int32 L_var2)
    155     {
    156 
    157         __asm
    158         {
    159             smull  L_var2, L_var1, L_var2, L_var1
    160             sub  L_sub, L_sub, L_var1
    161         }
    162         return L_sub;
    163     }
    164 
    165 
    166     __inline  Int32 fxp_mul32_Q29(const Int32 L_var1,  const Int32 L_var2)
    167     {
    168         Int32 result64_hi;
    169         Int32 result64_lo;
    170         __asm
    171         {
    172             smull result64_lo, result64_hi, L_var2, L_var1
    173             mov   result64_lo, result64_lo, lsr #29
    174             add   result64_hi, result64_lo, result64_hi, asl  #3
    175         }
    176         return (result64_hi);
    177     }
    178 
    179 
    180     __inline int32 pv_abs(int32 a)
    181     {
    182         Int32 b;
    183         /*
    184             b = a - (a<0);
    185             a = b ^ sign(b)
    186          */
    187         __asm
    188         {
    189             sub  b, a, a, lsr #31
    190             eor  a, b, b, asr #31
    191         }
    192         return (a);
    193     }
    194 
    195 #endif
    196 
    197 #ifdef __cplusplus
    198 }
    199 #endif
    200 
    201 
    202 #endif   /*  PV_MP3DEC_FXD_OP_ARM  */
    203 
    204