Math Processor Unit Library

libmpu – library of arithmetic functions for integer, real, and complex numbers of increased digit capacity

16 Commits   0 Branches   2 Tags
868b2b66 (kx 2024-12-20 16:11:07 +0300   1) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   2) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300   3) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   4) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   5) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   6) #include <nls.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   7) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   8) #include <errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300   9) #include <locale.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  10) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  11) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  12) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  13) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300  14) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  15) /* Allocate MPU Context in .tbss segment: */
868b2b66 (kx 2024-12-20 16:11:07 +0300  16) __thread struct __mpu_context mctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300  17) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  18) /* Share address of mpu_context: */
868b2b66 (kx 2024-12-20 16:11:07 +0300  19) struct __mpu_context *pmctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300  20) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  21) /* Should be called at start of main thread and at start of each posix threads: */
868b2b66 (kx 2024-12-20 16:11:07 +0300  22) void __mpu_init( void )
868b2b66 (kx 2024-12-20 16:11:07 +0300  23) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  24)   pmctx = &mctx;
868b2b66 (kx 2024-12-20 16:11:07 +0300  25) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  26)   mctx._ierrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  27)   mctx._rerrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  28)   mctx._cerrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  29)   mctx._merrno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  30)   mctx._ewarns = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  31) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  32)   mctx.mflags  = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  33) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  34)   pmctx->_cur_brk = (__mpu_void_t *)&((pmctx->_mem)[0]);
868b2b66 (kx 2024-12-20 16:11:07 +0300  35) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  36) #if ENABLE_NLS == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  37)   setlocale( LC_ALL, "" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  38)   bind_textdomain_codeset( PACKAGE, "UTF-8" );
868b2b66 (kx 2024-12-20 16:11:07 +0300  39)   textdomain( PACKAGE );
868b2b66 (kx 2024-12-20 16:11:07 +0300  40) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  41) }
868b2b66 (kx 2024-12-20 16:11:07 +0300  42) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  43) /************************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  44)   User may call the __mpu_free_context() function when needed to
868b2b66 (kx 2024-12-20 16:11:07 +0300  45)   clear MPU context and all allocated memory resources.
868b2b66 (kx 2024-12-20 16:11:07 +0300  46) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  47)   We do not use __mpu_weak_alias() because the __mpu_weak_alias() macro
868b2b66 (kx 2024-12-20 16:11:07 +0300  48)   is dedicated to create aliases of external symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300  49)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  50) #if defined( HAVE_WEAK_SYMBOLS )
868b2b66 (kx 2024-12-20 16:11:07 +0300  51) void __mpu_free_context( void ) __attribute__ ((weak, alias ("__mpu_init")));
868b2b66 (kx 2024-12-20 16:11:07 +0300  52) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  53) void __mpu_free_context( void ) __attribute__ ((alias ("__mpu_init")));
868b2b66 (kx 2024-12-20 16:11:07 +0300  54) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  55) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  56) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  57) static int
868b2b66 (kx 2024-12-20 16:11:07 +0300  58) __mpu_brk( __mpu_void_t *end_d )
868b2b66 (kx 2024-12-20 16:11:07 +0300  59) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  60)   __mpu_void_t  *ptr = __mem;
868b2b66 (kx 2024-12-20 16:11:07 +0300  61) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  62)   if( (__mpu_UNIT_t *)end_d < (__mpu_UNIT_t *)ptr ||
868b2b66 (kx 2024-12-20 16:11:07 +0300  63)       (__mpu_UNIT_t *)end_d > (__mpu_UNIT_t *)ptr + REGISTERS_MEM_SIZE_IN_UNITS )
868b2b66 (kx 2024-12-20 16:11:07 +0300  64)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  65)     errno = ENOMEM;
868b2b66 (kx 2024-12-20 16:11:07 +0300  66)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  67)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  68) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  69)  /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  70)    __cur_brk = (__tx_UNIT_t *)end_d;
868b2b66 (kx 2024-12-20 16:11:07 +0300  71) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  72)    Функция  __mpu_brk()  лишь проверяет границы
868b2b66 (kx 2024-12-20 16:11:07 +0300  73)    области памяти, значение __cur_brk выставляется
868b2b66 (kx 2024-12-20 16:11:07 +0300  74)    в __mpu_sbrk() .
868b2b66 (kx 2024-12-20 16:11:07 +0300  75)   *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  76) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  77)   return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  78) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  79) } /* End of __mpu_brk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  80) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  81) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  82) __mpu_void_t *
868b2b66 (kx 2024-12-20 16:11:07 +0300  83) __mpu_sbrk( int incr )
868b2b66 (kx 2024-12-20 16:11:07 +0300  84) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  85)   __mpu_void_t  *ptr = __cur_brk;
868b2b66 (kx 2024-12-20 16:11:07 +0300  86)   register int   rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  87) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  88)   if( incr == 0 ) return( ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300  89) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  90)   rc = __mpu_brk( ptr + incr );
868b2b66 (kx 2024-12-20 16:11:07 +0300  91)   if( rc == -1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  92)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  93)     /* errno is set into __mpu_brk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  94)     return( (__mpu_void_t *)0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  95)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  96) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  97)   __cur_brk = ((__mpu_UNIT_t *)ptr) + (int)incr;
868b2b66 (kx 2024-12-20 16:11:07 +0300  98) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  99)   return( ptr );
868b2b66 (kx 2024-12-20 16:11:07 +0300 100) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 101) } /* End of __mpu_sbrk() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 102) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 104) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 105)   For external purposes:
868b2b66 (kx 2024-12-20 16:11:07 +0300 106)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 107) __mpu_error_t *__ptr_integer_error_no( void ) { return( &mctx._ierrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 108) __mpu_error_t *__ptr_real_error_no   ( void ) { return( &mctx._rerrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 109) __mpu_error_t *__ptr_complex_error_no( void ) { return( &mctx._cerrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 110) __mpu_error_t *__ptr_math_error_no   ( void ) { return( &mctx._merrno ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 111) __mpu_error_t *__ptr_extra_warnings  ( void ) { return( &mctx._ewarns ); }
868b2b66 (kx 2024-12-20 16:11:07 +0300 112) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 113) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 114) void __mpu_clear_iflags( void ) { __CLEAR_IFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 115) void __mpu_clear_rflags( void ) { __CLEAR_RFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 116) void __mpu_clear_mflags( void ) { __CLEAR_MFLAGS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 118) 
31f615c1 (kx 2024-12-28 23:52:17 +0300 119) int  __mpu_gta( void ) { return __MFLAG( AF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 120) int  __mpu_gtc( void ) { return __MFLAG( CF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 121) int  __mpu_gto( void ) { return __MFLAG( OF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 122) int  __mpu_gts( void ) { return __MFLAG( SF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 123) int  __mpu_gtp( void ) { return __MFLAG( PF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 124) int  __mpu_gtz( void ) { return __MFLAG( ZF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 125) int  __mpu_gtr( void ) { return __MFLAG( RF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 126) int  __mpu_gtv( void ) { return __MFLAG( VF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 127) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 128) void __mpu_sta( void ) { __STA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 129) void __mpu_stc( void ) { __STC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 130) void __mpu_sto( void ) { __STO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 131) void __mpu_sts( void ) { __STS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 132) void __mpu_stp( void ) { __STP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 133) void __mpu_stz( void ) { __STZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 134) void __mpu_str( void ) { __STR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 135) void __mpu_stv( void ) { __STV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 136) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 137) void __mpu_cla( void ) { __CLA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 138) void __mpu_clc( void ) { __CLC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 139) void __mpu_clo( void ) { __CLO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 140) void __mpu_cls( void ) { __CLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 141) void __mpu_clp( void ) { __CLP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 142) void __mpu_clz( void ) { __CLZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 143) void __mpu_clr( void ) { __CLR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 144) void __mpu_clv( void ) { __CLV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 145) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 146) void __mpu_cma( void ) { __CMA; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 147) void __mpu_cmc( void ) { __CMC; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 148) void __mpu_cmo( void ) { __CMO; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 149) void __mpu_cms( void ) { __CMS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 150) void __mpu_cmp( void ) { __CMP; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 151) void __mpu_cmz( void ) { __CMZ; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 152) void __mpu_cmr( void ) { __CMR; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 153) void __mpu_cmv( void ) { __CMV; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 155) 
31f615c1 (kx 2024-12-28 23:52:17 +0300 156) int  __mpu_gtdom( void ) { return __MFLAG( DOMF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 157) int  __mpu_gtsng( void ) { return __MFLAG( SNGF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 158) int  __mpu_gtovf( void ) { return __MFLAG( OVFF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 159) int  __mpu_gtudf( void ) { return __MFLAG( UDFF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 160) int  __mpu_gttls( void ) { return __MFLAG( TLSF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 161) int  __mpu_gtpls( void ) { return __MFLAG( PLSF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 162) int  __mpu_gtind( void ) { return __MFLAG( INDF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 163) int  __mpu_gtinx( void ) { return __MFLAG( INXF ); }
31f615c1 (kx 2024-12-28 23:52:17 +0300 164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 165) void __mpu_stdom( void ) { __STDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 166) void __mpu_stsng( void ) { __STSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 167) void __mpu_stovf( void ) { __STOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 168) void __mpu_studf( void ) { __STUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 169) void __mpu_sttls( void ) { __STTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 170) void __mpu_stpls( void ) { __STPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 171) void __mpu_stind( void ) { __STIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 172) void __mpu_stinx( void ) { __STINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 174) void __mpu_cldom( void ) { __CLDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 175) void __mpu_clsng( void ) { __CLSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 176) void __mpu_clovf( void ) { __CLOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 177) void __mpu_cludf( void ) { __CLUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 178) void __mpu_cltls( void ) { __CLTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 179) void __mpu_clpls( void ) { __CLPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 180) void __mpu_clind( void ) { __CLIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 181) void __mpu_clinx( void ) { __CLINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 182) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 183) void __mpu_cmdom( void ) { __CMDOM; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 184) void __mpu_cmsng( void ) { __CMSNG; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 185) void __mpu_cmovf( void ) { __CMOVF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 186) void __mpu_cmudf( void ) { __CMUDF; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 187) void __mpu_cmtls( void ) { __CMTLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 188) void __mpu_cmpls( void ) { __CMPLS; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 189) void __mpu_cmind( void ) { __CMIND; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 190) void __mpu_cminx( void ) { __CMINX; }
868b2b66 (kx 2024-12-20 16:11:07 +0300 191)