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) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300     3)   __MPU_REAL.C
868b2b66 (kx 2024-12-20 16:11:07 +0300     4) 
868b2b66 (kx 2024-12-20 16:11:07 +0300     5)        This file contains source code of functions for
868b2b66 (kx 2024-12-20 16:11:07 +0300     6)        REAL arithmetic operations.
868b2b66 (kx 2024-12-20 16:11:07 +0300     7) 
868b2b66 (kx 2024-12-20 16:11:07 +0300     8)        PART OF : MPU - library .
868b2b66 (kx 2024-12-20 16:11:07 +0300     9) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    10)        USAGE   : Internal only .
868b2b66 (kx 2024-12-20 16:11:07 +0300    11) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    12)        NOTE    : NONE .
868b2b66 (kx 2024-12-20 16:11:07 +0300    13) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    14)        Copyright (C) 2000 - 2024  by Andrew V.Kosteltsev.
868b2b66 (kx 2024-12-20 16:11:07 +0300    15)        All Rights Reserved.
868b2b66 (kx 2024-12-20 16:11:07 +0300    16)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300    17) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    18) #ifdef HAVE_CONFIG_H
868b2b66 (kx 2024-12-20 16:11:07 +0300    19) #include <config.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    20) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300    21) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    22) #include <errno.h>   /* errno(3)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300    23) #include <string.h>  /* strcpy(3) */
868b2b66 (kx 2024-12-20 16:11:07 +0300    24) #include <strings.h> /* bzero(3)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300    25) #include <stdlib.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    26) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    27) #include <libmpu.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    28) #include <mpu-context.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    29) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    30) #include <mpu-emutype.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    31) #include <mpu-integer.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    32) #include <mpu-real.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    33) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    34) #include <mpu-char.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    35) #include <mpu-symbols.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    36) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    37) #include <mpu-math-errno.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    38) #include <mpu-strerror.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    39) #include <mpu-mtherr.h>
868b2b66 (kx 2024-12-20 16:11:07 +0300    40) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    41) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    42) int internal_np( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300    43) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300    44)  Description        : internal_np() возвращает количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300    45)                                     размера EMUSHORT в internal
868b2b66 (kx 2024-12-20 16:11:07 +0300    46)                                     e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300    47) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    48)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300    49) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    50)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300    51) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    52)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300    53) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    54)  Parameters         : int nb;  - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300    55)                                  external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300    56)                                  struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300    57) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    58)  Return             : int rc;  - количество слов.
868b2b66 (kx 2024-12-20 16:11:07 +0300    59)                       [rc = 0] - error.
868b2b66 (kx 2024-12-20 16:11:07 +0300    60) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    61)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300    62) {
868b2b66 (kx 2024-12-20 16:11:07 +0300    63)   int rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300    64) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    65)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300    66)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300    67)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300    68)       rc = NPIR_32;
868b2b66 (kx 2024-12-20 16:11:07 +0300    69)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    70)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300    71)       rc = NPIR_64;
868b2b66 (kx 2024-12-20 16:11:07 +0300    72)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    73)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300    74)       rc = NPIR_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300    75)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    76) 
868b2b66 (kx 2024-12-20 16:11:07 +0300    77)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300    78)       rc = NPIR_256;
868b2b66 (kx 2024-12-20 16:11:07 +0300    79)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    80)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300    81)       rc = NPIR_512;
868b2b66 (kx 2024-12-20 16:11:07 +0300    82)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    83)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300    84)       rc = NPIR_1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300    85)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    86)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300    87)       rc = NPIR_2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300    88)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    89)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300    90)       rc = NPIR_4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300    91)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    92)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300    93)       rc = NPIR_8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300    94)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    95)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300    96)       rc = NPIR_16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300    97)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300    98)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300    99)       rc = NPIR_32768;
868b2b66 (kx 2024-12-20 16:11:07 +0300   100)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   101)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   102)       rc = NPIR_65536;
868b2b66 (kx 2024-12-20 16:11:07 +0300   103)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   104)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   105)       rc = NPIR_131072;
868b2b66 (kx 2024-12-20 16:11:07 +0300   106)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   107) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   108)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   109)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   110)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   111)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   112)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   113)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   114)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   115)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   116)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   118)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   120) } /* End of internal_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   121) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   122) int internal_ne( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   123) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   124)  Description        : internal_ne() возвращает количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300   125)                                     размера EMUSHORT в Exponent
868b2b66 (kx 2024-12-20 16:11:07 +0300   126)                                     (internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300   127)                                     struct).
868b2b66 (kx 2024-12-20 16:11:07 +0300   128) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   129)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300   130) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   131)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   133)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   135)  Parameters         : int nb;  - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   136)                                  external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300   137)                                  struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   138) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   139)  Return             : int rc;  - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300   140)                                  Exponent.
868b2b66 (kx 2024-12-20 16:11:07 +0300   141)                       [rc = 0] - error.
868b2b66 (kx 2024-12-20 16:11:07 +0300   142) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   143)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   144) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   145)   int rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300   146) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   147)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   148)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   149)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   150)       rc = NPIE_32;
868b2b66 (kx 2024-12-20 16:11:07 +0300   151)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   152)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   153)       rc = NPIE_64;
868b2b66 (kx 2024-12-20 16:11:07 +0300   154)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   155)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   156)       rc = NPIE_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300   157)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   158) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   159)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   160)       rc = NPIE_256;
868b2b66 (kx 2024-12-20 16:11:07 +0300   161)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   162)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   163)       rc = NPIE_512;
868b2b66 (kx 2024-12-20 16:11:07 +0300   164)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   165)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   166)       rc = NPIE_1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300   167)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   168)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   169)       rc = NPIE_2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300   170)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   171)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   172)       rc = NPIE_4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300   173)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   174)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   175)       rc = NPIE_8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300   176)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   177)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   178)       rc = NPIE_16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300   179)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   180)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   181)       rc = NPIE_32768;
868b2b66 (kx 2024-12-20 16:11:07 +0300   182)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   183)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   184)       rc = NPIE_65536;
868b2b66 (kx 2024-12-20 16:11:07 +0300   185)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   186)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   187)       rc = NPIE_131072;
868b2b66 (kx 2024-12-20 16:11:07 +0300   188)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   190)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   191)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   192)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   193)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   194)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   195)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   196)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   197)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   198)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   200)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   201) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   202) } /* End of internal_ne() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   203) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   204) int internal_ns( int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   205) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   206)  Description        : internal_ns() возвращает количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300   207)                                     размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300   208)                                     Significand (internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   209)                                     data struct).
868b2b66 (kx 2024-12-20 16:11:07 +0300   210) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   211)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300   212) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   213)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   214) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   215)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   216) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   217)  Parameters         : int nb;  - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   218)                                  external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300   219)                                  struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   220) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   221)  Return             : int rc;  - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300   222)                                  Significand.
868b2b66 (kx 2024-12-20 16:11:07 +0300   223)                       [rc = 0] - error.
868b2b66 (kx 2024-12-20 16:11:07 +0300   224) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   225)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   226) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   227)   int rc = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300   228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   229)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   230)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   231)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   232)       rc = NPIR_32 - 3 - NPIE_32;
868b2b66 (kx 2024-12-20 16:11:07 +0300   233)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   234)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   235)       rc = NPIR_64 - 3 - NPIE_64;
868b2b66 (kx 2024-12-20 16:11:07 +0300   236)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   237)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   238)       rc = NPIR_128 - 3 - NPIE_128;
868b2b66 (kx 2024-12-20 16:11:07 +0300   239)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   240) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   241)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   242)       rc = NPIR_256 - 3 - NPIE_256;
868b2b66 (kx 2024-12-20 16:11:07 +0300   243)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   244)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   245)       rc = NPIR_512 - 3 - NPIE_512;
868b2b66 (kx 2024-12-20 16:11:07 +0300   246)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   247)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   248)       rc = NPIR_1024 - 3 - NPIE_1024;
868b2b66 (kx 2024-12-20 16:11:07 +0300   249)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   250)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   251)       rc = NPIR_2048 - 3 - NPIE_2048;
868b2b66 (kx 2024-12-20 16:11:07 +0300   252)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   253)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   254)       rc = NPIR_4096 - 3 - NPIE_4096;
868b2b66 (kx 2024-12-20 16:11:07 +0300   255)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   256)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   257)       rc = NPIR_8192 - 3 - NPIE_8192;
868b2b66 (kx 2024-12-20 16:11:07 +0300   258)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   259)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   260)       rc = NPIR_16384 - 3 - NPIE_16384;
868b2b66 (kx 2024-12-20 16:11:07 +0300   261)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   262)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   263)       rc = NPIR_32768 - 3 - NPIE_32768;
868b2b66 (kx 2024-12-20 16:11:07 +0300   264)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   265)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   266)       rc = NPIR_65536 - 3 - NPIE_65536;
868b2b66 (kx 2024-12-20 16:11:07 +0300   267)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   268)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   269)       rc = NPIR_131072 - 3 - NPIE_131072;
868b2b66 (kx 2024-12-20 16:11:07 +0300   270)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   271) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   272)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   273)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   274)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   275)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   276)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   277)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   278)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   279)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   280)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   281) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   282)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300   283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   284) } /* End of internal_ns() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   285) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   287) void ei_cleaz( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   288) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   289) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   290)  Description        : ei_cleaz() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   291)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   293)  Concepts           : clear out exploded internal e-type real
868b2b66 (kx 2024-12-20 16:11:07 +0300   294)                       number.
868b2b66 (kx 2024-12-20 16:11:07 +0300   295) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   296)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   297) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   298)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   299)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   300) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   301)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   302)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   303)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   304)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   305)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   306)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   307) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   308)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300   309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   310)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   311) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   312)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300   313) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   314)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300   315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   316)   (void)memset( (void *)ei, 0, np * SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300   317) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   318) } /* End of ei_cleaz() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   319) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   320) void ei_cleazs( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   321) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   322) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   323)  Description        : ei_cleazs() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   324)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   325) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   326)  Concepts           : clear out exploded internal e-type real
868b2b66 (kx 2024-12-20 16:11:07 +0300   327)                       number, but don't touch the sign.
868b2b66 (kx 2024-12-20 16:11:07 +0300   328) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   329)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   331)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   332)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   334)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   335)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   336)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   337)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   338)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   339)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   340) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   341)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300   342) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   343)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   344) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   345)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300   346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   347)   np = internal_np( nb ) - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   348) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300   349)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300   350) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   351) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   352)   (void)memset( (void *)ei, 0, np * SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300   353) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   354) } /* End of ei_cleazs() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   355) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   357) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300   358) #include <r_const/ei_ind_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   359) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   360) #include <r_const/ei_ind_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   361) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   362) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   363) void ei_ind( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   364) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   365) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   366)  Description        : ei_ind() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   367)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   369)  Concepts           : формирует `неопределенность' (- 1.IND)
868b2b66 (kx 2024-12-20 16:11:07 +0300   370) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   371)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   372)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   373)                          1 1...1 1  10.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300   374) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   375)                       которое не равно nan_max, nan_min и nan.
868b2b66 (kx 2024-12-20 16:11:07 +0300   376) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   377)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   378) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   379)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   380)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   381)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   382) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   383)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   384)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   385)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   386)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   387)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   388)                                      data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   389) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   390)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300   391) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   392)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   393) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   394)   size_t nbytes = internal_np( nb ) * SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300   395) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   396)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   397)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   398)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   399)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   400)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   401)       (void)memcpy( (void *)ei, (void *)&_ei_ind_128_[0],    nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   402)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   403)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   404)       (void)memcpy( (void *)ei, (void *)&_ei_ind_256_[0],    nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   405)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   406)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   407)       (void)memcpy( (void *)ei, (void *)&_ei_ind_512_[0],    nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   408)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   409)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   410)       (void)memcpy( (void *)ei, (void *)&_ei_ind_1024_[0],   nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   411)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   412)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   413)       (void)memcpy( (void *)ei, (void *)&_ei_ind_2048_[0],   nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   414)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   415)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   416)       (void)memcpy( (void *)ei, (void *)&_ei_ind_4096_[0],   nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   417)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   418)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   419)       (void)memcpy( (void *)ei, (void *)&_ei_ind_8192_[0],   nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   420)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   421)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   422)       (void)memcpy( (void *)ei, (void *)&_ei_ind_16384_[0],  nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   423)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   424)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   425)       (void)memcpy( (void *)ei, (void *)&_ei_ind_32768_[0],  nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   426)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   427)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   428)       (void)memcpy( (void *)ei, (void *)&_ei_ind_65536_[0],  nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   429)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   430)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   431)       (void)memcpy( (void *)ei, (void *)&_ei_ind_131072_[0], nbytes );
868b2b66 (kx 2024-12-20 16:11:07 +0300   432)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   434)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   435)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   436)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   437)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   438)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   439)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   440)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   441)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   442) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   443) } /* End of ei_ind() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   444) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   445) int ei_isind( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   446) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   447) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   448)  Description        : ei_isind() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   449)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   450) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   451)  Concepts           : проверка на `неопределенность' (- 1.IND)
868b2b66 (kx 2024-12-20 16:11:07 +0300   452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   453)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   454)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   455)                          1 1...1 1  10.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300   456) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   457)                       которая не равна nan_max, nan_min и nan.
868b2b66 (kx 2024-12-20 16:11:07 +0300   458) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   459)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   460) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   461)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   462)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   463)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   464) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   465)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   466)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   467)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   468)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   469)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   470)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   471) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   472)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300   473)                       if( `неопределенность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300   474)                       else                     [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300   475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   476)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   477) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   478)   int ie, ne, is, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300   479)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300   480) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   481)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300   482)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300   483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   484)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   485)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300   486)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300   487)       Compare 'Sign...Exp' and 'Significand'; skip lgw and hgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300   488)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300   489) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300   490)   ie = 0; is = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300   491) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   492)   ie = ns + 2; is = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   493) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   494) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   495)   ++ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300   496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   497)   ne *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300   498)   ns *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300   499) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   500)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   501)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   502)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   503)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   504)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   505)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_128_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   506)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_128_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   507)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   508)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   509)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   510)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_256_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   511)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_256_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   512)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   513)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   514)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   515)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_512_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   516)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_512_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   517)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   518)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   519)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   520)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_1024_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   521)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_1024_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   522)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   523)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   524)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   525)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_2048_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   526)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_2048_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   527)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   528)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   529)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   530)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_4096_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   531)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_4096_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   532)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   533)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   534)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   535)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_8192_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   536)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_8192_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   537)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   538)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   539)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   540)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_16384_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   541)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_16384_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   542)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   543)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   544)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   545)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_32768_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   546)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_32768_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   547)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   548)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   549)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   550)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_65536_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   551)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_65536_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   552)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   553)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   554)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   555)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_ind_131072_[0][ie], (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300   556)           !memcmp( (void *)&ei[is], (void *)&_ei_ind_131072_[0][is], (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300   557)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   558)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   559) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   560)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   561)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   562)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   563)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   564)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   565)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   566)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   567)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   568) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   569)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300   570) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   571) } /* End of ei_isind() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   572) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   573) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   574) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300   575) #include <r_const/e_ind_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   576) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   577) #include <r_const/e_ind_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   578) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   580) void e_ind( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   581) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   583)  Description        : e_ind() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   584)                               external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   585) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   586)  Concepts           : формирует `неопределенность' (- 1.IND)
868b2b66 (kx 2024-12-20 16:11:07 +0300   587) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   588)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   589)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   590)                          1 1...1 10.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300   591) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   592)                       которое не равно nan_max, nan_min и nan.
868b2b66 (kx 2024-12-20 16:11:07 +0300   593) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   594)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   595) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   596)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   597) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   598)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   599)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   600)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   601)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   602)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   603)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   604) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   605)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300   606) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   607)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   608) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   609)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300   610)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   611)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300   612)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300   613)           Здесь работа идет словами EMUSHORT (согласно
868b2b66 (kx 2024-12-20 16:11:07 +0300   614)           определениям из файлов e_ind_emu32*sb.dfn) и,
868b2b66 (kx 2024-12-20 16:11:07 +0300   615)           следовательно, на данный момент подразумевается,
868b2b66 (kx 2024-12-20 16:11:07 +0300   616)           что размер EMUSHORT равен 4 байта (32 bits).
868b2b66 (kx 2024-12-20 16:11:07 +0300   617) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   618)           Если BITS_PER_EMUSHORT > 32, то надо использовать
868b2b66 (kx 2024-12-20 16:11:07 +0300   619)           прямое присваивание значений, например:
868b2b66 (kx 2024-12-20 16:11:07 +0300   620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   621)             __mpu_uint32_t *e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300   622)             *e = 0xffc00000;
868b2b66 (kx 2024-12-20 16:11:07 +0300   623) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   624)           не забывая об очередности LITTLE/BIG endian.
868b2b66 (kx 2024-12-20 16:11:07 +0300   625) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   626)    *************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   627)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   628)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   629)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   630)       (void)memcpy( (void *)ee, (void *)&_e_ind_32_[0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   631)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   632)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   633)       (void)memcpy( (void *)ee, (void *)&_e_ind_64_[0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   634)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   635)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   636)       (void)memcpy( (void *)ee, (void *)&_e_ind_128_[0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   637)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   638)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   639)       (void)memcpy( (void *)ee, (void *)&_e_ind_256_[0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   640)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   641)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   642)       (void)memcpy( (void *)ee, (void *)&_e_ind_512_[0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   643)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   644)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   645)       (void)memcpy( (void *)ee, (void *)&_e_ind_1024_[0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   646)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   647)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   648)       (void)memcpy( (void *)ee, (void *)&_e_ind_2048_[0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   649)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   650)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   651)       (void)memcpy( (void *)ee, (void *)&_e_ind_4096_[0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   652)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   653)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   654)       (void)memcpy( (void *)ee, (void *)&_e_ind_8192_[0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   655)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   656)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   657)       (void)memcpy( (void *)ee, (void *)&_e_ind_16384_[0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   658)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   659)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   660)       (void)memcpy( (void *)ee, (void *)&_e_ind_32768_[0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   661)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   662)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   663)       (void)memcpy( (void *)ee, (void *)&_e_ind_65536_[0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   664)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   665)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   666)       (void)memcpy( (void *)ee, (void *)&_e_ind_131072_[0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   667)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   668) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   669)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   670)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   671)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   672)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   673)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   674)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   675)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   676)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   678) } /* End of e_ind() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   679) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   680) int e_isind( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   681) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   682) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   683)  Description        : e_isind() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   684)                                 external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   685) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   686)  Concepts           : проверка на `неопределенность' (- 1.IND)
868b2b66 (kx 2024-12-20 16:11:07 +0300   687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   688)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   689)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   690)                          1 1...1 10.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300   691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   692)                       которое не равно nan_max, nan_min и nan.
868b2b66 (kx 2024-12-20 16:11:07 +0300   693) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   694)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   695) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   696)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   697) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   698)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   699)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   700)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   701)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   702)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   703)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   704) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   705)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300   706)                       if( `неопределенность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300   707)                       else                     [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300   708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   709)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   710) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   711)   int    rc = 0;                    /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300   712)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300   713) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   714)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   715)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   716)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   717)       if( !memcmp( (void *)ee, (void *)&_e_ind_32_[0],     np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   718)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   719)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   720)       if( !memcmp( (void *)ee, (void *)&_e_ind_64_[0],     np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   721)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   722)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   723)       if( !memcmp( (void *)ee, (void *)&_e_ind_128_[0],    np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   724)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   725)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   726)       if( !memcmp( (void *)ee, (void *)&_e_ind_256_[0],    np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   727)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   728)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   729)       if( !memcmp( (void *)ee, (void *)&_e_ind_512_[0],    np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   730)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   731)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   732)       if( !memcmp( (void *)ee, (void *)&_e_ind_1024_[0],   np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   733)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   734)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   735)       if( !memcmp( (void *)ee, (void *)&_e_ind_2048_[0],   np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   736)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   737)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   738)       if( !memcmp( (void *)ee, (void *)&_e_ind_4096_[0],   np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   739)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   740)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   741)       if( !memcmp( (void *)ee, (void *)&_e_ind_8192_[0],   np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   742)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   743)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   744)       if( !memcmp( (void *)ee, (void *)&_e_ind_16384_[0],  np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   745)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   746)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   747)       if( !memcmp( (void *)ee, (void *)&_e_ind_32768_[0],  np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   748)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   749)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   750)       if( !memcmp( (void *)ee, (void *)&_e_ind_65536_[0],  np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   751)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   752)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   753)       if( !memcmp( (void *)ee, (void *)&_e_ind_131072_[0], np ) ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   754)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   755) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   756)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   757)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   758)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   759)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   760)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   761)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   762)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   763)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   765)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300   766) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   767) } /* End of e_isind() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   768) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   769) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   770) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300   771) #include <r_const/ei_nan_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   772) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   773) #include <r_const/ei_nan_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   774) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   775) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   777) void ei_nan( EMUSHORT *ei, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   778) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   779) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   780)  Description        : ei_nan() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   781)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   782) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   783)  Concepts           : формирует `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300   784) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   785)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   786)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   787)                          S 1...1 1  10.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300   788) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   789)                       которое не равно nan_max, nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300   790) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   791)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   792) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   793)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   794)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   795) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   796)  Parameters         : EMUSHORT *ei;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   797)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   798)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   799)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300   800)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300   801)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   802)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   803)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   805)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300   806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   807)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   808) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   809)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300   810)   size_t np = internal_np( nb ) * SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300   811) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   812)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   814)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   815)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   816)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   817)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   818)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   819)       (void)memcpy( (void *)ei, (void *)&_ei_nan_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   820)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   821)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300   822)       (void)memcpy( (void *)ei, (void *)&_ei_nan_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   823)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   824)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300   825)       (void)memcpy( (void *)ei, (void *)&_ei_nan_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   826)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   827)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300   828)       (void)memcpy( (void *)ei, (void *)&_ei_nan_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   829)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   830)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300   831)       (void)memcpy( (void *)ei, (void *)&_ei_nan_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   832)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   833)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300   834)       (void)memcpy( (void *)ei, (void *)&_ei_nan_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   835)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   836)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300   837)       (void)memcpy( (void *)ei, (void *)&_ei_nan_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   838)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   839)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300   840)       (void)memcpy( (void *)ei, (void *)&_ei_nan_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   841)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   842)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300   843)       (void)memcpy( (void *)ei, (void *)&_ei_nan_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   844)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   845)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300   846)       (void)memcpy( (void *)ei, (void *)&_ei_nan_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   847)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   848)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300   849)       (void)memcpy( (void *)ei, (void *)&_ei_nan_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   850)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   851) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   852)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300   853)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300   854)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   855)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300   856)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300   857)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   858)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300   859)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300   860) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   861) } /* End of ei_nan() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   862) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   863) int ei_isnans( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   864) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   866)  Description        : ei_isnans() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   867)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   868) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   869)  Concepts           : проверка на `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300   870) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   871)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   872)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   873)                          S 1...1 1  00.......01, min
868b2b66 (kx 2024-12-20 16:11:07 +0300   874)                          + 1...1 1  10.......00, (-ind)
868b2b66 (kx 2024-12-20 16:11:07 +0300   875)                          S 1...1 1  10.......01, 
868b2b66 (kx 2024-12-20 16:11:07 +0300   876)                          S 1...1 1  11.......11, max
868b2b66 (kx 2024-12-20 16:11:07 +0300   877) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   878)                       которое не равно           ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300   879) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   880)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   881) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   882)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   883)                       ei_isind( ei, nb );         | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   884)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   885)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300   886) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   887)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   888)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   889)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   890)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   891)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   892)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   893) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   894)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300   895)                       if( любое `не число' кроме `ind') [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300   896)                       else                              [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300   897) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   898)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   899) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   900)   int i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300   901) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   902)   if( ei_isind( ei, nb ) ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   903) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   904)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300   905)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300   906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   907) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300   908)   ei = ei + ne + ns + 1;               /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300   909) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   910)   ei++;
868b2b66 (kx 2024-12-20 16:11:07 +0300   911) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   912) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   913)   /* test ALL NaNs                                  */
868b2b66 (kx 2024-12-20 16:11:07 +0300   914) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300   915)   /* hight part of Exponent                         */
868b2b66 (kx 2024-12-20 16:11:07 +0300   916)   if( (*ei++ & HIGHT_EXP) != HIGHT_EXP ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   917)   /* low parts of Exponent (if is present)          */
868b2b66 (kx 2024-12-20 16:11:07 +0300   918)   for( i = 1; i < ne; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300   919)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   920)     if( *ei++ != MASK_ALL_BITS ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   921)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300   922)   ei++;                             /* skip the hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300   923)   /* hight part of Significand (без неявной 1.0)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300   924)   if( *ei++ & HIGHT_EXP ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   925)   /* low parts of Significand (if is present)       */
868b2b66 (kx 2024-12-20 16:11:07 +0300   926)   for( i = 1; i < ns; i++ ) if( *ei++ ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   927) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   928)   /* hight part of Exponent                         */
868b2b66 (kx 2024-12-20 16:11:07 +0300   929)   if( (*ei-- & HIGHT_EXP) != HIGHT_EXP ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   930)   /* low parts of Exponent (if is present)          */
868b2b66 (kx 2024-12-20 16:11:07 +0300   931)   for( i = 1; i < ne; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300   932)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   933)     if( *ei-- != MASK_ALL_BITS ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   934)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300   935)   ei--;                             /* skip the hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300   936)   /* hight part of Significand (без неявной 1.0)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300   937)   if( *ei-- & HIGHT_EXP ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   938)   /* low parts of Significand (if is present)       */
868b2b66 (kx 2024-12-20 16:11:07 +0300   939)   for( i = 1; i < ns; i++ ) if( *ei-- ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   940) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   941)                                        /* ei -> lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300   942)    return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300   943) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   944) } /* End of ei_isnans() */
868b2b66 (kx 2024-12-20 16:11:07 +0300   945) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   946) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   947) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300   948) #include <r_const/e_nan_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   949) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300   950) #include <r_const/e_nan_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300   951) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300   952) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   953) void e_nan( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   954) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300   955) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   956)  Description        : e_ind() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300   957)                               external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   958) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   959)  Concepts           : формирует `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300   960) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   961)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300   962)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300   963)                          S 1...1 10.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300   964) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   965)                       которое не равно nan_max, nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300   966) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   967)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300   968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   969)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300   970) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   971)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300   972)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   973)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300   974)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300   975)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300   976)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300   977)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300   978)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300   979) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   980)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300   981) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   982)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300   983) {
868b2b66 (kx 2024-12-20 16:11:07 +0300   984)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300   985)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300   986) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   987)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300   988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300   989)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300   990)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300   991)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300   992)       (void)memcpy( (void *)ee, (void *)&_e_nan_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   993)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   994)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300   995)       (void)memcpy( (void *)ee, (void *)&_e_nan_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   996)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300   997)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300   998)       (void)memcpy( (void *)ee, (void *)&_e_nan_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300   999)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1000)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1001)       (void)memcpy( (void *)ee, (void *)&_e_nan_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1002)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1003)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1004)       (void)memcpy( (void *)ee, (void *)&_e_nan_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1005)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1006)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1007)       (void)memcpy( (void *)ee, (void *)&_e_nan_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1008)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1009)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1010)       (void)memcpy( (void *)ee, (void *)&_e_nan_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1011)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1012)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1013)       (void)memcpy( (void *)ee, (void *)&_e_nan_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1014)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1015)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1016)       (void)memcpy( (void *)ee, (void *)&_e_nan_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1017)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1018)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1019)       (void)memcpy( (void *)ee, (void *)&_e_nan_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1020)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1021)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1022)       (void)memcpy( (void *)ee, (void *)&_e_nan_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1023)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1024)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1025)       (void)memcpy( (void *)ee, (void *)&_e_nan_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1026)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1027)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1028)       (void)memcpy( (void *)ee, (void *)&_e_nan_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1029)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1030) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1031)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1032)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1033)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1034)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1035)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1036)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1037)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1038)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1039) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1040) } /* End of e_nan() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1042) static int e_isnans_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1043) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1044) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1045)  Description        : e_isnans_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1046)                                     external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1047) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1048)  Concepts           : проверка на `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1049) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1050)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1051)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1052)                          S 1...1 00.......01, min
868b2b66 (kx 2024-12-20 16:11:07 +0300  1053)                          + 1...1 10.......00, (-ind)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1054)                          S 1...1 10.......01, 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1055)                          S 1...1 11.......11, max
868b2b66 (kx 2024-12-20 16:11:07 +0300  1056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1057)                       которое не равно           ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1058) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1059)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1060) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1061)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1062)                       e_isind( ee, nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1063) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1064)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1065)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1066)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1067)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1068)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1069)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1070) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1071)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1072)                       if( любое `не число' кроме `ind') [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1073)                       else                              [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1074) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1075)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1076) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1077)   __mpu_uint16_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1078)   int             rc = 1, rc1 = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1079) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1080)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1081)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1082)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1083)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1084)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1085)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1086)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1088)   if( e_isind( ee, nb ) ) return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1089) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1090)   e = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1091) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1092) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1093)   e++; /* high part of real32 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1094) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1095) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1096)   if( (*e & 0x7f80) == 0x7f80 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1097)   else                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1098) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1099)   if( rc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1100)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1101) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1102)     if( ((*e & 0x7f) != 0) || (*(e + 1) != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1103) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1104)     if( ((*e & 0x7f) != 0) || (*(e - 1) != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1105) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1106)       rc1 |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1107) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1108)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1109)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1110)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1111)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1112)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1113)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1114) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1115) } /* End of e_isnans_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1116) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1117) static int e_isnans_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1118) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1120)  Description        : e_isnans_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1121)                                     external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1123)  Concepts           : проверка на `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1124) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1125)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1126)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1127)                          S 1...1 00.......01, min
868b2b66 (kx 2024-12-20 16:11:07 +0300  1128)                          + 1...1 10.......00, (-ind)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1129)                          S 1...1 10.......01, 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1130)                          S 1...1 11.......11, max
868b2b66 (kx 2024-12-20 16:11:07 +0300  1131) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1132)                       которое не равно           ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1133) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1134)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1136)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1137)                       e_isind( ee, nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1138) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1139)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1140)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1141)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1142)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1143)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1144)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1145) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1146)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1147)                       if( любое `не число' кроме `ind') [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1148)                       else                              [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1149) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1150)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1151) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1152)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1153)   int             rc = 1, rc1 = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1155)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1156)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1157)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1158)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1159)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1160)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1161)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1163)   if( e_isind( ee, nb ) ) return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1165)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1166) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1167) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1168)   e++; /* high part of real32 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1169) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1170) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1171)   if( (*e & 0x7ff00000) == 0x7ff00000 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1172)   else                                  rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1174)   if( rc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1175)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1176) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1177)     if( ((*e & 0xfffff) != 0) || (*(e + 1) != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1178) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1179)     if( ((*e & 0xfffff) != 0) || (*(e - 1) != 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1180) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1181)       rc1 |= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1182) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1183)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1184)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1185)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1186)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1187)     return( rc1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1188)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1190) } /* End of e_isnans_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1191) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1192) static int e_isnans_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1193) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1195)  Description        : e_isnans_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1196)                                     external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1197) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1198)  Concepts           : проверка на `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1200)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1201)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1202)                          S 1...1 00.......01, min
868b2b66 (kx 2024-12-20 16:11:07 +0300  1203)                          + 1...1 10.......00, (-ind)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1204)                          S 1...1 10.......01, 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1205)                          S 1...1 11.......11, max
868b2b66 (kx 2024-12-20 16:11:07 +0300  1206) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1207)                       которое не равно           ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1208) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1209)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1210) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1211)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1212)                       e_isind( ee, nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1213)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1214)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1216)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1217)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1218)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1219)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1220)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1221)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1222) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1223)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1224)                       if( любое `не число' кроме `ind' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1225)                       else                               [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1226) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1227)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1228) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1229)   int i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1231)   if( e_isind( ee, nb ) ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1232) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1233)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1234)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1235) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1236) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1237)   ee = ee + ne + ns - 1;                    /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1238) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1240)   /* test ALL NaNs                                  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1241) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1242)   /* hight part of Exponent (skip Sign)             */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1243)   if( (*ee++ & HIGHT_EXP) != HIGHT_EXP ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1244)   /* low parts of Exponent (if is present)          */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1245)   for( i = 1; i < ne; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1246)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1247)     if( *ee++ != MASK_ALL_BITS ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1248)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1249)   /* all parts of Significand (if is present)       */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1250)   for( i = 0; i < ns; i++ ) if( *ee++ ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1251) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1252)   /* hight part of Exponent (skip Sign)             */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1253)   if( (*ee-- & HIGHT_EXP) != HIGHT_EXP ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1254)   /* low parts of Exponent (if is present)          */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1255)   for( i = 1; i < ne; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1256)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1257)     if( *ee-- != MASK_ALL_BITS ) return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1258)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1259)   /* all parts of Significand (if is present)       */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1260)   for( i = 0; i < ns; i++ ) if( *ee-- ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1261) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1263)   return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1264) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1265) } /* End of e_isnans_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1266) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1267) int e_isnans( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1268) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1269) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1270)  Description        : e_isnans() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1271)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1272) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1273)  Concepts           : проверка на `не число' (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1274) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1275)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1276)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1277)                          S 1...1 00.......01, min
868b2b66 (kx 2024-12-20 16:11:07 +0300  1278)                          + 1...1 10.......00, (-ind)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1279)                          S 1...1 10.......01, 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1280)                          S 1...1 11.......11, max
868b2b66 (kx 2024-12-20 16:11:07 +0300  1281) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1282)                       которое не равно           ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1284)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1285) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1286)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1287)                       e_isnans_32();              | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1288)                       e_isnans_64();              | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1289)                       e_isnans_np();              | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1291)  Parameters         : unsigned EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1292)                                                external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1293)                                                data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1294)                       unsigned int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1295)                                                external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1296)                                                data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1297) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1298)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1299)                       if( любое `не число' кроме `ind' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1300)                       else                               [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1302)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1303) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1304)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1305) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1306)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1307)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1308)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1309)       rc = e_isnans_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1310)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1311)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1312)       rc = e_isnans_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1313)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1314)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1315)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1316)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1317)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1318)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1319)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1320)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1321)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1322)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1323)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1324)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1325)       rc = e_isnans_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1326)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1328)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1329)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1330)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1331)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1332)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1333)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1334)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1335)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1336)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1337) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1338)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1339) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1340) } /* End of e_isnans() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1342) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1343) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1344) #include <r_const/ei_nanmax_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1345) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1346) #include <r_const/ei_nanmax_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1347) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1348) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1349) void ei_nanmax( EMUSHORT *ei, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1350) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1351) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1352)  Description        : ei_nanmax() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1353)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1354) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1355)  Concepts           : формирует максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1356)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1357) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1358)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1359)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1360)                          S 1...1 1  11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1361) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1362)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1363) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1364)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1365) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1366)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1367)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1369)  Parameters         : EMUSHORT *ei;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1370)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1371)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1372)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  1373)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1374)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1375)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1376)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1377) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1378)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  1379) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1380)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1381) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1382)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1383)   size_t np = internal_np( nb ) * SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1384) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1385)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1386) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1387)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1388)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1389)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1390)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1391)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1392)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1393)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1394)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1395)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1396)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1397)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1398)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1399)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1400)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1401)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1402)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1403)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1404)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1405)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1406)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1407)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1408)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1409)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1410)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1411)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1412)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1413)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1414)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1415)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1416)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1417)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1418)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1419)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1420)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1421)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1422)       (void)memcpy( (void *)ei, (void *)&_ei_nanmax_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1423)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1424) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1425)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1426)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1427)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1428)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1429)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1430)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1431)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1432)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1434) } /* End of ei_nanmax() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1435) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1436) int ei_isnanmax( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1437) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1438) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1439)  Description        : ei_isnanmax() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1440)                                     internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1441) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1442)  Concepts           : проверка на максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1443)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1444) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1445)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1446)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1447)                          S 1...1 1  11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1448) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1449)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1450) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1451)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1453)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1454)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1455)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1456) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1457)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1458)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1459)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1460)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1461)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1462)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1464)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1465)                       if( max `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1466)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1467) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1468)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1469) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1470)   int ie, ne, is, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1471)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1472) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1473)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1474)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1476)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1477)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1478)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  1479)       Compare 'Exp' and 'Significand'; skip Sign, lgw and hgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1480)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1481) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1482)   ie = 1; is = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1483) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1484)   ie = ns + 2; is = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1485) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1486) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1487)   ne *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1488)   ns *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1489) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1490)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1491)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1492)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1493)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1494)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1495)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_128_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1496)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_128_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1497)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1498)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1499)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1500)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_256_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1501)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_256_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1502)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1503)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1504)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1505)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_512_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1506)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_512_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1507)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1508)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1509)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1510)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_1024_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1511)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_1024_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1512)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1513)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1514)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1515)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_2048_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1516)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_2048_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1517)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1518)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1519)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1520)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_4096_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1521)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_4096_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1522)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1523)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1524)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1525)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_8192_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1526)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_8192_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1527)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1528)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1529)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1530)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_16384_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1531)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_16384_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1532)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1533)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1534)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1535)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_32768_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1536)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_32768_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1537)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1538)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1539)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1540)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_65536_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1541)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_65536_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1542)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1543)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1544)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1545)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmax_131072_[0][ie], (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  1546)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmax_131072_[0][is], (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1547)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1548)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1549) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1550)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1551)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1552)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1553)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1554)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1555)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1556)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1557)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1559)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1560) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1561) } /* End of ei_isnanmax() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1562) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1563) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1564) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1565) #include <r_const/e_nanmax_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1566) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1567) #include <r_const/e_nanmax_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1568) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1569) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1570) void e_nanmax( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1571) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1572) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1573)  Description        : e_nanmax() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1574)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1575) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1576)  Concepts           : формирует максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1577)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1578) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1579)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1580)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1581)                          S 1...1 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1583)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1584) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1585)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1586) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1587)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1588) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1589)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1590)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1591)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1592)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  1593)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1594)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1595)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1596)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1597) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1598)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1599) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1600)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1601) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1602)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1603)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1604) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1605)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1606) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1607)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1608)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1609)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1610)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1611)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1612)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1613)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1614)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1615)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1616)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1617)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1618)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1619)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1620)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1621)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1622)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1623)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1624)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1625)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1626)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1627)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1628)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1629)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1630)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1631)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1632)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1633)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1634)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1635)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1636)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1637)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1638)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1639)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1640)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1641)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1642)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1643)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1644)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1645)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1646)       (void)memcpy( (void *)ee, (void *)&_e_nanmax_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1647)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1648) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1649)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1650)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1651)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1652)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1653)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1654)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1655)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1656)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1657) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1658) } /* End of e_nanmax() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1659) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1660) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1661) static int e_isnanmax_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1662) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1663) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1664)  Description        : e_isnanmax_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1665)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  1666)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1667) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1668)  Concepts           : проверка на максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1669)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1670) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1671)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1672)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1673)                          S 1...1 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1675)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1676) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1677)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1678) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1679)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1680) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1681)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1682)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1683)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1684)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1685)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1686)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1688)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1689)                       if( max `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1690)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1692)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1693) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1694)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1695)   int             rc = 0;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1696) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1697)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1698) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1699)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1700)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1701)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1702)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1703)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1704)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1705)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1706) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1707)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1708)   if( (*e & 0x7fffffff) == 0x7fffffff )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1709)     rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1711)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1712) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1713) } /* End of e_isnanmax_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1714) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1715) static int e_isnanmax_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1716) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1717) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1718)  Description        : e_isnanmax_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1719)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  1720)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1721) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1722)  Concepts           : проверка на максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1723)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1724) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1725)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1726)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1727)                          S 1...1 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1728) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1729)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1730) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1731)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1732) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1733)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1734) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1735)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1736)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1737)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1738)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1739)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1740)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1741) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1742)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1743)                       if( max `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1744)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1745) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1746)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1747) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1748)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1749)   int             rc = 1;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1750) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1751)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1752) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1753)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1754)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1755)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1756)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1757)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1758)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1759)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1760) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1761) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1762)   e++; /* high part of real32 data struct     */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1763) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1765)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1766)   if( (*e & 0x7fffffff) == 0x7fffffff ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1767)   else                                  rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1768) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1769) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1770)   e++; /* low part of real32 data struct      */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1771) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1772)   e--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1773) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1774) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1775)   if( *e == 0xffffffff ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1776)   else                   rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1777) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1778)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1779) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1780) } /* End of e_isnanmax_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1781) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1782) static int e_isnanmax_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1783) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1784) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1785)  Description        : e_isnanmax_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1786)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  1787)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1788) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1789)  Concepts           : проверка на максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1790)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1791) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1792)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1793)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1794)                          S 1...1 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1795) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1796)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1797) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1798)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1799) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1800)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1801)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1802) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1803)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1804)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1805)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1806)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1807)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1808)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1809) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1810)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1811)                       if( max `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1812)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1814)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1815) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1816)   int ie, is, np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1817)   int rc = 1; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1818) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1819)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1821)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1822)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1823)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  1824)       Compare 'Exp' and 'Significand'; skip Sign.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1825)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1826) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  1827)   ie = 1; is = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1828) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1829)   ie = 0; is = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1830) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1831) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1832)   --np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1833) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1834)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1835)   if( (ee[is] & HIGHT_EXP) == HIGHT_EXP ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1836)   else                                    rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1837) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1838)   np *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1839) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1840)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1841)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1842)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1843)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_128_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1844)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1845)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1846)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1847)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_256_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1848)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1849)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1850)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1851)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_512_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1852)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1853)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1854)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1855)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_1024_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1856)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1857)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1858)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1859)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_2048_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1860)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1861)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1862)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1863)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_4096_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1864)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1865)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1866)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1867)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_8192_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1868)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1869)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1870)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1871)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_16384_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1872)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1873)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1874)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1875)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_32768_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1876)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1877)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1878)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1879)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_65536_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1880)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1881)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1882)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1883)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmax_131072_[0][ie], (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1884)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1885)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1886) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1887)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1888)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1889)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1890)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1891)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1892)       return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1893)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1894)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1895)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1896) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1897)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1898) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1899) } /* End of e_isnanmax_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1900) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1901) int e_isnanmax( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1902) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1903) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1904)  Description        : e_isnanmax() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1905)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1907)  Concepts           : проверка на максимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1908)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1909) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1910)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1911)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1912)                          S 1...1 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1913) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1914)                       которое не равно nan_min и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1915) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1916)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1917) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1918)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1919)                       e_isnanmax_32();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1920)                       e_isnanmax_64();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1921)                       e_isnanmax_np();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  1922) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1923)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  1924)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1925)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1926)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  1927)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  1928)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1929) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1930)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1931)                       if( max `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1932)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  1933) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1934)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  1935) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1936)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1937) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1938)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1939)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1940)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1941)       rc = e_isnanmax_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1942)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1943)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1944)       rc = e_isnanmax_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1945)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1946)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1947)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1948)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1949)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1950)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1951)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1952)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1953)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1954)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1955)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1956)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1957)       rc = e_isnanmax_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1958)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1959) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1960)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1961)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  1962)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1963)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1964)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1965)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1966)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  1967)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  1968)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1969) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1970)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  1971) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1972) } /* End of e_isnanmax() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  1973) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1975) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  1976) #include <r_const/ei_nanmin_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1977) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  1978) #include <r_const/ei_nanmin_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  1979) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  1980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1981) void ei_nanmin( EMUSHORT *ei, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  1982) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  1983) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1984)  Description        : ei_nanmin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  1985)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1986) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1987)  Concepts           : формирует минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  1988)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  1989) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1990)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  1991)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  1992)                          S 1...1 1  00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  1993) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1994)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  1995) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1996)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  1997) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  1998)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  1999)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2001)  Parameters         : EMUSHORT *ei;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2002)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2003)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2004)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  2005)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2006)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2007)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2008)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2009) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2010)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  2011) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2012)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2013) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2014)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2015)   size_t np = internal_np( nb ) * SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2017)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2018) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2019)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2020)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2021)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2022)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2023)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2024)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2025)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2026)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2027)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2028)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2029)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2030)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2031)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2032)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2033)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2034)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2035)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2036)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2037)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2038)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2039)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2040)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2041)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2042)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2043)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2044)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2045)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2046)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2047)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2048)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2049)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2050)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2051)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2052)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2053)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2054)       (void)memcpy( (void *)ei, (void *)&_ei_nanmin_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2055)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2057)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2058)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2059)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2060)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2061)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2062)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2063)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2064)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2066) } /* End of ei_nanmin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2067) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2068) int ei_isnanmin( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2069) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2070) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2071)  Description        : ei_isnanmin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2072)                                     internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2073)                                     struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2074) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2075)  Concepts           : проверка на минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2076)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2077) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2078)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2079)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2080)                          S 1...1 1  00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2081) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2082)                       которое не равно nan_max, и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2084)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2085) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2086)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2087)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2088)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2089) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2090)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2091)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2092)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2093)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2094)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2095)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2097)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2098)                       if( min `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2099)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2100) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2101)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2102) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2103)   int ie, ne, is, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2104)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2105) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2106)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2107)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2109)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2110)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2111)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  2112)       Compare 'Exp' and 'Significand'; skip Sign, lgw and hgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2113)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2114) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  2115)   ie = 1; is = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2116) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2117)   ie = ns + 2; is = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2118) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2120)   ne *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2121)   ns *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2123)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2124)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2125)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2126)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2127)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2128)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_128_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2129)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_128_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2130)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2131)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2132)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2133)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_256_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2134)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_256_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2135)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2136)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2137)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2138)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_512_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2139)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_512_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2140)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2141)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2142)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2143)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_1024_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2144)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_1024_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2145)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2146)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2147)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2148)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_2048_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2149)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_2048_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2150)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2151)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2152)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2153)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_4096_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2154)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_4096_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2155)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2156)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2157)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2158)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_8192_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2159)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_8192_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2160)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2161)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2162)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2163)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_16384_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2164)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_16384_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2165)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2166)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2167)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2168)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_32768_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2169)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_32768_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2170)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2171)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2172)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2173)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_65536_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2174)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_65536_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2175)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2176)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2177)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2178)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_nanmin_131072_[0][ie], (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2179)           !memcmp( (void *)&ei[is], (void *)&_ei_nanmin_131072_[0][is], (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2180)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2181)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2182) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2183)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2184)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2185)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2186)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2187)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2188)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2189)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2190)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2191) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2192)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2193) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2194) } /* End of ei_isnanmin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2196) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2197) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  2198) #include <r_const/e_nanmin_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2199) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2200) #include <r_const/e_nanmin_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2201) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2203) void e_nanmin( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2204) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2205) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2206)  Description        : e_nanmin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2207)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2208) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2209)  Concepts           : формирует минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2210)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2211) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2212)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2213)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2214)                          S 1...1 00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2216)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2217) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2218)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2220)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2221) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2222)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2223)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2224)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2225)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  2226)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2227)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2228)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2229)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2231)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2232) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2233)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2234) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2235)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2236)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2237) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2238)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2240)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2241)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2242)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2243)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2244)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2245)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2246)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2247)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2248)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2249)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2250)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2251)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2252)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2253)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2254)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2255)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2256)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2257)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2258)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2259)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2260)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2261)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2262)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2263)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2264)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2265)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2266)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2267)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2268)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2269)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2270)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2271)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2272)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2273)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2274)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2275)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2276)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2277)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2278)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2279)       (void)memcpy( (void *)ee, (void *)&_e_nanmin_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2280)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2281) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2282)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2283)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2284)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2285)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2286)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2287)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2288)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2289)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2291) } /* End of e_nanmin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2293) static int e_isnanmin_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2294) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2295) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2296)  Description        : e_isnanmin_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2297)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2298)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2299) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2300)  Concepts           : проверка на минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2301)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2302) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2303)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2304)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2305)                          S 1...1 00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2306) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2307)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2309)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2311)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2312) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2313)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2314)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2315)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2316)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2317)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2318)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2319) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2320)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2321)                       if( min `не число') [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2322)                       else                [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2324)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2325) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2326)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2327)   int             rc = 0;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2328) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2329)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2331)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2332)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2333)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2334)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2335)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2336)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2337)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2339)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2340)   if( (*e & 0x7fffffff) == 0x7f800001 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2341)     rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2342) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2343)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2344) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2345) } /* End of e_isnanmin_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2347) static int e_isnanmin_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2348) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2349) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2350)  Description        : e_isnanmin_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2351)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2352)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2353) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2354)  Concepts           : проверка на минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2355)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2357)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2358)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2359)                          S 1...1 00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2361)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2362) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2363)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2364) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2365)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2366) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2367)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2368)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2369)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2370)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2371)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2372)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2373) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2374)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2375)                       if( min `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2376)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2377) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2378)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2379) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2380)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2381)   int             rc = 1;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2382) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2383)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2384) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2385)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2386)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2387)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2388)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2389)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2390)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2391)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2393) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  2394)   e++; /* high part of real32 data struct     */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2395) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2396) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2397)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2398)   if( (*e & 0x7fffffff) == 0x7ff00000 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2399)   else                                  rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2400) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2401) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  2402)   e++; /* low part of real32 data struct      */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2403) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2404)   e--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2405) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2406) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2407)   if( *e == 0x00000001 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2408)   else                   rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2410)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2411) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2412) } /* End of e_isnanmin_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2413) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2414) static int e_isnanmin_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2415) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2416) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2417)  Description        : e_isnanmin_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2418)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2419)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2420) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2421)  Concepts           : проверка на минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2422)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2424)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2425)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2426)                          S 1...1 00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2427) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2428)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2429) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2430)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2432)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2433)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2434) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2435)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2436)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2437)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2438)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2439)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2440)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2441) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2442)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2443)                       if( min `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2444)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2446)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2447) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2448)   int ie, is, np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2449)   int rc = 1; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2450) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2451)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2453)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2454)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2455)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  2456)       Compare 'Exp' and 'Significand'; skip Sign.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2457)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2458) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  2459)   ie = 1; is = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2460) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2461)   ie = 0; is = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2462) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2464)   --np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2465) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2466)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2467)   if( (ee[is] & HIGHT_EXP) == HIGHT_EXP ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2468)   else                                    rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2470)   np *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2471) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2472)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2473)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2474)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2475)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_128_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2476)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2477)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2478)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2479)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_256_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2480)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2481)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2482)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2483)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_512_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2484)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2485)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2486)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2487)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_1024_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2488)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2489)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2490)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2491)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_2048_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2492)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2493)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2494)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2495)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_4096_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2496)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2497)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2498)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2499)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_8192_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2500)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2501)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2502)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2503)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_16384_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2504)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2505)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2506)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2507)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_32768_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2508)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2509)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2510)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2511)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_65536_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2512)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2513)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2514)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2515)       if( !memcmp( (void *)&ee[ie], (void *)&_e_nanmin_131072_[0][ie], (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2516)       else                                                                            rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2517)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2518) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2519)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2520)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2521)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2522)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2523)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2524)       return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2525)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2526)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2527)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2528) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2529)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2530) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2531) } /* End of e_isnanmin_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2532) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2533) int e_isnanmin( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2534) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2535) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2536)  Description        : e_isnanmin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2537)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2538) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2539)  Concepts           : проверка на минимальное `не число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  2540)                       (+/- 1.NAN)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2541) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2542)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2543)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2544)                          S 1...1 00.......01,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2545) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2546)                       которое не равно nan_max и ind.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2547) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2548)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2549) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2550)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2551)                       e_isnanmin_32();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2552)                       e_isnanmin_64();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2553)                       e_isnanmin_np();            | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2554) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2555)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2556)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2557)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2558)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2559)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2560)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2561) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2562)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2563)                       if( min `не число' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2564)                       else                 [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2566)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2567) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2568)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2569) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2570)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2571)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2572)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2573)       rc = e_isnanmin_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2574)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2575)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2576)       rc = e_isnanmin_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2577)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2578)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2579)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2580)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2581)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2582)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2583)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2584)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2585)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2586)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2587)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2588)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2589)       rc = e_isnanmin_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2590)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2591) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2592)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2593)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2594)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2595)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2596)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2597)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2598)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2599)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2600)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2601) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2602)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2603) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2604) } /* End of e_isnanmin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2605) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2606) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2607) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  2608) #include <r_const/ei_inf_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2609) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2610) #include <r_const/ei_inf_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2611) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2612) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2613) void ei_infin( EMUSHORT *ei, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2614) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2615) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2616)  Description        : ei_infin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2617)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2618) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2619)  Concepts           : формирует `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2621)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2622)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2623)                          S 1...1 1  00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2624) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2625)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2626) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2627)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2628)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2629) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2630)  Parameters         : EMUSHORT *ei;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2631)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2632)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2633)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  2634)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2635)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2636)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2637)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2638) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2639)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  2640) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2641)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2642) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2643)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2644)   size_t np = internal_np( nb ) * SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2645) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2646)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2648)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2649)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2650)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2651)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2652)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2653)       (void)memcpy( (void *)ei, (void *)&_ei_inf_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2654)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2655)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2656)       (void)memcpy( (void *)ei, (void *)&_ei_inf_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2657)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2658)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2659)       (void)memcpy( (void *)ei, (void *)&_ei_inf_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2660)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2661)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2662)       (void)memcpy( (void *)ei, (void *)&_ei_inf_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2663)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2664)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2665)       (void)memcpy( (void *)ei, (void *)&_ei_inf_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2666)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2667)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2668)       (void)memcpy( (void *)ei, (void *)&_ei_inf_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2669)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2670)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2671)       (void)memcpy( (void *)ei, (void *)&_ei_inf_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2672)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2673)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2674)       (void)memcpy( (void *)ei, (void *)&_ei_inf_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2675)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2676)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2677)       (void)memcpy( (void *)ei, (void *)&_ei_inf_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2678)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2679)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2680)       (void)memcpy( (void *)ei, (void *)&_ei_inf_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2681)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2682)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2683)       (void)memcpy( (void *)ei, (void *)&_ei_inf_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2684)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2685) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2686)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2687)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2688)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2689)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2690)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2691)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2692)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2693)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2694) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2695) } /* End of ei_infin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2696) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2697) int ei_isinfin( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2698) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2699) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2700)  Description        : ei_ininfin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2701)                                    internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2702) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2703)  Concepts           : проверка на `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2704) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2705)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2706)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2707)                          S 1...1 1  00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2709)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2711)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2712)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2713)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  2714) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2715)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2716)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2717)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2718)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2719)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2720)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2721) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2722)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2723)                       if( `бесконечность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2724)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2725) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2726)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2727) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2728)   int ie, ne, is, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2729)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2730) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2731)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2732)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2733) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2734)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2735)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2736)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  2737)       Compare 'Exp' and 'Significand'; skip Sign, lgw and hgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2738)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2739) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  2740)   ie = 1; is = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2741) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2742)   ie = ns + 2; is = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2743) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2744) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2745)   ne *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2746)   ns *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2747) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2748)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2749)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2750)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2751)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2752)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2753)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_128_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2754)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_128_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2755)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2756)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2757)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2758)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_256_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2759)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_256_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2760)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2761)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2762)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2763)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_512_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2764)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_512_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2765)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2766)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2767)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2768)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_1024_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2769)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_1024_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2770)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2771)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2772)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2773)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_2048_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2774)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_2048_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2775)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2776)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2777)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2778)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_4096_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2779)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_4096_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2780)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2781)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2782)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2783)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_8192_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2784)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_8192_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2785)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2786)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2787)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2788)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_16384_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2789)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_16384_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2790)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2791)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2792)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2793)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_32768_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2794)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_32768_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2795)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2796)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2797)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2798)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_65536_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2799)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_65536_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2800)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2801)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2802)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2803)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_inf_131072_[0][ie], (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  2804)           !memcmp( (void *)&ei[is], (void *)&_ei_inf_131072_[0][is], (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2805)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2806)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2807) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2808)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2809)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2810)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2811)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2812)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2813)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2814)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2815)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2817)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2818) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2819) } /* End of ei_isinfin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2821) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2822) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  2823) #include <r_const/e_inf_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2824) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  2825) #include <r_const/e_inf_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  2826) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  2827) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2828) void e_infin( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2829) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2830) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2831)  Description        : e_infin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2832)                                 external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2833) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2834)  Concepts           : формирует `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2835) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2836)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2837)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2838)                          S 1...1 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2839) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2840)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2841) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2842)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2843) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2844)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2845)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2846)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2847)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  2848)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2849)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2850)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2851)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2852) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2853)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2854) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2855)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2856) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2857)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2858)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2859) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2860)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2861) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2862)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2863)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2864)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2865)       (void)memcpy( (void *)ee, (void *)&_e_inf_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2866)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2867)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2868)       (void)memcpy( (void *)ee, (void *)&_e_inf_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2869)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2870)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2871)       (void)memcpy( (void *)ee, (void *)&_e_inf_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2872)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2873)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2874)       (void)memcpy( (void *)ee, (void *)&_e_inf_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2875)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2876)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2877)       (void)memcpy( (void *)ee, (void *)&_e_inf_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2878)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2879)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2880)       (void)memcpy( (void *)ee, (void *)&_e_inf_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2881)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2882)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2883)       (void)memcpy( (void *)ee, (void *)&_e_inf_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2884)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2885)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2886)       (void)memcpy( (void *)ee, (void *)&_e_inf_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2887)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2888)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2889)       (void)memcpy( (void *)ee, (void *)&_e_inf_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2890)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2891)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2892)       (void)memcpy( (void *)ee, (void *)&_e_inf_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2893)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2894)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2895)       (void)memcpy( (void *)ee, (void *)&_e_inf_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2896)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2897)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2898)       (void)memcpy( (void *)ee, (void *)&_e_inf_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2899)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2900)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2901)       (void)memcpy( (void *)ee, (void *)&_e_inf_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2902)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2903) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2904)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2905)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2906)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2907)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2908)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2909)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2910)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2911)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2912) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2913) } /* End of e_infin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2914) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2915) static int e_isinfin_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2916) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2917) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2918)  Description        : e_isinfin_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2919)                                      external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2920)                                      struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2921) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2922)  Concepts           : проверка на `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2923) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2924)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2925)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2926)                          S 1...1 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2927) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2928)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2929) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2930)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2931) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2932)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2933)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2934)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2935)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2936)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2937)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2938) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2939)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2940)                       if( `бесконечность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2941)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2942) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2943)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2944) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2945)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2946)   int             rc = 0;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2947) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2948)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2949) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2950)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2951)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2952)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2953)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2954)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2955)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2956)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  2957) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2958)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2959)   if( (*e & 0x7fffffff) == 0x7f800000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2960)     rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2961) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2962)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  2963) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2964) } /* End of e_isinfin_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2965) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2966) static int e_isinfin_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  2967) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  2968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2969)  Description        : e_isinfin_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  2970)                                      external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  2971)                                      struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2972) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2973)  Concepts           : проверка на `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  2974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2975)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  2976)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  2977)                          S 1...1 00.......0,
868b2b66 (kx 2024-12-20 16:11:07 +0300  2978) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2979)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  2980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2981)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  2982) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2983)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  2984)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2985)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2986)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  2987)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  2988)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  2989) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2990)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2991)                       if( `бесконечность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2992)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  2993) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2994)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  2995) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  2996)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  2997)   int             rc = 1;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  2998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  2999)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3001)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3002)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3003)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3004)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3005)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3006)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3007)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3008) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3009) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3010)   e++; /* high part of real32 data struct     */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3011) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3012) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3013)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3014)   if( (*e & 0x7fffffff) == 0x7ff00000 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3015)   else                                  rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3017) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  3018)   e++; /* low part of real32 data struct      */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3019) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3020)   e--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3021) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3022) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3023)   if( *e == 0x00000000 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3024)   else                   rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3025) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3026)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3027) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3028) } /* End of e_isinfin_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3029) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3030) static int e_isinfin_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3031) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3032) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3033)  Description        : e_ininfin_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3034)                                      external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  3035)                                      struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3037)  Concepts           : проверка на `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3038) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3039)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3040)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3041)                          S 1...1 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3042) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3043)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3044) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3045)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3046)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3047) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3048)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3049)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3050)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3051)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3052)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3053)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3054) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3055)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3056)                       if( `бесконечность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3057)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3058) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3059)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3060) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3061)   int ie, is, np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3062)   int rc = 1; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3063) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3064)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3066)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3067)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3068)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  3069)       Compare 'Exp' and 'Significand'; skip Sign.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3070)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3071) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  3072)   ie = 1; is = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3073) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3074)   ie = 0; is = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3075) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3076) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3077)   --np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3078) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3079)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3080)   if( (ee[is] & HIGHT_EXP) == HIGHT_EXP ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3081)   else                                    rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3082) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3083)   np *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3084) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3085)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3086)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3087)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3088)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_128_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3089)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3090)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3091)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3092)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_256_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3093)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3094)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3095)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3096)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_512_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3097)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3098)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3099)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3100)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_1024_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3101)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3102)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3103)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3104)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_2048_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3105)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3106)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3107)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3108)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_4096_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3109)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3110)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3111)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3112)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_8192_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3113)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3114)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3115)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3116)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_16384_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3117)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3118)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3119)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3120)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_32768_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3121)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3122)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3123)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3124)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_65536_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3125)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3126)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3127)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3128)       if( !memcmp( (void *)&ee[ie], (void *)&_e_inf_131072_[0][ie], (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3129)       else                                                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3130)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3131) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3132)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3133)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3134)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3135)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3136)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3137)       return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3138)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3139)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3140)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3141) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3142)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3143) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3144) } /* End of e_isinfin_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3145) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3146) int e_isinfin( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3147) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3148) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3149)  Description        : e_isinfin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3150)                                   external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3151) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3152)  Concepts           : проверка на `бесконечность' (+/- 1.INF)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3154)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3155)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3156)                          S 1...1 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3157) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3158)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3159) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3160)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3161)                       e_isinfin_32();             | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3162)                       e_isinfin_64();             | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3163)                       e_isinfin_np();             | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3165)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3166)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3167)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3168)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3169)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3170)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3172)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3173)                       if( `бесконечность' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3174)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3175) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3176)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3177) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3178)   int  rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3179) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3180)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3181)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3182)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3183)       rc = e_isinfin_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3184)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3185)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3186)       rc = e_isinfin_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3187)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3188)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3189)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3190)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3191)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3192)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3193)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3194)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3195)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3196)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3197)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3198)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3199)       rc = e_isinfin_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3200)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3201) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3202)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3203)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3204)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3205)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3206)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3207)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3208)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3209)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3210)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3211) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3212)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3213) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3214) } /* End of e_isinfin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3216) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3217) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3218) #include <r_const/e_realmin_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3219) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3220) #include <r_const/e_realmin_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3221) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3222) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3223) void e_realmin( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3224) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3225) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3226)  Description        : e_realmin() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3227)                                   external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3229)  Concepts           : формирует `минимальное число'
868b2b66 (kx 2024-12-20 16:11:07 +0300  3230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3231)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3232)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3233)                          S 0..01 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3234) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3235)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3237)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3239)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3240)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3241)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3242)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  3243)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3244)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3245)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3246)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3247) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3248)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3249) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3250)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3251) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3252)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3253)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3254) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3255)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3257)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3258)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3259)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3260)       (void)memcpy( (void *)ee, (void *)&_e_realmin_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3261)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3262)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3263)       (void)memcpy( (void *)ee, (void *)&_e_realmin_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3264)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3265)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3266)       (void)memcpy( (void *)ee, (void *)&_e_realmin_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3267)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3268)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3269)       (void)memcpy( (void *)ee, (void *)&_e_realmin_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3270)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3271)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3272)       (void)memcpy( (void *)ee, (void *)&_e_realmin_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3273)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3274)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3275)       (void)memcpy( (void *)ee, (void *)&_e_realmin_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3276)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3277)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3278)       (void)memcpy( (void *)ee, (void *)&_e_realmin_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3279)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3280)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3281)       (void)memcpy( (void *)ee, (void *)&_e_realmin_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3282)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3283)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3284)       (void)memcpy( (void *)ee, (void *)&_e_realmin_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3285)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3286)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3287)       (void)memcpy( (void *)ee, (void *)&_e_realmin_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3288)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3289)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3290)       (void)memcpy( (void *)ee, (void *)&_e_realmin_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3291)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3292)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3293)       (void)memcpy( (void *)ee, (void *)&_e_realmin_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3294)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3295)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3296)       (void)memcpy( (void *)ee, (void *)&_e_realmin_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3297)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3298) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3299)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3300)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3301)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3302)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3303)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3304)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3305)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3306)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3307) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3308) } /* End of e_realmin() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3311) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3312) #include <r_const/e_realmax_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3313) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3314) #include <r_const/e_realmax_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3315) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3316) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3317) void e_realmax( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3318) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3319) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3320)  Description        : e_realmax() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3321)                                   external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3322) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3323)  Concepts           : формирует `максимальное число' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3324) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3325)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3326)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3327)                          S 1..10 11.......11,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3328) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3329)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3331)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3332) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3333)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3334)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3335)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3336)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  3337)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3338)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3339)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3340)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3342)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3343) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3344)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3345) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3346)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3347)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3348) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3349)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3350) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3351)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3352)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3353)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3354)       (void)memcpy( (void *)ee, (void *)&_e_realmax_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3355)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3356)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3357)       (void)memcpy( (void *)ee, (void *)&_e_realmax_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3358)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3359)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3360)       (void)memcpy( (void *)ee, (void *)&_e_realmax_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3361)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3362)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3363)       (void)memcpy( (void *)ee, (void *)&_e_realmax_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3364)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3365)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3366)       (void)memcpy( (void *)ee, (void *)&_e_realmax_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3367)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3368)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3369)       (void)memcpy( (void *)ee, (void *)&_e_realmax_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3370)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3371)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3372)       (void)memcpy( (void *)ee, (void *)&_e_realmax_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3373)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3374)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3375)       (void)memcpy( (void *)ee, (void *)&_e_realmax_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3376)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3377)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3378)       (void)memcpy( (void *)ee, (void *)&_e_realmax_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3379)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3380)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3381)       (void)memcpy( (void *)ee, (void *)&_e_realmax_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3382)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3383)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3384)       (void)memcpy( (void *)ee, (void *)&_e_realmax_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3385)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3386)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3387)       (void)memcpy( (void *)ee, (void *)&_e_realmax_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3388)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3389)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3390)       (void)memcpy( (void *)ee, (void *)&_e_realmax_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3391)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3393)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3394)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3395)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3396)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3397)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3398)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3399)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3400)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3401) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3402) } /* End of e_realmax() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3403) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3404) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3405) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3406) #include <r_const/ei_null_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3407) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3408) #include <r_const/ei_null_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3409) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3410) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3411) void ei_signull( EMUSHORT *ei, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3412) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3413) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3414)  Description        : ei_signull() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3415)                                    internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3416) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3417)  Concepts           : формирует `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3419)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3420)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3421)                          S 0..00 0  00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3422) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3423)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3424) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3425)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3426)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3427) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3428)  Parameters         : EMUSHORT *ei;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3429)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3430)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3431)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  3432)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3433)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3434)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3435)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3436) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3437)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  3438) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3439)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3440) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3441)   int  sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3442)   int  np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3443) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3444)   (void)memset( (void *)ei, 0, np * SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3446) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3447)   sn = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3448) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3449) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3450)   if( sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3451)     ei[sn] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3453) } /* End of ei_signull() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3454) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3455) int ei_issignull( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3456) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3457) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3458)  Description        : ei_issignull() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3459)                                      internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3460) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3461)  Concepts           : проверка на `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3462) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3463)                       Sign  Exp  1. Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3464)                       ==== ===== == ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3465)                          S 0..00 0  00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3467)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3468) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3469)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3470)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3471)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3472) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3473)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3474)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3475)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3476)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3477)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3478)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3479) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3480)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3481)                       if( `знаковый ноль' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3482)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3484)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3485) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3486)   int ie, ne, is, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3487)   int rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3488) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3489)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3490)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3492)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3493)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3494)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  3495)       Compare 'Exp' and 'Significand'; skip Sign, lgw and hgw.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3496)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3497) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  3498)   ie = 1; is = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3499) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3500)   ie = ns + 2; is = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3501) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3502) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3503)   ne *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3504)   ns *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3505) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3506)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3507)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3508)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3509)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3510)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3511)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_128_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3512)           !memcmp( (void *)&ei[is], (void *)&_ei_null_128_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3513)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3514)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3515)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3516)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_256_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3517)           !memcmp( (void *)&ei[is], (void *)&_ei_null_256_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3518)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3519)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3520)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3521)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_512_[0][ie],    (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3522)           !memcmp( (void *)&ei[is], (void *)&_ei_null_512_[0][is],    (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3523)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3524)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3525)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3526)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_1024_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3527)           !memcmp( (void *)&ei[is], (void *)&_ei_null_1024_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3528)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3529)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3530)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3531)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_2048_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3532)           !memcmp( (void *)&ei[is], (void *)&_ei_null_2048_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3533)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3534)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3535)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3536)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_4096_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3537)           !memcmp( (void *)&ei[is], (void *)&_ei_null_4096_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3538)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3539)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3540)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3541)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_8192_[0][ie],   (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3542)           !memcmp( (void *)&ei[is], (void *)&_ei_null_8192_[0][is],   (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3543)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3544)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3545)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3546)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_16384_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3547)           !memcmp( (void *)&ei[is], (void *)&_ei_null_16384_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3548)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3549)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3550)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3551)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_32768_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3552)           !memcmp( (void *)&ei[is], (void *)&_ei_null_32768_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3553)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3554)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3555)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3556)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_65536_[0][ie],  (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3557)           !memcmp( (void *)&ei[is], (void *)&_ei_null_65536_[0][is],  (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3558)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3559)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3560)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3561)       if( !memcmp( (void *)&ei[ie], (void *)&_ei_null_131072_[0][ie], (size_t)ne ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  3562)           !memcmp( (void *)&ei[is], (void *)&_ei_null_131072_[0][is], (size_t)ns )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3563)         ) rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3564)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3566)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3567)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3568)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3569)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3570)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3571)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3572)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3573)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3575)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3576) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3577) } /* End of ei_issignull() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3578) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3580) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3581) #include <r_const/e_null_emu32lsb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3582) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3583) #include <r_const/e_null_emu32msb.dfn>
868b2b66 (kx 2024-12-20 16:11:07 +0300  3584) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3585) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3586) void e_signull( EMUSHORT *ee, unsigned sign, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3587) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3588) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3589)  Description        : e_signull() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3590)                                   external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  3591)                                   struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3593)  Concepts           : формирует `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3594) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3595)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3596)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3597)                          S 0..00 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3598) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3599)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3600) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3601)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3602) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3603)  Parameters         : EMUSHORT *ee;      - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3604)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3605)                                            data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3606)                       unsigned int sign; - знак формируемого
868b2b66 (kx 2024-12-20 16:11:07 +0300  3607)                                            числа;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3608)                       int nb;            - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3609)                                            external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3610)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3611) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3612)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  3613) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3614)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3615) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3616)   int    sn = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3617)   size_t np = nb / BITS_PER_BYTE_T; /* in Bytes */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3618) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3619)   if( sign ) sn = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3621)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3622)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3623)     case NBR_32:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3624)       (void)memcpy( (void *)ee, (void *)&_e_null_32_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3625)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3626)     case NBR_64:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3627)       (void)memcpy( (void *)ee, (void *)&_e_null_64_[sn][0],     np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3628)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3629)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3630)       (void)memcpy( (void *)ee, (void *)&_e_null_128_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3631)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3632)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3633)       (void)memcpy( (void *)ee, (void *)&_e_null_256_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3634)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3635)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3636)       (void)memcpy( (void *)ee, (void *)&_e_null_512_[sn][0],    np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3637)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3638)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3639)       (void)memcpy( (void *)ee, (void *)&_e_null_1024_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3640)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3641)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3642)       (void)memcpy( (void *)ee, (void *)&_e_null_2048_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3643)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3644)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3645)       (void)memcpy( (void *)ee, (void *)&_e_null_4096_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3646)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3647)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3648)       (void)memcpy( (void *)ee, (void *)&_e_null_8192_[sn][0],   np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3649)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3650)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3651)       (void)memcpy( (void *)ee, (void *)&_e_null_16384_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3652)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3653)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3654)       (void)memcpy( (void *)ee, (void *)&_e_null_32768_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3655)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3656)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3657)       (void)memcpy( (void *)ee, (void *)&_e_null_65536_[sn][0],  np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3658)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3659)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3660)       (void)memcpy( (void *)ee, (void *)&_e_null_131072_[sn][0], np );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3661)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3663)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3664)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3665)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3666)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3667)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3668)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3669)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3670)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3671) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3672) } /* End of e_signull() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3673) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3674) static int e_issignull_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3675) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3676) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3677)  Description        : e_issignull_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3678)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  3679)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3680) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3681)  Concepts           : проверка на `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3682) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3683)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3684)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3685)                          S 0..00 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3686) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3687)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3688) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3689)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3690) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3691)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3692)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3693)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3694)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3695)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3696)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3697) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3698)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3699)                       if( `знаковый ноль' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3700)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3701) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3702)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3703) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3704)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3705)   int             rc = 0;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3706) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3707)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3709)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3710)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3711)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3712)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3713)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3714)     return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3715)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3716) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3717)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3718)   if( (*e & 0x7fffffff) == (__mpu_uint32_t)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3719)     rc = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3720) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3721)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3722) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3723) } /* End of e_issignull_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3724) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3725) static int e_issignull_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3726) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3727) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3728)  Description        : e_issignull_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3729)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  3730)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3731) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3732)  Concepts           : проверка на `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3733) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3734)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3735)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3736)                          S 0..00 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3737) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3738)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3739) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3740)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3741) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3742)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3743)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3744)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3745)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3746)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3747)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3748) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3749)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3750)                       if( `знаковый ноль' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3751)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3752) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3753)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3754) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3755)   __mpu_uint32_t *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3756)   int             rc = 1;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3757) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3758)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3759) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3760)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3761)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3762)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3763)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3764)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3765)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3766)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3767) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3768) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  3769)   e++; /* high part of real32 data struct     */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3770) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3771) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3772)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3773)   if( (*e & 0x7fffffff) == (__mpu_uint32_t)0 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3774)   else                                         rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3775) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3776) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  3777)   e++; /* low part of real32 data struct      */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3778) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3779)   e--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3780) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3781) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3782)   if( *e == (__mpu_uint32_t)0 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3783)   else                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3784) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3785)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3786) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3787) } /* End of e_issignull_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3788) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3789) static int e_issignull_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3790) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3791) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3792)  Description        : e_issignull_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3793)                                       external e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  3794)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3795) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3796)  Concepts           : проверка на `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3797) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3798)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3799)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3800)                          S 0..00 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3801) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3802)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3803) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3804)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3805)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3807)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3808)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3809)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3810)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3811)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3812)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3814)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3815)                       if( `знаковый ноль' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3816)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3817) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3818)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3819) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3820)   int ie, is, np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3821)   int rc = 1; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3822) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3823)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3824) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3825)   /*************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3826)     NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3827)     ====
868b2b66 (kx 2024-12-20 16:11:07 +0300  3828)       Compare 'Exp' and 'Significand'; skip Sign.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3829)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3830) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  3831)   ie = 1; is = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3832) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  3833)   ie = 0; is = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3834) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  3835) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3836)   --np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3837) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3838)   /* skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3839)   if( (ee[is] & HIGHT_EXP) == (EMUSHORT)0 ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3840)   else                                      rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3841) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3842)   np *= SIZE_OF_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3843) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3844)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3845)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3846)     case NBR_128:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3847)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_128_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3848)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3849)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3850)     case NBR_256:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3851)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_256_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3852)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3853)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3854)     case NBR_512:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3855)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_512_[0][ie],    (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3856)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3857)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3858)     case NBR_1024:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3859)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_1024_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3860)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3861)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3862)     case NBR_2048:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3863)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_2048_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3864)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3865)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3866)     case NBR_4096:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3867)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_4096_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3868)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3869)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3870)     case NBR_8192:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3871)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_8192_[0][ie],   (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3872)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3873)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3874)     case NBR_16384:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3875)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_16384_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3876)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3877)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3878)     case NBR_32768:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3879)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_32768_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3880)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3881)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3882)     case NBR_65536:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3883)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_65536_[0][ie],  (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3884)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3885)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3886)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3887)       if( !memcmp( (void *)&ee[ie], (void *)&_e_null_131072_[0][ie], (size_t)np ) ) rc &= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3888)       else                                                                          rc &= 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3889)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3890) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3891)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3892)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3893)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3894)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3895)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3896)       return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3897)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3898)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3899)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3900) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3901)   return rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3902) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3903) } /* End of e_issignull_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3904) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3905) int e_issignull( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3906) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3907) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3908)  Description        : e_issignull() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3909)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3910) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3911)  Concepts           : проверка на `знаковый ноль' (+/- 0.0)
868b2b66 (kx 2024-12-20 16:11:07 +0300  3912) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3913)                       Sign  Exp  Significand
868b2b66 (kx 2024-12-20 16:11:07 +0300  3914)                       ==== ===== ===========
868b2b66 (kx 2024-12-20 16:11:07 +0300  3915)                          S 0..00 00.......00,
868b2b66 (kx 2024-12-20 16:11:07 +0300  3916) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3917)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3918) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3919)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3920)                       e_issignull_32();           | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3921)                       e_issignull_64();           | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3922)                       e_issignull_np();           | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3923) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3924)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3925)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3926)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3927)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3928)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3929)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3930) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3931)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3932)                       if( `знаковый ноль' ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3933)                       else                  [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  3934) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3935)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3936) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3937)   int  rc = 0; /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3938) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3939)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3940)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3941)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3942)       rc = e_issignull_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3943)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3944)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3945)       rc = e_issignull_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3946)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3947)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3948)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3949)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3950)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3951)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3952)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3953)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3954)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3955)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3956)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3957)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3958)       rc = e_issignull_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3959)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3960) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3961)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3962)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3963)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3964)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3965)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3966)       return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3967)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3968)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  3969)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3970) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3971)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  3972) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3973) } /* End of e_issignull() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  3974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3975) void ei_neg( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  3976) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  3977) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3978)  Description        : ei_neg() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  3979)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3981)  Concepts           : Negate the e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3982) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3983)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  3984) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3985)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  3986)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  3987) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3988)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  3989)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3990)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  3991)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  3992)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  3993)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  3994) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3995)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  3996) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  3997)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  3998) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  3999)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4001)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4002) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4003) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4004)   ei = ei + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4005) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4006) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4007)   *ei ^= MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4008) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4009) } /* End of ei_neg() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4010) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4011) int ei_isneg( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4012) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4013) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4014)  Description        : ei_isneg() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4015)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4017)  Concepts           : Return 1 if Sign e-type real number is
868b2b66 (kx 2024-12-20 16:11:07 +0300  4018)                       nonzero, else return zero.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4019) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4020)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4021) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4022)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4023)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4024) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4025)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4026)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4027)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4028)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4029)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4030)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4031) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4032)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4034)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4035) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4036)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4037) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4038)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4039) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4040) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4041)   ei = ei + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4042) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4043) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4044)   if( *ei & MASK_ALL_BITS ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4045)   else                      return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4046) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4047) } /* End of ei_isneg() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4048) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4049) static void e_neg_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4050) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4051) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4052)  Description        : e_neg_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4053)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4054) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4055)  Concepts           : Negate the e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4057)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4058) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4059)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4060) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4061)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4062)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4063)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4064)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4065)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4066)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4067) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4068)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4069) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4070)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4071) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4072)   __mpu_uint16_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4073) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4074)   e = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4076)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4077)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4078)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4079)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4080)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4081)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4082)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4084) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4085)   e++;      /* high part of real32 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4086) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4088)   *e ^= 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4089) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4090) } /* End of e_neg_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4091) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4092) static void e_neg_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4093) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4094) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4095)  Description        : e_neg_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4096)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4097) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4098)  Concepts           : Negate the e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4099)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4100)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4101) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4102)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4104)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4105)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4106)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4107)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4108)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4109)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4110) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4111)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4112) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4113)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4114) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4115)   __mpu_uint32_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4116) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4117)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4118) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4119)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4120)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4121)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4122)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4123)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4124)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4125)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4126) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4127) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4128)   e++;      /* high part of real32 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4129) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4130) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4131)   *e ^= 0x80000000;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4133) } /* End of e_neg_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4135) static void e_neg_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4136) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4137) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4138)  Description        : e_neg_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4139)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4140) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4141)  Concepts           : Negate the e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4142) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4143)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4144) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4145)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4146)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4147) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4148)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4149)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4150)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4151)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4152)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4153)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4155)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4156) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4157)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4158) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4159)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4160) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4161)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4163) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4164)   ee = ee + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4165) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4166) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4167)   *ee ^= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4168) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4169) } /* End of e_neg_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4170) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4172) void e_neg( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4173) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4175)  Description        : e_neg() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4176)                               external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4178)  Concepts           : Negate the e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4179)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4180)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4181) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4182)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4183)                       e_neg_32();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4184)                       e_neg_64();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4185)                       e_neg_np();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4186) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4187)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4188)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4189)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4190)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4191)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4192)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4193) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4194)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4196)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4197) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4198)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4199)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4200)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4201)       e_neg_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4202)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4203)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4204)       e_neg_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4205)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4206)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4207)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4208)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4209)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4210)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4211)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4212)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4213)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4214)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4215)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4216)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4217)       e_neg_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4218)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4220)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4221)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4222)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4223)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4224)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4225)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4226)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4227)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4229)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4231) } /* End of e_neg() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4232) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4233) static int e_isneg_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4234) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4235) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4236)  Description        : e_isneg_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4237)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4239)  Concepts           : Return 1 if Sign e-type real number is
868b2b66 (kx 2024-12-20 16:11:07 +0300  4240)                       nonzero, else return zero.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4241)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4242)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4243) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4244)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4245) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4246)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4247)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4248)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4249)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4250)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4251)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4252) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4253)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4254)                       if( Sign == 1 ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4255)                       else            [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4257)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4258) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4259)   __mpu_uint16_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4260) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4261)   e = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4263)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4264)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4265)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4266)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4267)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4268)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4269)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4270) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4271) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4272)   e++; /* high part of real32 data struct  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4273) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4274) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4275)   if( *e & 0x8000 ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4276)   else              return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4277) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4278) } /* End of e_isneg_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4279) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4280) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4281) static int e_isneg_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4282) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4284)  Description        : e_isneg_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4285)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4287)  Concepts           : Return 1 if Sign e-type real number is
868b2b66 (kx 2024-12-20 16:11:07 +0300  4288)                       nonzero, else return zero.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4289)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4290)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4291) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4292)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4294)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4295)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4296)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4297)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4298)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4299)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4300) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4301)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4302)                       if( Sign == 1 ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4303)                       else            [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4304) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4305)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4306) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4307)   __mpu_uint32_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4309)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4311)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4312)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4313)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4314)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4315)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4316)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4317)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4319) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4320)   e++; /* high part of real64 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4321) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4322) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4323)   if( *e & 0x80000000 ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4324)   else                  return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4325) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4326) } /* End of e_isneg_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4328) static int e_isneg_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4329) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4331)  Description        : e_isneg_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4332)                                    external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4334)  Concepts           : Return 1 if Sign e-type real number is
868b2b66 (kx 2024-12-20 16:11:07 +0300  4335)                       nonzero, else return zero.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4336) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4337)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4339)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4340)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4342)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4343)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4344)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4345)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4346)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4347)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4348) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4349)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4350) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4351)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4352) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4353)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4354) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4355)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4357) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4358)   ee = ee + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4359) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4361)   if( *ee & MASK_SIGN ) return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4362)   else                  return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4363) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4364) } /* End of e_isneg_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4365) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4366) int e_isneg( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4367) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4369)  Description        : e_isneg() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4370)                                 external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4371) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4372)  Concepts           : Return 1 if Sign e-type real number is
868b2b66 (kx 2024-12-20 16:11:07 +0300  4373)                       nonzero, else return zero.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4374)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4375)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4376) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4377)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4378)                       e_isneg_32();               | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4379)                       e_isneg_64();               | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4380)                       e_isneg_np();               | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4381) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4382)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4383)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4384)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4385)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4386)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4387)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4388) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4389)  Return             : int rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4390)                       if( Sign == 1 ) [rc = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4391)                       else            [rc = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4393)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4394) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4395)   int  rc = 0;   /* Return Code */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4396) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4397)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4398)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4399)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4400)       rc = e_isneg_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4401)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4402)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4403)       rc = e_isneg_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4404)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4405)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4406)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4407)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4408)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4409)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4410)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4411)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4412)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4413)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4414)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4415)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4416)       rc = e_isneg_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4417)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4419)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4420)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4421)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4422)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4423)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4424)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4425)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4426)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4427) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4428)   return( rc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4429) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4430) } /* End of e_isneg() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4432) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4433) void ei_abs( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4434) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4435) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4436)  Description        : ei_abs() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4437)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4438) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4439)  Concepts           : сбрасывает знак числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4440) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4441)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4442) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4443)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4444)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4446)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4447)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4448)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4449)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4450)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4451)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4453)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4454) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4455)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4456) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4457)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4458) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4459)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4460) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4461) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4462)   ei = ei + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4463) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4464) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4465)   *ei &= (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4467) } /* End of ei_abs() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4468) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4470) static void e_abs_32( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4471) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4472) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4473)  Description        : e_abs_32() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4474)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4476)  Concepts           : сбрасывает знак числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4477) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4478)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4479) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4480)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4481) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4482)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4483)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4484)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4485)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4486)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4487)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4488) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4489)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4490) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4491)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4492) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4493)   __mpu_uint16_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4494) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4495)   e = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4497)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4498)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4499)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4500)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4501)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4502)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4503)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4504) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4505) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4506)   e++;      /* high part of real32 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4507) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4508) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4509)   *e &= 0x7fff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4510) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4511) } /* End of e_abs_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4512) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4513) static void e_abs_64( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4514) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4515) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4516)  Description        : e_abs_64() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4517)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4518) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4519)  Concepts           : сбрасывает знак числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4520)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  4521)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4522) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4523)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4524) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4525)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4526)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4527)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4528)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4529)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4530)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4531) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4532)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4533) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4534)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4535) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4536)   __mpu_uint32_t  *e;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4538)   e = (__mpu_uint32_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4539) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4540)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4541)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4542)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4543)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4544)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4545)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4546)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4547) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4548) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4549)   e++;      /* high part of real64 data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4550) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4551) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4552)   *e &= 0x7fffffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4553) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4554) } /* End of e_abs_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4555) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4556) static void e_abs_np( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4557) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4559)  Description        : e_abs_np() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4560)                                  external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4561) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4562)  Concepts           : сбрасывает знак числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4563) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4564)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4566)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4567)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4568) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4569)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4570)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4571)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4572)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4573)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4574)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4575) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4576)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  4577) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4578)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4579) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4580)   int  np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4581) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4582)   np = internal_np( nb ) - 3; /* Sign, hgw, lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4583) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4584) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4585)   ee = ee + np - 1; /* go to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4586) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4587) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4588)   *ee &= HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4589) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4590) } /* End of e_abs_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4591) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4592) void e_abs( EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4593) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4594) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4595)  Description        : e_abs() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  4596)                               external e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4597) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4598)  Concepts           : сбрасывает знак числа.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4599) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4600)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4601) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4602)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4603)                       e_abs_32();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4604)                       e_abs_64();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4605)                       e_abs_np();                 | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  4606) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4607)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  4608)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4609)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4610)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  4611)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  4612)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4613) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4614)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  4615) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4616)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4617) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4618)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4619)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4620)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4621)       e_abs_32( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4622)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4623)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4624)       e_abs_64( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4625)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4626)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4627)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4628)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4629)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4630)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4631)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4632)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4633)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4634)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4635)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  4636)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4637)       e_abs_np( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4638)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4639) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4640)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  4641)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4642)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4643)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4644)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4645)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4646)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4647)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4648) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4649)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4650) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4651) } /* End of e_abs() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4652) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4653) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4654) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4655) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4656)   Functions for LONG INTEGER NUMBERS.
868b2b66 (kx 2024-12-20 16:11:07 +0300  4657)         (for Exponent in Internal e-type data struct.)
868b2b66 (kx 2024-12-20 16:11:07 +0300  4658)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4659) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4660) int ei_cmpe( EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4661) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4662)   SIGNED COMPARE TWO SIGNED INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  4663)   if( a  > b ) return(  1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4664)   if( a == b ) return(  0);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4665)   if( a  < b ) return( -1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4666)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4667) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4668)   EMUSHORT  p, q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4669)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4670) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4671) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4672)   a += np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4673)   b += np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4674) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4675) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4676)   p = *a & MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4677)   q = *b & MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4678) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4679)   /* the signs are different */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4680)   if( p != q )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4681)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4682)     if( p == (EMUSHORT)0 ) return(  1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4683)     else                   return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4684)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4685) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4686)   /* both are the same sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4687)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4688)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4689) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4690)     if( *a++ != *b++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4691) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4692)     if( *a-- != *b-- )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4693) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4694)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4695)       /* different */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4696) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4697)       if( *(--a) > *(--b) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4698) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4699)       if( *(++a) > *(++b) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4700) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4701)         return(  1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4702)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4703)         return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4704) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4705)     } /* End if( != ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4706) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4707)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4709)   return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4711) } /* End of ei_cmpe() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4712) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4713) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4714) int ei_cmp0e( EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4715) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4716)   SIGNED COMPARE A with ZERO
868b2b66 (kx 2024-12-20 16:11:07 +0300  4717)   if( a  > 0 ) return(  1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4718)   if( a == 0 ) return(  0);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4719)   if( a  < 0 ) return( -1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  4720)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4721) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4722)   int  i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4723) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4724) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  4725)   a += np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4726) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4727) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4728)   /* the sign are negative */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4729)   if( *a & MASK_SIGN ) return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4730)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4731)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4732)     /* the sign are positive */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4733)     for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4734)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4735) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4736)       if( *a++ != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4737) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4738)       if( *a-- != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4739) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4740)         return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4741) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4742)     } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4743) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4744)   } /* End if( sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4745) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4746)   return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4747) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4748) } /* End of ei_cmp0e() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4749) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4750) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4751) void ei_cpye_pack( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4752) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4753)   КОПИРОВАНИЕ БОЛЬШЕГО В МЕНЬШЕЕ (npa < npb)
868b2b66 (kx 2024-12-20 16:11:07 +0300  4754)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4755) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4756)   int  i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4757) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4758) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4759)   a += npa - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4760)   b += npb - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4761) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4762) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4763)   for( i = 0; i < npa; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4764)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4765) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4766)     *a-- = *b--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4767) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4768)     *a++ = *b++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4769) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4770)   } /* End for( i = 0; i < npa; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4771) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4772) } /* End of ei_cpye_pack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4773) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4774) void ei_cpye_unpack( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4775) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4776)   КОПИРОВАНИЕ МЕНЬШЕГО В БОЛЬШЕЕ (npa >= npb)
868b2b66 (kx 2024-12-20 16:11:07 +0300  4777)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4778) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4779)   int  i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4780) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4781) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4782)   a += npa - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4783)   b += npb - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4784) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4785) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4786)   for( i = 0; i < npb; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4787)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4788) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4789)     *a-- = *b--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4790) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4791)     *a++ = *b++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4792) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4793)   } /* End for( i = 0; i < npb; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4794) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4795)   while( i < npa )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4796)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4797) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4798)     *a-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4799) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4800)     *a++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4801) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4802)     i++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4803)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4805) } /* End of ei_cpye_unpack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4807) void ei_cpye( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4808) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4809)   COPY UNSIGNED INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  4810)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4811) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4812)   if( npa >= npb ) ei_cpye_unpack( a, b, npa, npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4813)   else             ei_cpye_pack  ( a, b, npa, npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4814) }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4815) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4817) void ei_cvte_unpack( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4818) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4819)   КОНВЕРТИРОВАНИЕ МЕНЬШЕГО В БОЛЬШЕЕ (npa >= npb)
868b2b66 (kx 2024-12-20 16:11:07 +0300  4820)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4821) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4822)   EMUSHORT  save_sign = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4823)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4824) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4825) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4826)   a += npa - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4827)   b += npb - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4828) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4829) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4830)   for( i = 0; i < npb; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4831)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4832) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4833)     *a-- = *b--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4834) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4835)     *a++ = *b++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4836) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4837)   } /* End for( i = 0; i < npb; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4838) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4839) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4840) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4841)   b++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4842) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4843)   b--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4844) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4845) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4846)   if( *b & MASK_SIGN ) save_sign = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4847) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4848)   while( i < npa )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4849)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4850) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4851)     *a-- = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4852) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4853)     *a++ = save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4854) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4855)     i++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4856)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4857) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4858) } /* End of ei_cvte_unpack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4859) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4860) void ei_cvte_pack( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4861) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4862)   КОНВЕРТИРОВАНИЕ БОЛЬШЕГО В МЕНЬШЕЕ (npa  < npb)
868b2b66 (kx 2024-12-20 16:11:07 +0300  4863)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4864) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4865)   EMUSHORT  save_sign = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4866)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4867) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4868) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4869)   if( *b             & MASK_SIGN ) save_sign = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4870) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4871)   if( *(b + npb - 1) & MASK_SIGN ) save_sign = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4872) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4873) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4874) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4875) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4876)   a += npa - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4877)   b += npb - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4878) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4879) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4880)   for( i = 0; i < npa; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4881)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4882) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4883)     *a-- = *b--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4884) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4885)     *a++ = *b++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4886) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4887)   } /* End for( i = 0; i < npa; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4888) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4889)   if( save_sign )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4890)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4891) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4892)     *(++a) |= save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4893) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4894)     *(--a) |= save_sign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4895) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4896)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4897)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4898)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4899)     /* ПРИНУДИТЕЛЬНЫЙ POSITIVE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4900) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4901)     *(++a) &= HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4902) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4903)     *(--a) &= HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4904) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4905)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4907) } /* End of ei_cvte_pack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4908) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4909) void ei_cvte( EMUSHORT *a, EMUSHORT *b, int npa, int npb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4910) /*************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4911)   CONVERT SIGNED INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  4912)  *************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4913) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4914)   if( npa >= npb ) ei_cvte_unpack( a, b, npa, npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4915)   else             ei_cvte_pack  ( a, b, npa, npb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  4916) }
868b2b66 (kx 2024-12-20 16:11:07 +0300  4917) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4918) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4919) void ei_adde( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4920) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4921)   ADD INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  4922)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4923) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4924)   EMULONG   rc, carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4925)   EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4926)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4927) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4928) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4929)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4930)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4931)   y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4932)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4933) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4934)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4935)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4936)   y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4937)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4938) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4940)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4941)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4942)     rc = (EMULONG)(*x) + (EMULONG)(*y) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4943) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4944)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4945)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4946) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4947)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4948) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4949) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4950)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4951)     --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4952)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4953) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4954)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4955)     ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4956)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4957) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4958) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4959)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4960) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4961) } /* End of ei_adde() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4962) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4963) void ei_ince( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4964) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  4965)   INCrement INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  4966)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  4967) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4968)   EMULONG   rc, carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4969)   EMUSHORT *z, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4970)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4971) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4972) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4973)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4974)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4975)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4976) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4977)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  4978)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4979)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4980) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4981) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4982)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  4983)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  4984)     rc = (EMULONG)(*x) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4985) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4986)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4987)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4989)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4990) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4991) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  4992)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4993)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4994) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  4995)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4996)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  4997) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  4998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  4999)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5001) } /* End of ei_ince() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5002) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5003) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5004) void ei_sube( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5005) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5006)   SUB INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  5007)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5008) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5009)   EMULONG   rc, carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5010)   EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5011)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5012) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5013) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5014)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5015)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5016)   y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5017)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5018) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5019)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5020)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5021)   y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5022)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5023) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5024) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5025)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5026)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5027)     rc = (EMULONG)(*x) - (EMULONG)(*y) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5028) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5029)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5030)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5031) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5032)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5034) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5035)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5036)     --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5037)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5038) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5039)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5040)     ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5041)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5042) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5043) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5044)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5045) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5046) } /* End of ei_sube() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5047) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5048) void ei_dece( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5049) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5050)   DECrement INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  5051)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5052) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5053)   EMULONG   rc, carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5054)   EMUSHORT *z, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5055)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5057) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5058)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5059)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5060)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5061) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5062)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5063)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5064)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5065) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5066) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5067)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5068)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5069)     rc = (EMULONG)(*x) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5070) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5071)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5072)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5073) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5074)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5076) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5077)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5078)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5079) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5080)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5081)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5082) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5084)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5085) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5086) } /* End of ei_dece() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5088) void ei_nege( EMUSHORT *c, EMUSHORT *a, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5089) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5090)   NEGATE Signed INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  5091)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5092) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5093)   EMULONG   rc, carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5094)   EMUSHORT *z, *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5095)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5097) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5098)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5099)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5100)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5101) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5102)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5103)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5104)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5105) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5106) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5107)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5108)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5109)     rc = (EMULONG)(~(*x)) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5110) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5111)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5112)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5113) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5114)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5115) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5116) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5117)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5118)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5119) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5120)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5121)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5122) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5123) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5124)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5126) } /* End of ei_nege() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5127) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5128) void ei_ande( EMUSHORT *c, EMUSHORT *a, EMUSHORT *b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5129) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5130)   AND INTEGER NUMBER
868b2b66 (kx 2024-12-20 16:11:07 +0300  5131)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5132) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5133)   EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5134)   int       i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5136) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5137)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5138)   x = a + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5139)   y = b + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5140)   z = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5141) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5142)   /* point to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5143)   x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5144)   y = b;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5145)   z = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5146) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5147) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5148)   for( i = 0; i < np; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5149)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5150)     *z = (*x) & (*y);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5151) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5152) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5153)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5154)     --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5155)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5156) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5157)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5158)     ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5159)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5160) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5161) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5162)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5163) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5164) } /* End of ei_ande() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5165) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5166) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5167) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5168)   СДВИГИ
868b2b66 (kx 2024-12-20 16:11:07 +0300  5169)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5170) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5171) #define N_SC_PARTS(b) ((b)>>POW2)
868b2b66 (kx 2024-12-20 16:11:07 +0300  5172) #define N_SC_BITS(b)  ((b)&(BITS_PER_EMUSHORT-1))
868b2b66 (kx 2024-12-20 16:11:07 +0300  5173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5174) void ei_shrn( EMUSHORT *c, EMUSHORT *a, unsigned b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5175) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5176)   SHIFT RIGHT
868b2b66 (kx 2024-12-20 16:11:07 +0300  5177)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5178) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5179)   EMUSHORT *x, *y, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5180)   int       i, n_parts = 0, n_bits = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5181) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5182)   if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5183)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5184)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5185)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5186)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5187)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5188)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5190)   if( b > BITS_PER_EMUSHORT*np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5191)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5192)     for( i = 0; i < np; i++ ) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5193)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5194)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5196)   n_parts = N_SC_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5197)   n_bits  = N_SC_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5199)   if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5200)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5201)     for( i = 0; i < np; i++ ) c[i] = a[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5202)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5203)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5204) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5205)   if( n_parts == np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5206)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5207)     for( i = 0; i < np; i++ ) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5208)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5209)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5210) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5211)   if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5212)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5213)     x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5214)     y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5216)     i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5217)     while( i ) { *y = *x; x++; y++; i--; }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5218)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5220)   if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5221)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5222) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5223)     x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5224)     y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5225) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5226)     x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5227)     y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5228) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5229) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5230)     i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5231)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5232)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5233) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5234)       *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5235) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5236)       *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5237) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5239) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5240)       x--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5241)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5242) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5243)       x++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5244)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5245) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5246)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5247)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5248) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5249)     i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5250)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5251)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5252) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5253)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5254) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5255)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5256) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5257)       *y = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5258) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5259)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5260)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5261) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5262)   } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5263) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5264)   if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5265)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5266) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5267)     y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5268) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5269)     y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5270) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5271) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5272)     *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5273) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5274)     y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5275) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5276)     y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5277) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5278) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5279)     i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5280)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5281)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5282)       tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5283)       *y = *y >> n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5285)       tmp = tmp << (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5286) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5287) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5288)       *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5289) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5290)       *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5291) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5293) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5294)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5295) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5296)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5297) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5298)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5299)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5300) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5301)   } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5302) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5303) } /* End of ei_shrn() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5304) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5305) void ei_shln( EMUSHORT *c, EMUSHORT *a, unsigned b, int np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5306) /******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5307)   SHIFT LEFT
868b2b66 (kx 2024-12-20 16:11:07 +0300  5308)  ******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5309) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5310)   EMUSHORT *x, *y, tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5311)   int       i, n_parts = 0, n_bits = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5312) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5313)   if( np == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5314)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5315)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5316)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5317)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5318)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5319)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5320) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5321)   if( b > BITS_PER_EMUSHORT*np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5322)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5323)     for( i = 0; i < np; i++ ) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5324)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5325)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5326) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5327)   n_parts = N_SC_PARTS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5328)   n_bits  = N_SC_BITS(b);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5329) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5330)   if( b == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5331)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5332)     for( i = 0; i < np; i++ ) c[i] = a[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5333)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5334)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5335) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5336)   if( n_parts == np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5337)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5338)     for( i = 0; i < np; i++ ) c[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5339)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5340)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5342)   if( n_parts == 0 ) /* переписываем c <= a, т.к. n_bits уже != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5343)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5344)     x = a;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5345)     y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5347)     i = np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5348)     while( i ) { *y = *x; x++; y++; i--; }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5349)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5350) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5351)   if( n_parts )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5352)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5353) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5354)     x = a + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5355)     y = c + n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5356) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5357)     x = a + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5358)     y = c + np - 1 - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5359) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5361)     i = np - n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5362)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5363)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5364) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5365)       *(y - n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5366) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5367)       *(y + n_parts) = *x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5368) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5369) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5370) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5371)       x++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5372)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5373) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5374)       x--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5375)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5376) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5377)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5378)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5379) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5380)     i = n_parts;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5381)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5382)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5383) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5384)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5385) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5386)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5387) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5388)       *y = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5389) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5390)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5391)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5393)   } /* End if( n_parts ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5394) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5395)   if( n_bits )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5396)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5397) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5398)     y = c;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5399) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5400)     y = c + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5401) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5402) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5403)     *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5404) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5405)     y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5406) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5407)     y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5408) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5410)     i = np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5411)     while( i )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5412)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5413)       tmp = *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5414)       *y = *y << n_bits;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5415) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5416)       tmp = tmp >> (BITS_PER_EMUSHORT-n_bits);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5417) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5418) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5419)       *(y - 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5420) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5421)       *(y + 1) |= tmp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5422) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5424) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5425)       y++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5426) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5427)       y--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5428) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5429)       i--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5430)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5432)   } /* End if( n_bits ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5434) } /* End of ei_shln() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5435) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5436) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5437)   End of Functions for LONG INTEGER NUMBERS.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5438)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5440) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5441) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5442) void ei_shdown( EMUSHORT *ei, unsigned sc, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5443) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5444) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5445)  Description        : ei_shdown() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  5446)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5447) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5448)  Concepts           : shift right Significand of exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  5449)                       internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5450)                       Guard words are included in the shift.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5451) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5452)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5453) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5454)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  5455)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5456)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5457) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5458)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5459)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5460)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5461)                       int sc;       - количество
868b2b66 (kx 2024-12-20 16:11:07 +0300  5462)                                       сдвигаемых бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5463)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  5464)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5465)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5467)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  5468) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5469)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5470) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5471)   int  ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5472) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5473)   int  ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5474) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5475)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5476) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5477)   ei = ei + ne + 1; /* point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5478) #endif /* else         point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5479) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5480)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5481) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5482)   ei_shrn( ei, ei, sc, ns + 2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5484) } /* End of ei_shdown() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5485) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5486) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5487) void ei_shup( EMUSHORT *ei, unsigned sc, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5488) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5489) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5490)  Description        : ei_shup() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  5491)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5492) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5493)  Concepts           : shift left Significand of exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  5494)                       internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5495)                       Guard words are included in the shift.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5497)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5498) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5499)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  5500)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5501)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5502) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5503)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5504)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5505)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5506)                       int sc;       - количество
868b2b66 (kx 2024-12-20 16:11:07 +0300  5507)                                       сдвигаемых бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5508)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  5509)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5510)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5511) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5512)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  5513) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5514)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5515) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5516)   int  ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5517) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5518)   int  ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5519) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5520)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5521) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5522)   ei = ei + ne + 1; /* point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5523) #endif /* else         point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5524) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5525)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5526) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5527)   ei_shln( ei, ei, sc, ns + 2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5528) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5529) } /* End of ei_shup() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5530) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5531) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5532) int ei_shift( EMUSHORT *ei, int sc, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5533) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5534) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5535)  Description        : ei_shift() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  5536)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5538)  Concepts           : shift the Significand of exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  5539)                       internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5540)                       Guard words are included in the shift.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5541) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5542)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5543) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5544)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  5545)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5546)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5547)                       ei_shup( *ei, sc, nb );     | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5548)                       ei_shdown( *ei, sc, nb );   | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5549) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5550)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5551)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5552)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5553)                       int sc;       - количество
868b2b66 (kx 2024-12-20 16:11:07 +0300  5554)                                       сдвигаемых бит
868b2b66 (kx 2024-12-20 16:11:07 +0300  5555)                                       (positive = up).
868b2b66 (kx 2024-12-20 16:11:07 +0300  5556)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  5557)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5558)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5559) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5560)  Return             : int lost;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5561)                       if( sc < 0 &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  5562)                           `выдвинут хотябы один единичный бит' )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5563)                          [lost = 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5564)                       else   [lost = 0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5566)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5567) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5568)   EMUSHORT  lost = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5569)   EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5570) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5571)   int       ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5572) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5573)   int       ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5575)   if( sc == 0 ) return( (int)lost );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5576) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5577) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5578)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5580)   p = ei + ne + 1; /* point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5581) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5582)   p = ei;          /* point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5583) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5584) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5585)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5586) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5587)   if( sc < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5588)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5589)     int i, k, ks;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5590) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5591)     sc = -sc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5592)     /********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5593)       remember lost bits
868b2b66 (kx 2024-12-20 16:11:07 +0300  5594)      ********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5595)     k = EMUSHORTSIZE(sc) - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5596)     for( i = 0; i < k; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5597)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5598) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5599)       lost |= p[ns + 1 - i];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5600) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5601)       lost |= p[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5602) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5603)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5604)     ks = sc - k*BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5605)     for( i = 0; i < ks; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5606)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5607)       lost |= ORDER_BIT( p, i + k*BITS_PER_EMUSHORT, ns+2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5608)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5609)     /******* end of remember lost bits **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5610) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5611)     ei_shdown( ei, (unsigned)sc, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5612) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5613)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5614)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5615)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5616)     ei_shup( ei, (unsigned)sc, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5617)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5618) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5619)   if( lost ) lost = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5621)   return( (int)lost );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5622) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5623) } /* End of ei_shift() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5624) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5625) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5626) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5627) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5628)   NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5629)      Количество бит мантиссы вещественного числа во внутреннем
868b2b66 (kx 2024-12-20 16:11:07 +0300  5630)      формате не должно превышать  максимального положительного
868b2b66 (kx 2024-12-20 16:11:07 +0300  5631)      signed EMUSHORT, которому соответствует тип __mpu_int32_t.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5632)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5633) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5634) /* количество бит в Significand in Internal e-type data struct */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5635) #define EINSBITS(nb) ((__mpu_int32_t)(internal_ns(nb)*BITS_PER_EMUSHORT))
868b2b66 (kx 2024-12-20 16:11:07 +0300  5636) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5637) __mpu_int32_t ei_normalize( EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5638) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5639) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5640)  Description        : ei_normalize() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  5641)                                      internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  5642)                                      struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5643) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5644)  Concepts           : left-justify the Significand of exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  5645)                       internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5646)                       Guard words are included in the shift.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5648)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5649) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5650)  Use Functions      : 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5651)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5652)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5653)                       ei_shup( *ei, sc, nb );     | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5654)                       ei_shdown( *ei, sc, nb );   | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  5655) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5656)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5657)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5658)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5659)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  5660)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5661)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5663)  Return             : __mpu_int32_t  sc; - shift counter.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5664) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5665)                       if( sc < 0 )         =>  был сдвиг вверх;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5666)                       else if( sc == 0 )   =>  сдвигов не было;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5667)                            else            =>  был сдвиг вниз;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5668) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5669)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5670) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5671)   __mpu_int32_t  sc = 0; /* Ret. Code (shift counter) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5672)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5673)   int            ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5674) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5675)   int            ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5676) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5677)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5678) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5679)   p = ei + ne + 1; /* point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5680) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5681) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5682)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5683) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5684) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  5685)   p = ei + ns + 1; /* point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5686) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5688)   if( *p == 0 ) /* normalize up (left) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5689)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5690) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5691)     p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5692) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5693)     p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5694) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5695) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5696)     if( *p & MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5697)       return( sc ); /* already normalized (sc = 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5698) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5699)     /*******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5700)       Left-justify the Significand.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5701)      *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5702)     while( *p == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5703)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5704)       ei_shup( ei, (unsigned)BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5705)       sc += BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5706) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5707)       if( sc > EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5708)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5709)         /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  5710)           With guard word, there are
868b2b66 (kx 2024-12-20 16:11:07 +0300  5711)           EINSBITS(nb)+BITS_PER_EMUSHORT
868b2b66 (kx 2024-12-20 16:11:07 +0300  5712)           bits available.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5713)           Return true if all are zero
868b2b66 (kx 2024-12-20 16:11:07 +0300  5714)           (SIGNED NULL or ei_cleazs(), for example).
868b2b66 (kx 2024-12-20 16:11:07 +0300  5715)          */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5716)         return( sc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5717)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5718)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5719)     /* see if high byte is zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5720)     while( (*p & HIGHT_BYTE) == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5721)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5722)       ei_shup( ei, (unsigned)8, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5723)       sc += 8;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5724)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5725)     /* now shift 1 bit at a time */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5726)     while( (*p & MASK_SIGN) == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5727)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5728)       ei_shup( ei, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5729)       sc += 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5730) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5731)       if( sc > EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5732)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5733)         /* ONLY: выставить ошибку и вернуть SC */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5734)         /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5735)           NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5736)              Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300  5737)              внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5738)              переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300  5739)              __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300  5740)              она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300  5741)              следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5742) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5743)                errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5744)          ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5745)         _mtherr( (EMUSHORT *)0, /* Not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5746)                  (__mpu_char8_t *)"ei_normalize", __UNDERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5747)                  (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5748)                  (EMUSHORT *)0, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5749)         __STUDF; /* Set REAL Underflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5750)         return( sc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5751)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5752)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5753)   }      /* End of normalize up (left) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5754)   else   /* normalize down (right) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5755)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5756)     /*******************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5757)       Normalize by shifting down (right) out of
868b2b66 (kx 2024-12-20 16:11:07 +0300  5758)       the high guard word  of the  Significand.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5759)      *******************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5760)     while( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5761)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5762)       ei_shdown( ei, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5763)       sc -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5765)       if( sc < - EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5766)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5767)         /* ONLY: выставить ошибку и вернуть SC */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5768)         /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5769)           NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5770)              Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300  5771)              внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5772)              переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300  5773)              __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300  5774)              она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300  5775)              следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5777)                errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5778)          ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5779)         _mtherr( (EMUSHORT *)0, /* Not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5780)                  (__mpu_char8_t *)"ei_normalize", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5781)                  (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5782)                  (EMUSHORT *)0, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5783)         __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5784)         return( sc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5785)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5786)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5787) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5788)   } /* End of normalize down (right) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5789) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5790)   __CLOVF; /* Clear REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5791)   __CLUDF; /* Clear REAL Underflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5792) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5793)   return( sc );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5794) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5795) } /* End of ei_normalize() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5796) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5797) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5798) static void unpack_32( EMUSHORT *ei, EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5799) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5800) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5801)  Description        : unpack_32() Распаковывает real32 data
868b2b66 (kx 2024-12-20 16:11:07 +0300  5802)                                   struct в internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  5803)                                   struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5805)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  5806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5807)  NOTE               : Функция работает правильно только для
868b2b66 (kx 2024-12-20 16:11:07 +0300  5808)                       размеров EMUSHORT кратных 16 бит
868b2b66 (kx 2024-12-20 16:11:07 +0300  5809)                       (16,32,48,64,80,96,...).
868b2b66 (kx 2024-12-20 16:11:07 +0300  5810)                       SEE operator:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5811) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5812)                         pe += (BITS_PER_EMUSHORT - 16) / 16
868b2b66 (kx 2024-12-20 16:11:07 +0300  5813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5814)                       in LITTLE_ENDIAN case.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5815) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5816)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  5817) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5818)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  5819) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5820)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5821)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5822)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5823)                                       память под нее
868b2b66 (kx 2024-12-20 16:11:07 +0300  5824)                                       выделяется до
868b2b66 (kx 2024-12-20 16:11:07 +0300  5825)                                       применения
868b2b66 (kx 2024-12-20 16:11:07 +0300  5826)                                       unpack_32() и
868b2b66 (kx 2024-12-20 16:11:07 +0300  5827)                                       ее размер на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5828)                                       совести
868b2b66 (kx 2024-12-20 16:11:07 +0300  5829)                                       программиста;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5830)                       EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  5831)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5832)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5833)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  5834)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  5835)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  5836) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5837)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  5838) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5839)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5840) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5841)   EMUSHORT    *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5842)                 *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  5843)                   *r = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5844)   EMUSHORT        *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5845)   __mpu_uint16_t  *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5846)   int              denorm = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5847)   __mpu_int32_t    k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5848)   int              np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5849) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5850)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5851) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5852)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5853)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5854)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5855)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5856)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5857)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5858)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5859) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5860)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5861)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5862)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5863) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5864)   /*** Allocate memory for exone, inc, r . ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5865)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5866)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5867)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5868)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5869)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5870)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5871) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5872)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5873)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5874)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5875)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5876) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5877)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5878)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5879)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5880) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5881)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5882)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5883) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5884)   r = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5885)   if( !r )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5886)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5887)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5888) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5889)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5890)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5891)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5892)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5893) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5894)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5895)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5896)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5897) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5898)   he = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5899)   ei_cleaz( ei, nb ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  5900)                          e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5901) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5902) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  5903)   ++he; /* point to high __mpu_uint16_t */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5904) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5905) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5907) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5908)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5909)   p = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5910)   for( i = 0; i < ne - 1; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5911)   *p = (EMUSHORT)0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5912) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5913)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5914)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5915)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5916) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5917)   p = r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5918)   for( i = 0; i < ne - 1; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5919)   *p = (EMUSHORT)(*he);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5920) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5921)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5922)   p = inc + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5923)   for( i = 0; i < ne - 1; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5924)   *p = (EMUSHORT)0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5925) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5926)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5927)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5928)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5929) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5930)   p = r + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5931)   for( i = 0; i < ne - 1; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5932)   *p = (EMUSHORT)(*he);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5933) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5934) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5935) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5936)   /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5937)   if( *he & 0x8000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5938) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5939)   *ei = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5940) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5941)   *(ei + np - 1) = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5942) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5943) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5944)   /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5945) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5946)   ei[ne + 1] = (EMUSHORT)((*he & 0x7f) | 0x80);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5947) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5948)   ei[ns + 1] = (EMUSHORT)((*he & 0x7f) | 0x80);
868b2b66 (kx 2024-12-20 16:11:07 +0300  5949) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5950) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5951)   /* Skip Sign and 7 significand bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5952) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5953)   *(r + ne - 1) &= (EMUSHORT)0x7f80; /* т.е. (~0x807f) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5954) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5955)   *r &= (EMUSHORT)0x7f80; /* т.е. (~0x807f) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5956) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5957) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5958)   /****************
868b2b66 (kx 2024-12-20 16:11:07 +0300  5959)     INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  5960)    ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5961) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5962)   if( *(r + ne - 1) == 0x7f80 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5963) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5964)   if( *r == 0x7f80 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5965) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5966)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5967)     /********
868b2b66 (kx 2024-12-20 16:11:07 +0300  5968)       NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  5969)      ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5970)     /* indeterminacy */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5971)     if( e_isind( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5972)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5973)       ei_ind( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5975)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5976)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5977)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5978)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5979)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5981)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5982)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  5983)     /* nanmin */
868b2b66 (kx 2024-12-20 16:11:07 +0300  5984)     if( e_isnanmin( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  5985)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  5986) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  5987)       ei_nanmin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5988) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  5989)       ei_nanmin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5990) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  5991) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5992)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5993)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5994)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5995)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  5996)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  5997) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  5998)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  5999)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6000)     /* nanmax */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6001)     if( e_isnanmax( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6002)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6003) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6004)       ei_nanmax( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6005) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6006)       ei_nanmax( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6007) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6008) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6009)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6010)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6011)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6012)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6013)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6014) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6015)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6016)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6017)     /* nans */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6018)     if( e_isnans( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6019)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6020) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6021)       ei_nan( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6022) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6023)       ei_nan( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6024) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6025) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6026)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6027)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6028)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6029)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6030)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6031) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6032)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6033)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6034)     /**********
868b2b66 (kx 2024-12-20 16:11:07 +0300  6035)       END NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  6036)      **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6037) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6038)     ei_cleazs( ei, nb ); /* не трогать знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6039) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6040)     ei_infin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6041) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6042)     ei_infin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6043) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6044) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6045)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6046)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6047)     /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6048)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6049)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6050) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6051)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6052)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6053)   /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6054)     END INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  6055)    **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6057)   ei_shrn( r, r, 7, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6058) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6059) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6060)   /* If zero Exponent, then the Significand is denormalized.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6061)     So take back the understood high Significand bit. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6062) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6063)   if( *(r + ne - 1) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6064) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6065)   if( *r == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6066) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6067)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6068)     denorm = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6069) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6070)     ei[ne + 1] &= ~((EMUSHORT)0x80);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6071) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6072)     ei[ns + 1] &= ~((EMUSHORT)0x80);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6073) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6074)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6076)   ei_sube( exone, exone,   inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6077)   ei_adde(     r,     r, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6078) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6079)   ei_cpye_unpack( &ei[1],    r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6080) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6081)   ei_cpye_unpack( &ei[ns+2], r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6082) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6084) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6085)   pe = (__mpu_uint16_t *)&ei[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6086)   /* NOTE: I not TEST !!! */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6087)   *pe = *(he + 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6088) /* продолжение для e53
868b2b66 (kx 2024-12-20 16:11:07 +0300  6089)   *(++pe) = *(he + 2);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6090)   *(++pe) = *(he + 3);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6091)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6092) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6093)   pe = (__mpu_uint16_t *)&ei[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6094)   /* следующий оператор требуется только здесь */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6095)   pe += (BITS_PER_EMUSHORT - 16) / 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6096)   *pe = *(he - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6097) /* продолжение для e53
868b2b66 (kx 2024-12-20 16:11:07 +0300  6098)   *(--pe) = *(he - 2);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6099)   *(--pe) = *(he - 3);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6100)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6101) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6102) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6103)   ei_shift( ei, -8, nb ); /* `-' - down(right) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6104) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6105)   if( denorm )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6106)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6107)     /* if zero Exponent, then normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6108)     if( (k = ei_normalize(ei, nb)) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6109)       ei_cleazs( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6110)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6111)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6112)       /* Exponent -= (k - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6113)       k -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6114)       ei_cvte_unpack( inc, (EMUSHORT *)&k, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6115) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6116)       p = &ei[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6117) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6118)       p = &ei[ns+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6119) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6120)       ei_sube( p, p, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6121)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6122)   } /* End if( denorm ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6123) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6124) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6125)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6126)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6127)   /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6128)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6129)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6130) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6131) } /* End of unpack_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6133) static void unpack_64( EMUSHORT *ei, EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6134) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6136)  Description        : unpack_64() Распаковывает real64 data
868b2b66 (kx 2024-12-20 16:11:07 +0300  6137)                                   struct в internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  6138)                                   struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6139) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6140)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6141) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6142)  NOTE               : Функция работает правильно только для
868b2b66 (kx 2024-12-20 16:11:07 +0300  6143)                       размеров EMUSHORT кратных 16 бит
868b2b66 (kx 2024-12-20 16:11:07 +0300  6144)                       (16,32,48,64,80,96,...).
868b2b66 (kx 2024-12-20 16:11:07 +0300  6145)                       SEE operator:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6146) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6147)                         pe += (BITS_PER_EMUSHORT - 16) / 16
868b2b66 (kx 2024-12-20 16:11:07 +0300  6148) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6149)                       in LITTLE_ENDIAN case.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6150) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6151)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6152) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6153)  Use Functions      : 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6155)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6156)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6157)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6158)                                       память под нее
868b2b66 (kx 2024-12-20 16:11:07 +0300  6159)                                       выделяется до
868b2b66 (kx 2024-12-20 16:11:07 +0300  6160)                                       применения
868b2b66 (kx 2024-12-20 16:11:07 +0300  6161)                                       unpack_32() и
868b2b66 (kx 2024-12-20 16:11:07 +0300  6162)                                       ее размер на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6163)                                       совести
868b2b66 (kx 2024-12-20 16:11:07 +0300  6164)                                       программиста;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6165)                       EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6166)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6167)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6168)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  6169)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6170)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6172)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6174)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6175) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6176)   EMUSHORT    *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  6177)                 *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  6178)                   *r = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6179)   EMUSHORT        *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6180)   __mpu_uint16_t  *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6181)   int              denorm = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6182)   __mpu_int32_t    k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6183)   int              np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6184) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6185)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6186) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6187)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6188)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6189)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6190)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6191)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6192)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6193)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6195)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6196)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6197)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6199)   /*** Allocate memory for exone, inc, r . ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6200)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6201)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6202)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6203)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6204)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6205)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6206) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6207)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6208)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6209)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6210)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6211) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6212)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6213)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6214)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6216)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6217)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6218) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6219)   r = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6220)   if( !r )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6221)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6222)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6223) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6224)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6225)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6226)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6227)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6229)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6230)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6231)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6232) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6233)   he = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6234)   ei_cleaz( ei, nb ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  6235)                          e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6237) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  6238)   he += 3; /* point to high word16bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6239) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6240) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6241) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6242) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6243)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6244)   p = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6245)   for( i = 0; i < ne - 1; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6246)   *p = (EMUSHORT)0x3ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6247) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6248)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6249)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6250)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6251) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6252)   p = r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6253)   for( i = 0; i < ne - 1; i++ ) *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6254)   *p = (EMUSHORT)(*he);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6255) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6256)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6257)   p = inc + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6258)   for( i = 0; i < ne - 1; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6259)   *p = (EMUSHORT)0x3ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6260) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6261)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6262)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6263)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6264) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6265)   p = r + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6266)   for( i = 0; i < ne - 1; i++ ) *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6267)   *p = (EMUSHORT)(*he);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6268) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6269) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6270) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6271)   /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6272)   if( *he & 0x8000 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6273) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6274)   *ei = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6275) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6276)   *(ei + np - 1) = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6277) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6278) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6279)   /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6280) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6281)   ei[ne + 1] = (EMUSHORT)((*he & 0x0f) | 0x10);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6282) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6283)   ei[ns + 1] = (EMUSHORT)((*he & 0x0f) | 0x10);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6284) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6285) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6286)   /* Skip Sign and 7 significand bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6287) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6288)   *(r + ne - 1) &= (EMUSHORT)0x7ff0; /* т.е. (~0x800f) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6289) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6290)   *r &= (EMUSHORT)0x7ff0; /* т.е. (~0x800f) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6291) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6293)   /****************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6294)     INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  6295)    ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6296) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6297)   if( *(r + ne - 1) == 0x7ff0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6298) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6299)   if( *r == 0x7ff0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6300) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6301)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6302)     /********
868b2b66 (kx 2024-12-20 16:11:07 +0300  6303)       NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  6304)      ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6305)     /* indeterminacy */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6306)     if( e_isind( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6307)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6308)       ei_ind( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6310)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6311)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6312)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6313)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6314)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6316)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6317)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6318)     /* nanmin */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6319)     if( e_isnanmin( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6320)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6321) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6322)       ei_nanmin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6323) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6324)       ei_nanmin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6325) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6326) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6327)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6328)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6329)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6330)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6331)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6332) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6333)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6334)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6335)     /* nanmax */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6336)     if( e_isnanmax( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6337)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6338) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6339)       ei_nanmax( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6340) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6341)       ei_nanmax( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6342) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6343) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6344)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6345)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6346)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6347)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6348)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6349) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6350)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6351)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6352)     /* nans */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6353)     if( e_isnans( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6354)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6355) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6356)       ei_nan( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6357) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6358)       ei_nan( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6359) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6361)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6362)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6363)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6364)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6365)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6366) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6367)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6368)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6369)     /**********
868b2b66 (kx 2024-12-20 16:11:07 +0300  6370)       END NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  6371)      **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6372) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6373)     ei_cleazs( ei, nb ); /* не трогать знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6374) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6375)     ei_infin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6376) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6377)     ei_infin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6378) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6379) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6380)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6381)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6382)     /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6383)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6384)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6385) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6386)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6387)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6388)   /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6389)     END INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  6390)    **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6391) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6392)   ei_shrn( r, r, 4, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6393) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6394) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6395)   /* If zero Exponent, then the Significand is denormalized.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6396)     So take back the understood high Significand bit. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6397) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6398)   if( *(r + ne - 1) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6399) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6400)   if( *r == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6401) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6402)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6403)     denorm = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6404) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6405)     ei[ne + 1] &= ~((EMUSHORT)0x10);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6406) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6407)     ei[ns + 1] &= ~((EMUSHORT)0x10);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6408) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6409)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6410) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6411)   ei_sube( exone, exone,   inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6412)   ei_adde(     r,     r, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6413) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6414)   ei_cpye_unpack( &ei[1],    r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6415) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6416)   ei_cpye_unpack( &ei[ns+2], r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6417) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6419) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6420)   pe = (__mpu_uint16_t *)&ei[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6421)   /* NOTE: I not TEST !!! */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6422)   *pe = *(he + 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6423)   *(++pe) = *(he + 2);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6424)   *(++pe) = *(he + 3);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6425) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6426)   pe = (__mpu_uint16_t *)&ei[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6427)   /* следующий оператор требуется только здесь */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6428)   pe += (BITS_PER_EMUSHORT - 16) / 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6429)   *pe = *(he - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6430)   *(--pe) = *(he - 2);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6431)   *(--pe) = *(he - 3);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6432) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6434)   ei_shift( ei, -5, nb ); /* `-' - down(right) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6435) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6436)   if( denorm )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6437)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6438)     /* if zero Exponent, then normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6439)     if( (k = ei_normalize(ei, nb)) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6440)       ei_cleazs( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6441)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6442)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6443)       /* Exponent -= (k - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6444)       k -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6445)       ei_cvte_unpack( inc, (EMUSHORT *)&k, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6446) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6447)       p = &ei[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6448) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6449)       p = &ei[ns+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6450) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6451)       ei_sube( p, p, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6452)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6453) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6454)   } /* End if( denorm ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6455) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6456)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6457)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6458)   /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6459)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6460)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6461) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6462) } /* End of unpack_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6464) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6465) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6466)   NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6467) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6468)      EMUPART <= EMUSHORT всегда.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6469)      На данный момент мы используем размер в 32 бита как для
868b2b66 (kx 2024-12-20 16:11:07 +0300  6470)      EMUSHORT, так и для EMUPART по тому, что работаем с
868b2b66 (kx 2024-12-20 16:11:07 +0300  6471)      моделями ILP32, LP64 для машин с разрядностью до 64 бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6472)      В случаее 128-разрядных машин, следует сохранить размер
868b2b66 (kx 2024-12-20 16:11:07 +0300  6473)      EMUPART в 32 бита, а размер EMUSHORT может быть 64 бита.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6474)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6476) static void unpack_np( EMUSHORT *ei, EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6477) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6478) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6479)  Description        : unpack_np() Распаковывает все начиная с
868b2b66 (kx 2024-12-20 16:11:07 +0300  6480)                                   real128 (real128,...) data
868b2b66 (kx 2024-12-20 16:11:07 +0300  6481)                                   struct в internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6482)                                   data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6484)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6485) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6486)  NOTE               :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6487)                       Функция работает правильно только для
868b2b66 (kx 2024-12-20 16:11:07 +0300  6488)                       размеров EMUSHORT кратных
868b2b66 (kx 2024-12-20 16:11:07 +0300  6489)                       BITS_PER_EMUPART(16|32) бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6490)                       SEE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6492)                      (BITS_PER_EMUSHORT - BITS_PER_EMUPART)
868b2b66 (kx 2024-12-20 16:11:07 +0300  6493)                p += ----------------------------------------;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6494)                              BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6495) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6497)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6498) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6499)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6500) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6501)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6502)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6503)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6504)                                       память под нее
868b2b66 (kx 2024-12-20 16:11:07 +0300  6505)                                       выделяется до
868b2b66 (kx 2024-12-20 16:11:07 +0300  6506)                                       применения
868b2b66 (kx 2024-12-20 16:11:07 +0300  6507)                                       unpack_128() и
868b2b66 (kx 2024-12-20 16:11:07 +0300  6508)                                       ее размер на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6509)                                       совести
868b2b66 (kx 2024-12-20 16:11:07 +0300  6510)                                       программиста;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6511)                       EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6512)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6513)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6514)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  6515)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6516)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6517) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6518)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6519) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6520)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6521) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6522)   EMUSHORT   *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  6523)                *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  6524)                  *r = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6525)   EMUSHORT       *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6526)   EMUPART        *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6527)   int             denorm = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6528)   __mpu_int32_t   k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6529)   int             np, ne, ns, nex, nsx, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6530) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6531)   if( nb < NBR_128 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6532)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6533)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6534)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6535)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6536)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6537)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6538) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6539)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6540)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6541)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6542) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6543)   /*** Allocate memory for exone, inc, r . ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6544)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6545)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6546)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6547)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6548)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6549)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6550) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6551)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6552)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6553)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6554)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6555) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6556)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6557)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6558)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6559) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6560)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6561)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6562) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6563)   r = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6564)   if( !r )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6565)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6566)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6567) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6568)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6569)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6570)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6571)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6572) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6573)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6574)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6575)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6576) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6577)   nex = EMUPARTSIZE(NEBITS(nb));
868b2b66 (kx 2024-12-20 16:11:07 +0300  6578)   nsx = EMUPARTSIZE(NSBITS(nb));
868b2b66 (kx 2024-12-20 16:11:07 +0300  6579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6580)   he = (EMUPART *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6581)   ei_cleaz( ei, nb ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  6582)                          e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6583) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6584) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6585)   he += nex - 1; /* point to low EMUPART of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6586) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6587)   he += nsx;     /* point to low EMUPART of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6588) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6589) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6590)   /* inc используется для хранения EXONE исходного формата */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6591)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  6592)     но до ее основного применения она используется для:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6593)     1) проверки всех бит исходной экспоненты на 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6594)     2) проверки всех бит исходной экспоненты на 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6595)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6596)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6597)   for( i = 0; i < ne; i++ )   r[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6598) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6599) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6600)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6601)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6602)   pe = (EMUPART *)(inc + ne - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6603)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  6604)     /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6605)                  BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6606)   for( i = 0; i < nex - 1; i++ ) *pe-- = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6607)   *pe = PART_HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6608) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6609)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6610)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6611)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6612)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6613)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6614) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6615)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6616)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6617)   pe = (EMUPART *)(r + ne - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6618)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  6619)     /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6620)                  BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6621)   for( i = 0; i < nex - 1; i++ ) *pe-- = *he--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6622)   *pe = *he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6623) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6624)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6625)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6626)   pe = (EMUPART *)inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6627)   for( i = 0; i < nex - 1; i++ ) *pe++ = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6628)   *pe = PART_HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6629) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6630)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6631)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6632)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6633)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6634)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6635) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6636)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6637)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6638)   pe = (EMUPART *)r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6639)   for( i = 0; i < nex - 1; i++ ) *pe++ = *he++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6640)   *pe = *he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6641) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6642)   /* NOW *he point to hight EMUPART of Exponent in the source format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6643)   /* NOW *pe point to hight EMUPART of Exponent in the target (r)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6644) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6645)   /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6646)   if( *he & PART_MASK_SIGN )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6647) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6648)   *ei = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6649) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6650)   *(ei + np - 1) = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6651) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6652) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6653)   /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6654) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6655)   ei[ne + 1] = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6656) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6657)   ei[ns + 1] = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6658) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6659) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6660)   /* Skip Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6661)   *pe &= PART_HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6663) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6664)   /****************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6665)     INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  6666)    ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6667) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6668)   if( ei_cmpe( r, inc, ne ) == 0 ) /* r == inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6669)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6670)     /********
868b2b66 (kx 2024-12-20 16:11:07 +0300  6671)       NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  6672)      ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6673)     /* indeterminacy */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6674)     if( e_isind( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6675)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6676)       ei_ind( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6678)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6679)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6680)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6681)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6682)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6683) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6684)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6685)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6686)     /* nanmin */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6687)     if( e_isnanmin( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6688)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6689) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6690)       ei_nanmin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6691) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6692)       ei_nanmin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6693) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6694) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6695)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6696)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6697)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6698)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6699)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6700) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6701)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6702)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6703)     /* nanmax */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6704)     if( e_isnanmax( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6705)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6706) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6707)       ei_nanmax( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6708) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6709)       ei_nanmax( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6710) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6712)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6713)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6714)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6715)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6716)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6717) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6718)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6719)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6720)     /* nans */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6721)     if( e_isnans( ee, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6722)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6723) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6724)       ei_nan( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6725) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6726)       ei_nan( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6727) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6728) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6729)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6730)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6731)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6732)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6733)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6734) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6735)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6736)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6737)     /**********
868b2b66 (kx 2024-12-20 16:11:07 +0300  6738)       END NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  6739)      **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6740) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6741)     ei_cleazs( ei, nb ); /* не трогать знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6742) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6743)     ei_infin( ei, ei[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6744) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6745)     ei_infin( ei, ei[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6746) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6747) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6748)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6749)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6750)     /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6751)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6752)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6753) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6754)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6755)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6756)   /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6757)     END INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  6758)    **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6759) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6760) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6761)   /* If zero Exponent, then the Significand is denormalized.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6762)     So take back the understood high Significand bit. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6763)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6764)   if( ei_cmpe( r, inc, ne ) == 0 ) /* r == inc (inc = 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6765)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6766)     denorm = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6767) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6768)     ei[ne + 1] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6769) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6770)     ei[ns + 1] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6771) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6772)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6773) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6774)   /* Create EXONE of source format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6775) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6776)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6777)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6778)   pe = (EMUPART *)(inc + ne - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6779)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  6780)     /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6781)                  BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6782)   for( i = 0; i < nex - 1; i++ ) *pe-- = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6783)   *pe = PART_HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6784) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6785)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6786)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6787)   pe = (EMUPART *)inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6788)   for( i = 0; i < nex - 1; i++ ) *pe++ = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6789)   *pe = PART_HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6790) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6791) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6792)   /* r += EXONEtarget - EXONEsource */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6793)   ei_sube( exone, exone,   inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6794)   ei_adde(     r,     r, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6795)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6796) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6797)   ei_cpye_unpack( &ei[1],    r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6798) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6799)   ei_cpye_unpack( &ei[ns+2], r, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6800) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6801) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6802)   /* Copy Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6803) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6804)   pe = (EMUPART *)&ei[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6805)   he = (EMUPART *)&ee[nex];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6806)   /* NOTE: I not TEST !!! */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6807)   for( i = 0; i < nsx; i++ ) *pe++ = *he++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6808) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6809)   pe = (EMUPART *)&ei[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6810)   he = (EMUPART *)&ee[ns-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6811)   /* следующий оператор требуется только здесь */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6812)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  6813)     /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6814)                  BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6815)   he += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  6816)     /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6817)                  BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6818)   for( i = 0; i < nsx; i++ ) *pe-- = *he--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6819) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6821)   ei_shift( ei, -1, nb ); /* `-' - down(right) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6822) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6823)   if( denorm )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6824)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6825)     /* if zero Exponent, then normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6826)     if( (k = ei_normalize(ei, nb)) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6827)       ei_cleazs( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6828)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6829)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6830)       /* Exponent -= (k - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6831)       k -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6832)       ei_cvte_unpack( inc, (EMUSHORT *)&k, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6833) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  6834)       p = &ei[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6835) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  6836)       p = &ei[ns+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6837) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  6838)       ei_sube( p, p, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6839)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6840) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6841)   } /* End if( denorm ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6842) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6843)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6844)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6845)   /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6846)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6847)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6848) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6849) } /* End of unpack_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6850) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6851) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6852) void unpack( EMUSHORT *ei, EMUSHORT *ee, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6853) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6854) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6855)  Description        : unpack() Распаковывает `real<all>' data
868b2b66 (kx 2024-12-20 16:11:07 +0300  6856)                                struct в internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  6857)                                struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6858) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6859)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6860) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6861)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6862) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6863)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6864)                       unpack_32 ( *ei, *ee, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  6865)                       unpack_64 ( *ei, *ee, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  6866)                       unpack_np ( *ei, *ee, nb ); | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  6867) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6868)  Parameters         : EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6869)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6870)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6871)                                       память под нее
868b2b66 (kx 2024-12-20 16:11:07 +0300  6872)                                       выделяется до
868b2b66 (kx 2024-12-20 16:11:07 +0300  6873)                                       применения
868b2b66 (kx 2024-12-20 16:11:07 +0300  6874)                                       unpack() и
868b2b66 (kx 2024-12-20 16:11:07 +0300  6875)                                       ее размер на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6876)                                       совести
868b2b66 (kx 2024-12-20 16:11:07 +0300  6877)                                       программиста;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6878)                       EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6879)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6880)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6881)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  6882)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6883)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6884) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6885)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  6886) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6887)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6888) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6889)   EMUSHORT *ex = NULL;  /* External format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6890)   int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6891) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6892)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6893)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6894)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6895)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6896)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6897)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6898)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6899) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6900)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  6901)     NP in EMUPARTs.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6902)     BITS_PER_EMUPART == only(16 || 32).
868b2b66 (kx 2024-12-20 16:11:07 +0300  6903)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6904)   np = nb/(BITS_PER_EMUPART);
868b2b66 (kx 2024-12-20 16:11:07 +0300  6905) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6906)   /*** Allocate memory for ex . *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6907)   ex = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUPART) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6908)   if( !ex )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6909)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6910)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6911)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6912)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6913)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6914) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6915)   /* copy EE to EX (External format) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6916)   (void)memcpy( (void *)ex, (void *)ee, (size_t)(np*SIZE_OF_EMUPART) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6917) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6918)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6919)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6920)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6921)       unpack_32( ei, ex, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6922)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6923)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6924)       unpack_64( ei, ex, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6925)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6926)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6927)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6928)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6929)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6930)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6931)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6932)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6933)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6934)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6935)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6936)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6937)       unpack_np( ei, ex, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6938)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6940)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6941)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6942)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6943)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6944)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6945)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6946)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  6947)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6948) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6949)   /* FREE ex ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6950)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUPART) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  6951)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6952) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6953)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6954) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6955) } /* End of unpack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6956) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6957) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6958) int ei_cmpm( EMUSHORT *ai, EMUSHORT *bi, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6959) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  6960) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6961)  Description        : ei_cmpm() Compare Significands of numbers
868b2b66 (kx 2024-12-20 16:11:07 +0300  6962)                                 in internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6963) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6964)  Concepts           : Guard words are included in the
868b2b66 (kx 2024-12-20 16:11:07 +0300  6965)                       comparison.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6966) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6967)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  6968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6969)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  6970)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  6971)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  6972) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6973)  Parameters         : EMUSHORT *ai; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6974)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6975)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6976)                       EMUSHORT *bi; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  6977)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6978)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6979)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  6980)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  6981)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6982) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6983)  Return             : int rc;       - Result of Comparison.
868b2b66 (kx 2024-12-20 16:11:07 +0300  6984) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6985)                       if( ai  > bi )  rc = +1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6986)                       if( ai == bi )  rc =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6987)                       if( ai  < bi )  rc = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6989)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  6990) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6991)   EMUSHORT *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6992)   int       ne, ns, hgw, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6993) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  6994)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  6995)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  6996)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6997)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  6998)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  6999)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7000)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7001) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7002)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7003)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7004) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7005) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7006)   hgw = ne + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7007) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7008)   hgw = ns + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7009) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7010) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7011)   x = &ai[hgw];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7012)   y = &bi[hgw];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7013) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7014)   for( i = 0; i < ns + 2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7015)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7016) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7017)     if( *x++ != *y++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7018) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7019)     if( *x-- != *y-- )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7020) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7021)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7022) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7023)       if( *(--x) > *(--y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7024) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7025)       if( *(++x) > *(++y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7026) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7027)         return( 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7028)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7029)         return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7030) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7031)     } /* End if( != ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7032) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7033)   } /* End for( i = 0; i < ns+2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7034) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7035)   return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7037) } /* End of ei_cmpm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7038) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7039) void ei_addm( EMUSHORT *ci, EMUSHORT *ai, EMUSHORT *bi, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7040) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7042)  Description        : ei_addm() Add Significands of e-type AI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7043)                                 and BI.  AI + BI replaces CI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7044) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7045)  Concepts           : Guard words are included in the Add.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7046)                       CI может указывать на любое число,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7047)                       даже на AI или BI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7048) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7049)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7050) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7051)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  7052)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7053)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7054) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7055)  Parameters         : EMUSHORT *ci; - Result;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7056)                       EMUSHORT *ai; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7057)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7058)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7059)                       EMUSHORT *bi; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7060)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7061)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7062)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7063)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7064)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7066)  Return             : [void].
868b2b66 (kx 2024-12-20 16:11:07 +0300  7067) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7068)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7069) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7070)   EMULONG   rc, carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7071)   EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7072)   int       np, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7073) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7074)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7075)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7076)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7077)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7078)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7079)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7080)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7081) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7082)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7083)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7084) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7085) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7086)   /* point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7087)   x = ai + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7088)   y = bi + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7089)   z = ci + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7090) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7091)   /* point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7092)   x = ai;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7093)   y = bi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7094)   z = ci;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7095) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7097)   for( i = 0; i < ns + 2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7098)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7099)     rc = (EMULONG)(*x) + (EMULONG)(*y) + carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7100) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7101)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7102)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7104)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7105) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7106) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7107)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7108)     --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7109)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7110) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7111)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7112)     ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7113)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7114) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7115) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7116)   } /* End for( i = 0; i < ns + 2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7118) } /* End of ei_addm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7120) void ei_subm( EMUSHORT *ci, EMUSHORT *ai, EMUSHORT *bi, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7121) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7123)  Description        : ei_subm() Subtract Significands of e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7124)                                 AI and BI. AI - BI replaces CI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7126)  Concepts           : Guard words are included in the
868b2b66 (kx 2024-12-20 16:11:07 +0300  7127)                       Subtraction. CI может указывать на любое
868b2b66 (kx 2024-12-20 16:11:07 +0300  7128)                       число, даже на AI или BI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7129) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7130)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7131) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7132)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  7133)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7134)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7136)  Parameters         : EMUSHORT *ci; - Result;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7137)                       EMUSHORT *ai; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7138)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7139)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7140)                       EMUSHORT *bi; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7141)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7142)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7143)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7144)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7145)                                      data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7146) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7147)  Return             : [void].
868b2b66 (kx 2024-12-20 16:11:07 +0300  7148) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7149)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7150) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7151)   EMULONG   rc, carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7152)   EMUSHORT *z, *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7153)   int       np, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7155)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7156)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7157)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7158)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7159)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7160)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7161)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7163)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7164)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7165) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7166) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7167)   /* point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7168)   x = ai + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7169)   y = bi + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7170)   z = ci + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7171) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7172)   /* point to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7173)   x = ai;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7174)   y = bi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7175)   z = ci;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7176) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7178)   for( i = 0; i < ns + 2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7179)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7180)     rc = (EMULONG)(*x) - (EMULONG)(*y) - carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7181) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7182)     if( rc & MASK_CARRY ) carry = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7183)     else                  carry = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7184) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7185)     *z = (EMUSHORT)rc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7186) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7187) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7188)     --x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7189)     --y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7190)     --z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7191) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7192)     ++x;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7193)     ++y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7194)     ++z;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7195) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7196) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7197)   } /* End for( i = 0; i < ns + 2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7199) } /* End of ei_subm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7200) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7201) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7203) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7204)    Radix MAX[unsigned EMUSHORT] versions of multiply and divide.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7205)    if HOST_BITS_PER_EMUSHORT == 16(от 0 до 65 535),
868b2b66 (kx 2024-12-20 16:11:07 +0300  7206)       then Radix = 65 536;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7207)    if HOST_BITS_PER_EMUSHORT == 32(от 0 до 4 294 967 295),
868b2b66 (kx 2024-12-20 16:11:07 +0300  7208)       then Radix = 4 294 967 296;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7209)    if HOST_BITS_PER_EMUSHORT == 64(от 0 до 18 446 744 073 709 551 616),
868b2b66 (kx 2024-12-20 16:11:07 +0300  7210)       then Radix = 18 446 744 073 709 551 616;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7211)    etc.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7212)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7213) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7214) static void mEMUSHORTm( EMUSHORT *prodi, EMUSHORT *numi, EMUSHORT mul, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7215) /************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7216)    Multiply significand of e-type number NUMI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7217)    by BITS_PER_EMUSHORT-bit quantity MUL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7218)    return e-type result to PRODI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7219)    ВОЗМОЖНО ИСПОЛЬЗОВАНИЕ mEMUSHORTm(X,X,a,nb):
868b2b66 (kx 2024-12-20 16:11:07 +0300  7220)    т.е. результат можно поместить на место
868b2b66 (kx 2024-12-20 16:11:07 +0300  7221)    операнда NUMI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7222)  ************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7223) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7224)   EMUSHORT  *pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7225)   EMULONG    carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7226)   EMUSHORT  *prod = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7227)   EMUSHORT  *ps;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7228)   EMULONG    a, m;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7229)   int        i, np, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7230) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7231)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7232)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7233)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7234)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7235)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7236)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7237)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7239)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7240)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7241)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7242) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7243)   /*** Allocate memory for prod . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7244)   prod = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7245)   if( !prod )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7246)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7247)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7248)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7249)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7250)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7251) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7252)   a = mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7253) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7254)   /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7255)   pp = &prod[np - 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7256)   *pp++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7257)   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7258)   ps = &numi[np - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7259) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7260)   /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7261)   pp = &prod[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7262)   *pp-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7263)   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7264)   ps = &numi[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7265) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7266)   *pp = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7267) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7268)   for( i = 0; i < ns + 1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7269)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7270)     if( *ps == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7271)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7272) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7273)       --ps;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7274)       --pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7275)       *(pp-1) = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7276) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7277)       ++ps;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7278)       ++pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7279)       *(pp+1) = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7280) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7281)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7282)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7283)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7284) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7285)       m = (EMULONG) a * *ps--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7286) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7287)       m = (EMULONG) a * *ps++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7288) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7289)       carry = (m & MASK_ALL_BITS) + *pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7290) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7291)       *pp-- = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7292) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7293)       *pp++ = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7294) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7295) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7296)       carry = (carry >> BITS_PER_EMUSHORT) + (m >> BITS_PER_EMUSHORT) + *pp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7297) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7298)       *pp = (EMUSHORT)carry;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7299) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7300)       *(pp-1) = (EMUSHORT)(carry >> BITS_PER_EMUSHORT);
868b2b66 (kx 2024-12-20 16:11:07 +0300  7301) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7302)       *(pp+1) = (EMUSHORT)(carry >> BITS_PER_EMUSHORT);
868b2b66 (kx 2024-12-20 16:11:07 +0300  7303) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7304)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7305) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7306)   } /* End for( i = 0; i < ns + 1; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7307) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7308) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7309)   for( i = ne + 1; i < np; i++ ) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7310) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7311)   for( i = 0; i < ns + 2; i++ ) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7312) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7313)     prodi[i] = prod[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7314) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7315)   /* FREE prod **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7316)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7317)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7319) } /* End of mEMUSHORTm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7320) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7321) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7322) int ei_divm( EMUSHORT *quoti, EMUSHORT *numi, EMUSHORT *deni, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7323) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7324) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7325)  Description        : ei_divm() Divide Significands of e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7326)                                 NUMI and DENI. NUMI / DENI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7327)                                 replaces QUOTI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7328) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7329)  Concepts           : Sign and Exponent of NUMI replaces Sign
868b2b66 (kx 2024-12-20 16:11:07 +0300  7330)                       and Exponent of QUOTI(NUMI[Sign,Exp] ->
868b2b66 (kx 2024-12-20 16:11:07 +0300  7331)                       QUOTI[Sign,Exp]).
868b2b66 (kx 2024-12-20 16:11:07 +0300  7332)                       QUOTI может указывать на любое число,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7333)                       даже на NUMI или DENI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7334) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7335)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7336) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7337)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  7338)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7339)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7340)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7342)  Parameters         : EMUSHORT *quoti; - Result;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7343)                       EMUSHORT *numi;  - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7344)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7345)                                          data struct -
868b2b66 (kx 2024-12-20 16:11:07 +0300  7346)                                          ДЕЛИМОЕ;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7347)                       EMUSHORT *deni;  - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7348)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7349)                                          data struct -
868b2b66 (kx 2024-12-20 16:11:07 +0300  7350)                                          ДЕЛИТЕЛЬ;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7351)                       int nb;          - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7352)                                          external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7353)                                          data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7354) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7355)  Return             : int j;           - признак наличия
868b2b66 (kx 2024-12-20 16:11:07 +0300  7356)                                          остатка от
868b2b66 (kx 2024-12-20 16:11:07 +0300  7357)                                          деления;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7358)                       if( remainder != 0 ) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7359)                       if( remainder == 0 ) j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7361)                       if( error ) j = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7362) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7363)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7364) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7365)   EMUSHORT  *pcpy_num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7366)             *pcpy_den = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7367)                *tprod = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7368)   EMUSHORT  *p, *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7369)   EMULONG    tnum;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7370)   EMUSHORT   j, tdenm, tquot;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7371)   int        i, np, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7372) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7373)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7374)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7375)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7376)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7377)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7378)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7379)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7380) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7381)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7382)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7383)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7384) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7385)   /*** Allocate memory for pcpy_num, pcpy_den, tprod . ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7386)   pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7387)   if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7388)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7389)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7390)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7391)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7393)   pcpy_den = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7394)   if( !pcpy_den )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7395)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7396)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7397) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7398)     /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7399)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7400)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7401) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7402)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7403)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7404) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7405)   tprod = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7406)   if( !tprod )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7407)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7408)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7410)     /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7411)     /* FREE pcpy_den **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7412)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7413)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7414) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7415)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7416)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7417)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7419)   /* Copy NUM */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7420)   p = numi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7421)   q = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7422)   for( i = 0; i < np; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7424)   /* Copy DEN */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7425)   p = deni;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7426)   q = pcpy_den;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7427)   for( i = 0; i < np; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7428) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7429)   ei_cleaz( quoti, nb ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  7430)                             e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7432)   /* Copy Sign & Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7433) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7434)    /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7435)    p = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7436)    q = quoti;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7437)    for( i = 0; i < ne + 1; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7438) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7439)    /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7440)    p = pcpy_num + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7441)    q = quoti    + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7442)    for( i = 0; i < ne + 1; i++ ) *q-- = *p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7443) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7444) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7445)    ei_shdown( pcpy_num, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7446) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7447)    tdenm = pcpy_den[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7448)    q = &quoti[nE + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7449) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7450)    tdenm = pcpy_den[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7451)    q = &quoti[ns + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7452) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7453) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7454)    for( i = 0; i < ns + 2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7455)    {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7456)      /* Find trial quotient digit (the radix ...). */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7457) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7458)      tnum = (((EMULONG)pcpy_num[ne + 1]) << BITS_PER_EMUSHORT) + pcpy_num[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7459) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7460)      tnum = (((EMULONG)pcpy_num[ns + 1]) << BITS_PER_EMUSHORT) + pcpy_num[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7461) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7462)      /* Do not execute the divide instruction if it will overflow. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7463)      if( ((EMULONG)tdenm * MASK_ALL_BITS) < tnum )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7464)        tquot = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7465)      else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7466)        tquot = (EMUSHORT)(tnum / tdenm);
868b2b66 (kx 2024-12-20 16:11:07 +0300  7467) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7468)      /* Multiply denominator by trial quotient digit. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7469)      mEMUSHORTm( tprod, pcpy_den, tquot, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7470) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7471)      /* The quotient digit may have been over estimated. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7472)      if( ei_cmpm( tprod, pcpy_num, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7473)      {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7474)        tquot -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7475)        ei_subm( tprod, tprod, pcpy_den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7476)        if( ei_cmpm( tprod, pcpy_num, nb ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7477)        {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7478)          tquot -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7479)          ei_subm( tprod, tprod, pcpy_den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7480)        }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7481)      }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7482)      ei_subm( pcpy_num, pcpy_num, tprod, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7483) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7484)      *q++ = tquot;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7485) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7486)      *q-- = tquot;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7487) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7488)      ei_shup( pcpy_num, (unsigned)BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7489)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7490) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7491)   /* test for nonzero remainder after roundoff bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7492) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7493)   /* Set pointer to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7494)   p = &pcpy_num[ne + 1]; 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7495) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7496)   /* Set pointer to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7497)   p = &pcpy_num[ns + 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7498) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7499)   j = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7500)   for( i = 0; i < ns + 2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7501)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7502) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7503)     j |= *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7504) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7505)     j |= *p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7506) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7507)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7508) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7509)   if( j ) j = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7510) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7511)   /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7512)   /* FREE pcpy_den **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7513)   /* FREE tprod *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7514)   __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7515)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7516) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7517)   return( (int)j );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7518) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7519) } /* End of ei_divm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7520) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7521) int ei_mulm( EMUSHORT *prodi, EMUSHORT *numi, EMUSHORT *muli, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7522) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7523) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7524)  Description        : ei_mulm() Multiply Significands of e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7525)                                 NUMI and MULI. NUMI * MULI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7526)                                 replaces PRODI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7527) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7528)  Concepts           : Sign and Exponent of NUMI replaces Sign
868b2b66 (kx 2024-12-20 16:11:07 +0300  7529)                       and Exponent of PRODI(NUMI[Sign,Exp] ->
868b2b66 (kx 2024-12-20 16:11:07 +0300  7530)                       PRODI[Sign,Exp]).
868b2b66 (kx 2024-12-20 16:11:07 +0300  7531)                       PRODI может указывать на любое число,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7532)                       даже на NUMI или MULI.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7533)                       МАНТИССА МНОЖИТЕЛЯ НЕ МОЖЕТ БЫТЬ РАВНА
868b2b66 (kx 2024-12-20 16:11:07 +0300  7534)                       НУЛЮ.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7535) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7536)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7538)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  7539)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7540)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7541)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7542) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7543)  Parameters         : EMUSHORT *prodi; - Result;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7544)                       EMUSHORT *numi;  - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7545)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7546)                                          data struct -
868b2b66 (kx 2024-12-20 16:11:07 +0300  7547)                                          МНОЖИМОЕ;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7548)                       EMUSHORT *muli;  - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7549)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7550)                                          data struct -
868b2b66 (kx 2024-12-20 16:11:07 +0300  7551)                                          МНОЖИТЕЛЬ;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7552)                       int nb;          - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7553)                                          external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7554)                                          data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7555) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7556)  Return             : int j;           - флаг потерянных
868b2b66 (kx 2024-12-20 16:11:07 +0300  7557)                                          ненулевых бит;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7559)                       if( lost nonzero bits != 0 ) j = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7560)                       if( lost nonzero bits == 0 ) j = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7561) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7562)                       if( error ) j = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7563) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7564)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7565) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7566)   EMUSHORT  *pcpy_num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7567)             *pcpy_mul = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7568)                *tprod = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7569)   EMUSHORT  *p, *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7570)   EMUSHORT   j;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7571)   int        i, np, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7572) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7573)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7574)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7575)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7576)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7577)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7578)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7579)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7580) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7581)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7582)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7583)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7584) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7585)   /*** Allocate memory for pcpy_num, pcpy_mul, tprod . ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7586)   pcpy_num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7587)   if( !pcpy_num )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7588)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7589)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7590)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7591)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7593)   pcpy_mul = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7594)   if( !pcpy_mul )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7595)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7596)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7597) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7598)     /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7599)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7600)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7601) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7602)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7603)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7604) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7605)   tprod = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7606)   if( !tprod )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7607)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7608)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7609) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7610)     /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7611)     /* FREE pcpy_mul **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7612)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7613)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7614) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7615)     return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7616)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7617)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7618) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7619)   /* Copy NUM */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7620)   p = numi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7621)   q = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7622)   for( i = 0; i < np; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7623) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7624)   /* Copy MUL */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7625)   p = muli;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7626)   q = pcpy_mul;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7627)   for( i = 0; i < np; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7628) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7629)   ei_cleaz( prodi, nb ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  7630)                             e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7631) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7632)   /* Copy Sign & Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7633) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7634)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7635)   p = pcpy_num;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7636)   q = prodi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7637)   for( i = 0; i < ne + 1; i++ ) *q++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7638) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7639)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7640)   p = pcpy_num + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7641)   q = prodi    + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7642)   for( i = 0; i < ne + 1; i++ ) *q-- = *p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7643) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7644) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7645)   j = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7646) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7647)   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7648)   p = &pcpy_mul[np - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7649)   q = &prodi[np - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7650) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7651)   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7652)   p = &pcpy_mul[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7653)   q = &prodi[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7654) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7655) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7656)   for( i = 0; i < ns + 1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7657)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7658)     if( *p == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7659)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7660) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7661)       --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7662) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7663)       ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7664) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7665)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7666)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7667)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7668) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7669)       mEMUSHORTm( tprod, pcpy_num, *p--, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7670) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7671)       mEMUSHORTm( tprod, pcpy_num, *p++, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7672) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7673)       ei_addm( prodi, prodi, tprod, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7674)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7675)     j |= *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7676)     ei_shdown( prodi, (unsigned)BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7678)   } /* End for( i = 0; i < ns + 1; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7679) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7680)   if( j ) j = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7681) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7682)   /* FREE pcpy_num **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7683)   /* FREE pcpy_mul **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7684)   /* FREE tprod *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7685)   __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7686)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7688)   return( (int)j );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7689) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7690) } /* End of ei_mulm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7692) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7693) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7694) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7695)   ROUNDOFF parameter register control.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7696)   =  ==    =         =        =
868b2b66 (kx 2024-12-20 16:11:07 +0300  7697)   регистр управления параметрами ОКРУГЛЕНИЯ.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7698)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7699) int rndprc = NSBITS_DEFAULT;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7700) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7701) static int nsbits = NSBITS_DEFAULT; /* текущее    NSBITS(nb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7702) static int            nslast  = -1; /* предыдущее NSBITS(nb) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7703) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7704) static int            rlast   = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7705) static int            rw      =  0; /* rounding word */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7706) static EMUSHORT       rm_mask =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7707) static EMUSHORT       rm_bit  =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7708) static EMUSHORT       re_bit  =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7709) static int            re      =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7712) void ei_mdenorm( EMUSHORT *si, int lost, int subflag, EMUSHORT *exp, int rcontrol, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7713) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  7714) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7715)  Description        : ei_mdenorm() .
868b2b66 (kx 2024-12-20 16:11:07 +0300  7716) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7717)  Concepts           : .
868b2b66 (kx 2024-12-20 16:11:07 +0300  7718) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7719)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7720) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7721)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  7722)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7723)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7724)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  7725) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7726)  Parameters         : EMUSHORT *si;       - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  7727)                                             internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7728)                                             data struct - 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7729)                                             число, подлежащее
868b2b66 (kx 2024-12-20 16:11:07 +0300  7730)                                             округлению;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7731)                       int       lost;     - флаг бита,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7732)                                             потерянного
868b2b66 (kx 2024-12-20 16:11:07 +0300  7733)                                             предыдущей
868b2b66 (kx 2024-12-20 16:11:07 +0300  7734)                                             операцией;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7735)                       int       subflag;  - указывает на то,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7736)                                             SI получено в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7737)                                             результате
868b2b66 (kx 2024-12-20 16:11:07 +0300  7738)                                             операции
868b2b66 (kx 2024-12-20 16:11:07 +0300  7739)                                             вычитания. В том
868b2b66 (kx 2024-12-20 16:11:07 +0300  7740)                                             случае, когда
868b2b66 (kx 2024-12-20 16:11:07 +0300  7741)                                             LOST != 0, SI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7742)                                             на самом деле
868b2b66 (kx 2024-12-20 16:11:07 +0300  7743)                                             немного меньше,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7744)                                             чем дано;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7745)                       EMUSHORT *exp;      - смещенный порядок,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7746)                                             который может быть
868b2b66 (kx 2024-12-20 16:11:07 +0300  7747)                                             отрицательным.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7748)                                             Поле Exponent
868b2b66 (kx 2024-12-20 16:11:07 +0300  7749)                                             параметра SI
868b2b66 (kx 2024-12-20 16:11:07 +0300  7750)                                             игнорируется, и
868b2b66 (kx 2024-12-20 16:11:07 +0300  7751)                                             замещается EXP,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7752)                                             откорректированным
868b2b66 (kx 2024-12-20 16:11:07 +0300  7753)                                             в процессе
868b2b66 (kx 2024-12-20 16:11:07 +0300  7754)                                             нормализации и
868b2b66 (kx 2024-12-20 16:11:07 +0300  7755)                                             округления;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7756)                       ВНИМАНИЕ: функция ei_mdenorm() СЧИТАЕТ, ЧТО
868b2b66 (kx 2024-12-20 16:11:07 +0300  7757)                                 РАЗМЕР EXP РАВЕН
868b2b66 (kx 2024-12-20 16:11:07 +0300  7758)                                    internal_ne( nb ) + 1,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7759)                                    =====================
868b2b66 (kx 2024-12-20 16:11:07 +0300  7760)                                    А ЗАТЕМ ПОРТИТ СОДЕРЖИМОЕ EXP.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7761)                                    ==============================
868b2b66 (kx 2024-12-20 16:11:07 +0300  7762)                       int       rcontrol; - поле управления
868b2b66 (kx 2024-12-20 16:11:07 +0300  7763)                                             округлением. Если
868b2b66 (kx 2024-12-20 16:11:07 +0300  7764)                                             RCONTROL != 0, то
868b2b66 (kx 2024-12-20 16:11:07 +0300  7765)                                             SI будет округлено
868b2b66 (kx 2024-12-20 16:11:07 +0300  7766)                                             к RNDPRC битам;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7767)                       int nb;             - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  7768)                                             external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  7769)                                             data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7770) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7771)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  7772) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7773)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7774) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7775)   EMUSHORT      *rbit = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7776)                  *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7777)                 *hexp = NULL; /* or 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7778)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7779)   EMUSHORT       r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7780)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7781)   int            k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7782)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7783) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7784)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7785)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7786)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7787) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7788)   /*** Allocate memory for rbit, inc, hexp . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7789)   rbit = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7790)   if( !rbit )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7791)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7792)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7793)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7794)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7795) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7796)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7797)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7798)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7799)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7800) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7801)     /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7802)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7803)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7805)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7806)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7807) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7808)   hexp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7809)   if( !hexp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7810)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7811)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7812) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7813)     /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7814)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7815)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7817)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7818)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7819)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7821)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7822)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7823)    /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7824) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7825)   if( nb < NBR_128 ) nb = NBR_128; /* т.к. NSBITS(32) = 16,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7826)                                            NSBITS(64) = 48,
868b2b66 (kx 2024-12-20 16:11:07 +0300  7827)                                       остальные работают верно. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7828) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7829)   nsbits = NSBITS(nb); /* Actual number of bits in the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7830) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7831)   for( i = 0; i < np;   i++ ) rbit[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7832)   for( i = 0; i < ne+1; i++ ) hexp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7833)   for( i = 0; i < ne+1; i++ )  inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7834) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7835) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7836) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7837)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7838)   /* исходный формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7839)   p = hexp + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7840)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7841)   *p = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7842) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7843)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7844)   /* исходный формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7845)   p = hexp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7846)   for( i = 0; i < ne - 1; i++ ) *p++ = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7847)   *p = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7848) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7849) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7850)   /* NORMALIZE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7851)   j = ei_normalize( si, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7852) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7853)   /* exp -= j */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7854)   ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7855)   ei_sube( exp, exp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7856) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7857)   /* exp < hexp */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7858)   if( (j > (__mpu_int32_t)nsbits) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300  7859)       ( ei_cmpe( exp, hexp, ne+1 ) < 0 )  ) /* exp < hexp */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7860)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7861)     /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7862)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7863)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7864) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7865)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7866)     /* FREE hexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7867)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7868)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7869) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7870)     ei_cleazs( si, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7871)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7872)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7873) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7874)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7875)   if( ei_cmpe( exp, inc, ne+1 ) < 0 ) /* exp < 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7876)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7877)     j = -((__mpu_int32_t)nsbits)-1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7878)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7879)     if( ei_cmpe( exp, inc, ne+1 ) > 0 ) /* exp > (-NSBITS-1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7880)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7881)       ei_cvte_pack( (EMUSHORT *)&j, exp, 1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7882)       k = ei_shift( si, (int)j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7883)       if( k ) lost = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7884)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7885)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7886)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7887)       /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7888)       __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7889)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7890) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7891)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7892)       /* FREE hexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7893)       __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7894)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7895) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7896)       ei_cleazs( si, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7897)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7898) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7899)     } /* End if( exp > (-NSBITS-1) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7900) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7901)   } /* End if( exp < 0L ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7902) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7903) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7904)   /* Round off, unless told not to by rcontrol */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7905)   if( rcontrol == 0 ) goto md_final;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7907)   /* Установить параметры если управляющий регистр изменен ||
868b2b66 (kx 2024-12-20 16:11:07 +0300  7908)      идет обработка другого типа вещественного числа */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7909)   if( (rndprc != rlast) || (nsbits != nslast) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7910)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7911)     switch( rndprc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7912)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7913)       /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  7914)         NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7915)         HOST_BITS_PER_EMUSHORT == 16, 32, 64, 128,..., etc.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7916)         ONLY.
868b2b66 (kx 2024-12-20 16:11:07 +0300  7917)        */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7918)       default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7919)       case NSBITS_DEFAULT:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7920)          /* Sign + Significand = NSBITS(nb)+1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7921) #if HOST_BITS_PER_EMUSHORT > 32
868b2b66 (kx 2024-12-20 16:11:07 +0300  7922)         k = ns*BITS_PER_EMUSHORT - rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7923)         if( (k > BITS_PER_EMUSHORT) || (k < 0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7924)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7925)           /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7926)           __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7927)           /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7928) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7929)           /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7930)           /* FREE hexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7931)           __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7932)           /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  7933) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7934)           ei_cleazs( si, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  7935)           return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7936)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7937)         if( k )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7938)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7939)           int n;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7940) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7941)           re = rw = ne + ns + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7942) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7943)           re = rw = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7944) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7945)           rm_mask = 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7946)           rm_bit  = 0x8000;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7947)           re_bit  = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7948) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7949)           n = k - 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7950)           while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  7951)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7952)             rm_mask <<= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7953)             rm_mask |= 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7954)             n -= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7955)           } /* End of while( n ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7956)           rm_bit <<= k - 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7957)           re_bit <<= k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7958)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300  7959)         else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7960)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300  7961) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7962)           rw = ne + ns + 2; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7963)           re = rw - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7964) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7965)           rw = 0; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7966)           re = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7967) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7968)           rm_mask = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7969)           rm_bit  = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7970)           re_bit  = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7971) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7972)         } /* End if( k ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7973) #else  /* HOST_BITS_PER_EMUSHORT <= 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7974) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7975)         rw = ne + ns + 2; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7976)         re = rw - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7977) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7978)         rw = 0; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7979)         re = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7980) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7981)         rm_mask = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7982)         rm_bit  = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7983)         re_bit  = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7984) #endif /* HOST_BITS_PER_EMUSHORT >  32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7985)         break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7986) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  7987)       case 53:
868b2b66 (kx 2024-12-20 16:11:07 +0300  7988)         /* NBR_64: Sign + Significand = 53 bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  7989) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  7990)         if( BITS_PER_EMUSHORT == 16 ) rw = ne + 5;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7991)         else if( BITS_PER_EMUSHORT == 32 ) rw = ne + 3;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7992)              else /* >= 64 */              rw = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7993) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  7994)         if( BITS_PER_EMUSHORT == 16 ) rw = ns - 3;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7995)         else if( BITS_PER_EMUSHORT == 32 ) rw = ns - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7996)              else /* >= 64 */              rw = ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7997) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  7998)         rm_mask = 0x07ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  7999)         rm_bit  = 0x0400;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8000)         re_bit  = 0x0800;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8001) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8002) #if HOST_BITS_PER_EMUSHORT > 64
868b2b66 (kx 2024-12-20 16:11:07 +0300  8003)         /* if( HOST_BITS_PER_EMUSHORT > 64 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8004)         { /* case HOST_BITS_PER_EMUSHORT == 128, 256,..., etc. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8005)           int n;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8006) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8007)           n = (BITS_PER_EMUSHORT - 64);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8008)           while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8009)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8010)             rm_mask <<= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8011)             rm_mask |= 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8012)             n -= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8013)           } /* End of while( n ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8014)           rm_bit  <<= (BITS_PER_EMUSHORT - 64);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8015)           re_bit  <<= (BITS_PER_EMUSHORT - 64);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8016)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8017) #endif /* HOST_BITS_PER_EMUSHORT > 64 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8018)         re = rw;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8019)         break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8020) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8021)       case 24:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8022)         /* NBR_32: Sign + Significand = 24 bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8023) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8024)         if( BITS_PER_EMUSHORT == 16 ) rw = ne + 3;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8025)         else /* >= 32 */              rw = ne + 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8026) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8027)         if( BITS_PER_EMUSHORT == 16 ) rw = ns - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8028)         else /* >= 32 */              rw = ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8029) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8030)         rm_mask = 0x00ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8031)         rm_bit  = 0x0080;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8032)         re_bit  = 0x0100;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8033)         if( BITS_PER_EMUSHORT > 32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8034)         { /* case HOST_BITS_PER_EMUSHORT == 64, 128,..., etc. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8035)           int n;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8037)           n = (BITS_PER_EMUSHORT - 32);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8038)           while( n > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8039)           {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8040)             rm_mask <<= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8041)             rm_mask |= 0xffff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8042)             n -= 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8043)           } /* End of while( n ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8044)           rm_bit  <<= (BITS_PER_EMUSHORT - 32);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8045)           re_bit  <<= (BITS_PER_EMUSHORT - 32);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8046)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8047)         re = rw;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8048)         break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8049) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8050)     } /* End of switch( rndprc ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8051) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8052)     /* rbit[re] = re_bit; */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8053)     rlast    = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8054)     nslast   = nsbits;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8055) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8056)   } /* End if( rndprc != rlast ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8057)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  8058)     Убрав следующий оператор из предыдущего блока
868b2b66 (kx 2024-12-20 16:11:07 +0300  8059)     мы обеспечили Static хранение массива rbit[]
868b2b66 (kx 2024-12-20 16:11:07 +0300  8060)     (наряду с rw, re, rm_mask, rm_bit, re_bit),
868b2b66 (kx 2024-12-20 16:11:07 +0300  8061)     содержащего 1 прибавляемый к мантиссе бит.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8062)     SEE the following: ei_addm( si, si, rbit, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8063)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8064)   rbit[re] = re_bit;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8066) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8067)   /* Временный сдвиг вправо */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8068)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8069)   if( ( ei_cmpe( exp, inc, ne+1 ) <= 0 ) && /* exp <= 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8070)       ( rndprc != (int)nsbits/*NSBITS(nb)*/ )        )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8071)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8072) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8073)     lost |= si[ne+ns+2] & (EMUSHORT)1; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8074) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8075)     lost |= si[0]       & (EMUSHORT)1; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8076) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8077)     ei_shdown( si, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8078)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8079) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8080) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8081)   /* Очистить все биты ниже бита округления,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8082)      запомнить в r, если какой-нибудь из них != 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8083)   r = si[rw] & rm_mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8084)   if( rndprc < (int)nsbits )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8085)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8086) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8087)     k = rw + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8088)     while( k < (int)np )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8089)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8090)       if( si[k] ) r |= (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8091)       si[k] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8092)       ++k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8093)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8094) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8095)     k = rw - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8096)     while( k >= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8097)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8098)       if( si[k] ) r |= (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8099)       si[k] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8100)       --k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8101)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8102) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8103)   } /* End if( rndprc < NSBITS(nb) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8104)   si[rw] &= ~rm_mask;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8105)   if( (r & rm_bit) != 0 ) /* Старший из отрезанных */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8106)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8107)     if( r == rm_bit ) /* Все отрезанные (кроме старшего) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8108)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8109)       if( lost == 0 ) /* Потерянных ранее нет */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8110)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8111)         if( (si[re] & re_bit) == 0 ) /* Округление к четному */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8112)           goto md_done;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8113)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8114)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8115)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8116)         if( subflag != 0 ) goto md_done;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8117)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8118) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8119)     } /* End if( r == rm_bit ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8120) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8121)     ei_addm( si, si, rbit, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8123)   } /* End if( (r & rm_bit) != 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8124) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8126) md_done:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8127)   /* UNDO: Временный сдвиг вправо */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8128)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8129)   if( ( ei_cmpe( exp, inc, ne+1 ) <= 0 ) && /* exp <= 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8130)       ( rndprc != (int)nsbits/*NSBITS(nb)*/ )        )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8131) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8132)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8133)     ei_shup( si, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8134)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8135) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8136) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8137) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8138)   if( si[ne+1] != (EMUSHORT)0 ) /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8139) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8140)   if( si[ns+1] != (EMUSHORT)0 ) /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8141) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8142)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8143)     /* overflow on roundoff */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8144)     ei_shdown( si, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8145)     j = (__mpu_int32_t)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8146)     /* exp += 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8147)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8148)     ei_adde( exp, exp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8149)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8150) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8151) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8152) md_final:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8153) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8154)   si[ne+ns+2] = (EMUSHORT)0; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8155) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8156)   si[0]       = (EMUSHORT)0; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8157) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8158)   if( ei_cmpe( exp, hexp, ne+1 ) >= 0 ) /* exp >= hexp */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8159)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8160)     /* Формирование +/- 1.#INF */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8161)     ei_cleazs( si, nb ); /* не трогать знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8162) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8163)     ei_infin( si, si[0] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8164) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8165)     ei_infin( si, si[ns + ne + 2] != (EMUSHORT)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8166) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8167)     /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  8168)       MY ADD:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8169)       "ovrflow range error"
868b2b66 (kx 2024-12-20 16:11:07 +0300  8170)      ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8171)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  8172)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8173)          Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300  8174)          внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8175)          переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300  8176)          __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300  8177)          она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300  8178)          следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8179) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8180)            errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8181)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8182)     _mtherr( (EMUSHORT *)0, /* Not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8183)              (__mpu_char8_t *)"ei_mdenorm", __OVERFLOW__,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8184)              (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8185)              (EMUSHORT *)0, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8186)     __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8187) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8188)     /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8189)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8190)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8191) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8192)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8193)     /* FREE hexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8194)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8195)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8196) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8197)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8199)   } /* End if( exp >= HIGHT_EXP ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8200) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8201)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8202)   if( ei_cmpe( exp, inc, ne+1 ) < 0 ) /* exp < 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8203)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8204)     /* si[exp] = 0   */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8205) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8206)     p = inc + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8207)     ei_cpye_unpack( &si[1],    p, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8208) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8209)     p = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8210)     ei_cpye_unpack( &si[ns+2], p, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8211) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8212)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8213)   else /* exp >= 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8214)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8215)     /* si[exp] = exp */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8216) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8217)     p = exp + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8218)     ei_cpye_unpack( &si[1],    p, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8219) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8220)     p = exp;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8221)     ei_cpye_unpack( &si[ns+2], p, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8222) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8223)   } /* End if( exp < 0L ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8224) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8225)   /* FREE rbit **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8226)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8227)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8229)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8230)   /* FREE hexp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8231)   __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8232)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8233) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8234) } /* End of ei_mdenorm() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8235) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8237) static void pack_32( EMUSHORT *ee, EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8238) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  8239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8240)  Description        : pack_32() Пакует internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  8241)                                 struct в real32 data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8242) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8243)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8244) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8245)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8246) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8247)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8248) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8249)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8250)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8251)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8252)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8253)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8254)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8255)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  8256)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8257)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8258) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8259)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8260) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8261)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8262) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8263)   EMUSHORT       *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8264)                    *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8265)                    *inc = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8266)   EMUSHORT       *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8267)   __mpu_uint16_t *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8268)   int             rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8269)   EMUSHORT        k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8270)   int             np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8271) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8272)   if( nb != NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8273)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8274)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8275)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8276)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8277)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8278)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8279) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8280)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8281) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8282)   e_signull( ee, (unsigned)0, nb ); /* clear out exploded external
868b2b66 (kx 2024-12-20 16:11:07 +0300  8283)                                        real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8285)   if( ei_isind( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8286)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8287)     e_ind( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8288)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8289)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8291)   if( ei_isnanmin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8292)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8293)     e_nanmin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8294)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8295)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8296) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8297)   if( ei_isnanmax( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8298)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8299)     e_nanmax( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8300)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8301)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8302) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8303)   if( ei_isnans( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8304)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8305)     e_nan( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8306)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8307)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8310)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8311)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8312)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8313) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8314)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8315)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8316)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8317)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8318)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8319)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8320)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8321) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8322)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8323)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8324)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8325)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8326) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8327)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8328)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8329)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8331)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8332)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8334)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8335)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8336)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8337)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8339)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8340)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8341)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8342)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8343) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8344)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8345)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8346)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8347) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8348)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8349)   for( i = 0; i < ne+1; i++ ) exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8350) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8351) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8352)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8353)   p = inc + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8354)   *p = (EMUSHORT)0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8355) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8356)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8357)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8358)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8359)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8360)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8361) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8362)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8363)   p = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8364)   *p = (EMUSHORT)0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8365) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8366)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8367)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8368)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8369)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8370)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8371) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8372) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8373)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8374) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8375)   ei_cpye_unpack( exp, &ei[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8376) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8377)   ei_cpye_unpack( exp, &ei[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8378) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8379) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8380)   /* exp = exp - (EXONEsource - EXONEtarget) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8381)   ei_sube( exone, exone,   inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8382)   ei_sube(   exp,   exp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8383) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8384)   if( !ei_isinfin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8385)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8386)      rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8387)      rndprc = 24;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8388)      ei_mdenorm( ei, 0, 0, exp, NSBITS_DEFAULT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8389)      rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8390)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8391) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8392)   he = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8393) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8394) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  8395)   ++he; /* point to high word16bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8396) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8397) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8398) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8399)   p = ei;          /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8400) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8401)   p = ei + np - 1; /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8402) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8403) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8404)   if( *p )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8405)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8406)     *he = 0x8000; /* output Sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8407)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8408) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8409) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8410)   p += ne;   /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8411)   k  = *p++; /* NOW: p point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8412) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8413)   p -= ne;   /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8414)   k  = *p--; /* NOW: p point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8415) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8416) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8417)   /* Handle overflow cases. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8418)   if( k >= (EMUSHORT)255 ) /* hex: 0x00ff */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8419)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8420)     e_infin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8421)     errno = ERANGE; /* USER's Variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8422)     __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8424)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8425)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8426)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8427)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8428)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8429) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8430)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8432)   } /* End if( k >= 255 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8434)   if( k == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8435)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8436)     ei_shift( ei, 7, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8437)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8438)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8439)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8440)     k <<= 7;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8441)     ei_shift( ei, 8, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8442)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8443)   /* Убрать бывшую явной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8444)   k |= *p & (EMUSHORT)0x7f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8445)   /* NOW: p point to hight part of Significand  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8446)   /* High order output already has sign bit set */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8447)   *he |= (__mpu_uint16_t)k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8448) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8449) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8450)   ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8451)   /* point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8452)   pe  = (__mpu_uint16_t *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8453)   ++he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8454) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8455)   --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8456)   /* point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8457)   pe  = (__mpu_uint16_t *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8458)   pe += (BITS_PER_EMUSHORT - 16) / 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8459)   --he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8460) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8461) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8462)   *he = *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8464)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8465)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8466)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8467)   __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8468)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8470) } /* End of pack_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8471) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8472) static void pack_64( EMUSHORT *ee, EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8473) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  8474) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8475)  Description        : pack_64() Пакует internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  8476)                                 struct в real64 data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8477) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8478)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8479) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8480)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8481) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8482)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8484)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8485)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8486)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8487)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8488)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8489)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8490)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  8491)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8492)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8493) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8494)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8495) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8496)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8497) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8498)   EMUSHORT       *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8499)                    *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8500)                    *inc = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8501)   EMUSHORT       *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8502)   __mpu_uint16_t *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8503)   int             rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8504)   EMUSHORT        k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8505)   int             np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8506) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8507)   if( nb != NBR_64 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8508)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8509)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8510)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8511)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8512)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8513)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8514) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8515)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8516) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8517)   e_signull( ee, (unsigned)0, nb ); /* clear out exploded external
868b2b66 (kx 2024-12-20 16:11:07 +0300  8518)                                        real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8519) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8520)   if( ei_isind( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8521)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8522)     e_ind( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8523)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8524)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8525) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8526)   if( ei_isnanmin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8527)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8528)     e_nanmin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8529)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8530)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8531) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8532)   if( ei_isnanmax( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8533)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8534)     e_nanmax( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8535)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8536)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8538)   if( ei_isnans( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8539)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8540)     e_nan( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8541)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8542)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8543) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8544) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8545)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8546)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8547)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8548) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8549)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8550)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8551)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8552)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8553)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8554)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8555)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8556) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8557)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8558)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8559)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8560)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8561) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8562)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8563)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8564)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8565) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8566)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8567)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8568) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8569)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8570)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8571)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8572)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8573) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8574)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8575)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8576)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8577)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8578) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8579)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8580)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8581)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8583)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8584)   for( i = 0; i < ne+1; i++ ) exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8585) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8586) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8587)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8588)   p = inc + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8589)   *p = (EMUSHORT)0x3ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8590) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8591)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8592)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8593)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8594)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8595)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8596) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8597)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8598)   p = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8599)   *p = (EMUSHORT)0x3ff;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8600) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8601)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8602)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8603)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8604)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8605)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8606) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8607) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8608)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8609) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8610)   ei_cpye_unpack( exp, &ei[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8611) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8612)   ei_cpye_unpack( exp, &ei[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8613) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8614) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8615)   /* exp = exp - (EXONEsource - EXONEtarget) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8616)   ei_sube( exone, exone,   inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8617)   ei_sube(   exp,   exp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8618) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8619)   if( !ei_isinfin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8620)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8621)      rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8622)      rndprc = 53;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8623)      ei_mdenorm( ei, 0, 0, exp, NSBITS_DEFAULT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8624)      rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8625)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8626) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8627)   he = (__mpu_uint16_t *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8628) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8629) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  8630)   he += 3; /* point to high word16bits */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8631) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8632) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8633) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8634)   p = ei;          /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8635) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8636)   p = ei + np - 1; /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8637) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8638) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8639)   if( *p )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8640)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8641)     *he = 0x8000; /* output Sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8642)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8643) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8644) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8645)   p += ne;   /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8646)   k  = *p++; /* NOW: p point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8647) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8648)   p -= ne;   /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8649)   k  = *p--; /* NOW: p point to hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8650) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8651) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8652)   /* Handle overflow cases. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8653)   if( k >= (EMUSHORT)2047 ) /* hex: 0x07ff */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8654)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8655)     e_infin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8656)     errno = ERANGE; /* USER's Variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8657)     __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8658) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8659)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8660)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8661)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8662)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8663)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8664) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8665)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8666) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8667)   } /* End if( k >= 2047 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8668) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8669)   if( k == (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8670)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8671)     ei_shift( ei, 4, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8672)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8673)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8674)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8675)     k <<= 4;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8676)     ei_shift( ei, 5, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8677)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8678)   /* Убрать бывшую явной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8679)   k |= *p & (EMUSHORT)0x0f;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8680)   /* NOW: p point to hight part of Significand  */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8681)   /* High order output already has sign bit set */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8682)   *he |= (__mpu_uint16_t)k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8683) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8684) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8685)   ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8686)   /* point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8687)   pe  = (__mpu_uint16_t *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8688)   ++he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8689)   *he = *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8690)   *(he + 1) = *(++pe);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8691)   *(he + 2) = *(++pe);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8692) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8693)   --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8694)   /* point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8695)   pe  = (__mpu_uint16_t *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8696)   pe += (BITS_PER_EMUSHORT - 16) / 16;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8697)   --he;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8698)   *he = *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8699)   *(he - 1) = *(--pe);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8700)   *(he - 2) = *(--pe);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8701) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8702) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8703)    /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8704)    /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8705)    /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8706)    __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8707)    /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8709) } /* End of pack_64() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8711) static void pack_np( EMUSHORT *ee, EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8712) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  8713) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8714)  Description        : pack_np() Пакует internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  8715)                                 struct в real128, real256,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8716)                                 ..., etc. data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8717) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8718)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8719)  
868b2b66 (kx 2024-12-20 16:11:07 +0300  8720)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  8721) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8722)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  8723) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8724)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8725)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8726)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8727)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  8728)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8729)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8730)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  8731)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  8732)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  8733) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8734)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8735) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8736)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8737) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8738)   EMUSHORT    *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8739)                 *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  8740)                 *inc = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8741)   EMUSHORT    *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8742)   EMUPART     *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8743)   int          rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8744)   int          np, ne, ns, nex, nsx, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8745) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8746)   if( nb < NBR_128 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8747)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8748)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8749)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8750)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8751)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8752)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8753) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8754)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8755) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8756)   e_signull( ee, (unsigned)0, nb ); /* clear out exploded external
868b2b66 (kx 2024-12-20 16:11:07 +0300  8757)                                        real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8758) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8759)   if( ei_isind( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8760)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8761)     e_ind( ee, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8762)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8763)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8765)   if( ei_isnanmin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8766)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8767)     e_nanmin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8768)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8769)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8770) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8771)   if( ei_isnanmax( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8772)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8773)     e_nanmax( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8774)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8775)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8777)   if( ei_isnans( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8778)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8779)     e_nan( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8780)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8781)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8782) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8783)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8784)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8785)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8786) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8787)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8788)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8789)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8790)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8791)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8792)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8793)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8794) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8795)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8796)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8797)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8798)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8799) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8800)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8801)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8802)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8803) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8804)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8805)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8807)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8808)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8809)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8810)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8811) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8812)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8813)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8814)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8815)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8817)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8818)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8819)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8821)   nex = EMUPARTSIZE(NEBITS(nb));
868b2b66 (kx 2024-12-20 16:11:07 +0300  8822)   nsx = EMUPARTSIZE(NSBITS(nb));
868b2b66 (kx 2024-12-20 16:11:07 +0300  8823) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8824)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8825)   for( i = 0; i < ne+1; i++ ) exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8826) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8827) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8828)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8829)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8830)   pe = (EMUPART *)(inc + ne);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8831)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  8832)      /* ------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8833)                     BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8834)   for( i = 0; i < nex - 1; i++ ) *pe-- = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8835)   *pe = PART_HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8836) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8837)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8838)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8839)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8840)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8841)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8842)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8843) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8844)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8845)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8846)   pe = (EMUPART *)inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8847)   for( i = 0; i < nex - 1; i++ ) *pe++ = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8848)   *pe = PART_HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8849) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8850)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8851)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8852)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8853)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8854)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8855)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8856) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8857) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8858)    /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8859) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8860)   ei_cpye_unpack( exp, &ei[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8861) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8862)   ei_cpye_unpack( exp, &ei[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8863) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8864) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8865)   /* exp = exp - (EXONEsource - EXONEtarget) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8866)   ei_sube( exone, exone,   inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8867)   ei_sube(   exp,   exp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8868) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8869)   if( !ei_isinfin( ei, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8870)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8871)     rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8872)     rndprc = (int)NSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8873)     ei_mdenorm( ei, 0, 0, exp, (int)NSBITS(nb), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8874)     rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8875)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8876) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8877)   he = (EMUPART *)ee;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8878) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8879) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  8880)   he += nex + nsx - 1; /* point to high EMUPART */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8881) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8882) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8883) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8884)   p = ei;          /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8885) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8886)   p = ei + np - 1; /* point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8887) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8888) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8889)   if( *p )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8890)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8891)     *he = PART_MASK_SIGN; /* output Sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8892)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8893) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8894) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8895)   p += ne; /* NOW: p point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8896) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8897)   p -= ne; /* NOW: p point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8898) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8899) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8900)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8901) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8902)   ei_cpye_unpack( exp, &ei[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8903) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8904)   ei_cpye_unpack( exp, &ei[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8905) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8907) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8908)   /* целевой формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8909)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8910)   pe = (EMUPART *)(inc + ne);
868b2b66 (kx 2024-12-20 16:11:07 +0300  8911)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  8912)      /* ------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8913)                     BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8914)   for( i = 0; i < nex - 1; i++ ) *pe-- = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8915)   *pe = PART_HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8916) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8917)   /* целевой формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8918)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8919)   pe = (EMUPART *)inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8920)   for( i = 0; i < nex - 1; i++ ) *pe++ = PART_MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8921)   *pe = PART_HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8922) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8923) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8924) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8925)   /* Handle overflow cases. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8926)   if( ei_cmpe( exp, inc, ne+1 ) >= 0 ) /* exp >= HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8927)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8928)     e_infin( ee, (unsigned)ei_isneg( ei, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8929)     errno = ERANGE; /* USER's Variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8930)     __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8931) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8932)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8933)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8934)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8935)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8936)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8937) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8938)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8940)   } /* End if( exp >= HIGHT_EXP ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8941) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8942)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8943)   if( ei_cmpe( exp, inc, ne+1 ) != 0 ) /* exp != NULL */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8944)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  8945)     /* Убрать бывшую явной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8946)     ei_shift( ei, 1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8947)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  8948) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8949)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8950)   /* High order output already has sign bit set, and
868b2b66 (kx 2024-12-20 16:11:07 +0300  8951)      p point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8952) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8953)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8954)   he = (EMUPART *)&ee[nex - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8955)   pe = (EMUPART *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8956)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  8957)      /* -------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8958)                     BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8959)   for( i = 0; i < nex - 1; i++ ) *he-- = *pe--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8960)   *he |= *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8961) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8962)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8963)   he = (EMUPART *)&ee[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8964)   pe = (EMUPART *)p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8965)   for( i = 0; i < nex - 1; i++ ) *he++ = *pe++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8966)   *he |= *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8967) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8969)    /* Copy Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8970) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  8971)   pe = (EMUPART *)&ei[ne + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8972)   he = (EMUPART *)&ee[nex];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8973)   for( i = 0; i < nsx; i++ ) *he++ = *pe++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8974) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  8975)   pe = (EMUPART *)&ei[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8976)   he = (EMUPART *)&ee[ns-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  8977)   pe += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  8978)      /* ------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8979)                     BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8980)   he += (BITS_PER_EMUSHORT - BITS_PER_EMUPART) /
868b2b66 (kx 2024-12-20 16:11:07 +0300  8981)      /* ------------------------------------- */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8982)                     BITS_PER_EMUPART;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8983)   for( i = 0; i < nsx; i++ ) *he-- = *pe--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  8984) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  8985) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8986)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8987)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8988)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8989)   __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  8990)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  8991) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8992) } /* End of pack_np() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  8993) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8994) void pack( EMUSHORT *ee, EMUSHORT *ei, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  8995) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  8996) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  8997)  Description        : pack() Пакует all e-type data struct
868b2b66 (kx 2024-12-20 16:11:07 +0300  8998)                              в `real<all>' data struct
868b2b66 (kx 2024-12-20 16:11:07 +0300  8999) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9000)  Concepts           :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9001) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9002)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9003) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9004)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9005)                       pack_32( *ee, *ei, nb );    | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9006)                       pack_64( *ee, *ei, nb );    | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9007)                       pack_np( *ee, *ei, nb );    | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9008) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9009)  Parameters         : EMUSHORT *ee; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9010)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9011)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9012)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9013)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9014)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9015)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9016)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9017)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9018) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9019)  Return             : [void];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9020) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9021)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9022) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9023)   EMUSHORT *eix = NULL; /* Internal format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9024)   int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9025) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9026)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9027)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9028)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9029)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9030)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9031)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9032)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9034)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9035) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9036)   /*** Allocate memory for eix . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9037)   eix = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9038)   if( !eix )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9039)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9040)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9041)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9042)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9043)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9044) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9045)   /* copy EI to EIX (Internal format) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9046)   (void)memcpy( (void *)eix, (void *)ei, (size_t)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9047) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9048)   switch( nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9049)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9050)     case NBR_32    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9051)       pack_32( ee, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9052)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9053)     case NBR_64    :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9054)       pack_64( ee, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9055)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9056)     case NBR_128   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9057)     case NBR_256   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9058)     case NBR_512   :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9059)     case NBR_1024  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9060)     case NBR_2048  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9061)     case NBR_4096  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9062)     case NBR_8192  :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9063)     case NBR_16384 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9064)     case NBR_32768 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9065)     case NBR_65536 :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9066)     case NBR_131072:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9067)       pack_np( ee, eix, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9068)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9069) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9070)     default:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9071)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9072)       /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9073)       __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9074)       __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9075)       break;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9076)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9077)   } /* End of switch( nb ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9078) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9079)   /* FREE eix ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9080)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9081)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9082) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9083)   return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9084) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9085) } /* End of pack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9086) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9088) void ei_copy( EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9089) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9090) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9091)  Description        : ei_copy() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  9092)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9093) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9094)  Concepts           : copy (EIB to EIA) exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  9095)                       internal e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9097)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9098) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9099)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9100)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9101) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9102)  Parameters         : EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9103)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9104)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9105)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9106)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9107)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9108)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9109)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9110)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9111)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9112)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9113) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9114)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  9115) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9116)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9117) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9118)   int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9120)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9121) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9122)   (void)memcpy( (void *)eia, (void *)eib, np * SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9123) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9124) } /* End of ei_copy() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9125) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9126) void ei_copyzlgw( EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9127) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9128) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9129)  Description        : ei_copyzlgw() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  9130)                                     internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  9131)                                     struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9133)  Concepts           : copy (EIB to EIA) exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  9134)                       internal e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9135)                       And clear low guard word.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9136) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9137)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9138) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9139)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9140)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9141) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9142)  Parameters         : EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9143)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9144)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9145)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9146)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9147)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9148)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9149)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9150)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9151)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9152)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9154)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  9155) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9156)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9157) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9158)   int np;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9159) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9160)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9161) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9162)   (void)memcpy( (void *)eia, (void *)eib, np * SIZE_OF_EMUSHORT );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9163) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9164) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9165)    eia[np-1] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9166) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9167)    eia[0]    = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9168) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9169) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9170) } /* End of ei_copyzlgw() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9172) int ei_cmp( EMUSHORT *ai, EMUSHORT *bi, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9173) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9175)  Description        : ei_cmp() Compare two numbers
868b2b66 (kx 2024-12-20 16:11:07 +0300  9176)                                in internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9178)  Concepts           : Guard words are included in the
868b2b66 (kx 2024-12-20 16:11:07 +0300  9179)                       comparison.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9180) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9181)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9182) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9183)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9184)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9185) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9186)  Parameters         : EMUSHORT *ai; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9187)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9188)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9189)                       EMUSHORT *bi; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9190)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9191)                                       data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9192)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9193)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9194)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9195) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9196)  Return             : int rc; - Result of Comparison.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9197) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9198)                         if( ai  > bi )        rc = +1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9199)                         if( ai == bi )        rc =  0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9200)                         if( ai  < bi )        rc = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9201)                         if((ai || bi) is NaN) rc = -2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9203)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9204) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9205)   EMUSHORT   *x, *y;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9206)   EMUSHORT   *p, *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9207)   int         msign;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9208)   int         np, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9209) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9210)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9211)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9212)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9213)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9214)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9215)     return( -3 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9216)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9217) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9218)   if( ei_isnanmin( ai, nb ) || ei_isnanmin( bi, nb ) ) return( -2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9219)   if( ei_isnanmax( ai, nb ) || ei_isnanmax( bi, nb ) ) return( -2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9220)   if( ei_isnans  ( ai, nb ) || ei_isnans  ( bi, nb ) ) return( -2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9221)   if( ei_isind   ( ai, nb ) || ei_isind   ( bi, nb ) ) return( -2 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9222) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9223)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9224) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9225) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9226)   x = ai;     /* Point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9227)   y = bi;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9228)   p = ai + 1; /* Point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9229)   q = bi + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9230) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9231)   x = ai + np - 1; /* Point to Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9232)   y = bi + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9233)   p = ai + np - 2; /* Point to hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9234)   q = bi + np - 2;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9235) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9237) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9238)   /* the Sign are different */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9239)   if( *x != *y )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9240)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9241)     /* -0.0 equals +0.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9242)     for( i = 1; i < np; i++ ) /* lgw are included */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9243)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9244)       if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9245)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9246)         /* No Zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9247)         if( *x == (EMUSHORT)0 ) return(  1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9248)         else                    return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9249)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9250)       if( *q != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9251)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9252)         /* No Zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9253)         if( *x == (EMUSHORT)0 ) return(  1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9254)         else                    return( -1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9255)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9257) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9258)       ++p; ++q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9259) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9260)       --p; --q;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9261) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9262)     } /* End for( i = 1; i < np - 1; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9263) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9264)     return( 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9265) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9266)   } /* End if( *x != *y ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9267) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9268) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9269)   /* both are the same sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9270)   if( *x == (EMUSHORT)0 ) msign =  1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9271)   else                    msign = -1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9272) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9273)   for( i = 0; i < np; i++ ) /* lgw are included */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9274)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9275) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9276)     if( *x++ != *y++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9277) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9278)     if( *x-- != *y-- )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9279) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9280)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9281)       /* different */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9282) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9283)       if( *(--x) > *(--y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9284) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9285)       if( *(++x) > *(++y) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9286) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9287)         return(  msign );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9288)       else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9289)         return( -msign );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9290) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9291)     } /* End if( *x++/-- != *y++/-- ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9292) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9293)   } /* End for( i = 0; i < np; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9294) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9295)   return( 0 ); /* equality */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9296) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9297) } /* End of ei_cmp() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9298) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9299) static void ei_cvt_unpack( EMUSHORT *eia, EMUSHORT *eib, int nba, int nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9300) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9302)  Description        : ei_cvt_unpack() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  9303)                                       internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  9304)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9305) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9306)  Concepts           : convert (EIB to EIA) exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  9307)                       internal e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9308) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9309)  NOTE               : NBA > NBB.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9310)                       Для real32, real64, and real128 EIA & EIB
868b2b66 (kx 2024-12-20 16:11:07 +0300  9311)                       могут указывать на одну и туже
868b2b66 (kx 2024-12-20 16:11:07 +0300  9312)                       internal e-type data struct, т.к.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9313)                       внутренний формат этих чисел одинаков и
868b2b66 (kx 2024-12-20 16:11:07 +0300  9314)                       ei_cvt_unpack() работает с копией
868b2b66 (kx 2024-12-20 16:11:07 +0300  9315)                       EIB (p_b).
868b2b66 (kx 2024-12-20 16:11:07 +0300  9316) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9317)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9319)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9320)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9321)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9322)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9324)  Parameters         : EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9325)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9326)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9327)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9328)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9329)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9330)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9331)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9332)                       int nba;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9333)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9334)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9335)                       int nbb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9336)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9337)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9339)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  9340) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9341)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9342) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9343)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  9344)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  9345)                     *r = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9346)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9347)   EMUSHORT      *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9348)   EMUSHORT      *p_b = NULL; /* ptr to copy of EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9349)   int            denorm = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9350)   __mpu_int32_t  k;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9351)   int            npa, nea, nsa, npb, neb, nsb, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9352) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9353)   if( (nba < NBR_32) || (nbb < NBR_32) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9354)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9355)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9356)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9357)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9358)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9359)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9361)   npb = internal_np( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9362)   neb = internal_ne( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9363)   nsb = internal_ns( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9364) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9365)   /*** Allocate memory for p_b . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9366)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9367)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9368)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9369)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9370)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9371)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9372)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9373) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9374)   ei_copy( p_b, eib, nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9375) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9376)   he = p_b;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9377)   ei_cleaz( eia, nba ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  9378)                            e-type real number. (TARGET) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9379) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9380) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9381)   he += neb;     /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9382) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9383)   he += nsb + 2; /* point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9384) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9385) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9386)   npa = internal_np( nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9387)   nea = internal_ne( nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9388)   nsa = internal_ns( nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9389) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9390)   /*** Allocate memory for exone, inc, r . ********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9391)   exone = (EMUSHORT *)__mpu_sbrk( (int)(nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9392)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9393)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9394)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9395) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9396)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9397)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9398)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9399) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9400)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9401)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9402) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9403)   inc = (EMUSHORT *)__mpu_sbrk( (int)(nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9404)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9405)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9406)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9407) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9408)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9409)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9410)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9411) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9412)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9413)     __mpu_sbrk( -(int)(nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9414)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9415) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9416)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9417)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9419)   r = (EMUSHORT *)__mpu_sbrk( (int)(nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9420)   if( !r )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9421)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9422)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9424)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9425)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9426)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9427) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9428)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9429)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9430)     __mpu_sbrk( -(int)(2*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9431)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9432) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9433)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9434)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9435)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9436) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9437)   /* inc используется для хранения EXONE исходного формата */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9438)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300  9439)     но до ее основного применения она используется для:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9440)     1) проверки всех бит исходной экспоненты на 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9441)     2) проверки всех бит исходной экспоненты на 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9442)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9443)   for( i = 0; i < nea; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9444)   for( i = 0; i < nea; i++ )   r[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9446) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9447)   /* исходный формат EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9448)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9449)   pe = inc + nea - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9450)   for( i = 0; i < neb - 1; i++ ) *pe-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9451)   *pe = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9453)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9454)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9455)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9456)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9457)   for( i = 0; i < nea - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9458) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9459)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9460)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9461)   pe = r + nea - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9462)   for( i = 0; i < neb; i++ ) *pe-- = *he--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9463) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9464)   /* исходный формат EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9465)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9466)   pe = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9467)   for( i = 0; i < neb - 1; i++ ) *pe++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9468)   *pe = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9470)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9471)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9472)   p = exone + nea - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9473)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9474)   for( i = 0; i < nea - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9475) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9476)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9477)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9478)   pe = r;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9479)   for( i = 0; i < neb; i++ ) *pe++ = *he++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9480) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9481) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9482)   /* NOW *he point to Sign in the source format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9484)   /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9485)   if( *he )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9486) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9487)   *eia = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9488) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9489)   *(eia + npa - 1) = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9490) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9492) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9493)   /****************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9494)     INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  9495)    ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9497)   if( ei_cmpe( r, inc, nea ) == 0 ) /* r == inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9498)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9499)     /********
868b2b66 (kx 2024-12-20 16:11:07 +0300  9500)       NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  9501)      ********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9502)     /* indeterminacy */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9503)     if( ei_isind( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9504)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9505)       ei_ind( eia, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9506) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9507)       /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9508)       __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9509)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9510) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9511)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9512)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9513)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9514)       __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9515)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9516) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9517)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9518)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9519)     /* nanmin */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9520)     if( ei_isnanmin( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9521)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9522) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9523)       ei_nanmin( eia, eia[0] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9524) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9525)       ei_nanmin( eia, eia[nsa + nea + 2] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9526) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9527) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9528)       /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9529)       __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9530)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9531) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9532)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9533)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9534)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9535)       __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9536)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9538)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9539)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9540)     /* nanmax */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9541)     if( ei_isnanmax( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9542)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9543) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9544)       ei_nanmax( eia, eia[0] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9545) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9546)       ei_nanmax( eia, eia[nsa + nea + 2] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9547) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9548) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9549)       /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9550)       __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9551)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9552) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9553)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9554)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9555)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9556)       __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9557)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9559)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9560)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9561)     /* nans */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9562)     if( ei_isnans( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9563)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9564) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9565)       ei_nan( eia, eia[0] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9566) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9567)       ei_nan( eia, eia[nsa + nea + 2] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9568) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9569) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9570)       /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9571)       __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9572)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9573) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9574)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9575)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9576)       /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9577)       __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9578)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9580)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9581)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9582)     /**********
868b2b66 (kx 2024-12-20 16:11:07 +0300  9583)       END NANS
868b2b66 (kx 2024-12-20 16:11:07 +0300  9584)      **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9585) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9586)     ei_cleazs( eia, nba ); /* не трогать знак */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9587) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9588)     ei_infin( eia, eia[0] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9589) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9590)     ei_infin( eia, eia[nsa + nea + 2] != (EMUSHORT)0, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9591) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9593)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9594)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9595)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9596) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9597)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9598)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9599)     /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9600)     __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9601)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9602) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9603)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9604)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9605)   /**************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9606)     END INFINITY
868b2b66 (kx 2024-12-20 16:11:07 +0300  9607)    **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9608) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9609) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9610)   /* If zero Exponent, then the Significand is denormalized.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9611)      So take back the understood high Significand bit. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9612)   for( i = 0; i < nea; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9613)   if( ei_cmpe( r, inc, nea ) == 0 ) /* r == inc (inc = 0) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9614)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9615)     denorm = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9616)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9617) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9618)   /* Create EXONE of source format */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9619) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9620)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9621)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9622)   pe = inc + neb - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9623)   for( i = 0; i < neb - 1; i++ ) *pe-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9624)   *pe = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9625) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9626)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9627)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9628)   pe = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9629)   for( i = 0; i < neb - 1; i++ ) *pe++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9630)   *pe = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9631) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9632) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9633)   /* r += EXONEtarget - EXONEsource */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9634)   ei_sube( exone, exone,   inc, nea );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9635)   ei_adde(     r,     r, exone, nea );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9636)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9637) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9638)   ei_cpye_unpack( &eia[1],     r, nea, nea );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9639) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9640)   ei_cpye_unpack( &eia[nsa+2], r, nea, nea );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9641) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9642) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9643)   /* Copy Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9644) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9645)   pe = &eia[nea + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9646)   he = &p_b[neb + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9647)   for( i = 0; i < nsb; i++ ) *pe++ = *he++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9648) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9649)   pe = &eia[nsa];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9650)   he = &p_b[nsb];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9651)   for( i = 0; i < nsb; i++ ) *pe-- = *he--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9652) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9653) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9654) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9655)   if( denorm )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9656)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9657)     /* if zero Exponent, then normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9658)     if( (k = ei_normalize(eia, nba)) > (__mpu_int32_t)EINSBITS(nba) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9659)       ei_cleazs( eia, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9660)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9661)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9662)       /* Exponent -= (k - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9663)       k -= 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9664)       ei_cvte_unpack( inc, (EMUSHORT *)&k, nea, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9665) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9666)       p = &eia[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9667) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9668)       p = &eia[nsa+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9669) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9670)       ei_sube( p, p, inc, nea );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9671)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9672)   } /* End if( denorm ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9673) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9674)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9675)   __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9676)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9678)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9679)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9680)   /* FREE r *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9681)   __mpu_sbrk( -(int)(3*nea*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9682)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9683) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9684) } /* End of ei_cvt_unpack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9685) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9686) static void ei_cvt_pack( EMUSHORT *eia, EMUSHORT *eib, int nba, int nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9687) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9688) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9689)  Description        : ei_cvt_pack() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300  9690)                                     internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300  9691)                                     struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9692) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9693)  Concepts           : convert (EIB to EIA) exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300  9694)                       internal e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9695) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9696)  NOTE               : NBA < NBB.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9697) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9698)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300  9699) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9700)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300  9701)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9702)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9703)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300  9704) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9705)  Parameters         : EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9706)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9707)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9708)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9709)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300  9710)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9711)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9712)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9713)                       int nba;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9714)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9715)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9716)                       int nbb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300  9717)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300  9718)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9719) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9720)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300  9721) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9722)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9723) {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9724)   EMUSHORT   *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  9725)                *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300  9726)                *inc = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9727)   EMUSHORT   *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9728)   EMUSHORT   *he, *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9729)   EMUSHORT   *p_b = NULL; /* ptr to copy EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9730)   int         rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9731)   int         npb, neb, nsb, nea, nsa, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9732) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9733)   errno = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9734) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9735)   if( (nba < NBR_32) || (nbb < NBR_32) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9736)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9737)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9738)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9739)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9740)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9741)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9742) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9743)   npb = internal_np( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9744)   neb = internal_ne( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9745)   nsb = internal_ns( nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9746) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9747)   nea = internal_ne( nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9748)   nsa = internal_ns( nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9749) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9750)   /*** Allocate memory for p_b . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9751)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9752)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9753)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9754)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9755)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9756)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9757)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9758) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9759)   ei_copy( p_b, eib, nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9760) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9761)   ei_signull( eia, (unsigned)0, nba ); /* clear out exploded internal
868b2b66 (kx 2024-12-20 16:11:07 +0300  9762)                                           e-type real number. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9763) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9764)   if( ei_isind( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9765)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9766)     ei_ind( eia, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9767) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9768)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9769)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9770)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9771) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9772)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9773)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9774) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9775)   if( ei_isnanmin( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9776)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9777)     ei_nanmin( eia, (unsigned)ei_isneg( p_b, nbb ), nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9778) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9779)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9780)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9781)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9782) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9783)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9784)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9785) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9786)   if( ei_isnanmax( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9787)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9788)     ei_nanmax( eia, (unsigned)ei_isneg( p_b, nbb ), nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9789) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9790)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9791)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9792)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9793) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9794)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9795)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9796) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9797)   if( ei_isnans( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9798)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9799)     ei_nan( eia, (unsigned)ei_isneg( p_b, nbb ), nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9800) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9801)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9802)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9803)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9805)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9806)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9807) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9808) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9809)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9810)   exone = (EMUSHORT *)__mpu_sbrk( (int)((neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9811)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9812)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9813)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9814) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9815)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9816)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9817)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9818) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9819)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9820)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9821) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9822)   exp = (EMUSHORT *)__mpu_sbrk( (int)((neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9823)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9824)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9825)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9826) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9827)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9828)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9829)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9830) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9831)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9832)     __mpu_sbrk( -(int)((neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9833)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9834) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9835)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9836)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9837) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9838)   inc = (EMUSHORT *)__mpu_sbrk( (int)((neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9839)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9840)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9841)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9842) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9843)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9844)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9845)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9846) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9847)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9848)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9849)     __mpu_sbrk( -(int)(2*(neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9850)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9851) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9852)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9853)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9854)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9855) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9856)   for( i = 0; i < neb+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9857)   for( i = 0; i < neb+1; i++ ) exp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9858) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9859) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9860)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9861)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9862)   pe = inc + neb;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9863)   for( i = 0; i < nea - 1; i++ ) *pe-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9864)   *pe = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9866)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9867)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9868)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9869)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9870)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9871)   for( i = 0; i < neb - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9872) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9873)   /* целевой формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9874)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9875)   pe = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9876)   for( i = 0; i < nea - 1; i++ ) *pe++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9877)   *pe = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9878) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9879)   /* исходный формат EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9880)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9881)   p = exone + neb;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9882)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9883)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9884)   for( i = 0; i < neb - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9885) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9886) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9887)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9888) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9889)   ei_cpye_unpack( exp, &p_b[1],     neb+1, neb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9890) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9891)   ei_cpye_unpack( exp, &p_b[nsb+2], neb+1, neb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9892) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9893) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9894)   /* exp = exp - (EXONEsource - EXONEtarget) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9895)   ei_sube( exone, exone,   inc, neb+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9896)   ei_sube(   exp,   exp, exone, neb+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9897) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9898)   if( !ei_isinfin( p_b, nbb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9899)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9900)     rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9901)     rndprc = (int)EINSBITS(nbb);
868b2b66 (kx 2024-12-20 16:11:07 +0300  9902)     /*****************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300  9903)       Здесь все равно какое значение RNDPRC, т.к. если оно не равно
868b2b66 (kx 2024-12-20 16:11:07 +0300  9904)       (24 или 53), то ei_mdenorm() округляет путем отбрасывания lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300  9905)       данного ей числа в internal формате. Ловить здесь 24 или 53
868b2b66 (kx 2024-12-20 16:11:07 +0300  9906)       нет смысла (т.к. это будет сделано во время неминуемой
868b2b66 (kx 2024-12-20 16:11:07 +0300  9907)       последующей упаковки в external формат), а вот далее при
868b2b66 (kx 2024-12-20 16:11:07 +0300  9908)       копировании мантиссы можно заполнить lgw целевого формата
868b2b66 (kx 2024-12-20 16:11:07 +0300  9909)       для более точного округления при последующей упаковке.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9910)       Мы использовали rndprc = (int)EINSBITS(nb); для того, чтобы
868b2b66 (kx 2024-12-20 16:11:07 +0300  9911)       избежать ошибок при больших размерах EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300  9912)      ******************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9913)     ei_mdenorm( p_b, 0, 0, exp, (int)EINSBITS(nbb), nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9914)     rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9915)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9916) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9917)   he = eia;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9918) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9919) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300  9920)   he += nea + nsa + 2; /* point to Sign of TARGET */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9921) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9922) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9923) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9924)   p = p_b;             /* point to Sign of SOURCE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9925) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9926)   p = p_b + npb - 1;   /* point to Sign of SOURCE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9927) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9928) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9929)   if( *p )
868b2b66 (kx 2024-12-20 16:11:07 +0300  9930)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9931)     *he = MASK_ALL_BITS; /* output Sign bit */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9932)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300  9933) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9934) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9935)   p += neb; /* NOW: p point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9936) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9937)   p -= neb; /* NOW: p point to low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9938) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9940)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9941) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9942)   ei_cpye_unpack( exp, &p_b[1],     neb+1, neb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9943) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9944)   ei_cpye_unpack( exp, &p_b[nsb+2], neb+1, neb );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9945) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9946) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9947) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9948)   /* целевой формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9949)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9950)   pe = inc + neb;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9951)   for( i = 0; i < nea - 1; i++ ) *pe-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9952)   *pe = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9953) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9954)   /* целевой формат HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9955)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9956)   pe = inc;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9957)   for( i = 0; i < nea - 1; i++ ) *pe++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9958)   *pe = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9959) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300  9960) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9961) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9962)   /* Handle overflow cases. */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9963)   if( ei_cmpe( exp, inc, neb+1 ) >= 0 ) /* exp >= HIGHT_EXP */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9964)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300  9965)     ei_infin( eia, (unsigned)ei_isneg( p_b, nbb ), nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9966)     errno = ERANGE; /* USER's Variable */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9967)     __STOVF; /* Set REAL Overflow Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9969)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9970)     __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9971)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9972) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9973)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9974)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9975)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9976)     __mpu_sbrk( -(int)(3*(neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300  9977)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300  9978) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9979)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9981)   } /* End if( exp >= HIGHT_EXP ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9982) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9983) 
868b2b66 (kx 2024-12-20 16:11:07 +0300  9984)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9985)   /* High order output already has sign bit set, and
868b2b66 (kx 2024-12-20 16:11:07 +0300  9986)      p point to low part of Exponent of SOURCE */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9987) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300  9988)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9989)   he = &eia[nea];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9990)   pe = p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9991)   for( i = 0; i < nea - 1; i++ ) *he-- = *pe--;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9992)   *he = *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9993) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300  9994)   /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300  9995)   he = &eia[nsa + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300  9996)   pe = p;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9997)   for( i = 0; i < nea - 1; i++ ) *he++ = *pe++;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9998)   *he = *pe;
868b2b66 (kx 2024-12-20 16:11:07 +0300  9999) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10001)   /* Copy Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10002)   /***********************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10003)     Я ВКЛЮЧИЛ lgw ДЛЯ БОЛЕЕ ТОЧНОГО ОКРУГЛЕНИЯ ПРИ
868b2b66 (kx 2024-12-20 16:11:07 +0300 10004)     ПОСЛЕДУЮЩИХ ОПЕРАЦИЯХ С ПОЛУЧЕННЫМ ЧИСЛОМ.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10005)     SEE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10006)       for( i = 0; i < nSa + 1; i++ ) *he++/-- = *pe++/--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10007)                      =======
868b2b66 (kx 2024-12-20 16:11:07 +0300 10008)    ***********************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10009) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10010)   pe = &p_b[neb + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10011)   he = &eia[nea + 2];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10012)   for( i = 0; i < nsa/* + 1*/; i++ ) *he++ = *pe++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10013) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10014)   pe = &p_b[nsb];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10015)   he = &eia[nsa];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10016)   for( i = 0; i < nsa/* + 1*/; i++ ) *he-- = *pe--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10017) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10018) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10019)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10020)   __mpu_sbrk( -(int)(npb*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10021)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10022) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10023)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10024)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10025)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10026)   __mpu_sbrk( -(int)(3*(neb+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10027)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10028) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10029) } /* End of ei_cvt_pack() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10030) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10031) void ei_convert( EMUSHORT *eia, EMUSHORT *eib, int nba, int nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10032) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10034)  Description        : ei_convert() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10035)                                    internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10037)  Concepts           : convert (EIB to EIA) exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300 10038)                       internal e-type real number.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10039) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10040)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10042)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10043) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10044)  Parameters         : EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10045)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10046)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10047)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10048)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10049)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10050)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10051)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10052)                       int nba;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10053)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10054)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10055)                       int nbb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10056)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10057)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10058) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10059)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10060) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10061)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10062) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10063) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10064)   if( nba == nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10065)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10066)     ei_copy( eia, eib, nba );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10067)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10068)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10069)   if( nba  > nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10070)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10071)     ei_cvt_unpack( eia, eib, nba, nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10072)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10073)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10074)   if( nba  < nbb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10075)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10076)     ei_cvt_pack( eia, eib, nba, nbb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10077)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10078)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10079) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10080) } /* End of ei_convert() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10081) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10082) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10084) static int subflag = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10085) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10086) static void ei_add1( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10087) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10088) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10089)  Description        : ei_add1() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10090)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10091) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10092)  Concepts           : Arithmetic common to both addition and
868b2b66 (kx 2024-12-20 16:11:07 +0300 10093)                       substraction.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10094)                       EIC = EIA + EIB or
868b2b66 (kx 2024-12-20 16:11:07 +0300 10095)                       EIC = EIA - EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10096) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10097)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10098) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10099)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10100)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10101)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10102)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10104)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10105)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10106)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10107)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10108)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10109)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10110)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10111)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10112)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10113)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10114)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10115)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10116)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10117)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10118)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10119)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10120) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10121)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10123)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10124) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10125)   EMUSHORT      *lt  = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10126)                 *lta = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10127)                 *ltb = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10128)                 *inc = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10129)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10130)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10131)   int            rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10132)   int            lost, k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10133)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10135)   if( ei_isinfin( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10136)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10137)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10138)     if( subflag )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10139)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10140)       ei_neg( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10141)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10142)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10143)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10144) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10145)   if( ei_isinfin( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10146)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10147)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10148)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10149)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10150) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10151)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10152)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10153)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10154) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10155)   /*** Allocate memory for lt, lta, ltb, inc . ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10156)   lt = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10157)   if( !lt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10158)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10159)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10160)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10161)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10162) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10163)   lta = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10164)   if( !lta )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10165)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10166)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10167) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10168)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10169)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10170)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10172)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10173)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10175)   ltb = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10176)   if( !ltb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10177)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10178)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10179) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10180)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10181)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10182)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10183)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10184) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10185)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10186)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10187) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10188)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10189)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10190)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10191)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10192) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10193)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10194)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10195)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10196)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10197)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10199)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10200)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10201)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10203)   if( nb < NBR_128 ) nb = NBR_128; /* т.к. NSBITS(32) = 16,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10204)                                            NSBITS(64) = 48,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10205)                                       остальные работают верно. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10206) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10207)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10208)   for( i = 0; i < ne+1; i++ ) lt [i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10209)   for( i = 0; i < ne+1; i++ ) lta[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10210)   for( i = 0; i < ne+1; i++ ) ltb[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10211) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10212)   if( subflag )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10213)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10214) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10215)     eib[0] = ~eib[0]; 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10216) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10217)     eib[ne+ns+2] = ~eib[ne+ns+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10218) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10219)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10220) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10221)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10222) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10223)   ei_cpye_unpack( lta, &eia[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10224)   ei_cpye_unpack( ltb, &eib[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10225) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10226)   ei_cpye_unpack( lta, &eia[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10227)   ei_cpye_unpack( ltb, &eib[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10228) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10229) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10230)   /* Compate Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10231)   ei_sube( lt, ltb, lta, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10232)   if( ei_cmpe( lt, inc, ne+1 ) > 0 ) /* lt > 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10233)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10234)     /* put the larger number in EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10235)     ei_copyzlgw( eic, eia, nb ); /* EIC <- EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10236)     ei_copyzlgw( eia, eib, nb ); /* EIA <- EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10237)     ei_copyzlgw( eib, eic, nb ); /* EIB <- EIC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10238)     /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10239) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10240)     ei_cpye_unpack( lta, &eia[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10241) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10242)     ei_cpye_unpack( lta, &eia[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10243) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10244)     ei_nege( lt, lt, ne+1 ); /* lt = -lt; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10245)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10246)   lost = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10247)   if( ei_cmpe( lt, inc, ne+1 ) != 0 ) /* lt != 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10248)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10249)     j = -((__mpu_int32_t)NSBITS(nb))-1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10250)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10251)     if( ei_cmpe( lt, inc, ne+1 ) < 0 ) /* lt < (-NSBITS-1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10252)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10253)       /* answer same as larger addend */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10254)       ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10255) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10256)       /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10257)       /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10258)       /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10259)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10260)       __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10261)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10262) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10263)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10264)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10265)     ei_cvte_pack( (EMUSHORT *)&j, lt, 1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10266)     /* shift the smaller number down */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10267)     lost = ei_shift( eib, (int)j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10268)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10269)   else /* т.е. lt == 0L */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10270)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10271)     /* Exponents were the same, so must compare Significands */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10272)     k = ei_cmpm( eib, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10273)     if( k == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10274)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10275)       /* the numbers are identical in magnitude */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10276)       /* if different signs, result is zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10277) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10278)       if( eia[0] != eib[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10279) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10280)       if( eia[np-1] != eib[np-1] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10281) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10282)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10283)         ei_signull( eic, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10285)         /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10286)         /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10287)         /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10288)         /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10289)         __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10290)         /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10291) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10292)         return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10293)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10294) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10295)       /* if same sign, result is double */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10296)       /* double denormalized tiny number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10297)       for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10298) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10299)       p = &eia[ne+2];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10300)       if( (ei_cmpe( &eia[1], inc, ne ) == 0) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 10301)          ((*p & MASK_SIGN) == (EMUSHORT)0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10302) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10303)       p = &eia[ns];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10304)       if( (ei_cmpe( &eia[ns+2], inc, ne ) == 0) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 10305)          ((*p & MASK_SIGN) == (EMUSHORT)0) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10306) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10307)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10308)         ei_shup( eia, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10310)         ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10311) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10312)         /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10313)         /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10314)         /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10315)         /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10316)         __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10317)         /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10319)         return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10320)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10321) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10322)       /* add 1 to Exponent unless both are zero! */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10323) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10324)       p = &eia[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10325) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10326)       p = &eia[ne+ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10327) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10328)       for( i = 1; i < np - 1; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10329)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10330)         if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10331)         {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10332)            /* This could overflow,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10333)               but let ei_copy() take care of that. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10334)            ei_ince( lta, lta, ne+1 ); /* lta += 1; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10335)            break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10336)         }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10337) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10338)         ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10339) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10340)         --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10341) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10342)       } /* End for( i = 1; i < np - 1; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10343) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10344)       ei_cpye_pack( &eia[1],    lta, ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10345) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10346)       ei_cpye_pack( &eia[ns+2], lta, ne, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10347) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10348)       ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10349) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10350)       /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10351)       /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10352)       /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10353)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10354)       __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10355)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10357)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10358) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10359)     } /* End if( k == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10360)     if( k > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10361)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10362)       /* put the larger number in EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10363)       ei_copyzlgw( eic, eia, nb ); /* EIC <- EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10364)       ei_copyzlgw( eia, eib, nb ); /* EIA <- EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10365)       ei_copyzlgw( eib, eic, nb ); /* EIB <- EIC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10366) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10367)     } /* End if( k > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10369)   } /* End if( lt != 0L ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10370) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10371) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10372) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 10373)   if( eia[0] == eib[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10374) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10375)   if( eia[np-1] == eib[np-1] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10376) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 10377)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10378)     ei_addm( eia, eia, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10379)     subflag = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10380)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10381)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 10382)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10383)     ei_subm( eia, eia, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10384)     subflag = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10385)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10386) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10387)   rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10388)   rndprc = (int)EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 10389)   /*****************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10390)     Здесь все равно какое значение RNDPRC, т.к. если оно не равно
868b2b66 (kx 2024-12-20 16:11:07 +0300 10391)     (24 или 53), то ei_mdenorm() округляет путем отбрасывания lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 10392)     данного ей числа в internal формате.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10393)     Мы использовали rndprc = (int)EINSBITS(nb); для того, чтобы
868b2b66 (kx 2024-12-20 16:11:07 +0300 10394)     избежать ошибок при больших размерах EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10395)    ******************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10396)   ei_mdenorm( eia, lost, subflag, lta, (int)EINSBITS(nb), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10397)   rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10398) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10399)   ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10400) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10401)   /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10402)   /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10403)   /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10404)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10405)   __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10406)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10407) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10408) } /* End of ei_add1() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10410) void ei_add( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10411) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10412) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10413)  Description        : ei_add() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10414)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10415) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10416)  Concepts           : EIC = EIA + EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10417) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10418)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10419) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10420)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10421)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10422) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10423)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10424)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10425)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10426)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10427)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10428)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10429)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10430)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10431)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10432)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10433)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10434)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10435)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10436)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10437)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10438)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10440)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10441) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10442)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10443) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10444)   EMUSHORT *p_a = NULL, *p_b = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10445)   int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10446) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10447)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10448) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10449)   /*** Allocate memory for p_a, p_b . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10450)   p_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10451)   if( !p_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10452)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10453)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10454)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10455)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10456) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10457)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10458)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10459)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10460)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10461) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10462)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10463)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10464)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10465) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10466)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10467)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10468)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10470) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10471)   ei_copy( p_a, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10472)   ei_copy( p_b, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10473) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10474)   /* EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10475)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10476)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10477)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10478)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10479)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10480)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10481)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10482)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10483)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10484)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10485)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10486)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10487)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10488) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10489)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10490)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10491)     _mtherr( eic, (__mpu_char8_t *)"add", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10492)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10493) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10494)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10495)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10496)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10497)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10498) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10499)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10500)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10501)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10502)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10503)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10504)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10505) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10506)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10507)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10508)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10509)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10510) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10511)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10512)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10513) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10514)   /* EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10515)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10516)   if( ei_isind( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10517)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10518)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10519)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10520)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10521)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10522)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10523)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10524)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10525)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10526)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10527)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10528) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10529)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10530)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10531)     _mtherr( eic, (__mpu_char8_t *)"add", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10532)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10533) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10534)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10535)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10536)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10537)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10538) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10539)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10540)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10541)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10542)   if( ei_isnans( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10543)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10544)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10545) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10546)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10547)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10548)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10549)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10550) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10551)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10552)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10553) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10554)   /* Infinity minus infinity is a InD.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10555)     Test for adding infinities of opposite signs. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10556)   if( ei_isinfin( eia, nb ) && ei_isinfin( eib, nb ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 10557)       (ei_isneg( eia, nb ) ^ ei_isneg( eib, nb )) != 0  )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10558)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10559)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10560)     ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10561)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10562)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10563)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10564)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10565)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10566)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10567)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10568)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10569) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10570)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10571)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10572)     _mtherr( eic, (__mpu_char8_t *)"sub", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10573)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10575)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10576)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10577)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10578)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10580)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10581)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10583)   subflag = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10584)   ei_add1( eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10585) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10586)   /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10587)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10588)   __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10589)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10590) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10591) } /* End of ei_add() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10593) void ei_sub( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10594) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10595) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10596)  Description        : ei_sub() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10597)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10598) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10599)  Concepts           : EIC = EIA - EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10600) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10601)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10602) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10603)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10604)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10605) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10606)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10607)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10608)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10609)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10610)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10611)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10612)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10613)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10614)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10615)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10616)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10617)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10618)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10619)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10620)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10621)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10622) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10623)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10624) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10625)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10626) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10627)   EMUSHORT *p_a = NULL, *p_b = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10628)   int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10629) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10630)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10631) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10632)   /*** Allocate memory for p_a, p_b . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10633)   p_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10634)   if( !p_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10635)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10636)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10637)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10638)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10639) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10640)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10641)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10642)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10643)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10644) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10645)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10646)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10647)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10648) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10649)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10650)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10651)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10652) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10653)   ei_copy( p_a, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10654)   ei_copy( p_b, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10655) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10656)   /* EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10657)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10658)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10659)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10660)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10661)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10662)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10663)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10664)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10665)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10666)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10667)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10668)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10669)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10670) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10671)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10672)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10673)     _mtherr( eic, (__mpu_char8_t *)"sub", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10674)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10675) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10676)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10677)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10678)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10679)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10680) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10681)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10682)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10683)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10684)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10685)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10686)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10688)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10689)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10690)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10691)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10692) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10693)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10694)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10695) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10696)   /* EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10697)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10698)   if( ei_isind( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10699)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10700)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10701)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10702)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10703)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10704)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10705)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10706)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10707)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10708)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10709)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10710) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10711)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10712)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10713)     _mtherr( eic, (__mpu_char8_t *)"sub", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10714)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10715) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10716)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10717)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10718)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10719)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10720) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10721)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10722)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10723)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10724)   if( ei_isnans( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10725)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10726)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10727) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10728)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10729)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10730)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10731)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10732) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10733)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10734)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10735) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10736)   /* Infinity minus infinity is a InD.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10737)     Test for adding infinities of opposite signs. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10738)   if( ei_isinfin( eia, nb ) && ei_isinfin( eib, nb ) &&
868b2b66 (kx 2024-12-20 16:11:07 +0300 10739)       (ei_isneg( eia, nb ) ^ ei_isneg( eib, nb )) == 0  )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10740)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10741)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10742)     ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10743)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10744)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10745)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10746)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10747)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10748)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10749)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10750)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10751) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10752)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10753)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10754)     _mtherr( eic, (__mpu_char8_t *)"sub", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10755)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10756) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10757)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10758)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10759)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10760)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10761) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10762)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10763)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10765) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10766)   subflag = 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10767)   ei_add1( eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10768) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10769)   /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10770)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10771)   __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10772)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10773) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10774) } /* End of ei_sub() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10775) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10777) void ei_div( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10778) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10779) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10780)  Description        : ei_div() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 10781)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10782) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10783)  Concepts           : EIC = EIA / EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10784) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10785)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10786) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10787)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10788)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 10789) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10790)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 10791)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10792)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10793)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10794)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10795)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10796)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10797)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10798)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10799)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 10800)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10801)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10802)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10803)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 10804)                                                 external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 10805)                                                 data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10806) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10807)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 10808) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10809)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10810) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10811)   EMUSHORT        *p_a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10812)                   *p_b = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10813)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10814)                   *lt  = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10815)                   *lta = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10816)                   *ltb = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10817)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10818)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10819)   int            k, rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10820)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10821) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10822) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10823)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10824) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10825) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10826)   /*** Allocate memory for p_a, p_b . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10827)   p_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10828)   if( !p_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10829)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10830)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10831)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10832)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10833) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10834)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10835)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10836)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10837)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10838) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10839)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10840)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10841)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10842) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10843)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10844)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10845)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10846) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10847) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10848)   ei_copy( p_a, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10849)   ei_copy( p_b, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10850) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10851)   /* EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10852)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10853)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10854)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10855)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10856)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10857)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10858)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10859)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10860)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10861)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10862)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10863)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10864)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10866)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10867)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10868)     _mtherr( eic, (__mpu_char8_t *)"div", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10869)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10870) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10871)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10872)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10873)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10874)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10875) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10876)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10877)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10878)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10879)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10880)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10881)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10882) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10883)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10884)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10885)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10886)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10887) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10888)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10889)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10890) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10891)   /* EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10892)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10893)   if( ei_isind( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10894)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10895)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10896)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10897)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10898)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10899)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10900)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10901)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10902)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10903)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10904)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10905) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10906)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10907)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10908)     _mtherr( eic, (__mpu_char8_t *)"div", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10909)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10910) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10911)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10912)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10913)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10914)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10915) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10916)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10917)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10918)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10919)   if( ei_isnans( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10920)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10921)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10922) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10923)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10924)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10925)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10926)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10927) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10928)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10929)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10930) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10931)   /* Zero over zero, or infinity over infinity, is a InD. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10932)   if( ( ei_isinfin( eia, nb )   && ei_isinfin( eib, nb )   ) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 10933)       ( ei_issignull( eia, nb ) && ei_issignull( eib, nb ) )   )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10934)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10935)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10936)     ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10937)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 10938)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 10939)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 10940)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10941)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 10942)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 10943)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 10944)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 10945) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10946)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 10947)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10948)     _mtherr( eic, (__mpu_char8_t *)"div", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10949)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10950) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10951)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10952)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10953)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10954)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10955) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10956)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10957)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10958) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10959)   /* Infinity over anything else is infinity. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10960)   if( ei_isinfin( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10961)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10962)     ei_infin( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10963)               (unsigned)(ei_isneg( eia, nb ) ^ ei_isneg( eib, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 10964)               nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10965) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10966)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10967)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10968)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10969)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10970) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10971)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10972)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10973) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10974)   /* Anything else over infinity is zero */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10975)   if( ei_isinfin( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10976)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10977)     ei_signull( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 10978)                 (unsigned)(ei_isneg( eia, nb ) ^ ei_isneg( eib, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 10979)                 nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10981)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10982)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10983)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10984)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10985) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10986)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 10987)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 10988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10989) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10990)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10991)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10992) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10993)   /*** Allocate memory for lt, lta, ltb, exone . **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 10994)   lt = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 10995)   if( !lt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 10996)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 10997)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 10998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 10999)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11000)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11001)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11002)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11003) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11004)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11005)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11006) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11007)   lta = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11008)   if( !lta )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11009)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11010)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11011) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11012)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11013)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11014)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11015)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11017)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11018)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11019)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11020) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11021)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11022)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11023) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11024)   ltb = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11025)   if( !ltb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11026)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11027)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11028) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11029)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11030)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11031)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11032)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11033) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11034)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11035)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11036)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11037)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11038) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11039)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11040)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11042)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11043)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11044)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11045)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11046) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11047)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11048)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11049)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11050)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11051) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11052)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11053)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11054)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11055)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11056)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11057) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11058)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11059)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11060)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11061) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11062) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11063)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11064) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11065)   ei_cpye_unpack( lta, &p_a[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11066)   ei_cpye_unpack( ltb, &p_b[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11067) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11068)   ei_cpye_unpack( lta, &p_a[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11069)   ei_cpye_unpack( ltb, &p_b[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11070) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11071) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11072) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11073)   for( i = 0; i < ne+1; i++ ) exone[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11074) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11075)   if( ei_cmpe( &p_a[1],    exone, ne ) == 0 ) /* exp( a ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11076) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11077)   if( ei_cmpe( &p_a[ns+2], exone, ne ) == 0 ) /* exp( a ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11078) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11079)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11080)     /* See if numerator is zero. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11081) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11082)     p = &p_a[ne + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11083) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11084)     p = &p_a[ns + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11085) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11086)     for( i = 0; i < ns+2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11087)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11088)       if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11089)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11090)         /* lta -= ei_normalize( p_a, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11091)         j = ei_normalize( p_a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11092)         ei_cvte_unpack( exone, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11093)         ei_sube( lta, lta, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11094)         goto dnzro1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11095)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11096) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11097)       p++; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11098) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11099)       p--; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11100) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11101)     } /* End for( i = 0; i < ns+2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11102)     ei_signull( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11103)                 (unsigned)(ei_isneg( p_a, nb ) ^ ei_isneg( p_b, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 11104)                 nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11105) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11106)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11107)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11108)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11109)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11110) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11111)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11112)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11113)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11114)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11115)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11116)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11118)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11120)   } /* End if( exp( a ) == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11121) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11122) dnzro1:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11123) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11124)   for( i = 0; i < ne+1; i++ ) exone[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11125) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11126)   if( ei_cmpe( &p_b[1],    exone, ne ) == 0 ) /* exp( b ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11127) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11128)   if( ei_cmpe( &p_b[ns+2], exone, ne ) == 0 ) /* exp( b ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11129) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11130)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11131)     /* possible divide by zero. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11132) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11133)     p = &p_b[ne + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11134) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11135)     p = &p_b[ns + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11136) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11137)     for( i = 0; i < ns+2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11138)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11139)       if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11140)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11141)         /* ltb -= ei_normalize( p_b, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11142)         j = ei_normalize( p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11143)         ei_cvte_unpack( exone, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11144)         ei_sube( ltb, ltb, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11145)         goto dnzro2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11146)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11147) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11148)       p++; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11149) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11150)       p--; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11151) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11152)     } /* End for( i = 0; i < ns+2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11153) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11154)     /* Divide by zero is not an invalid operation.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11155)        It is a divide-by-zero operation! */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11156)     ei_infin( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11157)               (unsigned)(ei_isneg( p_a, nb ) ^ ei_isneg( p_b, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 11158)               nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11159)     /* Set SING for divide-by-zero operation! */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11160)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11161)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11162)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11163)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11164)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11165)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 11166)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11167)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11168) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11169)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11170)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11171)     _mtherr( eic, (__mpu_char8_t *)"div", __SING__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11172)     __STSNG; /* Set REAL Singularity Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11174)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11175)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11176)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11177)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11178) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11179)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11180)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11181)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11182)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11183)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11184)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11185) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11186)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11187) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11188)   } /* End if( exp( b ) == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11190) dnzro2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11191) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11192) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11193)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11194)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11195)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11196)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11197)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11198)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11199) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11200)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11201)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11202)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11203)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11204)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11205)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11206) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11207) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11208) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11209)   k = ei_divm( p_a, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11210)   /* Calculate Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11211)   /* lt = lta - ltb + EXONE; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11212)   ei_sube( lt, lta,  ltb, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11213)   ei_adde( lt, lt, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11214) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11215)   rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11216)   rndprc = (int)EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 11217)   /*****************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11218)     Здесь все равно какое значение RNDPRC, т.к. если оно не равно
868b2b66 (kx 2024-12-20 16:11:07 +0300 11219)     (24 или 53), то ei_mdenorm() округляет путем отбрасывания lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 11220)     данного ей числа в internal формате.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11221)     Мы использовали rndprc = (int)EINSBITS(nb); для того, чтобы
868b2b66 (kx 2024-12-20 16:11:07 +0300 11222)     избежать ошибок при больших размерах EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11223)    ******************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11224)   ei_mdenorm( p_a, k, 0, lt, (int)EINSBITS(nb), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11225)   rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11226) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11227)   ei_copy( eic, p_a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11229)   /* Set the Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11230) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11231)   p = eic;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11232) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11233)   p = eic + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11234) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11235) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11236)   if( ei_isneg( p_a, nb ) ^
868b2b66 (kx 2024-12-20 16:11:07 +0300 11237)       ei_isneg( p_b, nb )  ) *p = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11238)   else                       *p = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11240)   /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11241)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11242)   __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11243)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11244) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11245)   /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11246)   /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11247)   /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11248)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11249)   __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11250)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11251) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11252) } /* End of ei_div() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11253) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11254) void ei_mul( EMUSHORT *eic, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11255) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11257)  Description        : ei_mul() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 11258)                                internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11260)  Concepts           : EIC = EIA * EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11261) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11262)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11263) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11264)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11265)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11266) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11267)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11268)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11269)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11270)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11271)                                        TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11272)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11273)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11274)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11275)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11276)                       EMUSHORT *eib; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11277)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11278)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11279)                                        ;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11280)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11281)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11282)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11284)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 11285) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11286)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11287) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11288)   EMUSHORT        *p_a = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11289)                   *p_b = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11290)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11291)                   *lt  = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11292)                   *lta = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11293)                   *ltb = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11294)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11295)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11296)   int            k, rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11297)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11298) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11299) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11300)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11302) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11303)   /*** Allocate memory for p_a, p_b . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11304)   p_a = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11305)   if( !p_a )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11306)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11307)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11308)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11309)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11310) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11311)   p_b = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11312)   if( !p_b )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11313)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11314)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11316)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11317)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11318)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11319) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11320)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11321)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11322)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11324) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11325)   ei_copy( p_a, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11326)   ei_copy( p_b, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11328)   /* EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11329)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11330)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11331)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11332)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11333)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11334)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11335)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11336)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11337)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11338)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11339)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 11340)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11341)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11342) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11343)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11344)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11345)     _mtherr( eic, (__mpu_char8_t *)"mul", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11346)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11347) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11348)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11349)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11350)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11351)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11352) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11353)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11354)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11355)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11356)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11357)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11358)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11359) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11360)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11361)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11362)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11363)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11364) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11365)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11366)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11367) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11368)   /* EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11369)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11370)   if( ei_isind( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11371)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11372)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11373)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11374)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11375)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11376)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11377)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11378)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11379)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 11380)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11381)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11382) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11383)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11384)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11385)     _mtherr( eic, (__mpu_char8_t *)"mul", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11386)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11387) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11388)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11389)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11390)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11391)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11392) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11393)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11394)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11395)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11396)   if( ei_isnans( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11397)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11398)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11399) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11400)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11401)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11402)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11403)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11404) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11405)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11406)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11407) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11408) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11409)   /* Zero over zero, or infinity over infinity, is a InD. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11410)   if( ( ei_isinfin( eia, nb ) && ei_issignull( eib, nb ) ) ||
868b2b66 (kx 2024-12-20 16:11:07 +0300 11411)       ( ei_isinfin( eib, nb ) && ei_issignull( eia, nb )     ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11412)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11413)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11414)     ei_ind( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11415)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11416)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11417)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 11418)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11419)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 11420)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 11421)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 11422)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11423) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11424)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11425)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11426)     _mtherr( eic, (__mpu_char8_t *)"mul", __INVALID__, eic, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11427)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11428) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11429)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11430)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11431)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11432)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11434)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11435)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11436) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11437)   /* Infinity over anything else is infinity. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11438)   if( ei_isinfin( eia, nb ) || ei_isinfin( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11439)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11440)     ei_infin( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11441)               (unsigned)(ei_isneg( eia, nb ) ^ ei_isneg( eib, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 11442)               nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11443) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11444)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11445)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11446)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11447)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11448) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11449)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11450)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11451) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11453)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11454)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11455) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11456)   /*** Allocate memory for lt, lta, ltb, exone . **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11457)   lt = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11458)   if( !lt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11459)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11460)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11461) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11462)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11463)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11464)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11465)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11467)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11468)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11469) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11470)   lta = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11471)   if( !lta )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11472)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11473)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11474) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11475)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11476)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11477)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11478)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11479) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11480)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11481)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11482)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11483) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11484)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11485)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11486) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11487)   ltb = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11488)   if( !ltb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11489)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11490)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11491) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11492)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11493)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11494)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11495)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11497)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11498)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11499)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11500)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11501) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11502)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11503)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11504) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11505)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11506)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11507)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11508)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11509) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11510)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11511)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11512)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11513)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11514) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11515)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11516)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11517)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11518)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11519)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11520) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11521)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11522)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11523)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11524) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11525) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11526)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11527) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11528)   ei_cpye_unpack( lta, &p_a[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11529)   ei_cpye_unpack( ltb, &p_b[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11530) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11531)   ei_cpye_unpack( lta, &p_a[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11532)   ei_cpye_unpack( ltb, &p_b[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11533) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11534) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11535) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11536)   for( i = 0; i < ne+1; i++ ) exone[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11537) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11538)   if( ei_cmpe( &p_a[1],    exone, ne ) == 0 ) /* exp( a ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11539) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11540)   if( ei_cmpe( &p_a[ns+2], exone, ne ) == 0 ) /* exp( a ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11541) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11542)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11543)     /* See if EIA is zero. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11544) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11545)     p = &p_a[ne + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11546) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11547)     p = &p_a[ns + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11548) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11549)     for( i = 0; i < ns+2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11550)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11551)       if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11552)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11553)         /* lta -= ei_normalize( p_a, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11554)         j = ei_normalize( p_a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11555)         ei_cvte_unpack( exone, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11556)         ei_sube( lta, lta, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11557)         goto mnzro1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11558)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11559) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11560)       p++; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11561) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11562)       p--; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11563) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11564)     } /* End for( i = 0; i < ns+2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11565)     ei_signull( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11566)                 (unsigned)(ei_isneg( p_a, nb ) ^ ei_isneg( p_b, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 11567)                 nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11568) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11569)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11570)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11571)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11572)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11573) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11574)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11575)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11576)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11577)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11578)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11579)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11580) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11581)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11582) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11583)   } /* End if( exp( a ) == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11584) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11585) mnzro1:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11586) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11587)   for( i = 0; i < ne+1; i++ ) exone[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11588) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11589)   if( ei_cmpe( &p_b[1],    exone, ne ) == 0 ) /* exp( b ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11590) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11591)   if( ei_cmpe( &p_b[ns+2], exone, ne ) == 0 ) /* exp( b ) == 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11592) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11593)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11594)     /* possible divide by zero. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11595) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11596)     p = &p_b[ne + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11597) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11598)     p = &p_b[ns + 1]; /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11599) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11600)     for( i = 0; i < ns+2; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11601)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11602)       if( *p != (EMUSHORT)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11603)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11604)         /* ltb -= ei_normalize( eib, nb ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11605)         j = ei_normalize( p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11606)         ei_cvte_unpack( exone, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11607)         ei_sube( ltb, ltb, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11608)         goto mnzro2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11609)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11610) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11611)       p++; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11612) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11613)       p--; /* to lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11614) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11615)     } /* End for( i = 0; i < ns+2; i++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11616)     ei_signull( eic,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11617)                 (unsigned)(ei_isneg( p_a, nb ) ^ ei_isneg( p_b, nb )),
868b2b66 (kx 2024-12-20 16:11:07 +0300 11618)                 nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11619) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11620)     /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11621)     /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11622)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11623)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11624) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11625)     /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11626)     /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11627)     /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11628)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11629)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11630)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11631) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11632)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11633) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11634)   } /* End if( exp( b ) == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11635) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11636) mnzro2:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11637) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11638) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11639)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11640)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11641)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11642)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11643)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11644)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11645) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11646)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11647)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11648)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11649)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11650)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11651)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11652) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11653) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11654) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11655)   /* Multiply significands */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11656)   k = ei_mulm( p_a, p_a, p_b, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11657)   /* Calculate Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11658)   /* lt = lta + ltb - (EXONE - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11659)   ei_adde( lt, lta,  ltb, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11660)   ei_dece( exone,  exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11661)   ei_sube( lt, lt, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11663)   rndsave = rndprc;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11664)   rndprc = (int)EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 11665)   /*****************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11666)     Здесь все равно какое значение RNDPRC, т.к. если оно не равно
868b2b66 (kx 2024-12-20 16:11:07 +0300 11667)     (24 или 53), то ei_mdenorm() округляет путем отбрасывания lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 11668)     данного ей числа в internal формате.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11669)     Мы использовали rndprc = (int)EINSBITS(nb); для того, чтобы
868b2b66 (kx 2024-12-20 16:11:07 +0300 11670)     избежать ошибок при больших размерах EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11671)    ******************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11672)   ei_mdenorm( p_a, k, 0, lt, (int)EINSBITS(nb), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11673)   rndprc = rndsave;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11675)   ei_copy( eic, p_a, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11676) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11677)   /* Set the Sign of product */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11678) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11679)   p = eic;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11680) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11681)   p = eic + np - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11682) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11683) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11684)   if( ei_isneg( p_a, nb ) ^
868b2b66 (kx 2024-12-20 16:11:07 +0300 11685)       ei_isneg( p_b, nb )  ) *p = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11686)   else                       *p = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11688)   /* FREE p_a ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11689)   /* FREE p_b ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11690)   __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11691)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11692) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11693)   /* FREE lt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11694)   /* FREE lta ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11695)   /* FREE ltb ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11696)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11697)   __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11698)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11699) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11700) } /* End of ei_mul() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11701) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11702) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11703) void ei_ltor( EMUSHORT *ei, EMUSHORT *lp, int nb, int nlp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11704) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11705) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11706)  Description        : ei_ltor() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 11707)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11708) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11709)  Concepts           : Convert Signed integer *LP to internal
868b2b66 (kx 2024-12-20 16:11:07 +0300 11710)                       e-type data struct *EI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11712)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11713) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11714)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11715)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11716)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11717)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11718) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11719)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11720)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11721)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11722)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11723)                                       TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11724)                       EMUSHORT *lp; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11725)                                       знаковое целое
868b2b66 (kx 2024-12-20 16:11:07 +0300 11726)                                       число.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11727)                                       SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11728)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11729)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11730)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11731)                       int nlp;      - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300 11732)                                       типа EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11733)                                       целом числе по
868b2b66 (kx 2024-12-20 16:11:07 +0300 11734)                                       указателю *lp.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11735) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11736)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 11737) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11738)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11739) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11740)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11741)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11742)                   *p_l = NULL; /* save *lp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11743)   EMUSHORT      *e, *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11744)   __mpu_int32_t  k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11745)   int            np, ne, ns, i, n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11746) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11747)   if( nb < NBR_32 || nlp == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11748)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11749)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11750)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11751)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11752)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11753)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11754) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11755)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11756)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11757)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11758) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11759)   /*** Allocate memory for p_l . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11760)   p_l = (EMUSHORT *)__mpu_sbrk( (int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11761)   if( !p_l )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11762)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11763)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11764)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11765)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11766)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11767) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11768)   /*** Allocate memory for exone, inc . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11769)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11770)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11771)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11772)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11773) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11774)     /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11775)     __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11776)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11777) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11778)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11779)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11780) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11781)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11782)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11783)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11784)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11785) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11786)     /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11787)     __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11788)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11789)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11790)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11791)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11792) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11793)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11794)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11795)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11796) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11797) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11798)   ei_cleaz( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11799)   if( ei_cmp0e( lp, nlp ) < 0 ) /* *LP < 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11800)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11801)     /* Negate *LP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11802)     ei_nege( p_l, lp, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11803) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11804)     /* put correct Sign in the Internal e-type number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11805)     ei[0]    = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11806) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11807)     /* put correct Sign in the Internal e-type number */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11808)     ei[np-1] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11809) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11810)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11811)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11812)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11813)     /* Copy *LP */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11814)     for( i = 0; i < nlp; i++ ) p_l[i] = lp[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 11815) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11816)   } /* End if( *LP < 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11817) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11818) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11819)   /* Copy the LONG INTEGER to EI Significand area */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11820) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11821)   p = p_l;           /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11822)   e = &ei[ne+1];     /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11823) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11824)   p = p_l + nlp - 1; /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11825)   e = &ei[ns+1];     /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11826) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11827) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11828)   /* if( nlp > ns ) low part of *LP my be LOST; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11829)   if( nlp >= ns ) n = ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11830)   else            n = nlp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11831)   /* Copy the LONG INTEGER to EI Significand area */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11832)   for( i = 0; i < n; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11833)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11834) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11835)     *e++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11836) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11837)     *e-- = *p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11838) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11839)   } /* End for( copy ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11840) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11841) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11842)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11843)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11844)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11845)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11846)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11847) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11848)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11849)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11850)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11851)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11852)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11853) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11854) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11855)   /* Clear inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11856)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11857)   /* Количество бит целого также (как и Significand)  ограничено
868b2b66 (kx 2024-12-20 16:11:07 +0300 11858)      знаковым числом, которое укладывается в тип signed EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11859)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11860) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11861)   inc[ne-1] = (nlp-1)*BITS_PER_EMUSHORT - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11862) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11863)   inc[0]    = (nlp-1)*BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11864) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11866)   /*********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11867)     For Correct SIGNED result!!!
868b2b66 (kx 2024-12-20 16:11:07 +0300 11868)    *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11869)   ei_cvte_unpack( inc, inc, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11870) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11871)   /* put correct Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11872) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11873)   ei_adde( &ei[1],    exone, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11874) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11875)   ei_adde( &ei[ns+2], exone, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11876) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11877) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11878)   /* normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11879)   if( (k = ei_normalize( ei, nb )) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11880)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11881)     /* it was zero : это был нуль */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11882)     ei_cleaz( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11883)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11884)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11885)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11886)     ei_cvte_unpack( inc, (EMUSHORT *)&k, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11887)     /* Exponent -= k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11888) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 11889)     ei_sube( &ei[1],    &ei[1],    inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11890) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 11891)     ei_sube( &ei[ns+2], &ei[ns+2], inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11892) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 11893)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11894) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11895)   /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11896)   __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11897)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11898) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11899)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11900)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11901)   __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11902)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11903) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11904) } /* End of ei_ltor() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11905) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11906) void ei_ultor( EMUSHORT *ei, EMUSHORT *lp, int nb, int nlp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11907) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 11908) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11909)  Description        : ei_ultor() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 11910)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11911) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11912)  Concepts           : Convert UNsigned integer *LP to internal
868b2b66 (kx 2024-12-20 16:11:07 +0300 11913)                       e-type data struct *EI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11914) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11915)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 11916) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11917)  Use Functions      : 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11918)                     internal_ne( nb );           | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11919)                     internal_ns( nb );           | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 11920) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11921)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 11922)                       EMUSHORT *ei; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11923)                                       internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11924)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11925)                                       TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11926)                       EMUSHORT *lp; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 11927)                                       беззнаковое целое
868b2b66 (kx 2024-12-20 16:11:07 +0300 11928)                                       число.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11929)                                       SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11930)                       int nb;       - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11931)                                       external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 11932)                                       data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11933)                       int nlp;      - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300 11934)                                       типа EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 11935)                                       целом числе по
868b2b66 (kx 2024-12-20 16:11:07 +0300 11936)                                       указателю *lp.
868b2b66 (kx 2024-12-20 16:11:07 +0300 11937) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11938)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 11939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11940)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11941) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11942)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11943)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 11944)                   *p_l = NULL; /* save *lp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11945)   EMUSHORT      *e, *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11946)   __mpu_int32_t  k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11947)   int            ne, ns, i, n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11948) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11949)   if( nb < NBR_32 || nlp == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11950)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11951)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11952)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11953)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11954)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11955)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11956) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11957)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11958)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11959) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11960)   /*** Allocate memory for p_l . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11961)   p_l = (EMUSHORT *)__mpu_sbrk( (int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11962)   if( !p_l )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11963)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11964)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11965)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11966)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11967)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11968) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11969)   /*** Allocate memory for exone, inc . ***********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11970)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11971)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11972)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11973)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11975)     /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11976)     __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11977)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11978) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11979)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11980)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11981) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11982)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11983)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 11984)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 11985)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 11986) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11987)     /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11988)     __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11989)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11990)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11991)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 11992)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11993) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11994)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 11995)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 11996)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 11997) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 11999)   /* Copy *lp */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12000)   for( i = 0; i < nlp; i++ ) p_l[i] = lp[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12001) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12002)   ei_cleaz( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12003) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12004)   /* Copy the LONG INTEGER to EI Significand area */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12005) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12006)   p = p_l;           /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12007)   e = &ei[ne+1];     /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12008) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12009)   p = p_l + nlp - 1; /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12010)   e = &ei[ns+1];     /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12011) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12012) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12013)   /* if( nlp > ns ) low part of *LP my be LOST; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12014)   if( nlp >= ns ) n = ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12015)   else            n = nlp;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12016)   /* Copy the LONG INTEGER to EI Significand area */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12017)   for( i = 0; i < n; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12018)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12019) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12020)     *e++ = *p++;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12021) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12022)     *e-- = *p--;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12023) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12024)   } /* End for( copy ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12025) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12026) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12027)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12028)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12029)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12030)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12031)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12032) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12033)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12034)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12035)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12036)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12037)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12038) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12039) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12040)   /* Clear inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12041)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12042)   /* Количество бит целого также (как и Significand)  ограничено
868b2b66 (kx 2024-12-20 16:11:07 +0300 12043)      знаковым числом, которое укладывается в тип signed EMUSHORT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12044)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12045) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12046)   inc[ne-1] = (nlp-1)*BITS_PER_EMUSHORT - 1; /* low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12047) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12048)   inc[0]    = (nlp-1)*BITS_PER_EMUSHORT - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12049) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12050) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12051)   /*********************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12052)     For Correct SIGNED result!!!
868b2b66 (kx 2024-12-20 16:11:07 +0300 12053)    *********************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12054)   ei_cvte_unpack( inc, inc, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12055) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12056)   /* put correct Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12057) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12058)   ei_adde( &ei[1],    exone, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12059) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12060)   ei_adde( &ei[ns+2], exone, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12061) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12062) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12063)   /* normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12064)   if( (k = ei_normalize( ei, nb )) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12065)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12066)     /* it was zero : это был нуль */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12067)     ei_cleaz( ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12068)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12069)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12070)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12071)     ei_cvte_unpack( inc, (EMUSHORT *)&k, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12072)     /* Exponent -= k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12073) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12074)     ei_sube( &ei[1],    &ei[1],    inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12075) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12076)     ei_sube( &ei[ns+2], &ei[ns+2], inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12077) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12078)   } /* End of normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12079) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12080)   /* FREE p_l ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12081)   __mpu_sbrk( -(int)(nlp*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12082)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12084)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12085)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12086)   __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12087)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12088) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12089) } /* End of ei_ultor() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12090) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12091) void ei_rtoul_frac( EMUSHORT *lp, EMUSHORT *frac, EMUSHORT *ei, int nlp, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12092) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12093) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12094)  Description        : ei_rtoul_frac() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 12095)                                       internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300 12096)                                       struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12097) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12098)  Concepts           : Find Unsigned long INTEGER *LP and
868b2b66 (kx 2024-12-20 16:11:07 +0300 12099)                       floating point fractional part *FRAC of
868b2b66 (kx 2024-12-20 16:11:07 +0300 12100)                       Internal e-type floating point input *EI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12101)                       A negative input yields INTEGER output=0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12102)                       but correct fraction.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12103)                       The output Internal e-type fraction
868b2b66 (kx 2024-12-20 16:11:07 +0300 12104)                       *FRAC is the positive fractional part of
868b2b66 (kx 2024-12-20 16:11:07 +0300 12105)                       abs(*EI).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12106) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12107)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12108) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12109)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 12110)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12111)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12112)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12113) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12114)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 12115)                       EMUSHORT *lp;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12116)                                         беззнаковое целое
868b2b66 (kx 2024-12-20 16:11:07 +0300 12117)                                         число.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12118)                                         TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12119)                       EMUSHORT *frac; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12120)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12121)                                         data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12122)                                         TARGET FRAC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12123)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12124)                          if( FRAC == 0 ) ei_rtoul_frac() просто
868b2b66 (kx 2024-12-20 16:11:07 +0300 12125)                                          не пытается вывести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12126)                                          полученную дробную часть.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12127) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12128)                       EMUSHORT *ei;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12129)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12130)                                         data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12131)                                         SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12132)                       int nlp;        - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300 12133)                                         типа EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 12134)                                         целом числе по
868b2b66 (kx 2024-12-20 16:11:07 +0300 12135)                                         указателю *lp.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12136)                       int nb;         - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 12137)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12138)                                         data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12139)                                         SOURCE & *FRAC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12140) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12141)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 12142) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12143)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12144) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12145)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12146)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12147)                     *k = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12148)                    *fi = NULL; /* tmp for FRAC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12149)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12150)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12151)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12152) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12153)   if( nb < NBR_32 || nlp == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12154)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12155)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12156)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12157)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12158)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12159)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12160) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12161)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12162)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12163)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12165)   /*** Allocate memory for exone, inc, k, fi . ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12166)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12167)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12168)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12169)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12170)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12171)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12172) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12173)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12174)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12175)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12176)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12178)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12179)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12180)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12181) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12182)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12183)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12184) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12185)   k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12186)   if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12187)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12188)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12190)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12191)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12192)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12193)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12195)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12196)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12197) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12198)   fi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12199)   if( !fi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12200)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12201)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12203)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12204)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12205)     /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12206)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12207)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12208) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12209)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12210)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12211)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12212) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12213) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12214)   for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12215) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12216)   ei_copy( fi, ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12217) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12218) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12219)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12220)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12221)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12222)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12223)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12224) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12225)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12226)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12227)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12228)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12229)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12230) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12231) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12232)   /* k = Exponent( fi ) - (EXONE - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12233)   ei_dece( exone, exone, ne ); /* save (EXONE - 1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12234) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12235)   ei_sube( k, &fi[1],    exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12236) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12237)   ei_sube( k, &fi[ns+2], exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12238) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12240)   if( ei_cmp0e( k, ne ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12241)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12242)     /* if( Exponent <= 0 ), integer = 0 and
868b2b66 (kx 2024-12-20 16:11:07 +0300 12243)                             real output is fraction */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12244)     for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12245)     if( frac ) ei_copy( frac, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12246) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12247)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12248)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12249)     /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12250)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12251)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12252) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12253)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12254)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12255)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12257)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12258)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12260)   for( i = 0; i < ne; i++ ) inc[i] =  (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12261) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12262)   inc[ne-1] = (EMUSHORT)(BITS_PER_EMUSHORT*nlp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12263) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12264)   inc[0]    = (EMUSHORT)(BITS_PER_EMUSHORT*nlp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12265) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12266)   if( ei_cmpe( k, inc, ne ) > 0 ) /* k > inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12267)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12268)     /* long INTEGER overflow: output large integer and
868b2b66 (kx 2024-12-20 16:11:07 +0300 12269)                               correct fraction */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12270)     /* In this case, return the largest unsigned INTEGER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12271)     for( i = 0; i < nlp; i++ ) lp[i] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12272) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12273)     /* Страховка на случай если
868b2b66 (kx 2024-12-20 16:11:07 +0300 12274)        k > max positive Signed EMUSHORT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12275) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12276)     inc[ne-1] = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12277) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12278)     inc[0]    = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12279) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12280)     if( ei_cmpe( k, inc, ne ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12281)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12282)       ei_shift( fi, (ns+1)*BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12283)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12284)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12285)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12286) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12287)       j = k[ne-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12288) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12289)       j = k[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12290) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12291)       ei_shift( fi, j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12292)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12294)     if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12295)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12296)       struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12297) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12298)       __real_error_no = __R_ETRUNC__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12299) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12300)       e.who          = _REAL_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12301)       e.type         = __real_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12302)       e.name         = (__mpu_char8_t *)"ei_rtoul_frac";
868b2b66 (kx 2024-12-20 16:11:07 +0300 12303)       e.msg          = __mpu_utf8mpu_error( _REAL_, __real_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12304)       e.msg_type     = _WARNING_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12305)       e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12306)       e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12307)       e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12308)       e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12309)       e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12310)       e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12311) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12312)       __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12313) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12314)       if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12316)     } /* End if( __extra_warnings ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12317) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12318)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12319)   else /* т.е. k <= (BITS_PER_EMUSHORT*nlp); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12320)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12321)     /* NOTE: Здесь k > 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12322) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12323)     j = k[ne-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12324) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12325)     j = k[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12326) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12327)     if( j > BITS_PER_EMUSHORT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12328)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12329)       int n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12330) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12331)       n = j % BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12332)       ei_shift( fi, n, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12333) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12334)       lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12335) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12336)       lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12337) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12338)       j -= n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12339)       do
868b2b66 (kx 2024-12-20 16:11:07 +0300 12340)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12341)         ei_shup( fi, BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12342)         ei_shln( lp, lp, BITS_PER_EMUSHORT, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12343) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12344)         lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12345) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12346)         lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12347) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12348)       } while( (j -= BITS_PER_EMUSHORT) > 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12349) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12350)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12351)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12352)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12353)       ei_shift( fi, j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12354) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12355)       lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12356) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12357)       lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12358) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12359)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12360) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12361)   } /* End if( k > BITS_PER_EMUSHORT*nlp ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12362) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12363) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12364) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12365)   if( fi[0] )    /* if( Sign ) *LP = NULL; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12366) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12367)   if( fi[np-1] ) /* if( Sign ) *LP = NULL; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12368) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12369)     for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12370) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12371) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12372)   fi[0]    = (EMUSHORT)0;    /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12373)   ei_cpye( &fi[1], exone, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12374)   fi[ne+1] = (EMUSHORT)0;    /*  hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12375) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12376)   fi[np-1]    = (EMUSHORT)0; /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12377)   ei_cpye( &fi[ns+2], exone, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12378)   fi[ns+1] = (EMUSHORT)0;    /*  hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12379) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12380) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12381)   /* normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12382)   if( (j = ei_normalize( fi, nb )) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12383)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12384)     /* it was zero : это был нуль */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12385)     ei_cleaz( fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12386)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12387)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12388)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12389)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12390)     /* Exponent -= k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12391) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12392)     ei_sube( &fi[1],    &fi[1],    inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12393) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12394)     ei_sube( &fi[ns+2], &fi[ns+2], inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12395) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12396)   } /* End of normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12397) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12398)   if( frac ) ei_copy( frac, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12399) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12400)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12401)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12402)   /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12403)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12404)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12405) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12406)   /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12407)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12408)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12410) } /* End of ei_rtoul_frac() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12411) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12412) void ei_rtol_frac( EMUSHORT *lp, EMUSHORT *frac, EMUSHORT *ei, int nlp, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12413) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12414) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12415)  Description        : ei_rtol_frac() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 12416)                                      internal e-type data
868b2b66 (kx 2024-12-20 16:11:07 +0300 12417)                                      struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12418) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12419)  Concepts           : Find Signed long INTEGER *LP and floating
868b2b66 (kx 2024-12-20 16:11:07 +0300 12420)                       point fractional part *FRAC of Internal
868b2b66 (kx 2024-12-20 16:11:07 +0300 12421)                       e-type floating point input *EI.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12422)                       The INTEGER output *LP has the sign of
868b2b66 (kx 2024-12-20 16:11:07 +0300 12423)                       the input *EI, except that positive
868b2b66 (kx 2024-12-20 16:11:07 +0300 12424)                       overflov is permitted
868b2b66 (kx 2024-12-20 16:11:07 +0300 12425)                       if FIXUNS_TRUNC_LIKE_FIX_TRUNC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12426)                       The output Internal e-type fraction
868b2b66 (kx 2024-12-20 16:11:07 +0300 12427)                       *FRAC is the positive fractional part of
868b2b66 (kx 2024-12-20 16:11:07 +0300 12428)                       abs(*EI).
868b2b66 (kx 2024-12-20 16:11:07 +0300 12429) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12430)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12431) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12432)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 12433)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12434)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12435)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 12436) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12437)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 12438)                       EMUSHORT *lp;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12439)                                         знаковое целое
868b2b66 (kx 2024-12-20 16:11:07 +0300 12440)                                         число.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12441)                                         TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12442)                       EMUSHORT *frac; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12443)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12444)                                         data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12445)                                         TARGET FRAC;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12446)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12447)                          if( FRAC == 0 ) ei_rtol_frac() просто
868b2b66 (kx 2024-12-20 16:11:07 +0300 12448)                                          не пытается вывести
868b2b66 (kx 2024-12-20 16:11:07 +0300 12449)                                          полученную дробную
868b2b66 (kx 2024-12-20 16:11:07 +0300 12450)                                          часть.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12451) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12452)                       EMUSHORT *ei;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 12453)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12454)                                         data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12455)                                         SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12456)                       int nlp;        - количество слов
868b2b66 (kx 2024-12-20 16:11:07 +0300 12457)                                         типа EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 12458)                                         целом числе по
868b2b66 (kx 2024-12-20 16:11:07 +0300 12459)                                         указателю *lp.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12460)                       int nb;         - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 12461)                                         internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 12462)                                         data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12463)                                         SOURCE & *FRAC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 12464) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12465)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 12466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12467)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12468) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12469)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12470)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12471)                     *k = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 12472)                    *fi = NULL; /* tmp for FRAC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12473)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12474)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12475)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12476) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12477)   if( nb < NBR_32 || nlp == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12478)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12479)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12480)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12481)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12482)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12483)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12484) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12485)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12486)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12487)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12488) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12489)   /*** Allocate memory for exone, inc, k, fi . ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12490)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12491)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12492)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12493)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12494)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12495)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12496) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12497)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12498)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12499)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12500)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12501) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12502)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12503)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12504)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12505) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12506)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12507)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12508) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12509)   k = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12510)   if( !k )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12511)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12512)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12513) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12514)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12515)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12516)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12517)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12518) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12519)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12520)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12521) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12522)   fi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12523)   if( !fi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12524)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12525)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12526) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12527)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12528)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12529)     /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12530)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12531)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12532) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12533)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12534)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12535)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12536) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12537) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12538)   for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12539) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12540)   ei_copy( fi, ei, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12541) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12542) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12543)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12544)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12545)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12546)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12547)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12548) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12549)   /* формирование EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12550)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12551)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12552)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12553)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12554) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12555) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12556)   /* k = Exponent( fi ) - (EXONE - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12557)   ei_dece( exone, exone, ne ); /* save (EXONE - 1) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12558) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12559)   ei_sube( k, &fi[1],    exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12560) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12561)   ei_sube( k, &fi[ns+2], exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12562) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12563) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12564)   if( ei_cmp0e( k, ne ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12565)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12566)     /* if( Exponent <= 0 ), integer = 0 and
868b2b66 (kx 2024-12-20 16:11:07 +0300 12567)                           real output is fraction */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12568)     for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12569)     if( frac ) ei_copy( frac, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12570) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12571)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12572)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12573)     /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12574)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12575)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12576) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12577)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12578)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12579)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12580) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12581)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12582)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12583) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12584)   for( i = 0; i < ne; i++ ) inc[i] =  (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12585) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12586)   inc[ne-1] = (EMUSHORT)(BITS_PER_EMUSHORT*nlp - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12587) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12588)   inc[0]    = (EMUSHORT)(BITS_PER_EMUSHORT*nlp - 1);
868b2b66 (kx 2024-12-20 16:11:07 +0300 12589) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12590)   if( ei_cmpe( k, inc, ne ) > 0 ) /* k > inc */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12591)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12592)     /* long INTEGER overflow: output large integer and
868b2b66 (kx 2024-12-20 16:11:07 +0300 12593)                             correct fraction */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12594) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12595)     if( fi[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12596) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12597)     if( fi[np-1] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12598) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12599)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12600)       /* In this case, return the largest negative INTEGER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12601)       for( i = 0; i < nlp; i++ ) lp[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12602) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12603)       lp[0]     = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12604) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12605)       lp[nlp-1] = MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12606) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12607)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12608)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12609)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12610) #ifdef FIXUNS_TRUNC_LIKE_FIX_TRUNC
868b2b66 (kx 2024-12-20 16:11:07 +0300 12611)       /* In this case, let it overflow and convert as if unsigned */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12612)       ei_rtoul_frac( lp, frac, ei, nlp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12613) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12614)       /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12615)       /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12616)       /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12617)       __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12618)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12619) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12620)       /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12621)       __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12622)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12623) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12624)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12625) #else  /* Not FIXUNS_TRUNC_LIKE_FIX_TRUNC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12626)       /* In other cases, return the largest positive INTEGER */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12627)       for( i = 0; i < nlp; i++ ) lp[i] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12628) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12629)       lp[0]     ^= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12630) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12631)       lp[nlp-1] ^= MASK_SIGN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12632) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12633) #endif /* FIXUNS_TRUNC_LIKE_FIX_TRUNC */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12634)     } /* End if( Sign ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12635) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12636)     /* Страховка на случай если
868b2b66 (kx 2024-12-20 16:11:07 +0300 12637)       k > max positive Signed EMUSHORT */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12638) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12639)     inc[ne-1] = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12640) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12641)     inc[0]    = HIGHT_EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12642) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12643)     if( ei_cmpe( k, inc, ne ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12644)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12645)       ei_shift( fi, (ns+1)*BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12646)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12647)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12648)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12649) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12650)       j = k[ne-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12651) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12652)       j = k[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12653) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12654)       ei_shift( fi, j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12655)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12656) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12657)     if( __extra_warnings )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12658)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12659)       struct __exception  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12660) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12661)       __real_error_no = __R_ETRUNC__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12663)       e.who          = _REAL_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12664)       e.type         = __real_error_no;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12665)       e.name         = (__mpu_char8_t *)"ei_rtol_frac";
868b2b66 (kx 2024-12-20 16:11:07 +0300 12666)       e.msg          = __mpu_utf8mpu_error( _REAL_, __real_error_no );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12667)       e.msg_type     = _WARNING_MSG_;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12668)       e.nb_a1        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12669)       e.nb_a2        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12670)       e.nb_rv        = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12671)       e.arg_1        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12672)       e.arg_2        = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12673)       e.return_value = (unsigned char *)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12675)       __mpu_warning( &e );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12676) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12677)       if( e.msg ) free( e.msg );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12678) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12679)     } /* End if( __extra_warnings ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12680) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12681)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12682)   else /* т.е. k <= (BITS_PER_EMUSHORT*nlp - 1); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12683)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12684)     /* NOTE: Здесь k > 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12685) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12686)     j = k[ne-1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12687) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12688)     j = k[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12689) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12690)     if( j > BITS_PER_EMUSHORT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12691)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12692)       int n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12693) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12694)       n = j % BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12695)       ei_shift( fi, n, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12696) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12697)       lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12698) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12699)       lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12700) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12701)       j -= n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12702)       do
868b2b66 (kx 2024-12-20 16:11:07 +0300 12703)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12704)         ei_shup( fi, BITS_PER_EMUSHORT, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12705)         ei_shln( lp, lp, BITS_PER_EMUSHORT, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12706) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12707)         lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12708) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12709)         lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12710) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12711)       } while( (j -= BITS_PER_EMUSHORT) > 0 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12712) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12713) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12714)       if( fi[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12715) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12716)       if( fi[np-1] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12717) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12718)         ei_nege( lp, lp, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12719)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12720)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12721)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12722)       ei_shift( fi, j, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12723) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12724)       lp[nlp-1] = fi[ne+1]; /* hgw to low part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12725)       if( fi[0] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12726) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12727)       lp[0]     = fi[ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12728)       if( fi[np-1] )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12729) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12730)         ei_nege( lp, lp, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12731)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12732) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12733)   } /* End if( k > BITS_PER_EMUSHORT*nlp - 1 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12734) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12735) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12736) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12737)   fi[0]    = (EMUSHORT)0;    /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12738)   ei_cpye( &fi[1], exone, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12739)   fi[ne+1] = (EMUSHORT)0;    /*  hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12740) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12741)   fi[np-1] = (EMUSHORT)0;    /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12742)   ei_cpye( &fi[ns+2], exone, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12743)   fi[ns+1] = (EMUSHORT)0;    /*  hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12744) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12745) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12746)   /* normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12747)   if( (j = ei_normalize( fi, nb )) > (__mpu_int32_t)EINSBITS(nb) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12748)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12749)     /* it was zero : это был нуль */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12750)     ei_cleaz( fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12751)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 12752)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12753)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12754)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12755)     /* Exponent -= k; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12756) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12757)     ei_sube( &fi[1],    &fi[1],    inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12758) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12759)     ei_sube( &fi[ns+2], &fi[ns+2], inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12760) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12761)   } /* End of normalize the Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12762) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12763)   if( frac ) ei_copy( frac, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12764) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12765)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12766)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12767)   /* FREE k *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12768)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12769)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12770) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12771)   /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12772)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12773)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12774) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12775) } /* End of ei_rtol_frac() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12777) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12778) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12779)   GENERATORS OF CONSTANT:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12780)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12781) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12782) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12783)   Память адресуемая *EIA должна быть достаточна для размещения
868b2b66 (kx 2024-12-20 16:11:07 +0300 12784)   производимых констант. Чтобы избежать ошибок можно
868b2b66 (kx 2024-12-20 16:11:07 +0300 12785)   воспользоваться макро NPIR_MAX, например:
868b2b66 (kx 2024-12-20 16:11:07 +0300 12786) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12787)     unsigned EMUSHORT half[NPIR_MAX];
868b2b66 (kx 2024-12-20 16:11:07 +0300 12788)     _gen_half( half, NBR_256 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12789) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12790)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12791) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12792) void _gen_zero( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12793) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12794)   0.0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12795)   zero: Sign 0x0000 hgw 0x0000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12796)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12797) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12798)   EMUSHORT *ei = eia; /* = _ei_zero_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12799) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12800)   ei_signull( ei, (unsigned)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12801) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12802) } /* End of _gen_zero() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12803) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12804) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12805) void _gen_half( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12806) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12807)   5.0E-1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12808)   half: Sign 0x3ffe hgw 0x8000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12809)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12810) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12811)   EMUSHORT *ei = eia; /* = _ei_half_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12812)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12814)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12815)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12816) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12817) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12818)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12819) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12821)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12822) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12823) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12824)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12825)   *ei++ = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12826)   for( i = 1; i < ne; i++ ) *ei++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12827)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12828)   *ei ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12829)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12830)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12831)   *ei++ = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12832)   for( i = 1; i < ns; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12833) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12834)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12835)   *ei-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12836)   for( i = 1; i < ne; i++ ) *ei-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12837)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12838)   *ei ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12839)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12840)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12841)   *ei-- = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12842)   for( i = 1; i < ns; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12843) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12844) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12845)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12846) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12847) } /* End of _gen_half() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12848) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12849) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12850) void _gen_one( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12851) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12852)   1.0E0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12853)   one:  Sign 0x3fff hgw 0x8000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12854)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12855) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12856)   EMUSHORT *ei = eia; /* = _ei_one_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12857)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12858) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12859)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12860)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12861) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12862) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12863)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12864) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12866)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12867) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12868) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12869)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12870)   *ei++ = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12871)   for( i = 1; i < ne; i++ ) *ei++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12872)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12873)   *ei++ = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12874)   for( i = 1; i < ns; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12875) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12876)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12877)   *ei-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12878)   for( i = 1; i < ne; i++ ) *ei-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12879)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12880)   *ei-- = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12881)   for( i = 1; i < ns; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12882) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12883) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12884)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12885) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12886) } /* End of _gen_one() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12887) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12888) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12889) void _gen_two( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12890) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12891)   2.0E0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12892)   two:  Sign 0x4000 hgw 0x8000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12893)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12894) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12895)   EMUSHORT *ei = eia; /* = _ei_two_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12896)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12897) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12898)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12899)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12900) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12901) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12902)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12903) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12904) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12905)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12907) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12908)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12909)   *ei++ = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12910)   for( i = 1; i < ne; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12911)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12912)   *ei++ = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12913)   for( i = 1; i < ns; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12914) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12915)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12916)   *ei-- = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12917)   for( i = 1; i < ne; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12918)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12919)   *ei-- = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12920)   for( i = 1; i < ns; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12921) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12922) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12923)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12924) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12925) } /* End of _gen_two() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12926) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12927) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12928) void _gen_ten( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12929) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12930)   1.0E1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12931)   10:   Sign 0x4002 hgw 0xa000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12932)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12933) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12934)   EMUSHORT *ei = eia; /* = _ei_ten_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12935)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12936) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12937)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12938)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12939) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12940) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12941)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12942) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12943) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12944)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12945) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12946) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12947)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12948)   *ei++ = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12949)   for( i = 1; i < ne; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12950)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12951)   *ei |= 2;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12952)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12953)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12954)   *ei++ = HIGHT_M_TEN;       /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12955)   for( i = 1; i < ns; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12956) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 12957)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12958)   *ei-- = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12959)   for( i = 1; i < ne; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12960)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12961)   *ei |= 2;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12962)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12963)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12964)   *ei-- = HIGHT_M_TEN;       /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12965)   for( i = 1; i < ns; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12966) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12967) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12968)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12969) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12970) } /* End of _gen_ten() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12971) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12972) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12973) void _gen_mten( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 12974) /*********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 12975)   1.0E-1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12976)   0.1:  Sign 0x3ffb hgw 0xcccc ... cccd lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 12977)  *********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 12978) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 12979)   EMUSHORT *ei = eia; /* = _ei_mten_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12980)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12981) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12982)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12983)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 12984) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12985) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 12986)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12987) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 12988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12989)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12990) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 12991) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 12992)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12993)   *ei++ = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12994)   for( i = 1; i < ne; i++ ) *ei++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12995)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12996)   *ei ^= 4;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12997)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 12998)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 12999)   *ei++ = HIGHT_M_MTEN;      /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13000)   for( i = 1; i < ns; i++ ) *ei++ = HIGHT_M_MTEN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13001)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13002)   *ei |= 1;        /* Low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13003)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13004) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13005)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13006)   *ei-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13007)   for( i = 1; i < ne; i++ ) *ei-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13008)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13009)   *ei ^= 4;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13010)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13011)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13012)   *ei-- = HIGHT_M_MTEN;      /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13013)   for( i = 1; i < ns; i++ ) *ei-- = HIGHT_M_MTEN;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13014)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13015)   *ei |= 1;        /* Low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13016)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13017) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13018) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13019)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13020) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13021) } /* End of _gen_mten() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13022) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13023) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13024) void _gen_32( EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13025) /****************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13026)   3.2E1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13027)   32:   Sign 0x4004 hgw 0x8000 ... lgw
868b2b66 (kx 2024-12-20 16:11:07 +0300 13028)  ****************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13029) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13030)   EMUSHORT *ei = eia; /* = _ei_32_; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13031)   int       i, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13032) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13033)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13034)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13035) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13036) #if MPU_WORD_ORDER_BIG_ENDIAN == 0
868b2b66 (kx 2024-12-20 16:11:07 +0300 13037)   ei = ei + ne + ns + 2;   /* начинаем с Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13038) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13039) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13040)   *ei = (EMUSHORT)0;                  /* Sign */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13041) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13042) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13043)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13044)   *ei++ = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13045)   for( i = 1; i < ne; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13046)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13047)   *ei |= 4;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13048)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13049)   *ei++ = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13050)   *ei++ = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13051)   for( i = 1; i < ns; i++ ) *ei++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13052) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13053)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13054)   *ei-- = HIGHT_EXTWO;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13055)   for( i = 1; i < ne; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13056)   ++ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13057)   *ei |= 4;           /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13058)   --ei;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13059)   *ei-- = (EMUSHORT)0;                 /* hgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13060)   *ei-- = MASK_SIGN;         /* с неявной 1.0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13061)   for( i = 1; i < ns; i++ ) *ei-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13062) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13063) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13064)   *ei = (EMUSHORT)0;                   /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13065) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13066) } /* End of _gen_32() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13067) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13068) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13069)   END GENERATORS OF CONSTANT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13070)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13071) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13072) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13073) void ei_remain( EMUSHORT *eic, EMUSHORT *eiquot, EMUSHORT *eia, EMUSHORT *eib, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13074) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13075) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13076)  Description        : ei_remain() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 13077)                                   internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13078) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13079)  Concepts           : EIC = remainder after dividing EIA by EIB.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13080)                       Sign of remainder == Sign of quotient.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13081)                       If( EIQUOT != (EMUSHORT *)0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13082)                       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13083)                         RETURN quotient of exploded
868b2b66 (kx 2024-12-20 16:11:07 +0300 13084)                         e-types EIA / EIB as unsigned
868b2b66 (kx 2024-12-20 16:11:07 +0300 13085)                         integer number in EIQUOT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13086)                       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13087) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13088)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13089) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13090)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13091)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13092)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13093)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13094) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13095)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13096)                       EMUSHORT *eic;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13097)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13098)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13099)                                           TARGET REMAINDER;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13100)                       EMUSHORT *eiquot; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13101)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13102)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13103)                                           TARGET QUOTIENT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13104)                       EMUSHORT *eia;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13105)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13106)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13107)                       EMUSHORT *eib;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13108)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13109)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13110)                       int nb;           - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 13111)                                           external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13112)                                           data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13113)                                           EIA, EIB, EIC &
868b2b66 (kx 2024-12-20 16:11:07 +0300 13114)                                           EIQUOT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13115) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13116)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 13117) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13118)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13119) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13120)   EMUSHORT         *ld = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13121)                    *ln = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13122)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13123)                   *den = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13124)                   *num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13125)                 *equot = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13126)                  *zero = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13127)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13128)   EMUSHORT       j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13129)   __mpu_int32_t  k;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13130)   int            np, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13131) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13132)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13133)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13134)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13135)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13136)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13137)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13138)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13139) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13140)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13141)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13142)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13143) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13144) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13145)   if( ei_isinfin( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13146)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13147)     ei_nan( eic, 0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13148)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13149)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13150) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13151)   /*** Allocate memory for den, num . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13152)   den = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13153)   if( !den )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13154)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13155)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13156)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13157)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13158) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13159)   num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13160)   if( !num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13161)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13162)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13163) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13164)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13165)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13166)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13167) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13168)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13169)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13170)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13171) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13172)   ei_copy( num, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13173)   ei_copy( den, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13174) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13175)   /* EIA */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13176)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13177)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13178)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13179)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13180)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13181)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13182)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13183)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 13184)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13185)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 13186)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 13187)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 13188)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13189) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13190)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13191)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13192)     _mtherr( eic, (__mpu_char8_t *)"remain", __INVALID__, eic, num, den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13193)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13195)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13196)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13197)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13198)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13200)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13201)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13202)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13203)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13204)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13205)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13206) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13207)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13208)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13209)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13210)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13211) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13212)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13213)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13214) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13215)   /* EIB */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13216)   /* InD plus anything is a InD */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13217)   if( ei_isind( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13218)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13219)     /* "invalid operation" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13220)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13221)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13222)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13223)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 13224)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13225)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 13226)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 13227)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 13228)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13229) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13230)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13231)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13232)     _mtherr( eic, (__mpu_char8_t *)"remain", __INVALID__, eic, num, den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13233)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13234) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13235)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13236)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13237)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13238)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13239) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13240)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13241)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13242)   /* NaN plus anything is a NaN */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13243)   if( ei_isnans( eib, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13244)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13245)     ei_copy( eic, eib, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13246) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13247)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13248)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13249)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13250)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13251) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13252)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13253)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13254) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13255)   /*** Allocate memory for zero . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13256)   zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13257)   if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13258)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13259)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13260) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13261)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13262)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13263)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13264)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13265) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13266)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13267)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13268)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13269) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13270)   _gen_zero( zero, nb ); /* for zero[NPIR_MAX] */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13271) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13272)   if( ei_cmp( eib, zero, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13273)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13274)     ei_cleaz( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13275)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13276)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13277)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 13278)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13279)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 13280)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 13281)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 13282)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13284)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13285)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13286)     _mtherr( eic, (__mpu_char8_t *)"remain", __SING__, eic, num, den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13287)     __STSNG; /* Set REAL Singularity Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13288) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13289)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13290)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13291)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13292)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13293)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13294) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13295)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13296)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13297) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13298)   /*** Allocate memory for equot, inc, ln, ld . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13299)   equot = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13300)   if( !equot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13301)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13302)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13303) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13304)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13305)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13306)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13307)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13308)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13309) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13310)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13311)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13312) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13313)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13314)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13315)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13316)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13317) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13318)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13319)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13320)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13321)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13322)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13323)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13324) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13325)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13326)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13327) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13328)   ln = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13329)   if( !ln )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13330)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13331)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13332) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13333)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13334)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13335)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13336)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13337)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13338)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13339) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13340)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13341)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13342)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13343) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13344)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13345)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13347)   ld = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13348)   if( !ld )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13349)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13350)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13351) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13352)     /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13353)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13354)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13355)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13356)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13357)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13358) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13359)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13360)     /* FREE ln ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13361)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13362)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13363) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13364)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13365)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13366)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13367) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13369)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13370) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13371)   ei_cpye_unpack( ln, &num[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13372)   ei_cpye_unpack( ld, &den[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13373) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13374)   ei_cpye_unpack( ln, &num[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13375)   ei_cpye_unpack( ld, &den[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13376) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13377) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13378)   k = ei_normalize( num, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13379)   ei_cvte_unpack( inc, (EMUSHORT *)&k, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13380)   ei_sube( ln, ln, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13381) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13382)   k = ei_normalize( den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13383)   ei_cvte_unpack( inc, (EMUSHORT *)&k, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13384)   ei_sube( ld, ld, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13385) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13386)   ei_cleaz( equot, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13387) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13388)   /* Set *p to low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13389) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13390)   p = &equot[np - 1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13391) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13392)   p = &equot[0];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13393) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13394) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13395)   while( ei_cmpe( ln, ld, ne+1 ) >= 0 ) /* ( ln >= ld ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13396)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13397)     if( ei_cmpm( den, num, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13398)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13399)       ei_subm( num, num, den, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13400)       j = (EMUSHORT)1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13401)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13402)     else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13403)       j = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13404) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13405)     ei_shup( equot, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13406)     *p |= j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13407)     ei_shup( num,   (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13408)     ei_dece( ln, ln, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13409) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13410)   } /* End while( ln >= ld ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13411) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13412)   ei_mdenorm( num, 0, 0, ln, 0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13413) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13414)   /* Sign of remainder == Sign of quotient */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13415) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13416)   if( eia[0] == eib[0] ) num[0] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13417)   else                   num[0] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13418) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13419)   if( eia[np-1] == eib[np-1] ) num[np-1] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13420)   else                         num[np-1] = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13421) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13422) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13423)   if( eiquot ) ei_copy( eiquot, equot, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13424) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13425)   ei_copy( eic, num, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13426) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13427)   /* FREE den ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13428)   /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13429)   /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13430)   /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13431)   __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13432)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13433) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13434)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13435)   /* FREE ln ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13436)   /* FREE ld ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13437)   __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13438)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13440) } /* End of ei_remain() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13441) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13442) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13443) #if BITS_PER_EMUSHORT == 16
868b2b66 (kx 2024-12-20 16:11:07 +0300 13444) static EMUSHORT bitmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 13445) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13446)   0xffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13447)   0xfffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13448)   0xfffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13449)   0xfff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13450)   0xfff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13451)   0xffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13452)   0xffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13453)   0xff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13454)   0xff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13455)   0xfe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13456)   0xfc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13457)   0xf800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13458)   0xf000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13459)   0xe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13460)   0xc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13461)   0x8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13462)   0x0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13463) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 13464) #else /* not (BITS_PER_EMUSHORT == 16) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13465) #if BITS_PER_EMUSHORT == 32
868b2b66 (kx 2024-12-20 16:11:07 +0300 13466) static EMUSHORT bitmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 13467) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13468)   0xffffffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13469)   0xfffffffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13470)   0xfffffffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13471)   0xfffffff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13472)   0xfffffff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13473)   0xffffffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13474)   0xffffffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13475)   0xffffff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13476)   0xffffff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13477)   0xfffffe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13478)   0xfffffc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13479)   0xfffff800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13480)   0xfffff000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13481)   0xffffe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13482)   0xffffc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13483)   0xffff8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13484)   0xffff0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13485)   0xfffe0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13486)   0xfffc0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13487)   0xfff80000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13488)   0xfff00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13489)   0xffe00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13490)   0xffc00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13491)   0xff800000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13492)   0xff000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13493)   0xfe000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13494)   0xfc000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13495)   0xf8000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13496)   0xf0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13497)   0xe0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13498)   0xc0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13499)   0x80000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13500)   0x00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13501) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 13502) #else /* not (BITS_PER_EMUSHORT == 32) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13503) #if BITS_PER_EMUSHORT == 64
868b2b66 (kx 2024-12-20 16:11:07 +0300 13504) static EMUSHORT bitmask[] =
868b2b66 (kx 2024-12-20 16:11:07 +0300 13505) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13506)   0xffffffffffffffff,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13507)   0xfffffffffffffffe,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13508)   0xfffffffffffffffc,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13509)   0xfffffffffffffff8,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13510)   0xfffffffffffffff0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13511)   0xffffffffffffffe0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13512)   0xffffffffffffffc0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13513)   0xffffffffffffff80,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13514)   0xffffffffffffff00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13515)   0xfffffffffffffe00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13516)   0xfffffffffffffc00,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13517)   0xfffffffffffff800,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13518)   0xfffffffffffff000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13519)   0xffffffffffffe000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13520)   0xffffffffffffc000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13521)   0xffffffffffff8000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13522)   0xffffffffffff0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13523)   0xfffffffffffe0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13524)   0xfffffffffffc0000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13525)   0xfffffffffff80000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13526)   0xfffffffffff00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13527)   0xffffffffffe00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13528)   0xffffffffffc00000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13529)   0xffffffffff800000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13530)   0xffffffffff000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13531)   0xfffffffffe000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13532)   0xfffffffffc000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13533)   0xfffffffff8000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13534)   0xfffffffff0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13535)   0xffffffffe0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13536)   0xffffffffc0000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13537)   0xffffffff80000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13538)   0xffffffff00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13539)   0xfffffffe00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13540)   0xfffffffc00000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13541)   0xfffffff800000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13542)   0xfffffff000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13543)   0xffffffe000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13544)   0xffffffc000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13545)   0xffffff8000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13546)   0xffffff0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13547)   0xfffffe0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13548)   0xfffffc0000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13549)   0xfffff80000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13550)   0xfffff00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13551)   0xffffe00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13552)   0xffffc00000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13553)   0xffff800000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13554)   0xffff000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13555)   0xfffe000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13556)   0xfffc000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13557)   0xfff8000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13558)   0xfff0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13559)   0xffe0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13560)   0xffc0000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13561)   0xff80000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13562)   0xff00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13563)   0xfe00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13564)   0xfc00000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13565)   0xf800000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13566)   0xf000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13567)   0xe000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13568)   0xc000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13569)   0x8000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13570)   0x0000000000000000,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13571) };
868b2b66 (kx 2024-12-20 16:11:07 +0300 13572) #else /* not (BITS_PER_EMUSHORT == 64) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13573) #error mpu-real.c: Cannot use that size of EMUSHORT type 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13574) #endif /* BITS_PER_EMUSHORT == 64 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13575) #endif /* BITS_PER_EMUSHORT == 32 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13576) #endif /* BITS_PER_EMUSHORT == 16 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13577) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13578) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13579) void ei_floor( EMUSHORT *eic, EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13580) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13581) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13582)  Description        : ei_floor() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 13583)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13584) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13585)  Concepts           : Return EIC = largest integer not greater
868b2b66 (kx 2024-12-20 16:11:07 +0300 13586)                       than EIA (truncated toward minus
868b2b66 (kx 2024-12-20 16:11:07 +0300 13587)                       infinity).
868b2b66 (kx 2024-12-20 16:11:07 +0300 13588)                       Возвращает EIC = наиболшее (ближайшее)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13589)                       целое не большее чем EIA (срезает в
868b2b66 (kx 2024-12-20 16:11:07 +0300 13590)                       сторону минус бесконечности).
868b2b66 (kx 2024-12-20 16:11:07 +0300 13591) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13592)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13593) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13594)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13595)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13596)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13597)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13598) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13599)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13600)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13601)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13602)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13603)                                        TARGET FLOOR;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13604)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13605)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13606)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13607)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13608)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 13609)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13610)                                        data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13611)                                        EIA, & EIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13612) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13613)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 13614) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13615)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13616) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13617)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13618)                   *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13619)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13620)                    *fi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13621)                   *num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13622)                 *equot = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13623)                   *one = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13624)   EMUSHORT      *p, *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13625)   EMUSHORT       j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13626)   __mpu_int32_t  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13627)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13628) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13629)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13630)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13631)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13632)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13633)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13634)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13635)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13636) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13637)   /* Если на входе знаковый ноль. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13638)   if( ei_issignull( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13639)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13640)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13641)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13642)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13643) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13644)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13645)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13646)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13648)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13649)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13650)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13651)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13652)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13653)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13654)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13655) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13656)   exp = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13657)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13658)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13659)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13660) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13661)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13662)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13663)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13664) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13665)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13666)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13667) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13668)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13669)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13670)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13671)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13672) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13673)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13674)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13675)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13676)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13677) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13678)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13679)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13680)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13681) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13682)   /*** Allocate memory for fi, num, equot,one . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13683)   fi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13684)   if( !fi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13685)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13686)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13687) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13688)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13689)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13690)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13691)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13692)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13693) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13694)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13695)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13696) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13697)   num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13698)   if( !num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13699)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13700)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13701) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13702)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13703)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13704)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13705)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13706)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13707) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13708)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13709)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13710)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13712)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13713)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13714) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13715)   equot = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13716)   if( !equot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13717)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13718)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13719) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13720)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13721)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13722)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13723)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13724)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13725) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13726)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13727)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13728)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13729)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13730) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13731)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13732)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13733) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13734)   one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13735)   if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13736)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13737)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13738) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13739)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13740)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13741)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13742)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13743)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13744) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13745)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13746)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13747)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13748)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13749)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13750) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13751)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13752)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13753)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13754) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13755)   ei_copy( fi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13756) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13757)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13758) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13759)   ei_cpye( exp, &fi[1],    ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13760) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13761)   ei_cpye( exp, &fi[ns+2], ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13762) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13763) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13764)   /* Create EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13765) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13766)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13767)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13768)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13769)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13770) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13771)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13772)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13773)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13774)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13775) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13776) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13777)   ei_dece( exone, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13778)   ei_sube( exp, exp, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13779) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13780)   if( ei_cmp0e( exp, nb ) <= 0 ) /* ( exp <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13781)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13782)     ei_cleaz( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13783)     goto isitminus;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13784)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13785) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13786)   /* Формируем INC как количество бит мантиссы. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13787)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13788)   j = EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 13789) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13790)   inc[ne-1] = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13791) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13792)   inc[0]    = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13793) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13794) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13795)   ei_sube( exp, inc, exp, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13796) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13797)   ei_copy( eic, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13798)   if( ei_cmp0e( exp, ne ) <= 0 ) /* ( exp <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13799)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13800)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13801)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13802)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13803)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13804)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13805) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13806)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13807)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13808)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13809)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13810)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13811)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13812) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13813)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13814)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13815) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13816) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13817)   p = &eic[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13818)   *p-- = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13819) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13820)   p = &eic[0];       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13821)   *p++ = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13822) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13823) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13824)   /* Следующее действие правомерно, т.к. количество бит мантиссы
868b2b66 (kx 2024-12-20 16:11:07 +0300 13825)      укладывается в число типа signed EMUSHORT. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13826)   ei_cpye_pack( (EMUSHORT *)(&e), exp, 1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13827) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13828)   while( e >= BITS_PER_EMUSHORT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13829)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13830) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13831)     *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13832) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13833)     *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13834) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13835)     e -= BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13836)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13837) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13838)   /* Clear the remaining bits. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13839)   *p &= bitmask[e];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13840) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13841)   /* Truncate negatives toward minus infinity. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13842) isitminus:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13843) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13844)   if( ei_isneg( fi, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13845)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13846)     _gen_one( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13847) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13848)     q = &eic[ne+ns+1]; /* low part of Signoficand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13849)     p =  &fi[ne+ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13850) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13851)     q = &eic[1];       /* low part of Signoficand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13852)     p =  &fi[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 13853) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13854) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13855)     for( i = 0; i < ns; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13856)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13857) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 13858)       if( *p-- != *q-- )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13859) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 13860)       if( *p++ != *q++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13861) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 13862)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13863)         ei_sub( eic, eic, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13864)         break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13865)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13866) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13867)     } /* End for( all parts of Significand ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13868) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13869)   } /* End if( isneg(fi) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13870) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13871)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13872)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13873)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13874)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13875)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13876) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13877)   /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13878)   /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13879)   /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13880)   /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13881)   __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13882)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13883) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13884) } /* End of ei_floor() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13885) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13886) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13887) void ei_ceil( EMUSHORT *eic, EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13888) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 13889) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13890)  Description        : ei_ceil() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 13891)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13892) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13893)  Concepts           : Return EIC = neargest integer not smaller
868b2b66 (kx 2024-12-20 16:11:07 +0300 13894)                       than EIA (truncated toward plus infinity).
868b2b66 (kx 2024-12-20 16:11:07 +0300 13895)                       Возвращает EIC = наименьшее (ближайшее)
868b2b66 (kx 2024-12-20 16:11:07 +0300 13896)                       целое не меньшее чем EIA (срезает в
868b2b66 (kx 2024-12-20 16:11:07 +0300 13897)                       сторону плюс бесконечности).
868b2b66 (kx 2024-12-20 16:11:07 +0300 13898) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13899)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 13900) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13901)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13902)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13903)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13904)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 13905) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13906)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 13907)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13908)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13909)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13910)                                        TARGET CEIL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13911)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 13912)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13913)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13914)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13915)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 13916)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 13917)                                        data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13918)                                        EIA, & EIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 13919) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13920)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 13921) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13922)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13923) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13924)   EMUSHORT      *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13925)                   *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13926)                   *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13927)                    *fi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13928)                   *num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13929)                 *equot = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 13930)                   *one = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13931)   EMUSHORT      *p, *q;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13932)   EMUSHORT       j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13933)   __mpu_int32_t  e;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13934)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13935) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13936)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13937)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13938)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13939)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13940)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13941)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13942)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13943) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13944)   /* Если на входе знаковый ноль. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13945)   if( ei_issignull( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13946)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13947)     ei_copy( eic, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13948)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13949)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13950) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13951)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13952)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13953)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13954) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13955)   /*** Allocate memory for exone, exp, inc . ******************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13956)   exone = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13957)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13958)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13959)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13960)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13961)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13962) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13963)   exp = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13964)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13965)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13966)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13967) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13968)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13969)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13970)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13971) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13972)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13973)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13974) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13975)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13976)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13977)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13978)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13979) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13980)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13981)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13982)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13983)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13984) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13985)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 13986)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 13987)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13988) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13989)   /*** Allocate memory for fi, num, equot,one . ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13990)   fi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13991)   if( !fi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 13992)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 13993)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 13994) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 13995)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13996)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13997)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 13998)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 13999)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14000) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14001)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14002)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14003) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14004)   num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14005)   if( !num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14006)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14007)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14008) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14009)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14010)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14011)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14012)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14013)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14014) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14015)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14016)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14017)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14018) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14019)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14020)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14021) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14022)   equot = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14023)   if( !equot )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14024)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14025)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14026) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14027)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14028)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14029)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14030)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14031)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14032) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14033)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14034)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14035)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14036)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14037) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14038)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14039)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14040) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14041)   one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14042)   if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14043)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14044)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14045) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14046)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14047)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14048)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14049)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14050)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14051) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14052)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14053)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14054)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14055)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14056)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14057) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14058)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14059)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14060)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14061) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14062)   ei_copy( fi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14063) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14064)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14065) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14066)   ei_cpye( exp, &fi[1],    ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14067) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14068)   ei_cpye( exp, &fi[ns+2], ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14069) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14070) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14071)   /* Create EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14072) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14073)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14074)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14075)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14076)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14077) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14078)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14079)   p = exone + ne - 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14080)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14081)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14082) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14083) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14084)   ei_dece( exone, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14085)   ei_sube( exp, exp, exone, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14086) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14087)   if( ei_cmp0e( exp, nb ) <= 0 ) /* ( exp <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14088)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14089)     ei_cleaz( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14090)     goto isitplus;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14091)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14092) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14093)   /* Формируем INC как количество бит мантиссы. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14094)   for( i = 0; i < ne; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14095)   j = EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14096) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14097)   inc[ne-1] = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14098) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14099)   inc[0]    = j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14100) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14101) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14102)   ei_sube( exp, inc, exp, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14103) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14104)   ei_copy( eic, fi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14105)   if( ei_cmp0e( exp, ne ) <= 0 ) /* ( exp <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14106)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14107)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14108)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14109)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14110)     __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14111)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14112) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14113)     /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14114)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14115)     /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14116)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14117)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14118)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14119) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14120)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14121)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14122) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14123) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14124)   p = &eic[ne+ns+2]; /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14125)   *p-- = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14126) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14127)   p = &eic[0];       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14128)   *p++ = (EMUSHORT)0; /* p -> low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14129) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14130) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14131)   /* Следующее действие правомерно, т.к. количество бит мантиссы
868b2b66 (kx 2024-12-20 16:11:07 +0300 14132)      укладывается в число типа signed EMUSHORT. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14133)   ei_cpye_pack( (EMUSHORT *)(&e), exp, 1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14135)   while( e >= BITS_PER_EMUSHORT )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14136)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14137) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14138)     *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14139) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14140)     *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14141) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14142)     e -= BITS_PER_EMUSHORT;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14143)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14144) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14145)   /* Clear the remaining bits. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14146)   *p &= bitmask[e];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14147) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14148)   /* Truncate positives toward plus infinity. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14149) isitplus:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14150) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14151)   if( !ei_isneg( fi, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14152)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14153)     _gen_one( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14154) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14155)     q = &eic[ne+ns+1]; /* low part of Signoficand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14156)     p =  &fi[ne+ns+1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14157) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14158)     q = &eic[1];       /* low part of Signoficand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14159)     p =  &fi[1];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14160) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14161) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14162)     for( i = 0; i < ns; i++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14163)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14164) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14165)       if( *p-- != *q-- )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14166) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14167)       if( *p++ != *q++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14168) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14169)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14170)         ei_add( eic, eic, one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14171)         break;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14172)       }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14173) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14174)     } /* End for( all parts of Significand ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14175) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14176)   } /* End if( !isneg(fi) ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14177) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14178)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14179)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14180)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14181)   __mpu_sbrk( -(int)(3*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14182)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14183) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14184)   /* FREE fi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14185)   /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14186)   /* FREE equot *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14187)   /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14188)   __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14189)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14190) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14191) } /* End of ei_ceil() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14192) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14193) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14194) void ei_round( EMUSHORT *eic, EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14195) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14196) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14197)  Description        : ei_round() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 14198)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14199) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14200)  Concepts           : Return EIC = nearest integer to EIA,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14201)                       as FLOOR( EIA + 0.5 ).
868b2b66 (kx 2024-12-20 16:11:07 +0300 14202) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14203)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14204) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14205)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14206)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14207) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14208)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14209)                       EMUSHORT *eic; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14210)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14211)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14212)                                        TARGET CEIL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14213)                       EMUSHORT *eia; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14214)                                        internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14215)                                        data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14216)                                        SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14217)                       int nb;        - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14218)                                        external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14219)                                        data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14220)                                        EIA, & EIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14221) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14222)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 14223) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14224)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14225) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14226)   EMUSHORT *half = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14227)   int       np;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14229)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14230)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14231)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14232)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14233)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14234)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14235)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14236) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14237)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14238) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14239)   /*** Allocate memory for half . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14240)   half = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14241)   if( !half )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14242)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14243)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14244)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14245)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14246)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14247) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14248) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14249)   _gen_half( half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14250)   ei_add( eic, eia, half, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14251)   ei_floor( eic, eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14252) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14253) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14254)   /* FREE half **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14255)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14256)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14257) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14258) } /* End of ei_round() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14260) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14261) void ei_frexp( EMUSHORT *eis, EMUSHORT *lpexp, EMUSHORT *eia, int nlp, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14262) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14263) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14264)  Description        : ei_frexp() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 14265)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14266) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14267)  Concepts           : Return EIS and LPEXP such that
868b2b66 (kx 2024-12-20 16:11:07 +0300 14268)                       EIS * 2^LPEXP = EIA and 0.5 <= EIS < 1.0.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14269)                       For example, 1.1 = 0.55 * 2^1.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14270)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14271)                       Функция разбивает число EIA на мантиссу
868b2b66 (kx 2024-12-20 16:11:07 +0300 14272)                       EIS и экспоненту LPEXP таким образом,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14273)                       что абсолютное значение EIS больше или
868b2b66 (kx 2024-12-20 16:11:07 +0300 14274)                       равно 0.5 и меньше 1.0 и
868b2b66 (kx 2024-12-20 16:11:07 +0300 14275)                       EIA == EIS * 2^LPEXP.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14276)                       Например, 1.1 = 0.55 * 2^1.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14277) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14278)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14279) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14280)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14281)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14282)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14283)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14284) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14285)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14286)                       EMUSHORT *eis;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14287)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14288)                                          data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14289)                                          TARGET Significand;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14290)                       EMUSHORT *lpexp; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14291)                                          external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14292)                                          INTEGER number.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14293)                                          TARGET EXP;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14294)                       EMUSHORT *eia;   - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14295)                                          internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14296)                                          data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14297)                                          SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14298)                       int nlp;         - количество порций
868b2b66 (kx 2024-12-20 16:11:07 +0300 14299)                                          размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14300)                                          external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14301)                                          INTEGER number;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14302)                                          LPEXP.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14303)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14304)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14305)                        NLP должно быть не меньше количества
868b2b66 (kx 2024-12-20 16:11:07 +0300 14306)                        порций размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14307)                        Exponent( EIA ), т.е.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14308)                                   nlp >= internal_ne(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14309)                        ВНИМАНИЕ:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14310)                           При использовании данной функции
868b2b66 (kx 2024-12-20 16:11:07 +0300 14311)                           программист обязан самостоятельно
868b2b66 (kx 2024-12-20 16:11:07 +0300 14312)                           отслеживать размер памяти,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14313)                           выделяемой под LPEXP.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14314)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14316)                       int nb;          - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14317)                                          external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14318)                                          data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14319)                                          EIA, & EIS.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14320) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14321)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 14322) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14323)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14324) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14325)   EMUSHORT      *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14326)                 *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14327)                  *xi = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14328)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14329)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14330)   int            np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14331) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14332)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14333)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14334)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14335)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14336)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14337)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14338)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14339) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14340)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14341)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14342)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14343) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14344)   if( nlp < ne )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14345)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14346)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14347)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14348)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14349)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14350)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14351) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14352)   /*** Allocate memory for exp, inc, xi . *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14353)   exp = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14354)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14355)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14356)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14357)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14358)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14359) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14360)   inc = (EMUSHORT *)__mpu_sbrk( (int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14361)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14362)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14363)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14364) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14365)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14366)     __mpu_sbrk( -(int)(ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14367)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14368) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14369)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14370)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14371) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14372)   xi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14373)   if( !xi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14374)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14375)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14376) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14377)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14378)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14379)     __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14380)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14381) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14382)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14383)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14384)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14385) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14386)   ei_copy( xi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14387) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14388)   /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 14389)     Handle denormalized numbers properly using long integer exponent.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14390)    */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14391) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14392)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14393) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14394)   ei_cpye_unpack( exp, &xi[1],    ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14395) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14396)   ei_cpye_unpack( exp, &xi[ns+2], ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14397) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14398) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14399)   if( ei_cmp0e( exp, ne ) == 0 ) /* ( exp == 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14400)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14401)     /* exp -= ei_normalize( xi ); */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14402)     j = ei_normalize( xi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14403)     ei_cpye_unpack( inc, (EMUSHORT *)&j, ne, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14404)     ei_sube( exp, exp, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14405)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14406) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14407)   /* Формирование HALF (экспоненты 0.5) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14408) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14409)   p = &inc[0];    /* hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14410)   *p++ = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14411)   for( i = 1; i < ne; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14412)   --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14413)   *p ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14414) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14415)   p = &inc[ne-1]; /* hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14416)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14417)   for( i = 1; i < ne; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14418)   ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14419)   *p ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14420) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14421) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14422)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14423) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14424)   ei_cpye_unpack( &xi[1],    inc, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14425) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14426)   ei_cpye_unpack( &xi[ns+2], inc, ne, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14427) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14428) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14429)   ei_copy( eis, xi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14430) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14431)   ei_sube( exp, exp, inc, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14432) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14433)   ei_cpye_unpack( lpexp, exp, nlp, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14434) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14435)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14436)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14437)   __mpu_sbrk( -(int)(2*ne*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14438)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14440)   /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14441)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14442)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14443) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14444) } /* End of ei_frexp() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14445) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14446) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14447) void ei_ldexp( EMUSHORT *eic, EMUSHORT *lppwr2, EMUSHORT *eia, int nlp, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14448) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14449) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14450)  Description        : ei_ldexp() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 14451)                                  internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14453)  Concepts           : Return EIC = EIA * 2^PWR2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14454)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14455)                       Функция вычисляет значение EIC как
868b2b66 (kx 2024-12-20 16:11:07 +0300 14456)                       EIA умноженное на 2 в степени LPPWR2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14457) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14458)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14459) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14460)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14461)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14462)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14464)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14465)                       EMUSHORT *eic;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14466)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14467)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14468)                                           TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14469)                       EMUSHORT *lppwr2; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14470)                                           external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14471)                                           INTEGER number.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14472)                                           SOURCE PWR2;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14473)                       EMUSHORT *eia;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14474)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14475)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14476)                                           SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14477)                       int nlp;          - количество порций
868b2b66 (kx 2024-12-20 16:11:07 +0300 14478)                                           размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14479)                                           external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14480)                                           INTEGER number;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14481)                                           LPPWR2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14482)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14483)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14484)                        NLP должно быть не больше количества
868b2b66 (kx 2024-12-20 16:11:07 +0300 14485)                        порций размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14486)                        Exponent( EIA )+1, т.е.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14487)                                   nlp <= internal_ne(nb)+1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14488)                        ВНИМАНИЕ:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14489)                           При использовании данной функции
868b2b66 (kx 2024-12-20 16:11:07 +0300 14490)                           программист обязан самостоятельно
868b2b66 (kx 2024-12-20 16:11:07 +0300 14491)                           отслеживать размер памяти,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14492)                           выделяемой под LPPWR2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14493)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14494) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14495)                       int nb;           - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14496)                                           external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14497)                                           data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14498)                                           EIA, & EIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14499) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14500)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 14501) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14502)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14503) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14504)   EMUSHORT *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14505)            *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14506)             *xi = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14507)   int       np, ne, ns;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14508) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14509)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14510)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14511)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14512)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14513)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14514)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14515)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14516) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14517)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14518)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14519)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14520) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14521)   if( nlp > ne+1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14522)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14523)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14524)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14525)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14526)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14527)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14528) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14529)   /*** Allocate memory for exp, inc, xi . *********************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14530)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14531)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14532)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14533)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14534)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14535)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14536) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14537)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14538)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14539)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14540)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14541) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14542)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14543)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14544)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14545) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14546)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14547)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14548) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14549)   xi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14550)   if( !xi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14551)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14552)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14553) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14554)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14555)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14556)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14557)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14559)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14560)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14561)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14562) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14563)   ei_copy( xi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14564) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14565)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14566) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14567)   ei_cpye_unpack( exp, &xi[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14568) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14569)   ei_cpye_unpack( exp, &xi[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14570) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14571) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14572)   /* Copy PWR2 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14573)   ei_cpye_unpack( inc, lppwr2, ne+1, nlp );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14575)   /* exp += pwr2 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14576)   ei_adde( exp, exp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14577) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14578)   ei_mdenorm( xi, 0, 0, exp, 0, nb ); /* rcntrl = 0 (просто обнуляем lgw) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14579) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14580)   ei_copy( eic, xi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14581) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14582)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14583)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14584)   __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14585)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14586) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14587)   /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14588)   __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14589)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14590) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14591) } /* End of ei_ldexp() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14593) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14594) void ei_logb( EMUSHORT *lpbase2, EMUSHORT *eia, int nlp, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14595) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14596) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14597)  Description        : ei_logb() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 14598)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14599) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14600)  Concepts           : Return LPbase2 = the base 2 signed
868b2b66 (kx 2024-12-20 16:11:07 +0300 14601)                                        integral Exponent of
868b2b66 (kx 2024-12-20 16:11:07 +0300 14602)                                        EIA.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14603)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14604)                       Функция вычисляет значение LPbase2 как
868b2b66 (kx 2024-12-20 16:11:07 +0300 14605)                       знаковую интегральную экспоненту по
868b2b66 (kx 2024-12-20 16:11:07 +0300 14606)                       основанию 2 вещественного числа EIA.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14607) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14608)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14609) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14610)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14611)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14612)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 14613) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14614)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 14615)                       EMUSHORT *lpbase2; - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14616)                                            external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14617)                                            INTEGER number.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14618)                                            TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14619)                       EMUSHORT *eia;     - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 14620)                                            internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14621)                                            data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14622)                                            SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14623)                       int nlp;           - количество порций
868b2b66 (kx 2024-12-20 16:11:07 +0300 14624)                                            размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14625)                                            external long
868b2b66 (kx 2024-12-20 16:11:07 +0300 14626)                                            INTEGER number;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14627)                                            LPBASE2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14628)                       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14629)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14630)                        NLP должно быть БОЛЬШЕ или равно
868b2b66 (kx 2024-12-20 16:11:07 +0300 14631)                        количеству порций размера EMUSHORT в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14632)                        Exponent( EIA )+1, т.е.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14633)                           nlp >= internal_ne(nb)+1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14634)                        ВНИМАНИЕ:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14635)                           При использовании данной функции
868b2b66 (kx 2024-12-20 16:11:07 +0300 14636)                           программист обязан самостоятельно
868b2b66 (kx 2024-12-20 16:11:07 +0300 14637)                           отслеживать размер памяти,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14638)                           выделяемой под LPBASE2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14639)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 14640) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14641)                       int nb;           - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 14642)                                           external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 14643)                                           data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14644)                                           EIA.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14645) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14646)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 14647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14648)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14649) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14650)   EMUSHORT   *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14651)            *base2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14652)            *exone = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14653)             *pwr2 = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14654)              *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14655)               *xi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14656)             *zero = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14657)              *one = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14658)               *ti = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14659)   EMUSHORT *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14660)   EMUSHORT  n_mant_bits = EINSBITS(nb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 14661)   int       np, ne, ns, i;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14663)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14664)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14665)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14666)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14667)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14668)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14669)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14670) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14671)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14672)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14673)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14674) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14675)   if( nlp < ne+1 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14676)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14677)     /* fatal error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14678)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14679)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14680)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14681)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14682) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14683)   /*** Allocate memory for xi . *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14684)   xi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14685)   if( !xi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14686)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14687)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14688)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14689)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14690)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14692)   ei_copy( xi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14693) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14694)   /***************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14695)     Test for EIA.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14696)    ***************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14697)   /* EI_LOGB(InD) produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14698)   if( ei_isind( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14699)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14700)     /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14701)     /* return: ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14702)     for( i = 0; i < nlp; i++ ) lpbase2[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14703)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14704)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14705)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 14706)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14707)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 14708)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 14709)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 14710)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14711) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14712)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14713)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14714)     _mtherr( (EMUSHORT *)0, /* not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14715)            (__mpu_char8_t *)"logb", __DOMAIN__, (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14716)            xi, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14717)     __STDOM; /* Set REAL InD - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14718) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14719)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14720)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14721)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14722) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14723)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14724)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14725)   /* EI_LOGB(NaN) produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14726)   if( ei_isnans( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14727)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14728)     /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14729)     /* return: ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14730)     for( i = 0; i < nlp; i++ ) lpbase2[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14731)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14732)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14733)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 14734)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14735)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 14736)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 14737)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 14738)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14739) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14740)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14741)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14742)     _mtherr( (EMUSHORT *)0, /* not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14743)            (__mpu_char8_t *)"logb", __DOMAIN__, (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14744)            xi, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14745)     __STDOM; /* Set REAL NaN - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14746) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14747)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14748)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14749)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14750) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14751)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14752)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14753) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14754)   /* EI_LOGB(Infinity) produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14755)   if( ei_isinfin( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14756)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14757)     /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14758)     /* return: ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14759)     for( i = 0; i < nlp; i++ ) lpbase2[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14760)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14761)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14762)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 14763)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14764)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 14765)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 14766)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 14767)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14768) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14769)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14770)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14771)     _mtherr( (EMUSHORT *)0, /* not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14772)            (__mpu_char8_t *)"logb", __DOMAIN__, (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14773)            xi, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14774)     __STDOM; /* Set REAL Infinity - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14775) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14776)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14777)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14778)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14779) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14780)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14781)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14782) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14783)   /*** Allocate memory for zero . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14784)   zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14785)   if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14786)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14787)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14788) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14789)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14790)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14791)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14792) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14793)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14794)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14795)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14796) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14797)   _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14798) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14799)   /* EI_LOGB(0.0) produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14800)   if( ei_cmp( zero, eia, nb ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14801)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14802)     /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14803)     /* return: ZERO */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14804)     for( i = 0; i < nlp; i++ ) lpbase2[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14805)     /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14806)       NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 14807)         Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 14808)         внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14809)         переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 14810)         __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 14811)         она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 14812)         следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14813) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14814)           errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 14815)      ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14816)     _mtherr( (EMUSHORT *)0, /* not change */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14817)            (__mpu_char8_t *)"logb", __DOMAIN__, (EMUSHORT *)0,
868b2b66 (kx 2024-12-20 16:11:07 +0300 14818)            xi, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14819)     __STDOM; /* Set REAL (EIA == 0.0) - produsing Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14820) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14821)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14822)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14823)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14824)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14825) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14826)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14827)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14828) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14829)   /*** Allocate memory for one . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14830)   one = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14831)   if( !one )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14832)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14833)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14834) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14835)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14836)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14837)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14838)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14839) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14840)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14841)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14842)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14843) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14844)   _gen_one( one, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14845) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14846)   /*** Allocate memory for ti, exp, base2, exone, pwr2, inc . */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14847)   ti = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14848)   if( !ti )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14849)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14850)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14851) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14852)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14853)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14854)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14855)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14856)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14857) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14858)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14859)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14860) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14861)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14862)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14863)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14864)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14865) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14866)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14867)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14868)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14869)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14870)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14871)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14872) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14873)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14874)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14875) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14876)   base2 = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14877)   if( !base2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14878)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14879)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14880) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14881)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14882)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14883)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14884)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14885)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14886)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14887) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14888)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14889)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14890)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14891) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14892)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14893)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14894) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14895)   exone = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14896)   if( !exone )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14897)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14898)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14899) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14900)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14901)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14902)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14903)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14904)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14905)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14906) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14907)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14908)     /* FREE base2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14909)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14910)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14911) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14912)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14913)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14914) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14915)   pwr2 = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14916)   if( !pwr2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14917)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14918)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14919) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14920)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14921)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14922)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14923)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14924)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14925)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14926) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14927)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14928)     /* FREE base2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14929)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14930)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14931)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14932) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14933)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14934)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14935) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14936)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14937)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14938)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14939)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14940) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14941)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14942)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14943)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14944)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14945)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14946)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14947) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14948)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14949)     /* FREE base2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14950)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14951)     /* FREE pwr2 **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14952)     __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14953)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14954) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14955)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14956)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 14957)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14958) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14959)   /* Generate the EXONE */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14960) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14961)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14962)   p = exone;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14963)   *p++ = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14964)   *p++ = HIGHT_EXONE; /* 0x3fff... */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14965)   for( i = 0; i < ne - 1; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14966) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14967)   /* hight part */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14968)   p = exone + ne;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14969)   *p-- = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14970)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14971)   for( i = 0; i < ne - 1; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14972) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14973) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14974)   /* Copy Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14975) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 14976)   ei_cpye_unpack( exp, &xi[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14977) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 14978)   ei_cpye_unpack( exp, &xi[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14979) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 14980) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14981) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14982)   if( ei_cmp0e( exp, ne+1 ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 14983)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 14984)     /**********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 14985)       A denormalized number.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14986)       ----------------------
868b2b66 (kx 2024-12-20 16:11:07 +0300 14987)       Multiplyng by 2^N_MANT_BITS normalizes it;
868b2b66 (kx 2024-12-20 16:11:07 +0300 14988)       we then subtract the N_MANT_BITS we added
868b2b66 (kx 2024-12-20 16:11:07 +0300 14989)       to the Exponent.
868b2b66 (kx 2024-12-20 16:11:07 +0300 14990)      **********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 14991)     ei_cpye_unpack( pwr2, &n_mant_bits, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14992)     ei_ldexp( ti, pwr2, one, ne+1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14993)     ei_mul( ti, xi, ti, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14994)     ei_logb( pwr2, ti, ne+1, nb ); /* Recursion */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14995)     ei_cpye_unpack( inc, &n_mant_bits, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14996)     ei_sube( base2, pwr2, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 14997)     ei_cvte_unpack( lpbase2, base2, nlp, ne+1 ); /* nlp >= ne+1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 14998) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 14999)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15000)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15001)     /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15002)     /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15003)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15004)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15005) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15006)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15007)     /* FREE base2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15008)     /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15009)     /* FREE pwr2 **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15010)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15011)     __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15012)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15013) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15014)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15015)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15016) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15017)   ei_sube( base2, exp, exone, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15018)   ei_cvte_unpack( lpbase2, base2, nlp, ne+1 ); /* nlp >= ne+1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15019) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15020)   /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15021)   /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15022)   /* FREE one ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15023)   /* FREE ti ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15024)   __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15025)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15026) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15027)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15028)   /* FREE base2 *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15029)   /* FREE exone *************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15030)   /* FREE pwr2 **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15031)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15032)   __mpu_sbrk( -(int)(5*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15033)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15034) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15035) } /* End of ei_logb() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15036) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15037) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15038) void ei_sqrt( EMUSHORT *eic, EMUSHORT *eia, int nb )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15039) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15040) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15041)  Description        : ei_sqrt() Работает с
868b2b66 (kx 2024-12-20 16:11:07 +0300 15042)                                 internal e-type data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15043) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15044)  Concepts           : Longhand SQUARE ROOT routine.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15045)                       =========================================
868b2b66 (kx 2024-12-20 16:11:07 +0300 15046)                       Вычисление обыкновенного КВАДРАТНОГО
868b2b66 (kx 2024-12-20 16:11:07 +0300 15047)                       КОРНЯ. (Если аргумент отрицательный,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15048)                       то результат равен нулю).
868b2b66 (kx 2024-12-20 16:11:07 +0300 15049) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15050)  Use Global Variable:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15051) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15052)  Use Functions      :
868b2b66 (kx 2024-12-20 16:11:07 +0300 15053)                       internal_np( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 15054)                       internal_ne( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 15055)                       internal_ns( nb );          | this file
868b2b66 (kx 2024-12-20 16:11:07 +0300 15056) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15057)  Parameters         :
868b2b66 (kx 2024-12-20 16:11:07 +0300 15058)                       EMUSHORT *eic;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 15059)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 15060)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15061)                                           TARGET;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15062)                       EMUSHORT *eia;    - указатель на
868b2b66 (kx 2024-12-20 16:11:07 +0300 15063)                                           internal e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 15064)                                           data struct.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15065)                                           SOURCE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15066)                       int nb;           - количество бит в
868b2b66 (kx 2024-12-20 16:11:07 +0300 15067)                                           external e-type
868b2b66 (kx 2024-12-20 16:11:07 +0300 15068)                                           data struct;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15069)                                           EIA, & EIC.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15070) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15071)  Return             : [void]
868b2b66 (kx 2024-12-20 16:11:07 +0300 15072) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15073)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15074) {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15075)   EMUSHORT           *exp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15076)                      *inc = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15077)                       *mt = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15078)                        *m = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15079)                 *sqrndbit = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15080)                     *temp = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15081)                      *num = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15082)                       *sq = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15083)                       *xi = NULL,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15084)                       *xa = NULL, /* temp EIA for _mtherr() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15085)                     *zero = NULL;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15086)   EMUSHORT      *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15087)   __mpu_int32_t  j;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15088)   int            np, ne, ns, i, w;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15089)   int            k, l, n, nlups;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15090) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15091)   if( nb < NBR_32 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15092)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15093)     /* error: Invalid size of operand(s) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15094)     __real_error_no = __R_ESIZE__;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15095)     __STIND; /* Set REAL ind-produsing operation Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15096)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15097)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15098) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15099)   np = internal_np( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15100)   ne = internal_ne( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15101)   ns = internal_ns( nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15102) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15103)   /*** Allocate memory for sqrndbit . *************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15104)   sqrndbit = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15105)   if( !sqrndbit )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15106)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15107)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15108)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15109)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15110)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15111) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15112)   ei_cleaz( sqrndbit, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15113) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15114)   sqrndbit[ne+ns+1] = (EMUSHORT)1; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15115) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15116)   sqrndbit[1]       = (EMUSHORT)1; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15117) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15118) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15119)   /*** Allocate memory for xa . *******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15120)   xa = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15121)   if( !xa )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15122)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15123)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15124) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15125)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15126)     __mpu_sbrk( -(int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15127)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15128) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15129)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15130)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15131)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15132) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15133)   ei_copy( xa, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15134) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15135)   /*** Allocate memory for zero . *****************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15136)   zero = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15137)   if( !zero )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15138)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15139)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15140) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15141)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15142)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15143)     __mpu_sbrk( -(int)(2*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15144)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15145) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15146)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15147)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15148)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15149) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15150)   /* Check for EIA <= 0 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15151)   _gen_zero( zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15152)   l = ei_cmp( eia, zero, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15153)   if( l <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15154)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15155)     if( l == -2 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15156)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15157)       ei_nan( eic, ei_isneg( eia, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15158) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15159)       /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15160)       /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15161)       /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15162)       __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15163)       /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15164) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15165)       return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15166)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15167) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15168)     ei_cleaz( eic, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15169) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15170)     if( l < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15171)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15172)       /* "argument domain error" */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15173)       /***************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15174)         NOTE:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15175)           Функция _mtherr() является переходником между
868b2b66 (kx 2024-12-20 16:11:07 +0300 15176)           внутренним форматом и внешней,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15177)           переопределяемой пользователем, функцией
868b2b66 (kx 2024-12-20 16:11:07 +0300 15178)           __mpu_math_error(). Кроме основных действий
868b2b66 (kx 2024-12-20 16:11:07 +0300 15179)           она выставляет системную переменную errno
868b2b66 (kx 2024-12-20 16:11:07 +0300 15180)           следующим образом.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15181) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15182)             errno = __mpu_math_errnotab[type];
868b2b66 (kx 2024-12-20 16:11:07 +0300 15183)        ***************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15184)       _mtherr( eic, (__mpu_char8_t *)"sqrt", __DOMAIN__,
868b2b66 (kx 2024-12-20 16:11:07 +0300 15185)                eic, xa, (EMUSHORT *)0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15186)       __STDOM; /* Set REAL Domain Flag */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15187)     }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15188) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15189)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15190)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15191)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15192)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15193)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15194) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15195)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15196) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15197)   } /* End if( l <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15198) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15199)   /* Check Infinity */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15200)   if( ei_isinfin( eia, nb ) )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15201)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15202)     ei_infin( eic, ei_isneg( eia, nb ), nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15203) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15204)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15205)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15206)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15207)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15208)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15209) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15210)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15211)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15212) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15213) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15214)   /*** Allocate memory for temp, num, sq, xi . ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15215)   temp = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15216)   if( !temp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15217)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15218)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15219) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15220)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15221)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15222)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15223)     __mpu_sbrk( -(int)(3*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15224)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15225) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15226)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15227)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15228) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15229)   num = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15230)   if( !num )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15231)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15232)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15233) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15234)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15235)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15236)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15237)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15238)     __mpu_sbrk( -(int)(4*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15239)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15240) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15241)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15242)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15243) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15244)   sq = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15245)   if( !sq )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15246)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15247)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15248) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15249)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15250)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15251)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15252)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15253)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15254)     __mpu_sbrk( -(int)(5*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15255)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15256) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15257)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15258)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15259) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15260)   xi = (EMUSHORT *)__mpu_sbrk( (int)(np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15261)   if( !xi )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15262)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15263)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15264) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15265)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15266)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15267)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15268)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15269)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15270)     /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15271)     __mpu_sbrk( -(int)(6*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15272)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15273) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15274)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15275)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15276)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15277) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15278)   /*** Allocate memory for exp . ******************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15279)   exp = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15280)   if( !exp )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15281)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15282)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15283) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15284)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15285)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15286)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15287)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15288)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15289)     /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15290)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15291)     __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15292)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15293) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15294)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15295)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15296) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15297)   inc = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15298)   if( !inc )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15299)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15300)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15301) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15302)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15303)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15304)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15305)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15306)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15307)     /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15308)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15309)     __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15310)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15311) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15312)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15313)     __mpu_sbrk( -(int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15314)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15315) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15316)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15317)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15318) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15319)   mt = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15320)   if( !mt )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15321)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15322)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15323) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15324)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15325)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15326)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15327)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15328)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15329)     /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15330)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15331)     __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15332)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15333) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15334)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15335)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15336)     __mpu_sbrk( -(int)(2*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15337)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15338) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15339)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15340)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15341) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15342)   m = (EMUSHORT *)__mpu_sbrk( (int)((ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15343)   if( !m )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15344)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15345)     /* fatal error */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15346) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15347)     /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15348)     /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15349)     /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15350)     /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15351)     /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15352)     /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15353)     /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15354)     __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15355)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15356) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15357)     /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15358)     /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15359)     /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15360)     __mpu_sbrk( -(int)(3*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15361)     /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15362) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15363)     return;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15364)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15365)   /************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15366) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15367) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15368)   /* Bring in the arg and renormalize if it is denormal. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15369)   ei_copy( xi, eia, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15370) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15371)   /* Copy Exponents */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15372) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15373)   ei_cpye_unpack( m, &xi[1],    ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15374) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15375)   ei_cpye_unpack( m, &xi[ns+2], ne+1, ne );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15376) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15377)   if( ei_cmp0e( m, ne+1 ) == 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15378)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15379)     /* m -= ei_normalize( xi ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15380)     j = ei_normalize( xi, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15381)     ei_cvte_unpack( inc, (EMUSHORT *)&j, ne+1, 1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15382)     ei_sube( m, m, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15383)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15384) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15385)   /* bzero inc !!! */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15386)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15387) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15388)   /**************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15389)     Divide Exponent by 2.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15390)    **************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15391)   /* Формирование HALF (экспоненты 0.5) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15392) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15393)   p = &inc[0];    /* hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15394)   *p++ = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15395)   for( i = 1; i < ne; i++ ) *p++ = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15396)   --p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15397)   *p ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15398) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15399)   p = &inc[ne-1]; /* hight part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15400)   *p-- = HIGHT_EXONE;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15401)   for( i = 1; i < ne; i++ ) *p-- = MASK_ALL_BITS;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15402)   ++p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15403)   *p ^= 1; /* Low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15404) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15405) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15406)   /* m -= 0x3f...fe; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15407)   ei_sube( m, m, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15408)   /* exp = (m / 2) + 0x3f...fe; */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15409)   if( ei_cmp0e( m, ne+1 ) < 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15410)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15411)     /* НЕЛЬЗЯ ПРОСТО СДВИНУТЬ ОТРИЦАТЕЛЬНОЕ ЧИСЛО. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15412)     ei_nege(  mt,  m, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15413)     ei_shrn(  mt, mt, (unsigned)1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15414)     ei_nege( exp, mt, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15415)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15416)   else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15417)     ei_shrn( exp, m, (unsigned)1, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15418)   ei_adde( exp, exp, inc, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15419) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15420)   /*** End Divide Exponent by 2 *********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15421) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15422)   /* Adjust if Exponent odd. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15423)   for( i = 0; i < ne+1; i++ ) inc[i] = (EMUSHORT)0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15424) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15425)   inc[ne] = (EMUSHORT)1; /* low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15426) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15427)   inc[0]  = (EMUSHORT)1; /* low part of Exponent */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15428) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15429) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15430)   /* mt = m & 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15431)   for( i = 0; i < ne+1; i++ ) mt[i] = m[i] & inc[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 15432) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15433)   if( ei_cmp0e( mt, ne+1 ) != 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15434)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15435)     if( ei_cmp0e( m, ne+1 ) > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15436)       ei_adde( exp, exp, inc, ne+1 ); /* exp += 1 */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15437)     ei_shdown( xi, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15438)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15439) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15440)   ei_cleaz(  sq, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15441)   ei_cleaz( num, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15442) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15443)   n     = ((BITS_PER_EMUSHORT)/2);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15444)   nlups = EINSBITS(nb);   /* Количество бит мантиссы. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15445)   w     = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15446) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15447) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15448)   p = &xi[ne+2]; /* hight part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15449) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15450)   p = &xi[ns];   /* hight part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15451) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15452) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15453)   while( nlups > 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15454)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15455)     /* Bring in next word of arg. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15456)     if( w < ns+1 ) /* Significand + lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15457) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15458)       num[ne+ns+2] = /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15459) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15460)       num[0] =       /* lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15461) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15462)       *p;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15463) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15464)     /* Do additional bit on last outer loop, for roundoff. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15465)     if( nlups <= ((BITS_PER_EMUSHORT)/2) ) n = nlups + 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15466) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15467)     for( k = 0; k < n; k++ )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15468)     {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15469)       /* Next 2 bits of arg */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15470)       ei_shup( num, (unsigned)2, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15471)       /* Shift up answer */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15472)       ei_shup(  sq, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15473)       /* Make trial divisor */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15474)       for( i = 0; i < np; i++ ) temp[i] = sq[i];
868b2b66 (kx 2024-12-20 16:11:07 +0300 15475)       ei_shup( temp, (unsigned)1, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15476)       ei_addm( temp, temp, sqrndbit, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15477)       /* Substract and insert answer bit if it goes in */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15478)       if( ei_cmpm( temp, num, nb ) <= 0 )
868b2b66 (kx 2024-12-20 16:11:07 +0300 15479)       {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15480)         ei_subm( num, num, temp, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15481) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15482)         sq[ne+ns+1] |= 1; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15483) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15484)         sq[1]       |= 1; /* low part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15485) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15486)       } /* End if( ei_cmpm( temp, num ) <= 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15487) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15488)     } /* End for( k = 0; i < n; k++ ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15489) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15490)     nlups -= n;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15491)     w     += 1;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15492) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15493)     ++p; /* toward lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15494) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15495)     --p; /* toward lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15496) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15497)   } /* End while( nlups > 0 ) */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15498) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15499) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15500)   /* Adjust for extra, roundoff loop done. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15501)   /* exp += (EINSBITS(nb) - 1) - rndprc;   */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15502)   /* т.к. в нашем случае (EINSBITS(nb) == rndprc)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15503)      делаем exp += -1; т.е. округляем до количества
868b2b66 (kx 2024-12-20 16:11:07 +0300 15504)      бит в мантиссе во внутреннем формате. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15505)   ei_dece( exp, exp, ne+1 );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15506) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15507)   /* Sticky bit = 1 if the remainder is nonzero. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15508)   k = 0;
868b2b66 (kx 2024-12-20 16:11:07 +0300 15509) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15510)   p = &num[ne+2]; /* hight part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15511) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15512)   p = &num[ns];   /* hight part of Significand */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15513) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15514)   for( i = 0; i < ns+1; i++ ) /* Significand + lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15515)   {
868b2b66 (kx 2024-12-20 16:11:07 +0300 15516) /* NOTE: x86_64: sizeof( long ) == 8!
868b2b66 (kx 2024-12-20 16:11:07 +0300 15517)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15518)     k |= (int)(__mpu_uint64_t)
868b2b66 (kx 2024-12-20 16:11:07 +0300 15519) #if MPU_WORD_ORDER_BIG_ENDIAN == 1
868b2b66 (kx 2024-12-20 16:11:07 +0300 15520)              p++; /* toward lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15521) #else
868b2b66 (kx 2024-12-20 16:11:07 +0300 15522)              p--; /* toward lgw */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15523) #endif
868b2b66 (kx 2024-12-20 16:11:07 +0300 15524)   }
868b2b66 (kx 2024-12-20 16:11:07 +0300 15525) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15526)   /* Renormalize and round off. */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15527)   ei_mdenorm( sq, k, 0, exp, 0, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15528) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15529)   ei_copy( eic, sq, nb );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15530) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15531)   /* FREE sqrndbit **********/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15532)   /* FREE xa ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15533)   /* FREE zero **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15534)   /* FREE temp **************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15535)   /* FREE num ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15536)   /* FREE sq ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15537)   /* FREE xi ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15538)   __mpu_sbrk( -(int)(7*np*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15539)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15540) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15541)   /* FREE exp ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15542)   /* FREE inc ***************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15543)   /* FREE mt ****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15544)   /* FREE m *****************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15545)   __mpu_sbrk( -(int)(4*(ne+1)*SIZE_OF_EMUSHORT) );
868b2b66 (kx 2024-12-20 16:11:07 +0300 15546)   /**************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15547) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15548) } /* End of ei_sqrt() */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15549) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15550) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15551) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15552)   Hide internal symbols:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15553)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15554) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15555) __mpu_hidden_decl(internal_ne);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15556) __mpu_hidden_decl(internal_ns);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15557) __mpu_hidden_decl(internal_np);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15558) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15559) __mpu_hidden_decl(ei_cleaz);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15560) __mpu_hidden_decl(ei_cleazs);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15561) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15562) __mpu_hidden_decl(ei_ind);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15563) __mpu_hidden_decl(ei_isind);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15564) __mpu_hidden_decl(e_ind);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15565) __mpu_hidden_decl(e_isind);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15566) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15567) __mpu_hidden_decl(ei_nan);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15568) __mpu_hidden_decl(ei_isnans);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15569) __mpu_hidden_decl(e_nan);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15570) __mpu_hidden_decl(e_isnans);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15571) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15572) __mpu_hidden_decl(ei_nanmax);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15573) __mpu_hidden_decl(ei_isnanmax);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15574) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15575) __mpu_hidden_decl(e_nanmax);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15576) __mpu_hidden_decl(e_isnanmax);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15577) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15578) __mpu_hidden_decl(ei_nanmin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15579) __mpu_hidden_decl(ei_isnanmin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15580) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15581) __mpu_hidden_decl(e_nanmin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15582) __mpu_hidden_decl(e_isnanmin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15583) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15584) __mpu_hidden_decl(ei_infin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15585) __mpu_hidden_decl(ei_isinfin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15586) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15587) __mpu_hidden_decl(e_infin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15588) __mpu_hidden_decl(e_isinfin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15589) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15590) __mpu_hidden_decl(e_realmin);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15591) __mpu_hidden_decl(e_realmax);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15592) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15593) __mpu_hidden_decl(ei_signull);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15594) __mpu_hidden_decl(ei_issignull);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15595) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15596) __mpu_hidden_decl(e_signull);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15597) __mpu_hidden_decl(e_issignull);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15598) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15599) __mpu_hidden_decl(ei_neg);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15600) __mpu_hidden_decl(ei_isneg);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15601) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15602) __mpu_hidden_decl(e_neg);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15603) __mpu_hidden_decl(e_isneg);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15604) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15605) __mpu_hidden_decl(ei_abs);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15606) __mpu_hidden_decl(e_abs);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15607) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15608) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15609) /********************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15610)   Functions for LONG INTEGER NUMBERS:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15611)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15612) __mpu_hidden_decl(ei_cmpe);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15613) __mpu_hidden_decl(ei_cmp0e);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15614) __mpu_hidden_decl(ei_cpye_pack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15615) __mpu_hidden_decl(ei_cpye_unpack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15616) __mpu_hidden_decl(ei_cpye);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15617) __mpu_hidden_decl(ei_cvte_unpack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15618) __mpu_hidden_decl(ei_cvte_pack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15619) __mpu_hidden_decl(ei_cvte);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15620) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15621) __mpu_hidden_decl(ei_adde);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15622) __mpu_hidden_decl(ei_ince);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15623) __mpu_hidden_decl(ei_sube);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15624) __mpu_hidden_decl(ei_dece);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15625) __mpu_hidden_decl(ei_nege);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15626) __mpu_hidden_decl(ei_ande);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15627) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15628) __mpu_hidden_decl(ei_shrn);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15629) __mpu_hidden_decl(ei_shln);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15630) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15631)   End of Functions for LONG INTEGER NUMBERS.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15632)  ********************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15633) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15634) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15635) __mpu_hidden_decl(ei_shdown);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15636) __mpu_hidden_decl(ei_shup);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15637) __mpu_hidden_decl(ei_shift);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15638) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15639) __mpu_hidden_decl(ei_normalize);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15640) __mpu_hidden_decl(unpack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15641) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15642) __mpu_hidden_decl(ei_cmpm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15643) __mpu_hidden_decl(ei_addm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15644) __mpu_hidden_decl(ei_subm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15645) __mpu_hidden_decl(ei_divm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15646) __mpu_hidden_decl(ei_mulm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15647) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15648) __mpu_hidden_decl(ei_mdenorm);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15649) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15650) __mpu_hidden_decl(pack);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15651) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15652) __mpu_hidden_decl(ei_copy);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15653) __mpu_hidden_decl(ei_copyzlgw);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15654) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15655) __mpu_hidden_decl(ei_cmp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15656) __mpu_hidden_decl(ei_convert);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15657) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15658) __mpu_hidden_decl(ei_add);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15659) __mpu_hidden_decl(ei_sub);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15660) __mpu_hidden_decl(ei_div);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15661) __mpu_hidden_decl(ei_mul);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15662) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15663) __mpu_hidden_decl(ei_ltor);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15664) __mpu_hidden_decl(ei_ultor);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15665) __mpu_hidden_decl(ei_rtoul_frac);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15666) __mpu_hidden_decl(ei_rtol_frac);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15667) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15668) /***************************************************************
868b2b66 (kx 2024-12-20 16:11:07 +0300 15669)   GENERATORS OF CONSTANT:
868b2b66 (kx 2024-12-20 16:11:07 +0300 15670)  */
868b2b66 (kx 2024-12-20 16:11:07 +0300 15671) __mpu_hidden_decl(_gen_zero);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15672) __mpu_hidden_decl(_gen_half);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15673) __mpu_hidden_decl(_gen_one);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15674) __mpu_hidden_decl(_gen_two);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15675) __mpu_hidden_decl(_gen_ten);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15676) __mpu_hidden_decl(_gen_mten);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15677) __mpu_hidden_decl(_gen_32);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15678) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15679)   END GENERATORS OF CONSTANT.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15680)  ***************************************************************/
868b2b66 (kx 2024-12-20 16:11:07 +0300 15681) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15682) __mpu_hidden_decl(ei_remain);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15683) __mpu_hidden_decl(ei_floor);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15684) __mpu_hidden_decl(ei_ceil);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15685) __mpu_hidden_decl(ei_round);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15686) __mpu_hidden_decl(ei_frexp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15687) __mpu_hidden_decl(ei_ldexp);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15688) __mpu_hidden_decl(ei_logb);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15689) __mpu_hidden_decl(ei_sqrt);
868b2b66 (kx 2024-12-20 16:11:07 +0300 15690) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15691) 
868b2b66 (kx 2024-12-20 16:11:07 +0300 15692) /*
868b2b66 (kx 2024-12-20 16:11:07 +0300 15693)   End of hide internal symbols.
868b2b66 (kx 2024-12-20 16:11:07 +0300 15694)  ***************************************************************/