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