^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/fcnvfxt.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 /w truncated result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * Single Floating-point to Double Fixed-point /w truncated result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * Double Floating-point to Single Fixed-point /w truncated result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * Double Floating-point to Double Fixed-point /w truncated result
^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_fcnvfxt(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * dbl_to_sgl_fcnvfxt(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * sgl_to_dbl_fcnvfxt(srcptr,nullptr,dstptr,status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) * sgl_to_sgl_fcnvfxt(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) * Convert single floating-point to single fixed-point format
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) * with truncated result
^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_fcnvfxt(
^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) 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, temp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) register int src_exponent, result;
^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) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) if (Sgl_isinexact_to_fix(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) *dstptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) return(NOEXCEPTION);
^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) * Single Floating-point to Double Fixed-point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) sgl_to_dbl_fcnvfxt(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) sgl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) dbl_integer *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) register int src_exponent, resultp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) register unsigned int src, temp, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) src = *srcptr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) src_exponent = Sgl_exponent(src) - SGL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) if (src_exponent > DBL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) /* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) if ((src_exponent > DBL_FX_MAX_EXP + 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) Sgl_isnotzero_mantissa(src) || Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) if (Sgl_iszero_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) resultp1 = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) resultp1 = 0x80000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) Dint_set_minint(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) temp = src;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) Sgl_clear_signexponent_set_hidden(temp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) Dint_from_sgl_mantissa(temp,src_exponent,resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) if (Sgl_isone_sign(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) Dint_setone_sign(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) if (Sgl_isinexact_to_fix(src,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) }
^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) Dint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) if (Sgl_isnotzero_exponentmantissa(src)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) * Double Floating-point to Single Fixed-point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) dbl_to_sgl_fcnvfxt(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) dbl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) int *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) register unsigned int srcp1, srcp2, tempp1, tempp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) register int src_exponent, result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^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) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) if (src_exponent > SGL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) /* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) if (Dbl_isoverflow_to_int(src_exponent,srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) if (Dbl_iszero_sign(srcp1)) result = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) else result = 0x80000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) tempp1 = srcp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) tempp2 = srcp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) Dbl_clear_signexponent_set_hidden(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) Int_from_dbl_mantissa(tempp1,tempp2,src_exponent);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) if (Dbl_isone_sign(srcp1) && (src_exponent <= SGL_FX_MAX_EXP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) result = -Dbl_allp1(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) else result = Dbl_allp1(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) *dstptr = result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) *dstptr = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) * Double Floating-point to Double Fixed-point
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) /*ARGSUSED*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) dbl_to_dbl_fcnvfxt(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) dbl_floating_point *srcptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) unsigned int *nullptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) dbl_integer *dstptr,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) unsigned int *status)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) register int src_exponent, resultp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) register unsigned int srcp1, srcp2, tempp1, tempp2, resultp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) Dbl_copyfromptr(srcptr,srcp1,srcp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) src_exponent = Dbl_exponent(srcp1) - DBL_BIAS;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) * Test for overflow
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) if (src_exponent > DBL_FX_MAX_EXP) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) /* check for MININT */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) if ((src_exponent > DBL_FX_MAX_EXP + 1) ||
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) Dbl_isnotzero_mantissa(srcp1,srcp2) || Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) if (Dbl_iszero_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) resultp1 = 0x7fffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) resultp2 = 0xffffffff;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) resultp1 = 0x80000000;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) resultp2 = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) if (Is_invalidtrap_enabled()) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) return(INVALIDEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) Set_invalidflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return(NOEXCEPTION);
^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) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) * Generate result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) if (src_exponent >= 0) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) tempp1 = srcp1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) tempp2 = srcp2;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) Dbl_clear_signexponent_set_hidden(tempp1);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) Dint_from_dbl_mantissa(tempp1,tempp2,src_exponent,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) if (Dbl_isone_sign(srcp1)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) Dint_setone_sign(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) if (Dbl_isinexact_to_fix(srcp1,srcp2,src_exponent)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) Dint_setzero(resultp1,resultp2);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) Dint_copytoptr(resultp1,resultp2,dstptr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) /* check for inexact */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (Dbl_isnotzero_exponentmantissa(srcp1,srcp2)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) else Set_inexactflag();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return(NOEXCEPTION);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }