^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/fcnvfu.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) * Floating-point to Unsigned Fixed-point Converts
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * External Interfaces:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * dbl_to_dbl_fcnvfu(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * dbl_to_sgl_fcnvfu(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * sgl_to_dbl_fcnvfu(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * sgl_to_sgl_fcnvfu(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * Internal Interfaces:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * Theory:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * <<please update with a overview of the operation of this file>>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * END_DESC
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #include "float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #include "sgl_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #include "dbl_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #include "cnv_float.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /************************************************************************
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) * Floating-point to Unsigned Fixed-point Converts *
^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * Single Floating-point to Single Unsigned Fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) sgl_to_sgl_fcnvfu(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) sgl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) unsigned int *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) register unsigned int src, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) register int src_exponent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) src = *srcptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) src_exponent = Sgl_exponent(src) - SGL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) if (src_exponent > SGL_FX_MAX_EXP + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) result = 0xffffffff;
^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) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * Check sign.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * If negative, trap unimplemented.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) Sgl_clear_signexponent_set_hidden(src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) Suint_from_sgl_mantissa(src,src_exponent,result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) if (Sgl_isinexact_to_unsigned(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) case ROUNDMINUS: /* never negative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) if (Sgl_isone_roundbit(src,src_exponent) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) (Sgl_isone_stickybit(src,src_exponent) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) (result & 1))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) if (src_exponent == -1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) Sgl_isnotzero_mantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) else result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * Single Floating-point to Double Unsigned Fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) sgl_to_dbl_fcnvfu(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) sgl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) dbl_unsigned *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) register int src_exponent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) register unsigned int src, resultp1, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) src = *srcptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) src_exponent = Sgl_exponent(src) - SGL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) if (src_exponent > DBL_FX_MAX_EXP + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) resultp1 = resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) * Check sign.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) * If negative, trap unimplemented.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) Sgl_clear_signexponent_set_hidden(src);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) Duint_from_sgl_mantissa(src,src_exponent,resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) if (Sgl_isinexact_to_unsigned(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) case ROUNDMINUS: /* never negative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (Sgl_isone_roundbit(src,src_exponent) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) (Sgl_isone_stickybit(src,src_exponent) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) Duint_isone_lowp2(resultp2))) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) Duint_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) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) Duint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) if (src_exponent == -1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) Sgl_isnotzero_mantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) resultp1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) else Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) * Double Floating-point to Single Unsigned Fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) dbl_to_sgl_fcnvfu (dbl_floating_point * srcptr, unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) unsigned int *dstptr, unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) register unsigned int srcp1, srcp2, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) register int src_exponent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) if (src_exponent > SGL_FX_MAX_EXP + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) result = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) * Check sign.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) * If negative, trap unimplemented.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) Dbl_clear_signexponent_set_hidden(srcp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) Suint_from_dbl_mantissa(srcp1,srcp2,src_exponent,result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) if (Dbl_isinexact_to_unsigned(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) case ROUNDMINUS: /* never negative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) if(Dbl_isone_roundbit(srcp1,srcp2,src_exponent) &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) (Dbl_isone_stickybit(srcp1,srcp2,src_exponent)||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) result&1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) /* check for overflow */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) if (result == 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) result = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371) if (Dbl_iszero_sign(srcp1)) result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) if (src_exponent == -1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385) Dbl_isnotzero_mantissa(srcp1,srcp2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) result = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) else result++;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) * Double Floating-point to Double Unsigned Fixed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) dbl_to_dbl_fcnvfu (dbl_floating_point * srcptr, unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) dbl_unsigned * dstptr, unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) register int src_exponent;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) register unsigned int srcp1, srcp2, resultp1, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) register boolean inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) if (src_exponent > DBL_FX_MAX_EXP + 1) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) resultp1 = resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) * Check sign.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) * If negative, trap unimplemented.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) Dbl_clear_signexponent_set_hidden(srcp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) Duint_from_dbl_mantissa(srcp1,srcp2,src_exponent,resultp1,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) if (Dbl_isinexact_to_unsigned(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) case ROUNDMINUS: /* never negative */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) if(Dbl_isone_roundbit(srcp1,srcp2,src_exponent))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) if(Dbl_isone_stickybit(srcp1,srcp2,src_exponent) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) Duint_isone_lowp2(resultp2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) }
^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) Duint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) inexact = TRUE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) /* round result */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) switch (Rounding_mode()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) case ROUNDPLUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) case ROUNDMINUS:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) resultp1 = resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) case ROUNDNEAREST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) if (src_exponent == -1 &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) Dbl_isnotzero_mantissa(srcp1,srcp2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) Duint_increment(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) resultp1 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) inexact = FALSE;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) Duint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) if (inexact) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523)