Loading basic_op/basop32.c +450 −1 File changed.Preview size limit exceeded, changes collapsed. Show changes basic_op/basop32.h +88 −42 Original line number Diff line number Diff line Loading @@ -44,6 +44,10 @@ #ifndef _BASIC_OP_H #define _BASIC_OP_H #ifdef BASOP_NOGLOB #include <assert.h> #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading @@ -51,8 +55,16 @@ | $Id $ |___________________________________________________________________________| */ extern Flag Overflow; #ifdef BASOP_NOGLOB /* DISABLED TO AVOID GLOBAL VARIABLES */ /* extern Flag BASOP_Overflow, BASOP_Overflow2; extern Flag BASOP_Carry; */ #else /* BASOP_NOGLOB */ extern Flag Overflow, Overflow2; extern Flag Carry; #endif /* BASOP_NOGLOB */ #define BASOP_SATURATE_WARNING_ON #define BASOP_SATURATE_WARNING_OFF Loading @@ -66,6 +78,12 @@ extern Flag Carry; #define MAX_16 (Word16)0x7fff #define MIN_16 (Word16)0x8000 #ifdef BASOP_NOGLOB static inline void set_flag(Flag* flag) { if (flag) *flag = 1; else assert(0); } static inline void unset_flag(Flag* flag) { if (flag) *flag = 0; else assert(0); } static inline Flag get_flag(Flag* flag) { if (flag) return *flag; else assert(0); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | | Prototypes for basic arithmetic operators | Loading Loading @@ -119,10 +137,38 @@ Word16 i_mult (Word16 a, Word16 b); /* Weight FFS; currently assigned /* * New shiftless operators, not used in G.729/G.723.1 */ Word32 L_mult0 (Word16 v1, Word16 v2); /* 32-bit Multiply w/o shift e 1 */ Word32 L_mult0 (Word16 v1, Word16 v2); /* 32-bit Multiply w/o shift 1 */ Word32 L_mac0 (Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Mac w/o shift 1 */ Word32 L_msu0 (Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Msu w/o shift 1 */ #ifdef BASOP_NOGLOB /* * Overflowing operators */ Word16 add_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 sub_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 shl_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 mult_o (Word16 var1, Word16 var2, Flag * Overflow); Word32 L_mult_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 round_fx_o (Word32 L_var1, Flag * Overflow); Word32 L_mac_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_msu_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_macNs_co (Word32 L_var3, Word16 var1, Word16 var2, Flag * Carry, Flag* Overflow); Word32 L_msuNs_co (Word32 L_var3, Word16 var1, Word16 var2, Flag * Carry, Flag* Overflow); Word32 L_add_o (Word32 L_var1, Word32 L_var2, Flag * Overflow); Word32 L_sub_o (Word32 L_var1, Word32 L_var2, Flag * Overflow); Word32 L_add_co (Word32 L_var1, Word32 L_var2, Flag * Carry, Flag *Overflow); Word32 L_sub_co (Word32 L_var1, Word32 L_var2, Flag * Carry, Flag *Overflow); Word32 L_shr_o (Word32 L_var1, Word16 var2, Flag * Overflow); Word32 L_shl_o (Word32 L_var1, Word16 var2, Flag * Overflow); Word32 L_mls_o (Word32 Lv, Word16 v, Flag * Overflow); Word32 L_mac0_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_msu0_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word16 mult_ro (Word16 var1, Word16 var2, Flag * Overflow); Word16 mac_ro (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word16 msu_ro (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_sat_co (Word32 L_var1, Flag Overflow, Flag Carry); #endif /* BASOP_NOGLOB */ #endif /* ifndef _BASIC_OP_H */ Loading basic_op/enh40.c +81 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ #include <stdio.h> #include <stdlib.h> #include "stl.h" #ifdef BASOP_NOGLOB #include <assert.h> #endif /* BASOP_NOGLOB */ #if (WMOPS) extern BASIC_OP multiCounter[MAXCOUNTERS]; Loading Loading @@ -124,7 +127,11 @@ extern int currCounter; * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_shl_o (Word40 L40_var1, Word16 var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_shl (Word40 L40_var1, Word16 var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; Word40 L40_constant = L40_set (0xc000000000); Loading @@ -143,12 +150,22 @@ Word40 L40_shl (Word40 L40_var1, Word16 var2) { for (; var2 > 0; var2--) { if (L40_var_out > 0x003fffffffff) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ break; } else if (L40_var_out < L40_constant) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ break; } Loading @@ -166,6 +183,12 @@ Word40 L40_shl (Word40 L40_var1, Word16 var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_shl (Word40 L40_var1, Word16 var2) { return L40_shl_o (L40_var1, var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -295,7 +318,11 @@ Word40 L40_negate (Word40 L40_var1) { * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_add_o (Word40 L40_var1, Word40 L40_var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; L40_var_out = L40_var1 + L40_var2; Loading @@ -303,12 +330,22 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { if ((((L40_var1 & 0x8000000000) >> 39) != 0) && (((L40_var2 & 0x8000000000) >> 39) != 0) && (((L40_var_out & 0x8000000000) >> 39) == 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } else if ((((L40_var1 & 0x8000000000) >> 39) == 0) && (((L40_var2 & 0x8000000000) >> 39) == 0) && (((L40_var_out & 0x8000000000) >> 39) != 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } #if (WMOPS) multiCounter[currCounter].L40_add++; Loading @@ -317,6 +354,12 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { return L40_add_o (L40_var1, L40_var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -348,7 +391,11 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_sub_o (Word40 L40_var1, Word40 L40_var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; L40_var_out = L40_var1 - L40_var2; Loading @@ -356,12 +403,22 @@ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { if ((((L40_var1 & 0x8000000000) >> 39) != 0) && (((L40_var2 & 0x8000000000) >> 39) == 0) && (((L40_var_out & 0x8000000000) >> 39) == 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } else if ((((L40_var1 & 0x8000000000) >> 39) == 0) && (((L40_var2 & 0x8000000000) >> 39) != 0) && (((L40_var_out & 0x8000000000) >> 39) != 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } #if (WMOPS) multiCounter[currCounter].L40_sub++; Loading @@ -370,6 +427,12 @@ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { return L40_sub_o (L40_var1, L40_var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -537,7 +600,11 @@ Word40 L40_min (Word40 L40_var1, Word40 L40_var2) { * the range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word32 L_saturate40_o (Word40 L40_var1, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word32 L_saturate40 (Word40 L40_var1) { #endif /* BASOP_NOGLOB */ Word32 L_var_out; Word40 UNDER_L40_var2 = (Word40) ~ ((((Word40) 1) << 31) - (Word40) 1); Loading @@ -545,12 +612,20 @@ Word32 L_saturate40 (Word40 L40_var1) { if (L40_var1 < UNDER_L40_var2) { L40_var1 = UNDER_L40_var2; #ifdef BASOP_NOGLOB set_flag (Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } if (L40_var1 > OVER_L40_var2) { L40_var1 = OVER_L40_var2; #ifdef BASOP_NOGLOB set_flag (Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } L_var_out = L_Extract40 (L40_var1); Loading @@ -563,6 +638,12 @@ Word32 L_saturate40 (Word40 L40_var1) { return (L_var_out); } #ifdef BASOP_NOGLOB Word32 L_saturate40 (Word40 L40_var1) { return L_saturate40_o (L40_var1, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading basic_op/enh40.h +17 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ #include "stl.h" #ifdef BASOP_NOGLOB #define MAX_40 ( 0x0000007fffffffff ) #define MIN_40 ( 0xffffff8000000000 ) #endif /* BASOP_NOGLOB */ #ifdef WMOPS extern BASIC_OP multiCounter[MAXCOUNTERS]; Loading @@ -44,6 +48,7 @@ extern int currCounter; #ifndef BASOP_NOGLOB /***************************************************************************** * * Macros for 40 bit arithmetic overflow management : Loading @@ -53,6 +58,7 @@ extern int currCounter; *****************************************************************************/ #define L40_OVERFLOW_OCCURED( L40_var1) (Overflow = 1, exit(1), L40_var1) #define L40_UNDERFLOW_OCCURED( L40_var1) (Overflow = 1, exit(2), L40_var1) #endif /* BASOP_NOGLOB */ Loading Loading @@ -104,6 +110,15 @@ Word40 L40_min (Word40 L40_var1, Word40 L40_var2); Word32 L_saturate40 (Word40 L40_var1); Word16 norm_L40 (Word40 L40_var1); #ifdef BASOP_NOGLOB /* * Overflowing operators */ Word40 L40_shl_o( Word40 L40_var1, Word16 var2, Flag *Overflow ); Word40 L40_add_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); Word40 L40_sub_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); Word32 L_saturate40_o( Word40 L40_var1, Flag *Overflow ); #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -154,7 +169,8 @@ static __inline Word40 L40_set (Word40 L40_var1) { return (L40_var_out); } /* #endif */ /* ifdef _MSC_VER */ // #endif /* ifdef _MSC_VER */ /***************************************************************************** Loading basic_op/enh64.c 100644 → 100755 +119 −2 Original line number Diff line number Diff line Loading @@ -163,7 +163,11 @@ Word64 W_sub_nosat (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_shl_o (Word64 L64_var1, Word16 var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_shl (Word64 L64_var1, Word16 var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out = 0LL; Loading @@ -176,13 +180,21 @@ Word64 W_shl (Word64 L64_var1, Word16 var2) { else { for (; var2 > 0; var2--) { if (L64_var1 > (Word64) 0X3fffffffffffffffLL) { #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ L64_var_out = (Word64) 0X7fffffffffffffffLL; break; } else { if (L64_var1 < (Word64) 0xc000000000000000LL) { #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ L64_var_out = (Word64)0x8000000000000000LL; break; } Loading @@ -195,11 +207,17 @@ Word64 W_shl (Word64 L64_var1, Word16 var2) { multiCounter[currCounter].W_shl++; #endif /* BASOP_CHECK();*/ // BASOP_CHECK(); return (L64_var_out); } #ifdef BASOP_NOGLOB Word64 W_shl (Word64 L64_var1, Word16 var2) { return W_shl_o(L64_var1, var2, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading Loading @@ -306,7 +324,7 @@ Word64 W_shl_nosat (Word64 L64_var1, Word16 var2) { multiCounter[currCounter].W_shl_nosat++; #endif /* BASOP_CHECK();*/ // BASOP_CHECK (); return (L64_var_out); } Loading Loading @@ -1088,7 +1106,11 @@ Word32 W_shl_sat_l (Word64 L64_var, Word32 n) { | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | |__________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word32 W_round48_L_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word32 W_round48_L (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; Word32 L_result; Loading @@ -1103,7 +1125,11 @@ Word32 W_round48_L (Word64 L64_var1) { if ( ( (L64_var1 ^ L64_var2) & L64_MIN) == 0) { if ( (L64_var_out ^ L64_var1) & L64_MIN) { L64_var_out = (L64_var1 < 0) ? L64_MIN : L64_MAX; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } L_result = W_extract_h (L64_var_out); Loading @@ -1116,6 +1142,12 @@ Word32 W_round48_L (Word64 L64_var1) { return (L_result); } #ifdef BASOP_NOGLOB Word32 W_round48_L (Word64 L64_var1) { return W_round48_L_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*__________________________________________________________________________________ | | | Function Name : W_round32_s | Loading Loading @@ -1143,7 +1175,11 @@ Word32 W_round48_L (Word64 L64_var1) { | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | |__________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word16 W_round32_s_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word16 W_round32_s (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; Word32 L_var; Word16 var_out; Loading @@ -1159,7 +1195,11 @@ Word16 W_round32_s (Word64 L64_var1) { if (((L64_var1 ^ L64_var2) & L64_MIN) == 0) { if ((L64_var_out ^ L64_var1) & L64_MIN) { L64_var_out = (L64_var1 < 0) ? L64_MIN : L64_MAX; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } L_var = W_extract_h (L64_var_out); Loading @@ -1173,6 +1213,13 @@ Word16 W_round32_s (Word64 L64_var1) { return (var_out); } #ifdef BASOP_NOGLOB Word16 W_round32_s (Word64 L64_var1) { return W_round32_s_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | | Function Name : W_norm | Loading Loading @@ -1258,7 +1305,11 @@ Word16 W_norm (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_add_o (Word64 L64_var1, Word64 L64_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; L64_var_out = L64_var1 + L64_var2; Loading @@ -1266,7 +1317,11 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { if (((L64_var1 ^ L64_var2) & MIN_64) == 0) { if ((L64_var_out ^ L64_var1) & MIN_64) { L64_var_out = (L64_var1 < 0) ? MIN_64 : MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } Loading @@ -1276,6 +1331,12 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_add (Word64 L64_var1, Word64 L64_var2) { return W_add_o(L64_var1, L64_var2, NULL); } #endif /* BASOP_NOGLOB */ /*______________________________________________________________________________ | | | Function Name : W_sub | Loading Loading @@ -1307,7 +1368,11 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_sub_o (Word64 L64_var1, Word64 L64_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; L64_var_out = L64_var1 - L64_var2; Loading @@ -1315,7 +1380,11 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { if (((L64_var1 ^ L64_var2) & MIN_64) != 0) { if ((L64_var_out ^ L64_var1) & MIN_64) { L64_var_out = (L64_var1 < 0) ? MIN_64 : MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } Loading @@ -1325,6 +1394,12 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { return W_sub_o(L64_var1, L64_var2, NULL); } #endif /* BASOP_NOGLOB */ /*______________________________________________________________________________ | | Loading Loading @@ -1353,12 +1428,20 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_neg_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_neg (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if (L64_var1 == MIN_64) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { L64_var_out = -L64_var1; Loading @@ -1372,6 +1455,12 @@ Word64 W_neg (Word64 L64_var1) { } #ifdef BASOP_NOGLOB Word64 W_neg (Word64 L64_var1) { return W_neg_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading Loading @@ -1400,12 +1489,20 @@ Word64 W_neg (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_abs_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_abs (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if (L64_var1 == MIN_64) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { if (L64_var1 < 0) { Loading @@ -1423,6 +1520,12 @@ Word64 W_abs (Word64 L64_var1) { return (L64_var_out); } #ifdef BASOP_NOGLOB Word64 W_abs (Word64 L64_var1) { return W_abs_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*_________________________________________________________________________________________________ | | | Function Name : W_mult_32_32 | Loading Loading @@ -1455,12 +1558,20 @@ Word64 W_abs (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var_out <= 0x7fffffff ffffffffLL. | |_________________________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_mult_32_32_o(Word32 L_var1, Word32 L_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if ((L_var1 == MIN_32) && (L_var2 == MIN_32)) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { L64_var_out = ((Word64 )L_var1*L_var2) << 1; Loading @@ -1472,6 +1583,12 @@ Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { return W_mult_32_32_o(L_var1, L_var2, NULL); } #endif /* BASOP_NOGLOB */ /*_________________________________________________________________________________________________ | | | Function Name : W_mult0_32_32 | Loading Loading
basic_op/basop32.h +88 −42 Original line number Diff line number Diff line Loading @@ -44,6 +44,10 @@ #ifndef _BASIC_OP_H #define _BASIC_OP_H #ifdef BASOP_NOGLOB #include <assert.h> #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading @@ -51,8 +55,16 @@ | $Id $ |___________________________________________________________________________| */ extern Flag Overflow; #ifdef BASOP_NOGLOB /* DISABLED TO AVOID GLOBAL VARIABLES */ /* extern Flag BASOP_Overflow, BASOP_Overflow2; extern Flag BASOP_Carry; */ #else /* BASOP_NOGLOB */ extern Flag Overflow, Overflow2; extern Flag Carry; #endif /* BASOP_NOGLOB */ #define BASOP_SATURATE_WARNING_ON #define BASOP_SATURATE_WARNING_OFF Loading @@ -66,6 +78,12 @@ extern Flag Carry; #define MAX_16 (Word16)0x7fff #define MIN_16 (Word16)0x8000 #ifdef BASOP_NOGLOB static inline void set_flag(Flag* flag) { if (flag) *flag = 1; else assert(0); } static inline void unset_flag(Flag* flag) { if (flag) *flag = 0; else assert(0); } static inline Flag get_flag(Flag* flag) { if (flag) return *flag; else assert(0); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | | Prototypes for basic arithmetic operators | Loading Loading @@ -119,10 +137,38 @@ Word16 i_mult (Word16 a, Word16 b); /* Weight FFS; currently assigned /* * New shiftless operators, not used in G.729/G.723.1 */ Word32 L_mult0 (Word16 v1, Word16 v2); /* 32-bit Multiply w/o shift e 1 */ Word32 L_mult0 (Word16 v1, Word16 v2); /* 32-bit Multiply w/o shift 1 */ Word32 L_mac0 (Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Mac w/o shift 1 */ Word32 L_msu0 (Word32 L_v3, Word16 v1, Word16 v2); /* 32-bit Msu w/o shift 1 */ #ifdef BASOP_NOGLOB /* * Overflowing operators */ Word16 add_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 sub_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 shl_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 mult_o (Word16 var1, Word16 var2, Flag * Overflow); Word32 L_mult_o (Word16 var1, Word16 var2, Flag * Overflow); Word16 round_fx_o (Word32 L_var1, Flag * Overflow); Word32 L_mac_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_msu_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_macNs_co (Word32 L_var3, Word16 var1, Word16 var2, Flag * Carry, Flag* Overflow); Word32 L_msuNs_co (Word32 L_var3, Word16 var1, Word16 var2, Flag * Carry, Flag* Overflow); Word32 L_add_o (Word32 L_var1, Word32 L_var2, Flag * Overflow); Word32 L_sub_o (Word32 L_var1, Word32 L_var2, Flag * Overflow); Word32 L_add_co (Word32 L_var1, Word32 L_var2, Flag * Carry, Flag *Overflow); Word32 L_sub_co (Word32 L_var1, Word32 L_var2, Flag * Carry, Flag *Overflow); Word32 L_shr_o (Word32 L_var1, Word16 var2, Flag * Overflow); Word32 L_shl_o (Word32 L_var1, Word16 var2, Flag * Overflow); Word32 L_mls_o (Word32 Lv, Word16 v, Flag * Overflow); Word32 L_mac0_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_msu0_o (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word16 mult_ro (Word16 var1, Word16 var2, Flag * Overflow); Word16 mac_ro (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word16 msu_ro (Word32 L_var3, Word16 var1, Word16 var2, Flag * Overflow); Word32 L_sat_co (Word32 L_var1, Flag Overflow, Flag Carry); #endif /* BASOP_NOGLOB */ #endif /* ifndef _BASIC_OP_H */ Loading
basic_op/enh40.c +81 −0 Original line number Diff line number Diff line Loading @@ -63,6 +63,9 @@ #include <stdio.h> #include <stdlib.h> #include "stl.h" #ifdef BASOP_NOGLOB #include <assert.h> #endif /* BASOP_NOGLOB */ #if (WMOPS) extern BASIC_OP multiCounter[MAXCOUNTERS]; Loading Loading @@ -124,7 +127,11 @@ extern int currCounter; * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_shl_o (Word40 L40_var1, Word16 var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_shl (Word40 L40_var1, Word16 var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; Word40 L40_constant = L40_set (0xc000000000); Loading @@ -143,12 +150,22 @@ Word40 L40_shl (Word40 L40_var1, Word16 var2) { for (; var2 > 0; var2--) { if (L40_var_out > 0x003fffffffff) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ break; } else if (L40_var_out < L40_constant) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ break; } Loading @@ -166,6 +183,12 @@ Word40 L40_shl (Word40 L40_var1, Word16 var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_shl (Word40 L40_var1, Word16 var2) { return L40_shl_o (L40_var1, var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -295,7 +318,11 @@ Word40 L40_negate (Word40 L40_var1) { * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_add_o (Word40 L40_var1, Word40 L40_var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; L40_var_out = L40_var1 + L40_var2; Loading @@ -303,12 +330,22 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { if ((((L40_var1 & 0x8000000000) >> 39) != 0) && (((L40_var2 & 0x8000000000) >> 39) != 0) && (((L40_var_out & 0x8000000000) >> 39) == 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } else if ((((L40_var1 & 0x8000000000) >> 39) == 0) && (((L40_var2 & 0x8000000000) >> 39) == 0) && (((L40_var_out & 0x8000000000) >> 39) != 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } #if (WMOPS) multiCounter[currCounter].L40_add++; Loading @@ -317,6 +354,12 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { return L40_add_o (L40_var1, L40_var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -348,7 +391,11 @@ Word40 L40_add (Word40 L40_var1, Word40 L40_var2) { * the range : MIN_40 <= L40_var_out <= MAX_40. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word40 L40_sub_o (Word40 L40_var1, Word40 L40_var2, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { #endif /* BASOP_NOGLOB */ Word40 L40_var_out; L40_var_out = L40_var1 - L40_var2; Loading @@ -356,12 +403,22 @@ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { if ((((L40_var1 & 0x8000000000) >> 39) != 0) && (((L40_var2 & 0x8000000000) >> 39) == 0) && (((L40_var_out & 0x8000000000) >> 39) == 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MIN_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_UNDERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } else if ((((L40_var1 & 0x8000000000) >> 39) == 0) && (((L40_var2 & 0x8000000000) >> 39) != 0) && (((L40_var_out & 0x8000000000) >> 39) != 0)) { #ifdef BASOP_NOGLOB set_flag (Overflow); L40_var_out = MAX_40; #else /* BASOP_NOGLOB */ L40_var_out = L40_OVERFLOW_OCCURED (L40_var_out); #endif /* BASOP_NOGLOB */ } #if (WMOPS) multiCounter[currCounter].L40_sub++; Loading @@ -370,6 +427,12 @@ Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { return (L40_var_out); } #ifdef BASOP_NOGLOB Word40 L40_sub (Word40 L40_var1, Word40 L40_var2) { return L40_sub_o (L40_var1, L40_var2, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -537,7 +600,11 @@ Word40 L40_min (Word40 L40_var1, Word40 L40_var2) { * the range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. * *****************************************************************************/ #ifdef BASOP_NOGLOB Word32 L_saturate40_o (Word40 L40_var1, Flag *Overflow) { #else /* BASOP_NOGLOB */ Word32 L_saturate40 (Word40 L40_var1) { #endif /* BASOP_NOGLOB */ Word32 L_var_out; Word40 UNDER_L40_var2 = (Word40) ~ ((((Word40) 1) << 31) - (Word40) 1); Loading @@ -545,12 +612,20 @@ Word32 L_saturate40 (Word40 L40_var1) { if (L40_var1 < UNDER_L40_var2) { L40_var1 = UNDER_L40_var2; #ifdef BASOP_NOGLOB set_flag (Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } if (L40_var1 > OVER_L40_var2) { L40_var1 = OVER_L40_var2; #ifdef BASOP_NOGLOB set_flag (Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } L_var_out = L_Extract40 (L40_var1); Loading @@ -563,6 +638,12 @@ Word32 L_saturate40 (Word40 L40_var1) { return (L_var_out); } #ifdef BASOP_NOGLOB Word32 L_saturate40 (Word40 L40_var1) { return L_saturate40_o (L40_var1, NULL); } #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading
basic_op/enh40.h +17 −1 Original line number Diff line number Diff line Loading @@ -25,6 +25,10 @@ #include "stl.h" #ifdef BASOP_NOGLOB #define MAX_40 ( 0x0000007fffffffff ) #define MIN_40 ( 0xffffff8000000000 ) #endif /* BASOP_NOGLOB */ #ifdef WMOPS extern BASIC_OP multiCounter[MAXCOUNTERS]; Loading @@ -44,6 +48,7 @@ extern int currCounter; #ifndef BASOP_NOGLOB /***************************************************************************** * * Macros for 40 bit arithmetic overflow management : Loading @@ -53,6 +58,7 @@ extern int currCounter; *****************************************************************************/ #define L40_OVERFLOW_OCCURED( L40_var1) (Overflow = 1, exit(1), L40_var1) #define L40_UNDERFLOW_OCCURED( L40_var1) (Overflow = 1, exit(2), L40_var1) #endif /* BASOP_NOGLOB */ Loading Loading @@ -104,6 +110,15 @@ Word40 L40_min (Word40 L40_var1, Word40 L40_var2); Word32 L_saturate40 (Word40 L40_var1); Word16 norm_L40 (Word40 L40_var1); #ifdef BASOP_NOGLOB /* * Overflowing operators */ Word40 L40_shl_o( Word40 L40_var1, Word16 var2, Flag *Overflow ); Word40 L40_add_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); Word40 L40_sub_o( Word40 L40_var1, Word40 L40_var2, Flag *Overflow ); Word32 L_saturate40_o( Word40 L40_var1, Flag *Overflow ); #endif /* BASOP_NOGLOB */ /***************************************************************************** * Loading Loading @@ -154,7 +169,8 @@ static __inline Word40 L40_set (Word40 L40_var1) { return (L40_var_out); } /* #endif */ /* ifdef _MSC_VER */ // #endif /* ifdef _MSC_VER */ /***************************************************************************** Loading
basic_op/enh64.c 100644 → 100755 +119 −2 Original line number Diff line number Diff line Loading @@ -163,7 +163,11 @@ Word64 W_sub_nosat (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_shl_o (Word64 L64_var1, Word16 var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_shl (Word64 L64_var1, Word16 var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out = 0LL; Loading @@ -176,13 +180,21 @@ Word64 W_shl (Word64 L64_var1, Word16 var2) { else { for (; var2 > 0; var2--) { if (L64_var1 > (Word64) 0X3fffffffffffffffLL) { #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ L64_var_out = (Word64) 0X7fffffffffffffffLL; break; } else { if (L64_var1 < (Word64) 0xc000000000000000LL) { #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ L64_var_out = (Word64)0x8000000000000000LL; break; } Loading @@ -195,11 +207,17 @@ Word64 W_shl (Word64 L64_var1, Word16 var2) { multiCounter[currCounter].W_shl++; #endif /* BASOP_CHECK();*/ // BASOP_CHECK(); return (L64_var_out); } #ifdef BASOP_NOGLOB Word64 W_shl (Word64 L64_var1, Word16 var2) { return W_shl_o(L64_var1, var2, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading Loading @@ -306,7 +324,7 @@ Word64 W_shl_nosat (Word64 L64_var1, Word16 var2) { multiCounter[currCounter].W_shl_nosat++; #endif /* BASOP_CHECK();*/ // BASOP_CHECK (); return (L64_var_out); } Loading Loading @@ -1088,7 +1106,11 @@ Word32 W_shl_sat_l (Word64 L64_var, Word32 n) { | range : 0x8000 0000 <= L_var_out <= 0x7fff ffff. | |__________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word32 W_round48_L_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word32 W_round48_L (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; Word32 L_result; Loading @@ -1103,7 +1125,11 @@ Word32 W_round48_L (Word64 L64_var1) { if ( ( (L64_var1 ^ L64_var2) & L64_MIN) == 0) { if ( (L64_var_out ^ L64_var1) & L64_MIN) { L64_var_out = (L64_var1 < 0) ? L64_MIN : L64_MAX; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } L_result = W_extract_h (L64_var_out); Loading @@ -1116,6 +1142,12 @@ Word32 W_round48_L (Word64 L64_var1) { return (L_result); } #ifdef BASOP_NOGLOB Word32 W_round48_L (Word64 L64_var1) { return W_round48_L_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*__________________________________________________________________________________ | | | Function Name : W_round32_s | Loading Loading @@ -1143,7 +1175,11 @@ Word32 W_round48_L (Word64 L64_var1) { | range : 0xffff 8000 <= var_out <= 0x0000 7fff. | |__________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word16 W_round32_s_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word16 W_round32_s (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; Word32 L_var; Word16 var_out; Loading @@ -1159,7 +1195,11 @@ Word16 W_round32_s (Word64 L64_var1) { if (((L64_var1 ^ L64_var2) & L64_MIN) == 0) { if ((L64_var_out ^ L64_var1) & L64_MIN) { L64_var_out = (L64_var1 < 0) ? L64_MIN : L64_MAX; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } L_var = W_extract_h (L64_var_out); Loading @@ -1173,6 +1213,13 @@ Word16 W_round32_s (Word64 L64_var1) { return (var_out); } #ifdef BASOP_NOGLOB Word16 W_round32_s (Word64 L64_var1) { return W_round32_s_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | | Function Name : W_norm | Loading Loading @@ -1258,7 +1305,11 @@ Word16 W_norm (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_add_o (Word64 L64_var1, Word64 L64_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; L64_var_out = L64_var1 + L64_var2; Loading @@ -1266,7 +1317,11 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { if (((L64_var1 ^ L64_var2) & MIN_64) == 0) { if ((L64_var_out ^ L64_var1) & MIN_64) { L64_var_out = (L64_var1 < 0) ? MIN_64 : MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } Loading @@ -1276,6 +1331,12 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_add (Word64 L64_var1, Word64 L64_var2) { return W_add_o(L64_var1, L64_var2, NULL); } #endif /* BASOP_NOGLOB */ /*______________________________________________________________________________ | | | Function Name : W_sub | Loading Loading @@ -1307,7 +1368,11 @@ Word64 W_add (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_sub_o (Word64 L64_var1, Word64 L64_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; L64_var_out = L64_var1 - L64_var2; Loading @@ -1315,7 +1380,11 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { if (((L64_var1 ^ L64_var2) & MIN_64) != 0) { if ((L64_var_out ^ L64_var1) & MIN_64) { L64_var_out = (L64_var1 < 0) ? MIN_64 : MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } } Loading @@ -1325,6 +1394,12 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { return W_sub_o(L64_var1, L64_var2, NULL); } #endif /* BASOP_NOGLOB */ /*______________________________________________________________________________ | | Loading Loading @@ -1353,12 +1428,20 @@ Word64 W_sub (Word64 L64_var1, Word64 L64_var2) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |_______________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_neg_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_neg (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if (L64_var1 == MIN_64) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { L64_var_out = -L64_var1; Loading @@ -1372,6 +1455,12 @@ Word64 W_neg (Word64 L64_var1) { } #ifdef BASOP_NOGLOB Word64 W_neg (Word64 L64_var1) { return W_neg_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*___________________________________________________________________________ | | Loading Loading @@ -1400,12 +1489,20 @@ Word64 W_neg (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var1 <= 0x7fffffff ffffffffLL. | |___________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_abs_o (Word64 L64_var1, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_abs (Word64 L64_var1) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if (L64_var1 == MIN_64) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { if (L64_var1 < 0) { Loading @@ -1423,6 +1520,12 @@ Word64 W_abs (Word64 L64_var1) { return (L64_var_out); } #ifdef BASOP_NOGLOB Word64 W_abs (Word64 L64_var1) { return W_abs_o(L64_var1, NULL); } #endif /* BASOP_NOGLOB */ /*_________________________________________________________________________________________________ | | | Function Name : W_mult_32_32 | Loading Loading @@ -1455,12 +1558,20 @@ Word64 W_abs (Word64 L64_var1) { | range : 0x80000000 00000000LL <= L64_var_out <= 0x7fffffff ffffffffLL. | |_________________________________________________________________________________________________| */ #ifdef BASOP_NOGLOB Word64 W_mult_32_32_o(Word32 L_var1, Word32 L_var2, Flag* Overflow) { #else /* BASOP_NOGLOB */ Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { #endif /* BASOP_NOGLOB */ Word64 L64_var_out; if ((L_var1 == MIN_32) && (L_var2 == MIN_32)) { L64_var_out = MAX_64; #ifdef BASOP_NOGLOB set_flag(Overflow); #else /* BASOP_NOGLOB */ Overflow = 1; #endif /* BASOP_NOGLOB */ } else { L64_var_out = ((Word64 )L_var1*L_var2) << 1; Loading @@ -1472,6 +1583,12 @@ Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { return L64_var_out; } #ifdef BASOP_NOGLOB Word64 W_mult_32_32(Word32 L_var1, Word32 L_var2) { return W_mult_32_32_o(L_var1, L_var2, NULL); } #endif /* BASOP_NOGLOB */ /*_________________________________________________________________________________________________ | | | Function Name : W_mult0_32_32 | Loading