^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) }