12c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/* 22c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2004-2010 NXP Software 32c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Copyright (C) 2010 The Android Open Source Project 42c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 52c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Licensed under the Apache License, Version 2.0 (the "License"); 62c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * you may not use this file except in compliance with the License. 72c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * You may obtain a copy of the License at 82c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 92c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * http://www.apache.org/licenses/LICENSE-2.0 102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * 112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * Unless required by applicable law or agreed to in writing, software 122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * distributed under the License is distributed on an "AS IS" BASIS, 132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * See the License for the specific language governing permissions and 152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent * limitations under the License. 162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent */ 172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef _LVM_MACROS_H_ 192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define _LVM_MACROS_H_ 202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus 222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurentextern "C" { 232c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */ 242c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 252c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 262c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32(A,B,C,ShiftR) 272c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent C = (A * B) >> ShiftR 282c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 292c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent A, B and C are all 32 bit SIGNED numbers and ShiftR can vary from 0 to 64 302c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 312c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent The user has to take care that C does not overflow. The result in case 322c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent of overflow is undefined. 332c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 342c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 352c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef MUL32x32INTO32 362c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define MUL32x32INTO32(A,B,C,ShiftR) \ 372c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {LVM_INT32 MUL32x32INTO32_temp,MUL32x32INTO32_temp2,MUL32x32INTO32_mask,MUL32x32INTO32_HH,MUL32x32INTO32_HL,MUL32x32INTO32_LH,MUL32x32INTO32_LL;\ 382c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 shiftValue;\ 392c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent shiftValue = (ShiftR);\ 402c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_mask=0x0000FFFF;\ 412c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_HH= ((LVM_INT32)((LVM_INT16)((A)>>16))*((LVM_INT16)((B)>>16)) );\ 422c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_HL= ((LVM_INT32)((B)&MUL32x32INTO32_mask)*((LVM_INT16)((A)>>16))) ;\ 432c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_LH= ((LVM_INT32)((A)&MUL32x32INTO32_mask)*((LVM_INT16)((B)>>16)));\ 442c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_LL= (LVM_INT32)((A)&MUL32x32INTO32_mask)*(LVM_INT32)((B)&MUL32x32INTO32_mask);\ 452c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_temp= (LVM_INT32)(MUL32x32INTO32_HL&MUL32x32INTO32_mask)+(LVM_INT32)(MUL32x32INTO32_LH&MUL32x32INTO32_mask)+(LVM_INT32)((MUL32x32INTO32_LL>>16)&MUL32x32INTO32_mask);\ 462c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_HH= MUL32x32INTO32_HH+(LVM_INT32)(MUL32x32INTO32_HL>>16)+(LVM_INT32)(MUL32x32INTO32_LH>>16)+(LVM_INT32)(MUL32x32INTO32_temp>>16);\ 472c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_LL=MUL32x32INTO32_LL+(LVM_INT32)(MUL32x32INTO32_HL<<16)+(LVM_INT32)(MUL32x32INTO32_LH<<16);\ 482c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(shiftValue<32)\ 492c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {\ 502c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_HH=MUL32x32INTO32_HH<<(32-shiftValue);\ 512c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_mask=((LVM_INT32)1<<(32-shiftValue))-1;\ 522c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_LL=(MUL32x32INTO32_LL>>shiftValue)&MUL32x32INTO32_mask;\ 532c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_temp2=MUL32x32INTO32_HH|MUL32x32INTO32_LL;\ 542c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }\ 552c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else\ 562c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {\ 572c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x32INTO32_temp2=(LVM_INT32)MUL32x32INTO32_HH>>(shiftValue-32);\ 582c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }\ 592c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C) = MUL32x32INTO32_temp2;\ 602c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 612c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif 622c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 632c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 642c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32(A,B,C,ShiftR) 652c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent C = (A * B) >> ShiftR 662c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 672c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent A and C are 32 bit SIGNED numbers. B is a 16 bit SIGNED number. 682c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ShiftR can vary from 0 to 48 692c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 702c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent The user has to take care that C does not overflow. The result in case 712c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent of overflow is undefined. 722c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 732c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 742c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef MUL32x16INTO32 752c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define MUL32x16INTO32(A,B,C,ShiftR) \ 762c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {LVM_INT32 MUL32x16INTO32_mask,MUL32x16INTO32_HH,MUL32x16INTO32_LL;\ 772c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent LVM_INT32 shiftValue;\ 782c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent shiftValue = (ShiftR);\ 792c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32_mask=0x0000FFFF;\ 802c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32_HH= ((LVM_INT32)(B)*((LVM_INT16)((A)>>16)));\ 812c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32_LL= ((LVM_INT32)((A)&MUL32x16INTO32_mask)*(B));\ 822c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if(shiftValue<16)\ 832c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {\ 842c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32_HH=(LVM_INT32)((LVM_UINT32)MUL32x16INTO32_HH<<(16-shiftValue));\ 852c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C)=MUL32x16INTO32_HH+(LVM_INT32)(MUL32x16INTO32_LL>>shiftValue);\ 862c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }\ 872c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else if(shiftValue<32) {\ 882c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent MUL32x16INTO32_HH=(LVM_INT32)(MUL32x16INTO32_HH>>(shiftValue-16));\ 892c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C)=MUL32x16INTO32_HH+(LVM_INT32)(MUL32x16INTO32_LL>>shiftValue);\ 902c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }\ 912c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else {\ 922c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C)=MUL32x16INTO32_HH>>(shiftValue-16);}\ 932c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 942c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif 952c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 962c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/********************************************************************************** 972c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent ADD2_SAT_32x32(A,B,C) 982c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent C = SAT(A + B) 992c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1002c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent A,B and C are 32 bit SIGNED numbers. 1012c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent***********************************************************************************/ 1022c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifndef ADD2_SAT_32x32 1032c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#define ADD2_SAT_32x32(A,B,C) \ 1042c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {(C)=(A)+(B);\ 1052c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if ((((C) ^ (A)) & ((C) ^ (B))) >> 31)\ 1062c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent {\ 1072c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent if((A)<0)\ 1082c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C)=0x80000000l;\ 1092c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent else\ 1102c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent (C)=0x7FFFFFFFl;\ 1112c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent }\ 1122c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent } 1132c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif 1142c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1152c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1162c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#ifdef __cplusplus 1172c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent} 1182c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* __cplusplus */ 1192c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1202c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent#endif /* _LVM_MACROS_H_ */ 1212c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent 1222c8e5cab3faa6d360e222b7a6c40a80083d021acEric Laurent/*** End of file ******************************************************************/ 123