142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/* ------------------------------------------------------------------
242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Copyright (C) 1998-2009 PacketVideo
342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Licensed under the Apache License, Version 2.0 (the "License");
542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * you may not use this file except in compliance with the License.
642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * You may obtain a copy of the License at
742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *      http://www.apache.org/licenses/LICENSE-2.0
942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong *
1042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * Unless required by applicable law or agreed to in writing, software
1142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * distributed under the License is distributed on an "AS IS" BASIS,
1242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
1342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * express or implied.
1442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * See the License for the specific language governing permissions
1542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * and limitations under the License.
1642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong * -------------------------------------------------------------------
1742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong */
1842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*********************************************************************************/
1942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Filename: sad_halfpel_inline.h                                                      */
2042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Description: Implementation for in-line functions used in dct.cpp           */
2142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*  Modified:                                                                   */
2242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong/*********************************************************************************/
2342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#ifndef _SAD_HALFPEL_INLINE_H_
2542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#define _SAD_HALFPEL_INLINE_H_
2642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
2742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#ifdef __cplusplus
2842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dongextern "C"
2942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
3042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#endif
3142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
3242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#if !defined(PV_ARM_GCC_V5) && !defined(PV_ARM_GCC_V4) /* ARM GNU COMPILER  */
3342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
3442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
3542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
3642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp = (tmp2 >> 1) - tmp;
3742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (tmp > 0) sad += tmp;
3842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else sad -= tmp;
3942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
4042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return sad;
4142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
4242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
4342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
4442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
4542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        tmp = (tmp >> 2) - tmp2;
4642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        if (tmp > 0) sad += tmp;
4742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        else sad -= tmp;
4842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
4942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return sad;
5042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
5142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
5242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#elif defined(__CC_ARM)  /* only work with arm v5 */
5342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
5442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
5542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
5642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        __asm
5742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
5842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rsbs    tmp, tmp, tmp2, asr #1 ;
5942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rsbmi   tmp, tmp, #0 ;
6042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            add     sad, sad, tmp ;
6142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
6242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
6342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return sad;
6442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
6542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
6642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
6742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
6842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        __asm
6942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        {
7042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rsbs    tmp, tmp2, tmp, asr #2 ;
7142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            rsbmi   tmp, tmp, #0 ;
7242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong            add     sad, sad, tmp ;
7342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        }
7442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
7542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return sad;
7642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
7742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
7842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#elif ( defined(PV_ARM_GCC_V5) || defined(PV_ARM_GCC_V4) ) /* ARM GNU COMPILER  */
7942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
8042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
8142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
8242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    {
8342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 out;
8442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 temp1;
8542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 ss = sad;
8642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 tt = tmp;
8742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 uu = tmp2;
8842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
8942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        asm volatile("rsbs	%1, %3, %4, asr #1\n\t"
9042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "rsbmi %1, %1, #0\n\t"
9142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "add  %0, %2, %1"
9242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong             : "=&r"(out),
9342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "=&r"(temp1)
9442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             : "r"(ss),
9542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             "r"(tt),
9642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             "r"(uu));
9742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return out;
9842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
9942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
10042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
10142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2)
10242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong{
10342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 out;
10442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 temp1;
10542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 ss = sad;
10642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 tt = tmp;
10742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        register int32 uu = tmp2;
10842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
10942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        asm volatile("rsbs      %1, %4, %3, asr #2\n\t"
11042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "rsbmi %1, %1, #0\n\t"
11142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "add  %0, %2, %1"
11242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong             : "=&r"(out),
11342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                     "=&r"(temp1)
11442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             : "r"(ss),
11542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             "r"(tt),
11642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong                             "r"(uu));
11742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong        return out;
11842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong    }
11942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12142ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#endif // Diff OS
12242ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12342ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12442ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12542ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#ifdef __cplusplus
12642ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong}
12742ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#endif
12842ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
12942ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong#endif //_SAD_HALFPEL_INLINE_H_
13042ef0c715da879a9878b7bf4eb9c90b21e4ab8aeJames Dong
131