1/*
2 * Copyright (C) 2004-2010 NXP Software
3 * Copyright (C) 2010 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 *      http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17
18/**********************************************************************************
19   INCLUDE FILES
20***********************************************************************************/
21
22#include "VectorArithmetic.h"
23
24/**********************************************************************************
25   FUNCTION Shift_Sat_v32xv32
26***********************************************************************************/
27
28void Shift_Sat_v32xv32 (const   LVM_INT16   val,
29                        const   LVM_INT32   *src,
30                        LVM_INT32   *dst,
31                        LVM_INT16   n)
32{
33    LVM_INT32   ii;
34    LVM_INT16   RShift;
35
36    if(val>0)
37    {
38        LVM_INT32 a,b;
39
40        for (ii = n; ii != 0; ii--)
41        {
42            a=*src;
43            src++;
44
45            b=(a<<val);
46
47            if( (b>>val) != a ) /* if overflow occured, right shift will show difference*/
48            {
49                if(a<0)
50                {
51                    b=0x80000000l;
52                }
53                else
54                {
55                    b=0x7FFFFFFFl;
56                }
57            }
58
59            *dst = b;
60            dst++;
61        }
62    }
63    else if(val<0)
64    {
65        RShift=(LVM_INT16)(-val);
66        for (ii = n; ii != 0; ii--)
67        {
68            *dst = (*src >> RShift);
69            dst++;
70            src++;
71        }
72    }
73    else
74    {
75        if(src!=dst)
76        {
77            Copy_16((LVM_INT16 *)src,(LVM_INT16 *)dst,(LVM_INT16)(n<<1));
78        }
79    }
80    return;
81}
82
83/**********************************************************************************/
84