14a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/*---------------------------------------------------------------------------* 24a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * sh_down.h * 34a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 44a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Copyright 2007, 2008 Nuance Communciations, Inc. * 54a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 64a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the 'License'); * 74a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * you may not use this file except in compliance with the License. * 84a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 94a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * You may obtain a copy of the License at * 104a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 * 114a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 124a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * Unless required by applicable law or agreed to in writing, software * 134a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * distributed under the License is distributed on an 'AS IS' BASIS, * 144a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * 154a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * See the License for the specific language governing permissions and * 164a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * limitations under the License. * 174a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project * * 184a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project *---------------------------------------------------------------------------*/ 194a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 204a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#ifndef _SH_DOWN_INL_ 214a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define _SH_DOWN_INL_ 224a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 234a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include <limits.h> 244a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 254a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "fronttyp.h" 264a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "setting.h" 274a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#include "portable.h" 284a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 294a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SHIFT_DOWN(X,S) ((S) > 0 ? shift_down_inline ((X), (S)) : (X)) 304a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define SHIFT_UP(X,S) ((S) > 0 ? shift_up_inline ((X), (S)) : (X)) 314a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 324a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define COND_SHIFT_DOWN(X,S) (SHIFT_DOWN(X,S)) 334a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define COND_SHIFT_UP(X,S) (SHIFT_UP(X,S)) 344a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 354a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int fixed_point_convert(float xx, int shift); 364a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int shift_up_inline(int value, unsigned int shift); 374a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int shift_down_inline(int value, unsigned int shift); 384a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int fixed_round(float value); 394a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 404a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#define TRUNCATE_ON_SHIFT 1 414a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 424a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int shift_up_inline(int value, unsigned int shift) 434a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 444a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project /* Shift up using bit operations with max limit */ 454a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project int temp, retval; 464a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 474a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(shift > 0); 484a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (value > 0) 494a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = value; 504a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 514a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project temp = -value; 524a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 534a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project retval = temp << shift; 544a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 554a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if ((retval > (int)LONG_MAX) || (retval < temp)) /* TODO: max_val if LONG_MAX, overflow won't be detected */ 564a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project retval = (int)LONG_MAX; 574a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (value > 0) 584a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return retval; 594a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 604a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (-retval); 614a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 624a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 634a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 644a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int shift_down_inline(int value, unsigned int shift) 654a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project/* Shift down using bit operations with rounding */ 664a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 674a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (shift-- == 0) 684a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (value); 694a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (value >= 0) 704a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (((value >> shift) + 1) >> 1); 714a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 724a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (-((((-value) >> shift) + 1) >> 1)); 734a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 744a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 754a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int fixed_point_convert(float xx, int shift) 764a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 774a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project float scaled_val; 784a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 794a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project ASSERT(shift >= 0); 804a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project scaled_val = xx * (0x01 << shift); 814a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (scaled_val >= 0) 824a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (scaled_val > LONG_MAX) 834a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (LONG_MAX); 844a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 854a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ((int)(scaled_val + 0.5)); 864a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 874a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (scaled_val < -LONG_MAX) 884a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return (-LONG_MAX); 894a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 904a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ((int)(scaled_val - 0.5)); 914a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 924a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 934a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Projectstatic PINLINE int fixed_round(float value) 944a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project{ 954a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project if (value > 0) 964a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ((int)(value + 0.5)); 974a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project else 984a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project return ((int)(value - 0.5)); 994a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project} 1004a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project 1014a68b3365c8c50aa93505e99ead2565ab73dcdb0The Android Open Source Project#endif 102