mpy_32.h revision 4f1efc098cb5791c3e9f483f2af84aef70d2d0a0
163ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall/* ------------------------------------------------------------------
263ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * Copyright (C) 1998-2009 PacketVideo
363ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall *
463ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * Licensed under the Apache License, Version 2.0 (the "License");
563ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * you may not use this file except in compliance with the License.
663ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * You may obtain a copy of the License at
763ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall *
863ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall *      http://www.apache.org/licenses/LICENSE-2.0
963ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall *
1063ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * Unless required by applicable law or agreed to in writing, software
1163ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * distributed under the License is distributed on an "AS IS" BASIS,
1263ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1363ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * express or implied.
1463ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * See the License for the specific language governing permissions
1563ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * and limitations under the License.
1663ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall * -------------------------------------------------------------------
1763ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall */
1863ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall/****************************************************************************************
1963ed38dc52b27c5b39b11717d0c7736e1756db42Jesse HallPortions of this file are derived from the following 3GPP standard:
2063ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall
2163ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall    3GPP TS 26.073
2263ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall    ANSI-C code for the Adaptive Multi-Rate (AMR) speech codec
2363ed38dc52b27c5b39b11717d0c7736e1756db42Jesse Hall    Available from http://www.3gpp.org
24c0d184b8c1002098138f65e5cd2d9b1fb3da8bb1Jesse Hall
252d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall(C) 2004, 3GPP Organizational Partners (ARIB, ATIS, CCSA, ETSI, TTA, TTC)
262d9faafa2318c05f8991beff9cc683d72cbabd07Jesse HallPermission to distribute, modify and use this file under the standard license
272d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hallterms listed above has been obtained from the copyright holder.
282d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall****************************************************************************************/
292d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall/*
302d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
312d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall Filename: /audio/gsm_amr/c/include/mpy_32.h
322d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
332d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall------------------------------------------------------------------------------
342d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall REVISION HISTORY
352d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
362d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall Description: Updated function prototype declaration to reflect new interface.
372d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall              A pointer to overflow flag is passed into the function. Updated
382d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall              template.
392d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
402d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall Description: Moved _cplusplus #ifdef after Include section.
412d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
422d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall Description: Updated the function to include ARM and Linux-ARM assembly
432d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall              instructions.
442d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
452d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall Description:
462d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
472d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall------------------------------------------------------------------------------
482d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall INCLUDE DESCRIPTION
492d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
502d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall This file contains all the constant definitions and prototype definitions
512d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall needed by the Mpy_32 function.
522d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
532d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall------------------------------------------------------------------------------
542d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall*/
552d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
562d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall/*----------------------------------------------------------------------------
572d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall; CONTINUE ONLY IF NOT ALREADY DEFINED
582d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall----------------------------------------------------------------------------*/
592d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#ifndef MPY_32_H
602d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#define MPY_32_H
612d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
622d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall/*----------------------------------------------------------------------------
632d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall; INCLUDES
642d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall----------------------------------------------------------------------------*/
652d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#include    "basicop_malloc.h"
662d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
672d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall/*--------------------------------------------------------------------------*/
682d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#ifdef __cplusplus
692d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hallextern "C"
702d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall{
712d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#endif
722d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
732d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
742d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; MACROS
752d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; Define module specific macros here
762d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
772d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
782d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
792d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
802d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; DEFINES
812d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; Include all pre-processor statements here.
822d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
832d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
842d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
852d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; EXTERNAL VARIABLES REFERENCES
862d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; Declare variables used in this module but defined elsewhere
872d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
882d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
892d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
902d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; SIMPLE TYPEDEF'S
912d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
922d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
932d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
942d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; ENUMERATED TYPEDEF'S
952d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
962d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
972d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
982d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; STRUCTURES TYPEDEF'S
992d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
1002d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1012d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
1022d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; GLOBAL FUNCTION DEFINITIONS
1032d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; Function Prototype declaration
1042d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
1052d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#if defined(PV_ARM_V5) /* Instructions for ARM Assembly on ADS*/
1062d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1072d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    __inline Word32 Mpy_32(Word16 L_var1_hi,
1082d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    Word16 L_var1_lo,
1092d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    Word16 L_var2_hi,
1102d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    Word16 L_var2_lo,
1112d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    Flag   *pOverflow)
1122d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1132d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    {
1142d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /*----------------------------------------------------------------------------
1152d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ; Define all local variables
1162d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ----------------------------------------------------------------------------*/
1172d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 L_product;
1182d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 L_sum;
1192d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 product32;
1202d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1212d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        OSCL_UNUSED_ARG(pOverflow);
1222d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /*----------------------------------------------------------------------------
1232d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ; Function body here
1242d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ----------------------------------------------------------------------------*/
1252d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /* L_product = L_mult (L_var1_hi, L_var2_hi, pOverflow);*/
1262d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1272d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {SMULBB L_product, L_var1_hi, L_var2_hi}
1282d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {QDADD L_product, 0, L_product}
1292d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {SMULBB product32, L_var1_hi, L_var2_lo}
1302d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        product32 >>= 15;
1312d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {QDADD L_sum, L_product, product32}
1322d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        L_product = L_sum;
1332d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {SMULBB product32, L_var1_lo, L_var2_hi}
1342d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        product32 >>= 15;
1352d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        __asm {QDADD L_sum, L_product, product32}
1362d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        return (L_sum);
1372d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    }
1382d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1392d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#elif defined(PV_ARM_GCC_V5) /* Instructions for ARM-linux cross-compiler*/
1402d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1412d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    static inline Word32 Mpy_32(Word16 L_var1_hi,
1422d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                                Word16 L_var1_lo,
1432d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                                Word16 L_var2_hi,
1442d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                                Word16 L_var2_lo,
1452d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                                Flag   *pOverflow)
1462d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    {
1472d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 product32;
1482d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 L_sum;
1492d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 L_product, result;
1502d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 ra = L_var1_hi;
1512d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 rb = L_var1_lo;
1522d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 rc = L_var2_hi;
1532d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        register Word32 rd = L_var2_lo;
1542d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1552d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1562d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1572d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        OSCL_UNUSED_ARG(pOverflow);
1582d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1592d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("smulbb %0, %1, %2"
1602d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(L_product)
1612d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(ra), "r"(rc)
1622d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1632d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("mov %0, #0"
1642d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(result)
1652d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                    );
1662d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1672d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("qdadd %0, %1, %2"
1682d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(L_sum)
1692d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(result), "r"(L_product)
1702d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1712d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1722d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("smulbb %0, %1, %2"
1732d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(product32)
1742d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(ra), "r"(rd)
1752d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1762d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1772d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("mov %0, %1, ASR #15"
1782d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(ra)
1792d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(product32)
1802d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1812d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("qdadd %0, %1, %2"
1822d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(L_product)
1832d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(L_sum), "r"(ra)
1842d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1852d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1862d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("smulbb %0, %1, %2"
1872d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(product32)
1882d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(rb), "r"(rc)
1892d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1902d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1912d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("mov %0, %1, ASR #15"
1922d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(rb)
1932d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(product32)
1942d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
1952d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
1962d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        asm volatile("qdadd %0, %1, %2"
1972d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall             : "=r"(L_sum)
1982d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                             : "r"(L_product), "r"(rb)
1992d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                            );
2002d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2012d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        return (L_sum);
2022d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    }
2032d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2042d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#else /* C_EQUIVALENT */
2052d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2062d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    __inline Word32 Mpy_32(Word16 L_var1_hi,
2072d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                           Word16 L_var1_lo,
2082d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                           Word16 L_var2_hi,
2092d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                           Word16 L_var2_lo,
2102d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                           Flag   *pOverflow)
2112d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    {
2122d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 L_product;
2132d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 L_sum;
2142d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        Word32 product32;
2152d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2162d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        OSCL_UNUSED_ARG(pOverflow);
2172d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        L_product = (Word32) L_var1_hi * L_var2_hi;
2182d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2192d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        if (L_product != (Word32) 0x40000000L)
2202d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        {
2212d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            L_product <<= 1;
2222d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        }
2232d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        else
2242d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        {
2252d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            L_product = MAX_32;
2262d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        }
2272d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2282d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /* result = mult (L_var1_hi, L_var2_lo, pOverflow); */
2292d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        product32 = ((Word32) L_var1_hi * L_var2_lo) >> 15;
2302d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2312d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /* L_product = L_mac (L_product, result, 1, pOverflow); */
2322d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        L_sum = L_product + (product32 << 1);
2332d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2342d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        if ((L_product ^ product32) > 0)
2352d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        {
2362d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            if ((L_sum ^ L_product) < 0)
2372d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            {
2382d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
2392d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            }
2402d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        }
2412d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2422d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        L_product = L_sum;
2432d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2442d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /* result = mult (L_var1_lo, L_var2_hi, pOverflow); */
2452d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        product32 = ((Word32) L_var1_lo * L_var2_hi) >> 15;
2462d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2472d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /* L_product = L_mac (L_product, result, 1, pOverflow); */
2482d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        L_sum = L_product + (product32 << 1);
2492d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2502d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        if ((L_product ^ product32) > 0)
2512d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        {
2522d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            if ((L_sum ^ L_product) < 0)
2532d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            {
2542d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall                L_sum = (L_product < 0) ? MIN_32 : MAX_32;
2552d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall            }
2562d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        }
2572d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2582d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        /*----------------------------------------------------------------------------
2592d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ; Return nothing or data or data pointer
2602d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        ----------------------------------------------------------------------------*/
2612d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall        return (L_sum);
2622d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    }
2632d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2642d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#endif
2652d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    /*----------------------------------------------------------------------------
2662d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ; END
2672d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall    ----------------------------------------------------------------------------*/
2682d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#ifdef __cplusplus
2692d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall}
2702d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#endif
2712d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall
2722d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall#endif /* _MPY_32_H_ */
2732d9faafa2318c05f8991beff9cc683d72cbabd07Jesse Hall