Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   1) // SPDX-License-Identifier: GPL-2.0-or-later
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   3)  * Linux/PA-RISC Project (http://www.parisc-linux.org/)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   4)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   5)  * Floating-point emulation code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   6)  *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   7)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   8) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300   9)  * BEGIN_DESC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11)  *  File:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12)  *	@(#)	pa/spmath/fcnvfx.c		$Revision: 1.1 $
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14)  *  Purpose:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15)  *	Single Floating-point to Single Fixed-point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16)  *	Single Floating-point to Double Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17)  *	Double Floating-point to Single Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18)  *	Double Floating-point to Double Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20)  *  External Interfaces:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21)  *	dbl_to_dbl_fcnvfx(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22)  *	dbl_to_sgl_fcnvfx(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23)  *	sgl_to_dbl_fcnvfx(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24)  *	sgl_to_sgl_fcnvfx(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26)  *  Internal Interfaces:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28)  *  Theory:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)  *	<<please update with a overview of the operation of this file>>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30)  *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)  * END_DESC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #include "float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36) #include "sgl_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #include "dbl_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #include "cnv_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41)  *  Single Floating-point to Single Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) sgl_to_sgl_fcnvfx(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46) 		    sgl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 		    sgl_floating_point *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 		    int *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 		    sgl_floating_point *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51) 	register unsigned int src, temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52) 	register int src_exponent, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) 	register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) 	src = *srcptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56) 	src_exponent = Sgl_exponent(src) - SGL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) 	/* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) 	 * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) 	if (src_exponent > SGL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) 		/* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) 		if ((src_exponent > SGL_FX_MAX_EXP + 1) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64) 		Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65)                         if (Sgl_iszero_sign(src)) result = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66)                         else result = 0x80000000; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) 	                if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)                             return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70)                         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71)                         Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) 			*dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) 			return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74)        		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) 	 * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) 	if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80) 		temp = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) 		Sgl_clear_signexponent_set_hidden(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) 		Int_from_sgl_mantissa(temp,src_exponent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) 		if (Sgl_isone_sign(src))  result = -Sgl_all(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) 		else result = Sgl_all(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87) 		if (Sgl_isinexact_to_fix(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) 			inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89) 			/*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) 			switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) 			case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) 			     if (Sgl_iszero_sign(src)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) 			     break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94) 			case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) 			     if (Sgl_isone_sign(src)) result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96) 			     break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) 			case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98) 			     if (Sgl_isone_roundbit(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) 			        if (Sgl_isone_stickybit(src,src_exponent) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) 				|| (Sgl_isone_lowmantissa(temp)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) 			           if (Sgl_iszero_sign(src)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) 			           else result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) 			} 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 		result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) 		if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) 			inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) 			/*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) 			switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) 			case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 			     if (Sgl_iszero_sign(src)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) 			     break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) 			case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) 			     if (Sgl_isone_sign(src)) result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) 			     break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) 			case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) 			     if (src_exponent == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) 			        if (Sgl_isnotzero_mantissa(src))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) 			           if (Sgl_iszero_sign(src)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) 			           else result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) 			} 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) 	*dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) 	if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) 		if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) 		else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) 	return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138)  *  Single Floating-point to Double Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) sgl_to_dbl_fcnvfx(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) 		sgl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) 		unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) 		dbl_integer *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 		unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) 	register int src_exponent, resultp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) 	register unsigned int src, temp, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 	register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) 	src = *srcptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) 	src_exponent = Sgl_exponent(src) - SGL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) 	/* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	 * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) 	if (src_exponent > DBL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) 		/* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) 		if ((src_exponent > DBL_FX_MAX_EXP + 1) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 		Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)                         if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)                               resultp1 = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) 			      resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)                         else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) 			    resultp1 = 0x80000000; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) 			    resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) 	                if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171)                             return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)                         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)                         Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)     		        Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) 			return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) 		Dint_set_minint(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 		Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) 		return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) 	 * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 	if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) 		temp = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) 		Sgl_clear_signexponent_set_hidden(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) 		Dint_from_sgl_mantissa(temp,src_exponent,resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) 		if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) 			Dint_setone_sign(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) 		if (Sgl_isinexact_to_fix(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) 			inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)                              if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 				Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203)                              if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 				Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)                              if (Sgl_isone_roundbit(src,src_exponent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209)                                 if (Sgl_isone_stickybit(src,src_exponent) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) 				(Dint_isone_lowp2(resultp2)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 				   if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) 				      Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214)                                    else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) 				      Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217)                         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 		Dint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) 		if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) 			inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)                              if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 				Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)                              if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) 				Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)                              if (src_exponent == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240)                                 if (Sgl_isnotzero_mantissa(src))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241)                                    if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) 				      Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)                                    else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) 				      Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 	if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 		else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 	return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)  *  Double Floating-point to Single Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) dbl_to_sgl_fcnvfx(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 		    dbl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 		    unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		    int *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 		    unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 	register unsigned int srcp1,srcp2, tempp1,tempp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 	register int src_exponent, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 	register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 	Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 	src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 	/* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 	 * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 	if (src_exponent > SGL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 		/* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 		if (Dbl_isoverflow_to_int(src_exponent,srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)                         if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283)                         else result = 0x80000000; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 	                if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)                             return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287)                         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288)                         Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) 			*dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 			return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 	 * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 		tempp1 = srcp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 		tempp2 = srcp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		Dbl_clear_signexponent_set_hidden(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 		Int_from_dbl_mantissa(tempp1,tempp2,src_exponent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		if (Dbl_isone_sign(srcp1) && (src_exponent <= SGL_FX_MAX_EXP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 			result = -Dbl_allp1(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) 		else result = Dbl_allp1(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) 		if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)                         inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)                              if (Dbl_iszero_sign(srcp1)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314)                              if (Dbl_isone_sign(srcp1)) result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317)                              if (Dbl_isone_roundbit(srcp1,srcp2,src_exponent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318)                                 if (Dbl_isone_stickybit(srcp1,srcp2,src_exponent) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) 				(Dbl_isone_lowmantissap1(tempp1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320)                                    if (Dbl_iszero_sign(srcp1)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321)                                    else result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)                         } 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) 			/* check for overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) 			if ((Dbl_iszero_sign(srcp1) && result < 0) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 			    (Dbl_isone_sign(srcp1) && result > 0)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 			        
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327)                           if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)                           else result = 0x80000000; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) 	                  if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331)                             return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)                           }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)                           Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) 			  *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) 			  return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) 		result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 		if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344)                         inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348)                              if (Dbl_iszero_sign(srcp1)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351)                              if (Dbl_isone_sign(srcp1)) result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354)                              if (src_exponent == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355)                                 if (Dbl_isnotzero_mantissa(srcp1,srcp2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356)                                    if (Dbl_iszero_sign(srcp1)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)                                    else result--;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) 	*dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362)         if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)                 if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) 		else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 	return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)  *  Double Floating-point to Double Fixed-point 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) dbl_to_dbl_fcnvfx(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 		    dbl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) 		    unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) 		    dbl_integer *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) 		    unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) 	register int src_exponent, resultp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) 	register unsigned int srcp1, srcp2, tempp1, tempp2, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) 	register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) 	Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) 	src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) 	/* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) 	 * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) 	if (src_exponent > DBL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) 		/* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) 		if ((src_exponent > DBL_FX_MAX_EXP + 1) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) 		Dbl_isnotzero_mantissa(srcp1,srcp2) || Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)                         if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395)                               resultp1 = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) 			      resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)                         else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) 			    resultp1 = 0x80000000; 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) 			    resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) 	                if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)                             return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)                         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)                         Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406)     		        Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) 			return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) 	/*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	 * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 	 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) 	if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) 		tempp1 = srcp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 		tempp2 = srcp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) 		Dbl_clear_signexponent_set_hidden(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) 		Dint_from_dbl_mantissa(tempp1,tempp2,src_exponent,resultp1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) 		resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 		if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) 			Dint_setone_sign(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) 		}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 		if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426)                         inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430)                              if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 				Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435)                              if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 				Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440)                              if (Dbl_isone_roundbit(srcp1,srcp2,src_exponent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441)                                 if (Dbl_isone_stickybit(srcp1,srcp2,src_exponent) || 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 				(Dint_isone_lowp2(resultp2)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443)                                    if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 				      Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)                                    else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) 				      Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449)                         } 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 	else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 		Dint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		/* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 		if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457)                         inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)                         /*  round result  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459)                         switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460)                         case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461)                              if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 				Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465)                         case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)                              if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) 				Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 			     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469)                              break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)                         case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)                              if (src_exponent == -1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)                                 if (Dbl_isnotzero_mantissa(srcp1,srcp2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)                                    if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) 				      Dint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476)                                    else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) 				      Dint_decrement(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) 				   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) 			}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480)                 }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) 	Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483)         if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484)                 if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485)         	else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486)         }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) 	return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) }