Why perform multiplication in this way?
<p>I've run into this function:</p>

<pre><code>static inline INT32 MPY48SR(INT16 o16, INT32 o32)
{
    UINT32   Temp0;
    INT32    Temp1;
    // A1. get the lower 16 bits of the 32-bit param
    // A2. multiply them with the 16-bit param
    // A3. add 16384 (TODO: why?)
    // A4. bitshift to the right by 15 (TODO: why 15?)
    Temp0 = (((UINT16)o32 * o16) + 0x4000) &gt;&gt; 15;
    // B1. Get the higher 16 bits of the 32-bit param
    // B2. Multiply them with the 16-bit param
    Temp1 = (INT16)(o32 &gt;&gt; 16) * o16;
    // 1. Shift B to the left (TODO: why do this?)
    // 2. Combine with A and return
    return (Temp1 &lt;&lt; 1) + Temp0;
}
</code></pre>

<p>The inline comments are mine.  It seems that all it's doing is multiplying the two arguments.  Is this right, or is there more to it?  Why would this be done in such a way?</p>
