Home | History | Annotate | Download | only in aacdec
      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  Pathname: fxp_mul32_arm_v4_gcc.h
     21 
     22 ------------------------------------------------------------------------------
     23  REVISION HISTORY
     24 
     25  Who:                                       Date:
     26  Description:
     27 ------------------------------------------------------------------------------
     28  INCLUDE DESCRIPTION
     29 
     30 ------------------------------------------------------------------------------
     31 */
     32 
     33 
     34 
     35 #ifndef FXP_MUL32_V4_ARM_GCC
     36 #define FXP_MUL32_V4_ARM_GCC
     37 
     38 
     39 #ifdef __cplusplus
     40 extern "C"
     41 {
     42 #endif
     43 
     44 
     45 #include "pv_audio_type_defs.h"
     46 
     47 
     48 #if defined (_ARM_V4_GCC) /* ARM_V4 GNU COMPILER  */
     49 
     50 
     51 #define preload_cache( a)
     52 
     53 
     54     static inline  Int32 shft_lft_1(Int32 L_var1)
     55     {
     56         Int32 x;
     57         register Int32 ra = L_var1;
     58         Int32 z = INT32_MAX;
     59 
     60         asm volatile(
     61             "mov %0, %1, asl #1\n\t"
     62             "teq %1, %0, asr #1\n\t"
     63             "eorne   %0, %2, %1, asr #31"
     64     : "=&r*i"(x)
     65                     : "r"(ra),
     66                     "r"(z));
     67 
     68         return(x);
     69     }
     70 
     71     static inline Int32 fxp_mul_16_by_16bb(Int32 L_var1, Int32 L_var2)
     72 {
     73 
     74         Int32 tmp1;
     75         Int32 tmp2;
     76         register Int32 ra = (Int32)L_var1;
     77         register Int32 rb = (Int32)L_var2;
     78 
     79         asm volatile(
     80             "mov %0, %3, asl #16\n\t"
     81             "mov %0, %0, asr #16\n\t"
     82             "mov %1, %2, asl #16\n\t"
     83             "mov %1, %1, asr #16\n\t"
     84             "mul %0, %1, %0"
     85     : "=&r*i"(tmp1),
     86             "=&r*i"(tmp2)
     87                     : "r"(ra),
     88                     "r"(rb));
     89 
     90         return (tmp1);
     91 
     92     }
     93 
     94 #define fxp_mul_16_by_16(a, b)  fxp_mul_16_by_16bb(  a, b)
     95 
     96 
     97     static inline Int32 fxp_mul_16_by_16tb(Int32 L_var1, Int32 L_var2)
     98 {
     99 
    100         Int32 tmp1;
    101         Int32 tmp2;
    102         register Int32 ra = (Int32)L_var1;
    103         register Int32 rb = (Int32)L_var2;
    104 
    105         asm volatile(
    106             "mov %0, %3, asl #16\n\t"
    107             "mov %0, %0, asr #16\n\t"
    108             "mov %1, %2, asr #16\n\t"
    109             "mul %0, %1, %0"
    110     : "=&r*i"(tmp1),
    111             "=&r*i"(tmp2)
    112                     : "r"(ra),
    113                     "r"(rb));
    114 
    115         return (tmp1);
    116 
    117     }
    118 
    119 
    120     static inline Int32 fxp_mul_16_by_16bt(Int32 L_var1, Int32 L_var2)
    121 {
    122 
    123         Int32 tmp1;
    124         Int32 tmp2;
    125         register Int32 ra = (Int32)L_var1;
    126         register Int32 rb = (Int32)L_var2;
    127 
    128         asm volatile(
    129             "mov %0, %3, asr #16\n\t"
    130             "mov %1, %2, asl #16\n\t"
    131             "mov %1, %1, asr #16\n\t"
    132             "mul %0, %1, %0"
    133     : "=&r*i"(tmp1),
    134             "=&r*i"(tmp2)
    135                     : "r"(ra),
    136                     "r"(rb));
    137 
    138         return (tmp1);
    139 
    140     }
    141 
    142 
    143     static inline Int32 fxp_mul_16_by_16tt(Int32 L_var1, Int32 L_var2)
    144 {
    145 
    146         Int32 tmp1;
    147         Int32 tmp2;
    148         register Int32 ra = (Int32)L_var1;
    149         register Int32 rb = (Int32)L_var2;
    150 
    151         asm volatile(
    152             "mov %0, %3, asr #16\n\t"
    153             "mov %1, %2, asr #16\n\t"
    154             "mul %0, %1, %0"
    155     : "=&r*i"(tmp1),
    156             "=&r*i"(tmp2)
    157                     : "r"(ra),
    158                     "r"(rb));
    159 
    160         return (tmp1);
    161 
    162     }
    163 
    164 
    165 
    166     static inline  Int32 fxp_mac_16_by_16(Int16 L_var1,  Int16 L_var2, Int32 L_add)
    167 {
    168 
    169         Int32 tmp;
    170         register Int32 ra = (Int32)L_var1;
    171         register Int32 rb = (Int32)L_var2;
    172         register Int32 rc = (Int32)L_add;
    173 
    174         asm volatile(
    175             "mla %0, %1, %2, %3"
    176     : "=&r*i"(tmp)
    177                     : "r"(ra),
    178                     "r"(rb),
    179                     "r"(rc));
    180 
    181         return (tmp);
    182     }
    183 
    184 
    185 
    186     static inline Int32 fxp_mac_16_by_16_bb(Int16 L_var1,  Int32 L_var2, Int32 L_add)
    187 {
    188 
    189         Int32 tmp1;
    190         Int32 tmp2;
    191         register Int32 ra = (Int32)L_var1;
    192         register Int32 rb = (Int32)L_var2;
    193         register Int32 rc = (Int32)L_add;
    194 
    195         asm volatile(
    196             "mov %0, %3, asl #16\n\t"
    197             "mov %0, %0, asr #16\n\t"
    198             "mla %1, %0, %2, %4"
    199     : "=&r*i"(tmp1),
    200             "=&r*i"(tmp2)
    201                     : "r"(ra),
    202                     "r"(rb),
    203                     "r"(rc));
    204 
    205         return (tmp2);
    206     }
    207 
    208 
    209 
    210     static inline  Int32 fxp_mac_16_by_16_bt(Int16 L_var1,  Int32 L_var2, Int32 L_add)
    211 {
    212 
    213         Int32 tmp1;
    214         Int32 tmp2;
    215         register Int32 ra = (Int32)L_var1;
    216         register Int32 rb = (Int32)L_var2;
    217         register Int32 rc = (Int32)L_add;
    218 
    219         asm volatile(
    220             "mov %0, %3, asr #16\n\t"
    221             "mla %1, %0, %2, %4"
    222     : "=&r*i"(tmp1),
    223             "=&r*i"(tmp2)
    224                     : "r"(ra),
    225                     "r"(rb),
    226                     "r"(rc));
    227 
    228         return (tmp2);
    229 
    230     }
    231 
    232 
    233 
    234     static inline  Int32 cmplx_mul32_by_16(Int32 x, Int32 y, Int32 exp_jw)
    235 {
    236 
    237         Int32 rTmp0;
    238         Int32 iTmp0;
    239         Int32 result64_hi;
    240         register Int32 ra = (Int32)x;
    241         register Int32 rb = (Int32)y;
    242         register Int32 rc = (Int32)exp_jw;
    243 
    244 
    245 
    246         asm volatile(
    247             "mov %0, %5, asr #16\n\t"
    248             "mov %1, %5, asl #16\n\t"
    249             "mov %0, %0, asl #16\n\t"
    250     : "=&r*i"(rTmp0),
    251             "=&r*i"(iTmp0),
    252             "=&r*i"(result64_hi)
    253                     : "r"(ra),
    254                     "r"(rb),
    255                     "r"(rc));
    256 
    257 
    258         asm volatile(
    259             "smull %0, %2, %3, %0\n\t"
    260             "smlal %1, %2, %4, %1"
    261     : "=&r*i"(rTmp0),
    262             "=&r*i"(iTmp0),
    263             "=&r*i"(result64_hi)
    264                     : "r"(ra),
    265                     "r"(rb),
    266                     "r"(rc));
    267 
    268         return (result64_hi);
    269 
    270 
    271     }
    272 
    273 
    274     static inline  Int32 fxp_mul32_by_16(Int32 L_var1, Int32 L_var2)
    275 {
    276 
    277         Int32 rTmp0;
    278         Int32 result64_hi;
    279         Int32 result64_lo;
    280         register Int32 ra = (Int32)L_var1;
    281         register Int32 rb = (Int32)L_var2;
    282 
    283         asm volatile(
    284             "mov %0, %4, asl #16\n\t"
    285             "smull %2, %1, %0, %3"
    286     : "=&r*i"(rTmp0),
    287             "=&r*i"(result64_hi),
    288             "=&r*i"(result64_lo)
    289                     : "r"(ra),
    290                     "r"(rb));
    291 
    292         return (result64_hi);
    293     }
    294 
    295 
    296 #define fxp_mul32_by_16b( a, b)   fxp_mul32_by_16( a, b)
    297 
    298 
    299 
    300     static inline  Int32 fxp_mul32_by_16t(Int32 L_var1, Int32 L_var2)
    301 {
    302 
    303         Int32 rTmp0;
    304         Int32 result64_hi;
    305         Int32 result64_lo;
    306         register Int32 ra = (Int32)L_var1;
    307         register Int32 rb = (Int32)L_var2;
    308 
    309         asm volatile(
    310             "mov %0, %4, asr #16\n\t"
    311             "mov %0, %0, asl #16\n\t"
    312             "smull %2, %1, %0, %3"
    313     : "=&r*i"(rTmp0),
    314             "=&r*i"(result64_hi),
    315             "=&r*i"(result64_lo)
    316                     : "r"(ra),
    317                     "r"(rb));
    318 
    319         return (result64_hi);
    320     }
    321 
    322 
    323 
    324     static inline  Int32 fxp_mac32_by_16(Int32 L_var1, Int32 L_var2, Int32 L_add)
    325 {
    326 
    327         Int32 rTmp0;
    328         Int32 result64_hi;
    329         Int32 result64_lo;
    330         register Int32 ra = (Int32)L_var1;
    331         register Int32 rb = (Int32)L_var2;
    332         register Int32 rc = (Int32)L_add;
    333 
    334         asm volatile(
    335             "mov %0, %4, asl #16\n\t"
    336             "mov %1, %5\n\t"
    337             "smlal %2, %1, %0, %3"
    338     : "=&r*i"(rTmp0),
    339             "=&r*i"(result64_hi),
    340             "=&r*i"(result64_lo)
    341                     : "r"(ra),
    342                     "r"(rb),
    343                     "r"(rc));
    344 
    345         return (result64_hi);
    346     }
    347 
    348 
    349     static inline int64 fxp_mac64_Q31(int64 sum, const Int32 L_var1, const Int32 L_var2)
    350 {
    351         sum += (int64)L_var1 * L_var2;
    352         return (sum);
    353     }
    354 
    355 
    356     static inline Int32 fxp_mac32_Q30(const Int32 a, const Int32 b, Int32 L_add)
    357     {
    358         Int32 result64_hi;
    359         Int32 result64_lo;
    360         register Int32 ra = (Int32)a;
    361         register Int32 rb = (Int32)b;
    362         register Int32 rc = (Int32)L_add;
    363 
    364         asm volatile("smull %1, %0, %2, %3\n\t"
    365                      "add %4, %4, %0, asl #2\n\t"
    366                      "add %0, %4, %1, lsr #30"
    367              : "=&r*i"(result64_hi),
    368                      "=&r*i"(result64_lo)
    369                              : "r"(ra),
    370                              "r"(rb),
    371                              "r"(rc));
    372 
    373         return (result64_hi);
    374     }
    375 
    376 
    377     static inline Int32 fxp_mac32_Q31(Int32 L_add, const Int32 a, const Int32 b)
    378 {
    379 
    380         Int32 result64_hi;
    381         Int32 result64_lo;
    382         register Int32 ra = (Int32)a;
    383         register Int32 rb = (Int32)b;
    384         register Int32 rc = (Int32)L_add;
    385 
    386         asm volatile("smull %1, %0, %2, %3\n\t"
    387                      "add %0, %0, %4"
    388              : "=&r*i"(result64_hi),
    389                      "=&r*i"(result64_lo)
    390                              : "r"(ra),
    391                              "r"(rb),
    392                              "r"(rc));
    393 
    394         return (result64_hi);
    395     }
    396 
    397 
    398 
    399     static inline Int32 fxp_msu32_Q31(Int32 L_sub, const Int32 a, const Int32 b)
    400 {
    401         Int32 result64_hi;
    402         Int32 result64_lo;
    403         register Int32 ra = (Int32)a;
    404         register Int32 rb = (Int32)b;
    405         register Int32 rc = (Int32)L_sub;
    406 
    407         asm volatile("smull %1, %0, %2, %3\n\t"
    408                      "sub %0, %4, %0"
    409              : "=&r*i"(result64_hi),
    410                      "=&r*i"(result64_lo)
    411                              : "r"(ra),
    412                              "r"(rb),
    413                              "r"(rc));
    414 
    415 
    416         return (result64_hi);
    417     }
    418 
    419 
    420     static inline Int32 fxp_mul32_Q31(const Int32 a, const Int32 b)
    421 {
    422         Int32 result64_hi;
    423         Int32 result64_lo;
    424         register Int32 ra = (Int32)a;
    425         register Int32 rb = (Int32)b;
    426         asm volatile(
    427             "smull %1, %0, %2, %3"
    428     : "=&r*i"(result64_hi),
    429             "=&r*i"(result64_lo)
    430                     : "r"(ra),
    431                     "r"(rb));
    432 
    433         return (result64_hi);
    434     }
    435 
    436 
    437     static inline Int32 fxp_mul32_Q30(const Int32 a, const Int32 b)
    438 {
    439         Int32 result64_hi;
    440         Int32 result64_lo;
    441         register Int32 ra = (Int32)a;
    442         register Int32 rb = (Int32)b;
    443         asm volatile("smull %1, %0, %2, %3\n\t"
    444                      "mov %0, %0, lsl #2\n\t"
    445                      "orr   %0, %0, %1, lsr #30"
    446              : "=&r*i"(result64_hi),
    447                      "=&r*i"(result64_lo)
    448                              : "r"(ra),
    449                              "r"(rb));
    450         return (result64_hi);
    451     }
    452 
    453 
    454 
    455     static inline Int32 fxp_mac32_Q29(const Int32 a, const Int32 b, Int32 L_add)
    456 {
    457         Int32 result64_hi;
    458         Int32 result64_lo;
    459         register Int32 ra = (Int32)a;
    460         register Int32 rb = (Int32)b;
    461         register Int32 rc = (Int32)L_add;
    462 
    463         asm volatile("smull %1, %0, %2, %3\n\t"
    464                      "add   %4, %4, %0, lsl #3\n\t"
    465                      "add   %0, %4, %1, lsr #29"
    466              : "=&r*i"(result64_hi),
    467                      "=&r*i"(result64_lo)
    468                              : "r"(ra),
    469                              "r"(rb),
    470                              "r"(rc));
    471 
    472         return (result64_hi);
    473     }
    474 
    475 
    476     static inline Int32 fxp_msu32_Q29(const Int32 a, const Int32 b, Int32 L_sub)
    477 {
    478         Int32 result64_hi;
    479         Int32 result64_lo;
    480         register Int32 ra = (Int32)a;
    481         register Int32 rb = (Int32)b;
    482         register Int32 rc = (Int32)L_sub;
    483 
    484         asm volatile("smull %1, %0, %2, %3\n\t"
    485                      "sub   %4, %4, %0, lsl #3\n\t"
    486                      "sub   %0, %4, %1, lsr #29"
    487              : "=&r*i"(result64_hi),
    488                      "=&r*i"(result64_lo)
    489                              : "r"(ra),
    490                              "r"(rb),
    491                              "r"(rc));
    492 
    493         return (result64_hi);
    494     }
    495 
    496     static inline Int32 fxp_mul32_Q29(const Int32 a, const Int32 b)
    497 {
    498         Int32 result64_hi;
    499         Int32 result64_lo;
    500         register Int32 ra = (Int32)a;
    501         register Int32 rb = (Int32)b;
    502         asm volatile("smull %1, %0, %2, %3\n\t"
    503                      "mov %0, %0, lsl #3\n\t"
    504                      "orr   %0, %0, %1, lsr #29"
    505              : "=&r*i"(result64_hi),
    506                      "=&r*i"(result64_lo)
    507                              : "r"(ra),
    508                              "r"(rb));
    509         return (result64_hi);
    510     }
    511 
    512 
    513 
    514     static inline Int32 fxp_mul32_Q28(const Int32 a, const Int32 b)
    515 {
    516         Int32 result64_hi;
    517         Int32 result64_lo;
    518         register Int32 ra = (Int32)a;
    519         register Int32 rb = (Int32)b;
    520         asm volatile("smull %1, %0, %2, %3\n\t"
    521                      "mov %0, %0, lsl #4\n\t"
    522                      "orr   %0, %0, %1, lsr #28"
    523              : "=&r*i"(result64_hi),
    524                      "=&r*i"(result64_lo)
    525                              : "r"(ra),
    526                              "r"(rb));
    527         return (result64_hi);
    528     }
    529 
    530     static inline Int32 fxp_mul32_Q27(const Int32 a, const Int32 b)
    531 {
    532         Int32 result64_hi;
    533         Int32 result64_lo;
    534         register Int32 ra = (Int32)a;
    535         register Int32 rb = (Int32)b;
    536         asm volatile("smull %1, %0, %2, %3\n\t"
    537                      "mov %0, %0, lsl #5\n\t"
    538                      "orr   %0, %0, %1, lsr #27"
    539              : "=&r*i"(result64_hi),
    540                      "=&r*i"(result64_lo)
    541                              : "r"(ra),
    542                              "r"(rb));
    543 
    544         return (result64_hi);
    545     }
    546 
    547 
    548     static inline Int32 fxp_mul32_Q26(const Int32 a, const Int32 b)
    549 {
    550         Int32 result64_hi;
    551         Int32 result64_lo;
    552         register Int32 ra = (Int32)a;
    553         register Int32 rb = (Int32)b;
    554         asm volatile("smull %1, %0, %2, %3\n\t"
    555                      "mov %0, %0, lsl #6\n\t"
    556                      "orr   %0, %0, %1, lsr #26"
    557              : "=&r*i"(result64_hi),
    558                      "=&r*i"(result64_lo)
    559                              : "r"(ra),
    560                              "r"(rb));
    561 
    562         return (result64_hi);
    563     }
    564 
    565 
    566     static inline Int32 fxp_mul32_Q20(const Int32 a, const Int32 b)
    567 {
    568         Int32 result64_hi;
    569         Int32 result64_lo;
    570         register Int32 ra = (Int32)a;
    571         register Int32 rb = (Int32)b;
    572         asm volatile("smull %1, %0, %2, %3\n\t"
    573                      "mov %0, %0, lsl #12\n\t"
    574                      "orr   %0, %0, %1, lsr #20"
    575              : "=&r*i"(result64_hi),
    576                      "=&r*i"(result64_lo)
    577                              : "r"(ra),
    578                              "r"(rb));
    579 
    580         return (result64_hi);
    581     }
    582 
    583 
    584     static inline Int32 fxp_mul32_Q15(const Int32 a, const Int32 b)
    585 {
    586         Int32 result64_hi;
    587         Int32 result64_lo;
    588         register Int32 ra = (Int32)a;
    589         register Int32 rb = (Int32)b;
    590         asm volatile("smull %1, %0, %2, %3\n\t"
    591                      "mov %0, %0, lsl #17\n\t"
    592                      "orr   %0, %0, %1, lsr #15"
    593              : "=&r*i"(result64_hi),
    594                      "=&r*i"(result64_lo)
    595                              : "r"(ra),
    596                              "r"(rb));
    597 
    598         return (result64_hi);
    599     }
    600 
    601 
    602 
    603     static inline Int32 fxp_mul32_Q14(const Int32 a, const Int32 b)
    604 {
    605         Int32 result64_hi;
    606         Int32 result64_lo;
    607         register Int32 ra = (Int32)a;
    608         register Int32 rb = (Int32)b;
    609         asm volatile("smull %1, %0, %2,  %3\n\t"
    610                      "mov   %0, %0, lsl #18\n\t"
    611                      "orr   %0, %0, %1, lsr #14"
    612              : "=&r*i"(result64_hi),
    613                      "=&r*i"(result64_lo)
    614                              : "r"(ra),
    615                              "r"(rb));
    616 
    617         return (result64_hi);
    618     }
    619 
    620 #endif
    621 
    622 #ifdef __cplusplus
    623 }
    624 #endif
    625 
    626 
    627 #endif   /*  FXP_MUL32_V4_ARM_GCC  */
    628 
    629 
    630 
    631