/*
 * Project 25 IMBE Encoder/Decoder Fixed-Point implementation
 * Developed by Pavel Yazev E-mail: pyazev@gmail.com
 * Version 1.0 (c) Copyright 2009
 *
 * This is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 3, or (at your option)
 * any later version.
 *
 * The software is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this; see the file COPYING.  If not, write to the Free
 * Software Foundation, Inc., 51 Franklin Street, Boston, MA
 * 02110-1301, USA.
 */
#ifndef __BASIC_OP_H__
#define __BASIC_OP_H__

// ---------------------------------------------------------------------------
//	 Constants and Globals
// ---------------------------------------------------------------------------
extern Flag Overflow;
extern Flag Carry;

#define MAX_32 (Word32)0x7fffffffL
#define MIN_32 (Word32)0x80000000L

#define MAX_16 (Word16)0x7fff
#define MIN_16 (Word16)0x8000

// ---------------------------------------------------------------------------
//	 Global Functions
// ---------------------------------------------------------------------------

Word16 add(Word16 var1, Word16 var2);    /* Short add,           1   */
Word16 sub(Word16 var1, Word16 var2);    /* Short sub,           1   */
Word16 abs_s(Word16 var1);               /* Short abs,           1   */
Word16 shl(Word16 var1, Word16 var2);    /* Short shift left,    1   */
Word16 shr(Word16 var1, Word16 var2);    /* Short shift right,   1   */
Word16 mult(Word16 var1, Word16 var2);   /* Short mult,          1   */
Word32 L_mult(Word16 var1, Word16 var2); /* Long mult,           1   */
Word16 negate(Word16 var1);              /* Short negate,        1   */
Word16 extract_h(Word32 L_var1);         /* Extract high,        1   */
Word16 extract_l(Word32 L_var1);         /* Extract low,         1   */
Word16 L_round(Word32 L_var1);           /* Round,               1   */
Word32 L_mac(Word32 L_var3, Word16 var1, Word16 var2);   /* Mac,  1  */
Word32 L_msu(Word32 L_var3, Word16 var1, Word16 var2);   /* Msu,  1  */
Word32 L_macNs(Word32 L_var3, Word16 var1, Word16 var2); /* Mac without
															sat, 1   */
Word32 L_msuNs(Word32 L_var3, Word16 var1, Word16 var2); /* Msu without
															sat, 1   */
Word32 L_add(Word32 L_var1, Word32 L_var2);    /* Long add,        2 */
Word32 L_sub(Word32 L_var1, Word32 L_var2);    /* Long sub,        2 */
Word32 L_add_c(Word32 L_var1, Word32 L_var2);  /* Long add with c, 2 */
Word32 L_sub_c(Word32 L_var1, Word32 L_var2);  /* Long sub with c, 2 */
Word32 L_negate(Word32 L_var1);                /* Long negate,     2 */
Word16 mult_r(Word16 var1, Word16 var2);       /* Mult with round, 2 */
Word32 L_shl(Word32 L_var1, Word16 var2);      /* Long shift left, 2 */
Word32 L_shr(Word32 L_var1, Word16 var2);      /* Long shift right, 2*/
Word16 shr_r(Word16 var1, Word16 var2);        /* Shift right with
												round, 2           */
Word16 mac_r(Word32 L_var3, Word16 var1, Word16 var2); /* Mac with
														rounding,2 */
Word16 msu_r(Word32 L_var3, Word16 var1, Word16 var2); /* Msu with
														rounding,2 */
Word32 L_deposit_h(Word16 var1);        /* 16 bit var1 -> MSB,     2 */
Word32 L_deposit_l(Word16 var1);        /* 16 bit var1 -> LSB,     2 */

Word32 L_shr_r(Word32 L_var1, Word16 var2); /* Long shift right with
											round,  3             */
Word32 L_abs(Word32 L_var1);            /* Long abs,              3  */
Word32 L_sat(Word32 L_var1);            /* Long saturation,       4  */
Word16 norm_s(Word16 var1);             /* Short norm,           15  */
Word16 div_s(Word16 var1, Word16 var2); /* Short division,       18  */
Word16 norm_l(Word32 L_var1);           /* Long norm,            30  */

#endif // __BASIC_OP_H__
