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 = "i[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 = "i[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) ***************************************************************/