18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Linux/PA-RISC Project (http://www.parisc-linux.org/)
48c2ecf20Sopenharmony_ci *
58c2ecf20Sopenharmony_ci * Floating-point emulation code
68c2ecf20Sopenharmony_ci *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
78c2ecf20Sopenharmony_ci */
88c2ecf20Sopenharmony_ci/*
98c2ecf20Sopenharmony_ci * BEGIN_DESC
108c2ecf20Sopenharmony_ci *
118c2ecf20Sopenharmony_ci *  File:
128c2ecf20Sopenharmony_ci *	@(#)	pa/spmath/fcnvxf.c		$Revision: 1.1 $
138c2ecf20Sopenharmony_ci *
148c2ecf20Sopenharmony_ci *  Purpose:
158c2ecf20Sopenharmony_ci *	Single Fixed-point to Single Floating-point
168c2ecf20Sopenharmony_ci *	Single Fixed-point to Double Floating-point
178c2ecf20Sopenharmony_ci *	Double Fixed-point to Single Floating-point
188c2ecf20Sopenharmony_ci *	Double Fixed-point to Double Floating-point
198c2ecf20Sopenharmony_ci *
208c2ecf20Sopenharmony_ci *  External Interfaces:
218c2ecf20Sopenharmony_ci *	dbl_to_dbl_fcnvxf(srcptr,nullptr,dstptr,status)
228c2ecf20Sopenharmony_ci *	dbl_to_sgl_fcnvxf(srcptr,nullptr,dstptr,status)
238c2ecf20Sopenharmony_ci *	sgl_to_dbl_fcnvxf(srcptr,nullptr,dstptr,status)
248c2ecf20Sopenharmony_ci *	sgl_to_sgl_fcnvxf(srcptr,nullptr,dstptr,status)
258c2ecf20Sopenharmony_ci *
268c2ecf20Sopenharmony_ci *  Internal Interfaces:
278c2ecf20Sopenharmony_ci *
288c2ecf20Sopenharmony_ci *  Theory:
298c2ecf20Sopenharmony_ci *	<<please update with a overview of the operation of this file>>
308c2ecf20Sopenharmony_ci *
318c2ecf20Sopenharmony_ci * END_DESC
328c2ecf20Sopenharmony_ci*/
338c2ecf20Sopenharmony_ci
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci#include "float.h"
368c2ecf20Sopenharmony_ci#include "sgl_float.h"
378c2ecf20Sopenharmony_ci#include "dbl_float.h"
388c2ecf20Sopenharmony_ci#include "cnv_float.h"
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_ci/*
418c2ecf20Sopenharmony_ci *  Convert single fixed-point to single floating-point format
428c2ecf20Sopenharmony_ci */
438c2ecf20Sopenharmony_ci
448c2ecf20Sopenharmony_ciint
458c2ecf20Sopenharmony_cisgl_to_sgl_fcnvxf(
468c2ecf20Sopenharmony_ci		    int *srcptr,
478c2ecf20Sopenharmony_ci		    unsigned int *nullptr,
488c2ecf20Sopenharmony_ci		    sgl_floating_point *dstptr,
498c2ecf20Sopenharmony_ci		    unsigned int *status)
508c2ecf20Sopenharmony_ci{
518c2ecf20Sopenharmony_ci	register int src, dst_exponent;
528c2ecf20Sopenharmony_ci	register unsigned int result = 0;
538c2ecf20Sopenharmony_ci
548c2ecf20Sopenharmony_ci	src = *srcptr;
558c2ecf20Sopenharmony_ci	/*
568c2ecf20Sopenharmony_ci	 * set sign bit of result and get magnitude of source
578c2ecf20Sopenharmony_ci	 */
588c2ecf20Sopenharmony_ci	if (src < 0) {
598c2ecf20Sopenharmony_ci		Sgl_setone_sign(result);
608c2ecf20Sopenharmony_ci		Int_negate(src);
618c2ecf20Sopenharmony_ci	}
628c2ecf20Sopenharmony_ci	else {
638c2ecf20Sopenharmony_ci		Sgl_setzero_sign(result);
648c2ecf20Sopenharmony_ci        	/* Check for zero */
658c2ecf20Sopenharmony_ci        	if (src == 0) {
668c2ecf20Sopenharmony_ci                	Sgl_setzero(result);
678c2ecf20Sopenharmony_ci			*dstptr = result;
688c2ecf20Sopenharmony_ci                	return(NOEXCEPTION);
698c2ecf20Sopenharmony_ci        	}
708c2ecf20Sopenharmony_ci	}
718c2ecf20Sopenharmony_ci	/*
728c2ecf20Sopenharmony_ci	 * Generate exponent and normalized mantissa
738c2ecf20Sopenharmony_ci	 */
748c2ecf20Sopenharmony_ci	dst_exponent = 16;    /* initialize for normalization */
758c2ecf20Sopenharmony_ci	/*
768c2ecf20Sopenharmony_ci	 * Check word for most significant bit set.  Returns
778c2ecf20Sopenharmony_ci	 * a value in dst_exponent indicating the bit position,
788c2ecf20Sopenharmony_ci	 * between -1 and 30.
798c2ecf20Sopenharmony_ci	 */
808c2ecf20Sopenharmony_ci	Find_ms_one_bit(src,dst_exponent);
818c2ecf20Sopenharmony_ci	/*  left justify source, with msb at bit position 1  */
828c2ecf20Sopenharmony_ci	if (dst_exponent >= 0) src <<= dst_exponent;
838c2ecf20Sopenharmony_ci	else src = 1 << 30;
848c2ecf20Sopenharmony_ci	Sgl_set_mantissa(result, src >> (SGL_EXP_LENGTH-1));
858c2ecf20Sopenharmony_ci	Sgl_set_exponent(result, 30+SGL_BIAS - dst_exponent);
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ci	/* check for inexact */
888c2ecf20Sopenharmony_ci	if (Int_isinexact_to_sgl(src)) {
898c2ecf20Sopenharmony_ci		switch (Rounding_mode()) {
908c2ecf20Sopenharmony_ci			case ROUNDPLUS:
918c2ecf20Sopenharmony_ci				if (Sgl_iszero_sign(result))
928c2ecf20Sopenharmony_ci					Sgl_increment(result);
938c2ecf20Sopenharmony_ci				break;
948c2ecf20Sopenharmony_ci			case ROUNDMINUS:
958c2ecf20Sopenharmony_ci				if (Sgl_isone_sign(result))
968c2ecf20Sopenharmony_ci					Sgl_increment(result);
978c2ecf20Sopenharmony_ci				break;
988c2ecf20Sopenharmony_ci			case ROUNDNEAREST:
998c2ecf20Sopenharmony_ci				Sgl_roundnearest_from_int(src,result);
1008c2ecf20Sopenharmony_ci		}
1018c2ecf20Sopenharmony_ci		if (Is_inexacttrap_enabled()) {
1028c2ecf20Sopenharmony_ci			*dstptr = result;
1038c2ecf20Sopenharmony_ci			return(INEXACTEXCEPTION);
1048c2ecf20Sopenharmony_ci		}
1058c2ecf20Sopenharmony_ci		else Set_inexactflag();
1068c2ecf20Sopenharmony_ci	}
1078c2ecf20Sopenharmony_ci	*dstptr = result;
1088c2ecf20Sopenharmony_ci	return(NOEXCEPTION);
1098c2ecf20Sopenharmony_ci}
1108c2ecf20Sopenharmony_ci
1118c2ecf20Sopenharmony_ci/*
1128c2ecf20Sopenharmony_ci *  Single Fixed-point to Double Floating-point
1138c2ecf20Sopenharmony_ci */
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ciint
1168c2ecf20Sopenharmony_cisgl_to_dbl_fcnvxf(
1178c2ecf20Sopenharmony_ci		    int *srcptr,
1188c2ecf20Sopenharmony_ci		    unsigned int *nullptr,
1198c2ecf20Sopenharmony_ci		    dbl_floating_point *dstptr,
1208c2ecf20Sopenharmony_ci		    unsigned int *status)
1218c2ecf20Sopenharmony_ci{
1228c2ecf20Sopenharmony_ci	register int src, dst_exponent;
1238c2ecf20Sopenharmony_ci	register unsigned int resultp1 = 0, resultp2 = 0;
1248c2ecf20Sopenharmony_ci
1258c2ecf20Sopenharmony_ci	src = *srcptr;
1268c2ecf20Sopenharmony_ci	/*
1278c2ecf20Sopenharmony_ci	 * set sign bit of result and get magnitude of source
1288c2ecf20Sopenharmony_ci	 */
1298c2ecf20Sopenharmony_ci	if (src < 0) {
1308c2ecf20Sopenharmony_ci		Dbl_setone_sign(resultp1);
1318c2ecf20Sopenharmony_ci		Int_negate(src);
1328c2ecf20Sopenharmony_ci	}
1338c2ecf20Sopenharmony_ci	else {
1348c2ecf20Sopenharmony_ci		Dbl_setzero_sign(resultp1);
1358c2ecf20Sopenharmony_ci        	/* Check for zero */
1368c2ecf20Sopenharmony_ci        	if (src == 0) {
1378c2ecf20Sopenharmony_ci                	Dbl_setzero(resultp1,resultp2);
1388c2ecf20Sopenharmony_ci                	Dbl_copytoptr(resultp1,resultp2,dstptr);
1398c2ecf20Sopenharmony_ci                	return(NOEXCEPTION);
1408c2ecf20Sopenharmony_ci        	}
1418c2ecf20Sopenharmony_ci	}
1428c2ecf20Sopenharmony_ci	/*
1438c2ecf20Sopenharmony_ci	 * Generate exponent and normalized mantissa
1448c2ecf20Sopenharmony_ci	 */
1458c2ecf20Sopenharmony_ci	dst_exponent = 16;    /* initialize for normalization */
1468c2ecf20Sopenharmony_ci	/*
1478c2ecf20Sopenharmony_ci	 * Check word for most significant bit set.  Returns
1488c2ecf20Sopenharmony_ci	 * a value in dst_exponent indicating the bit position,
1498c2ecf20Sopenharmony_ci	 * between -1 and 30.
1508c2ecf20Sopenharmony_ci	 */
1518c2ecf20Sopenharmony_ci	Find_ms_one_bit(src,dst_exponent);
1528c2ecf20Sopenharmony_ci	/*  left justify source, with msb at bit position 1  */
1538c2ecf20Sopenharmony_ci	if (dst_exponent >= 0) src <<= dst_exponent;
1548c2ecf20Sopenharmony_ci	else src = 1 << 30;
1558c2ecf20Sopenharmony_ci	Dbl_set_mantissap1(resultp1, src >> DBL_EXP_LENGTH - 1);
1568c2ecf20Sopenharmony_ci	Dbl_set_mantissap2(resultp2, src << (33-DBL_EXP_LENGTH));
1578c2ecf20Sopenharmony_ci	Dbl_set_exponent(resultp1, (30+DBL_BIAS) - dst_exponent);
1588c2ecf20Sopenharmony_ci	Dbl_copytoptr(resultp1,resultp2,dstptr);
1598c2ecf20Sopenharmony_ci	return(NOEXCEPTION);
1608c2ecf20Sopenharmony_ci}
1618c2ecf20Sopenharmony_ci
1628c2ecf20Sopenharmony_ci/*
1638c2ecf20Sopenharmony_ci *  Double Fixed-point to Single Floating-point
1648c2ecf20Sopenharmony_ci */
1658c2ecf20Sopenharmony_ci
1668c2ecf20Sopenharmony_ciint
1678c2ecf20Sopenharmony_cidbl_to_sgl_fcnvxf(
1688c2ecf20Sopenharmony_ci			dbl_integer *srcptr,
1698c2ecf20Sopenharmony_ci			unsigned int *nullptr,
1708c2ecf20Sopenharmony_ci			sgl_floating_point *dstptr,
1718c2ecf20Sopenharmony_ci			unsigned int *status)
1728c2ecf20Sopenharmony_ci{
1738c2ecf20Sopenharmony_ci	int dst_exponent, srcp1;
1748c2ecf20Sopenharmony_ci	unsigned int result = 0, srcp2;
1758c2ecf20Sopenharmony_ci
1768c2ecf20Sopenharmony_ci	Dint_copyfromptr(srcptr,srcp1,srcp2);
1778c2ecf20Sopenharmony_ci	/*
1788c2ecf20Sopenharmony_ci	 * set sign bit of result and get magnitude of source
1798c2ecf20Sopenharmony_ci	 */
1808c2ecf20Sopenharmony_ci	if (srcp1 < 0) {
1818c2ecf20Sopenharmony_ci		Sgl_setone_sign(result);
1828c2ecf20Sopenharmony_ci		Dint_negate(srcp1,srcp2);
1838c2ecf20Sopenharmony_ci	}
1848c2ecf20Sopenharmony_ci	else {
1858c2ecf20Sopenharmony_ci		Sgl_setzero_sign(result);
1868c2ecf20Sopenharmony_ci        	/* Check for zero */
1878c2ecf20Sopenharmony_ci        	if (srcp1 == 0 && srcp2 == 0) {
1888c2ecf20Sopenharmony_ci                	Sgl_setzero(result);
1898c2ecf20Sopenharmony_ci                	*dstptr = result;
1908c2ecf20Sopenharmony_ci                	return(NOEXCEPTION);
1918c2ecf20Sopenharmony_ci		}
1928c2ecf20Sopenharmony_ci        }
1938c2ecf20Sopenharmony_ci	/*
1948c2ecf20Sopenharmony_ci	 * Generate exponent and normalized mantissa
1958c2ecf20Sopenharmony_ci	 */
1968c2ecf20Sopenharmony_ci	dst_exponent = 16;    /* initialize for normalization */
1978c2ecf20Sopenharmony_ci	if (srcp1 == 0) {
1988c2ecf20Sopenharmony_ci		/*
1998c2ecf20Sopenharmony_ci		 * Check word for most significant bit set.  Returns
2008c2ecf20Sopenharmony_ci		 * a value in dst_exponent indicating the bit position,
2018c2ecf20Sopenharmony_ci		 * between -1 and 30.
2028c2ecf20Sopenharmony_ci		 */
2038c2ecf20Sopenharmony_ci		Find_ms_one_bit(srcp2,dst_exponent);
2048c2ecf20Sopenharmony_ci		/*  left justify source, with msb at bit position 1  */
2058c2ecf20Sopenharmony_ci		if (dst_exponent >= 0) {
2068c2ecf20Sopenharmony_ci			srcp1 = srcp2 << dst_exponent;
2078c2ecf20Sopenharmony_ci			srcp2 = 0;
2088c2ecf20Sopenharmony_ci		}
2098c2ecf20Sopenharmony_ci		else {
2108c2ecf20Sopenharmony_ci			srcp1 = srcp2 >> 1;
2118c2ecf20Sopenharmony_ci			srcp2 <<= 31;
2128c2ecf20Sopenharmony_ci		}
2138c2ecf20Sopenharmony_ci		/*
2148c2ecf20Sopenharmony_ci		 *  since msb set is in second word, need to
2158c2ecf20Sopenharmony_ci		 *  adjust bit position count
2168c2ecf20Sopenharmony_ci		 */
2178c2ecf20Sopenharmony_ci		dst_exponent += 32;
2188c2ecf20Sopenharmony_ci	}
2198c2ecf20Sopenharmony_ci	else {
2208c2ecf20Sopenharmony_ci		/*
2218c2ecf20Sopenharmony_ci		 * Check word for most significant bit set.  Returns
2228c2ecf20Sopenharmony_ci		 * a value in dst_exponent indicating the bit position,
2238c2ecf20Sopenharmony_ci		 * between -1 and 30.
2248c2ecf20Sopenharmony_ci		 *
2258c2ecf20Sopenharmony_ci		 */
2268c2ecf20Sopenharmony_ci		Find_ms_one_bit(srcp1,dst_exponent);
2278c2ecf20Sopenharmony_ci		/*  left justify source, with msb at bit position 1  */
2288c2ecf20Sopenharmony_ci		if (dst_exponent > 0) {
2298c2ecf20Sopenharmony_ci			Variable_shift_double(srcp1,srcp2,(32-dst_exponent),
2308c2ecf20Sopenharmony_ci			 srcp1);
2318c2ecf20Sopenharmony_ci			srcp2 <<= dst_exponent;
2328c2ecf20Sopenharmony_ci		}
2338c2ecf20Sopenharmony_ci		/*
2348c2ecf20Sopenharmony_ci		 * If dst_exponent = 0, we don't need to shift anything.
2358c2ecf20Sopenharmony_ci		 * If dst_exponent = -1, src = - 2**63 so we won't need to
2368c2ecf20Sopenharmony_ci		 * shift srcp2.
2378c2ecf20Sopenharmony_ci		 */
2388c2ecf20Sopenharmony_ci		else srcp1 >>= -(dst_exponent);
2398c2ecf20Sopenharmony_ci	}
2408c2ecf20Sopenharmony_ci	Sgl_set_mantissa(result, srcp1 >> SGL_EXP_LENGTH - 1);
2418c2ecf20Sopenharmony_ci	Sgl_set_exponent(result, (62+SGL_BIAS) - dst_exponent);
2428c2ecf20Sopenharmony_ci
2438c2ecf20Sopenharmony_ci	/* check for inexact */
2448c2ecf20Sopenharmony_ci	if (Dint_isinexact_to_sgl(srcp1,srcp2)) {
2458c2ecf20Sopenharmony_ci		switch (Rounding_mode()) {
2468c2ecf20Sopenharmony_ci			case ROUNDPLUS:
2478c2ecf20Sopenharmony_ci				if (Sgl_iszero_sign(result))
2488c2ecf20Sopenharmony_ci					Sgl_increment(result);
2498c2ecf20Sopenharmony_ci				break;
2508c2ecf20Sopenharmony_ci			case ROUNDMINUS:
2518c2ecf20Sopenharmony_ci				if (Sgl_isone_sign(result))
2528c2ecf20Sopenharmony_ci					Sgl_increment(result);
2538c2ecf20Sopenharmony_ci				break;
2548c2ecf20Sopenharmony_ci			case ROUNDNEAREST:
2558c2ecf20Sopenharmony_ci				Sgl_roundnearest_from_dint(srcp1,srcp2,result);
2568c2ecf20Sopenharmony_ci		}
2578c2ecf20Sopenharmony_ci		if (Is_inexacttrap_enabled()) {
2588c2ecf20Sopenharmony_ci			*dstptr = result;
2598c2ecf20Sopenharmony_ci			return(INEXACTEXCEPTION);
2608c2ecf20Sopenharmony_ci		}
2618c2ecf20Sopenharmony_ci		else Set_inexactflag();
2628c2ecf20Sopenharmony_ci	}
2638c2ecf20Sopenharmony_ci	*dstptr = result;
2648c2ecf20Sopenharmony_ci	return(NOEXCEPTION);
2658c2ecf20Sopenharmony_ci}
2668c2ecf20Sopenharmony_ci
2678c2ecf20Sopenharmony_ci/*
2688c2ecf20Sopenharmony_ci *  Double Fixed-point to Double Floating-point
2698c2ecf20Sopenharmony_ci */
2708c2ecf20Sopenharmony_ci
2718c2ecf20Sopenharmony_ciint
2728c2ecf20Sopenharmony_cidbl_to_dbl_fcnvxf(
2738c2ecf20Sopenharmony_ci		    dbl_integer *srcptr,
2748c2ecf20Sopenharmony_ci		    unsigned int *nullptr,
2758c2ecf20Sopenharmony_ci		    dbl_floating_point *dstptr,
2768c2ecf20Sopenharmony_ci		    unsigned int *status)
2778c2ecf20Sopenharmony_ci{
2788c2ecf20Sopenharmony_ci	register int srcp1, dst_exponent;
2798c2ecf20Sopenharmony_ci	register unsigned int srcp2, resultp1 = 0, resultp2 = 0;
2808c2ecf20Sopenharmony_ci
2818c2ecf20Sopenharmony_ci	Dint_copyfromptr(srcptr,srcp1,srcp2);
2828c2ecf20Sopenharmony_ci	/*
2838c2ecf20Sopenharmony_ci	 * set sign bit of result and get magnitude of source
2848c2ecf20Sopenharmony_ci	 */
2858c2ecf20Sopenharmony_ci	if (srcp1 < 0) {
2868c2ecf20Sopenharmony_ci		Dbl_setone_sign(resultp1);
2878c2ecf20Sopenharmony_ci		Dint_negate(srcp1,srcp2);
2888c2ecf20Sopenharmony_ci	}
2898c2ecf20Sopenharmony_ci	else {
2908c2ecf20Sopenharmony_ci		Dbl_setzero_sign(resultp1);
2918c2ecf20Sopenharmony_ci        	/* Check for zero */
2928c2ecf20Sopenharmony_ci        	if (srcp1 == 0 && srcp2 ==0) {
2938c2ecf20Sopenharmony_ci                	Dbl_setzero(resultp1,resultp2);
2948c2ecf20Sopenharmony_ci                	Dbl_copytoptr(resultp1,resultp2,dstptr);
2958c2ecf20Sopenharmony_ci                	return(NOEXCEPTION);
2968c2ecf20Sopenharmony_ci		}
2978c2ecf20Sopenharmony_ci        }
2988c2ecf20Sopenharmony_ci	/*
2998c2ecf20Sopenharmony_ci	 * Generate exponent and normalized mantissa
3008c2ecf20Sopenharmony_ci	 */
3018c2ecf20Sopenharmony_ci	dst_exponent = 16;    /* initialize for normalization */
3028c2ecf20Sopenharmony_ci	if (srcp1 == 0) {
3038c2ecf20Sopenharmony_ci		/*
3048c2ecf20Sopenharmony_ci		 * Check word for most significant bit set.  Returns
3058c2ecf20Sopenharmony_ci		 * a value in dst_exponent indicating the bit position,
3068c2ecf20Sopenharmony_ci		 * between -1 and 30.
3078c2ecf20Sopenharmony_ci		 */
3088c2ecf20Sopenharmony_ci		Find_ms_one_bit(srcp2,dst_exponent);
3098c2ecf20Sopenharmony_ci		/*  left justify source, with msb at bit position 1  */
3108c2ecf20Sopenharmony_ci		if (dst_exponent >= 0) {
3118c2ecf20Sopenharmony_ci			srcp1 = srcp2 << dst_exponent;
3128c2ecf20Sopenharmony_ci			srcp2 = 0;
3138c2ecf20Sopenharmony_ci		}
3148c2ecf20Sopenharmony_ci		else {
3158c2ecf20Sopenharmony_ci			srcp1 = srcp2 >> 1;
3168c2ecf20Sopenharmony_ci			srcp2 <<= 31;
3178c2ecf20Sopenharmony_ci		}
3188c2ecf20Sopenharmony_ci		/*
3198c2ecf20Sopenharmony_ci		 *  since msb set is in second word, need to
3208c2ecf20Sopenharmony_ci		 *  adjust bit position count
3218c2ecf20Sopenharmony_ci		 */
3228c2ecf20Sopenharmony_ci		dst_exponent += 32;
3238c2ecf20Sopenharmony_ci	}
3248c2ecf20Sopenharmony_ci	else {
3258c2ecf20Sopenharmony_ci		/*
3268c2ecf20Sopenharmony_ci		 * Check word for most significant bit set.  Returns
3278c2ecf20Sopenharmony_ci		 * a value in dst_exponent indicating the bit position,
3288c2ecf20Sopenharmony_ci		 * between -1 and 30.
3298c2ecf20Sopenharmony_ci		 */
3308c2ecf20Sopenharmony_ci		Find_ms_one_bit(srcp1,dst_exponent);
3318c2ecf20Sopenharmony_ci		/*  left justify source, with msb at bit position 1  */
3328c2ecf20Sopenharmony_ci		if (dst_exponent > 0) {
3338c2ecf20Sopenharmony_ci			Variable_shift_double(srcp1,srcp2,(32-dst_exponent),
3348c2ecf20Sopenharmony_ci			 srcp1);
3358c2ecf20Sopenharmony_ci			srcp2 <<= dst_exponent;
3368c2ecf20Sopenharmony_ci		}
3378c2ecf20Sopenharmony_ci		/*
3388c2ecf20Sopenharmony_ci		 * If dst_exponent = 0, we don't need to shift anything.
3398c2ecf20Sopenharmony_ci		 * If dst_exponent = -1, src = - 2**63 so we won't need to
3408c2ecf20Sopenharmony_ci		 * shift srcp2.
3418c2ecf20Sopenharmony_ci		 */
3428c2ecf20Sopenharmony_ci		else srcp1 >>= -(dst_exponent);
3438c2ecf20Sopenharmony_ci	}
3448c2ecf20Sopenharmony_ci	Dbl_set_mantissap1(resultp1, srcp1 >> (DBL_EXP_LENGTH-1));
3458c2ecf20Sopenharmony_ci	Shiftdouble(srcp1,srcp2,DBL_EXP_LENGTH-1,resultp2);
3468c2ecf20Sopenharmony_ci	Dbl_set_exponent(resultp1, (62+DBL_BIAS) - dst_exponent);
3478c2ecf20Sopenharmony_ci
3488c2ecf20Sopenharmony_ci	/* check for inexact */
3498c2ecf20Sopenharmony_ci	if (Dint_isinexact_to_dbl(srcp2)) {
3508c2ecf20Sopenharmony_ci		switch (Rounding_mode()) {
3518c2ecf20Sopenharmony_ci			case ROUNDPLUS:
3528c2ecf20Sopenharmony_ci				if (Dbl_iszero_sign(resultp1)) {
3538c2ecf20Sopenharmony_ci					Dbl_increment(resultp1,resultp2);
3548c2ecf20Sopenharmony_ci				}
3558c2ecf20Sopenharmony_ci				break;
3568c2ecf20Sopenharmony_ci			case ROUNDMINUS:
3578c2ecf20Sopenharmony_ci				if (Dbl_isone_sign(resultp1)) {
3588c2ecf20Sopenharmony_ci					Dbl_increment(resultp1,resultp2);
3598c2ecf20Sopenharmony_ci				}
3608c2ecf20Sopenharmony_ci				break;
3618c2ecf20Sopenharmony_ci			case ROUNDNEAREST:
3628c2ecf20Sopenharmony_ci				Dbl_roundnearest_from_dint(srcp2,resultp1,
3638c2ecf20Sopenharmony_ci				resultp2);
3648c2ecf20Sopenharmony_ci		}
3658c2ecf20Sopenharmony_ci		if (Is_inexacttrap_enabled()) {
3668c2ecf20Sopenharmony_ci			Dbl_copytoptr(resultp1,resultp2,dstptr);
3678c2ecf20Sopenharmony_ci			return(INEXACTEXCEPTION);
3688c2ecf20Sopenharmony_ci		}
3698c2ecf20Sopenharmony_ci		else Set_inexactflag();
3708c2ecf20Sopenharmony_ci	}
3718c2ecf20Sopenharmony_ci	Dbl_copytoptr(resultp1,resultp2,dstptr);
3728c2ecf20Sopenharmony_ci	return(NOEXCEPTION);
3738c2ecf20Sopenharmony_ci}
374