Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
480 changes: 480 additions & 0 deletions src/basop/basop32.c

Large diffs are not rendered by default.

50 changes: 49 additions & 1 deletion src/basop/basop32.h
Original file line number Diff line number Diff line change
Expand Up @@ -44,22 +44,40 @@
#ifndef _BASIC_OP_H
#define _BASIC_OP_H

#ifdef BASOP_NOGLOB
#include <assert.h>
#endif /* BASOP_NOGLOB */


/*___________________________________________________________________________
| |
| Constants and Globals |
| $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 MAX_32 (Word32)0x7fffffffL
#define MIN_32 (Word32)0x80000000L

#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 |
Expand Down Expand Up @@ -117,6 +135,36 @@ 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 shr_o (Word16 var1, Word16 var2, Flag * Overflow);
Word16 shr_ro(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 Carry, Flag Overflow);
#endif /* BASOP_NOGLOB */

#endif /* ifndef _BASIC_OP_H */

Expand Down
81 changes: 81 additions & 0 deletions src/basop/enh40.c
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand Down Expand Up @@ -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);
Expand All @@ -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;
}

Expand All @@ -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 */


/*****************************************************************************
*
Expand Down Expand Up @@ -295,20 +318,34 @@ 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;

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++;
Expand All @@ -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 */


/*****************************************************************************
*
Expand Down Expand Up @@ -348,20 +391,34 @@ 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;

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++;
Expand All @@ -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 */


/*****************************************************************************
*
Expand Down Expand Up @@ -537,20 +600,32 @@ 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);
Word40 OVER_L40_var2 = (Word40) ((((Word40) 1) << 31) - (Word40) 1);

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);
Expand All @@ -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 */


/*****************************************************************************
*
Expand Down
15 changes: 15 additions & 0 deletions src/basop/enh40.h
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -44,6 +48,7 @@ extern int currCounter;



#ifndef BASOP_NOGLOB
/*****************************************************************************
*
* Macros for 40 bit arithmetic overflow management :
Expand All @@ -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 */



Expand Down Expand Up @@ -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 */

/*****************************************************************************
*
Expand Down
Loading