129a84457aed4c45bc900998b5e11c03023264208James Dong/* ------------------------------------------------------------------ 229a84457aed4c45bc900998b5e11c03023264208James Dong * Copyright (C) 1998-2009 PacketVideo 329a84457aed4c45bc900998b5e11c03023264208James Dong * 429a84457aed4c45bc900998b5e11c03023264208James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 529a84457aed4c45bc900998b5e11c03023264208James Dong * you may not use this file except in compliance with the License. 629a84457aed4c45bc900998b5e11c03023264208James Dong * You may obtain a copy of the License at 729a84457aed4c45bc900998b5e11c03023264208James Dong * 829a84457aed4c45bc900998b5e11c03023264208James Dong * http://www.apache.org/licenses/LICENSE-2.0 929a84457aed4c45bc900998b5e11c03023264208James Dong * 1029a84457aed4c45bc900998b5e11c03023264208James Dong * Unless required by applicable law or agreed to in writing, software 1129a84457aed4c45bc900998b5e11c03023264208James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1229a84457aed4c45bc900998b5e11c03023264208James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1329a84457aed4c45bc900998b5e11c03023264208James Dong * express or implied. 1429a84457aed4c45bc900998b5e11c03023264208James Dong * See the License for the specific language governing permissions 1529a84457aed4c45bc900998b5e11c03023264208James Dong * and limitations under the License. 1629a84457aed4c45bc900998b5e11c03023264208James Dong * ------------------------------------------------------------------- 1729a84457aed4c45bc900998b5e11c03023264208James Dong */ 1829a84457aed4c45bc900998b5e11c03023264208James Dong 1929a84457aed4c45bc900998b5e11c03023264208James Dong#ifndef _SAD_HALFPEL_INLINE_H_ 2029a84457aed4c45bc900998b5e11c03023264208James Dong#define _SAD_HALFPEL_INLINE_H_ 2129a84457aed4c45bc900998b5e11c03023264208James Dong 2229a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef __cplusplus 2329a84457aed4c45bc900998b5e11c03023264208James Dongextern "C" 2429a84457aed4c45bc900998b5e11c03023264208James Dong{ 2529a84457aed4c45bc900998b5e11c03023264208James Dong#endif 2629a84457aed4c45bc900998b5e11c03023264208James Dong 2729a84457aed4c45bc900998b5e11c03023264208James Dong#if defined(__GNUC__) && defined(__arm__) /* ARM GNU COMPILER */ 2829a84457aed4c45bc900998b5e11c03023264208James Dong 2929a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 3029a84457aed4c45bc900998b5e11c03023264208James Dong { 3129a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (tmp2 >> 1) - tmp; 3229a84457aed4c45bc900998b5e11c03023264208James Dong if (tmp > 0) sad += tmp; 3329a84457aed4c45bc900998b5e11c03023264208James Dong else sad -= tmp; 3429a84457aed4c45bc900998b5e11c03023264208James Dong 3529a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 3629a84457aed4c45bc900998b5e11c03023264208James Dong } 3729a84457aed4c45bc900998b5e11c03023264208James Dong 3829a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 3929a84457aed4c45bc900998b5e11c03023264208James Dong { 4029a84457aed4c45bc900998b5e11c03023264208James Dong tmp = (tmp >> 2) - tmp2; 4129a84457aed4c45bc900998b5e11c03023264208James Dong if (tmp > 0) sad += tmp; 4229a84457aed4c45bc900998b5e11c03023264208James Dong else sad -= tmp; 4329a84457aed4c45bc900998b5e11c03023264208James Dong 4429a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 4529a84457aed4c45bc900998b5e11c03023264208James Dong } 4629a84457aed4c45bc900998b5e11c03023264208James Dong 4729a84457aed4c45bc900998b5e11c03023264208James Dong#elif defined(__CC_ARM) /* only work with arm v5 */ 4829a84457aed4c45bc900998b5e11c03023264208James Dong 4929a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 5029a84457aed4c45bc900998b5e11c03023264208James Dong { 5129a84457aed4c45bc900998b5e11c03023264208James Dong __asm 5229a84457aed4c45bc900998b5e11c03023264208James Dong { 5329a84457aed4c45bc900998b5e11c03023264208James Dong rsbs tmp, tmp, tmp2, asr #1 ; 5429a84457aed4c45bc900998b5e11c03023264208James Dong rsbmi tmp, tmp, #0 ; 5529a84457aed4c45bc900998b5e11c03023264208James Dong add sad, sad, tmp ; 5629a84457aed4c45bc900998b5e11c03023264208James Dong } 5729a84457aed4c45bc900998b5e11c03023264208James Dong 5829a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 5929a84457aed4c45bc900998b5e11c03023264208James Dong } 6029a84457aed4c45bc900998b5e11c03023264208James Dong 6129a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 6229a84457aed4c45bc900998b5e11c03023264208James Dong { 6329a84457aed4c45bc900998b5e11c03023264208James Dong __asm 6429a84457aed4c45bc900998b5e11c03023264208James Dong { 6529a84457aed4c45bc900998b5e11c03023264208James Dong rsbs tmp, tmp2, tmp, asr #2 ; 6629a84457aed4c45bc900998b5e11c03023264208James Dong rsbmi tmp, tmp, #0 ; 6729a84457aed4c45bc900998b5e11c03023264208James Dong add sad, sad, tmp ; 6829a84457aed4c45bc900998b5e11c03023264208James Dong } 6929a84457aed4c45bc900998b5e11c03023264208James Dong 7029a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 7129a84457aed4c45bc900998b5e11c03023264208James Dong } 7229a84457aed4c45bc900998b5e11c03023264208James Dong 7329a84457aed4c45bc900998b5e11c03023264208James Dong#elif defined(__GNUC__) && defined(__arm__) /* ARM GNU COMPILER */ 7429a84457aed4c45bc900998b5e11c03023264208James Dong 7529a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP1_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 7629a84457aed4c45bc900998b5e11c03023264208James Dong { 7729a84457aed4c45bc900998b5e11c03023264208James Dong__asm__ volatile("rsbs %1, %1, %2, asr #1\n\trsbmi %1, %1, #0\n\tadd %0, %0, %1": "=r"(sad), "=r"(tmp): "r"(tmp2)); 7829a84457aed4c45bc900998b5e11c03023264208James Dong 7929a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 8029a84457aed4c45bc900998b5e11c03023264208James Dong } 8129a84457aed4c45bc900998b5e11c03023264208James Dong 8229a84457aed4c45bc900998b5e11c03023264208James Dong __inline int32 INTERP2_SUB_SAD(int32 sad, int32 tmp, int32 tmp2) 8329a84457aed4c45bc900998b5e11c03023264208James Dong { 8429a84457aed4c45bc900998b5e11c03023264208James Dong__asm__ volatile("rsbs %1, %2, %1, asr #2\n\trsbmi %1, %1, #0\n\tadd %0, %0, %1": "=r"(sad), "=r"(tmp): "r"(tmp2)); 8529a84457aed4c45bc900998b5e11c03023264208James Dong 8629a84457aed4c45bc900998b5e11c03023264208James Dong return sad; 8729a84457aed4c45bc900998b5e11c03023264208James Dong } 8829a84457aed4c45bc900998b5e11c03023264208James Dong 8929a84457aed4c45bc900998b5e11c03023264208James Dong#endif 9029a84457aed4c45bc900998b5e11c03023264208James Dong 9129a84457aed4c45bc900998b5e11c03023264208James Dong#ifdef __cplusplus 9229a84457aed4c45bc900998b5e11c03023264208James Dong} 9329a84457aed4c45bc900998b5e11c03023264208James Dong#endif 9429a84457aed4c45bc900998b5e11c03023264208James Dong 9529a84457aed4c45bc900998b5e11c03023264208James Dong#endif //_SAD_HALFPEL_INLINE_H_ 9629a84457aed4c45bc900998b5e11c03023264208James Dong 97