162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-or-later
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Linux/PA-RISC Project (http://www.parisc-linux.org/)
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Floating-point emulation code
662306a36Sopenharmony_ci *  Copyright (C) 2001 Hewlett-Packard (Paul Bame) <bame@debian.org>
762306a36Sopenharmony_ci */
862306a36Sopenharmony_ci/*
962306a36Sopenharmony_ci * BEGIN_DESC
1062306a36Sopenharmony_ci *
1162306a36Sopenharmony_ci *  File:
1262306a36Sopenharmony_ci *	@(#)	pa/spmath/sfdiv.c		$Revision: 1.1 $
1362306a36Sopenharmony_ci *
1462306a36Sopenharmony_ci *  Purpose:
1562306a36Sopenharmony_ci *	Single Precision Floating-point Divide
1662306a36Sopenharmony_ci *
1762306a36Sopenharmony_ci *  External Interfaces:
1862306a36Sopenharmony_ci *	sgl_fdiv(srcptr1,srcptr2,dstptr,status)
1962306a36Sopenharmony_ci *
2062306a36Sopenharmony_ci *  Internal Interfaces:
2162306a36Sopenharmony_ci *
2262306a36Sopenharmony_ci *  Theory:
2362306a36Sopenharmony_ci *	<<please update with a overview of the operation of this file>>
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * END_DESC
2662306a36Sopenharmony_ci*/
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_ci#include "float.h"
3062306a36Sopenharmony_ci#include "sgl_float.h"
3162306a36Sopenharmony_ci
3262306a36Sopenharmony_ci/*
3362306a36Sopenharmony_ci *  Single Precision Floating-point Divide
3462306a36Sopenharmony_ci */
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ciint
3762306a36Sopenharmony_cisgl_fdiv (sgl_floating_point * srcptr1, sgl_floating_point * srcptr2,
3862306a36Sopenharmony_ci	  sgl_floating_point * dstptr, unsigned int *status)
3962306a36Sopenharmony_ci{
4062306a36Sopenharmony_ci	register unsigned int opnd1, opnd2, opnd3, result;
4162306a36Sopenharmony_ci	register int dest_exponent, count;
4262306a36Sopenharmony_ci	register boolean inexact = FALSE, guardbit = FALSE, stickybit = FALSE;
4362306a36Sopenharmony_ci	boolean is_tiny;
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	opnd1 = *srcptr1;
4662306a36Sopenharmony_ci	opnd2 = *srcptr2;
4762306a36Sopenharmony_ci	/*
4862306a36Sopenharmony_ci	 * set sign bit of result
4962306a36Sopenharmony_ci	 */
5062306a36Sopenharmony_ci	if (Sgl_sign(opnd1) ^ Sgl_sign(opnd2)) Sgl_setnegativezero(result);
5162306a36Sopenharmony_ci	else Sgl_setzero(result);
5262306a36Sopenharmony_ci	/*
5362306a36Sopenharmony_ci	 * check first operand for NaN's or infinity
5462306a36Sopenharmony_ci	 */
5562306a36Sopenharmony_ci	if (Sgl_isinfinity_exponent(opnd1)) {
5662306a36Sopenharmony_ci		if (Sgl_iszero_mantissa(opnd1)) {
5762306a36Sopenharmony_ci			if (Sgl_isnotnan(opnd2)) {
5862306a36Sopenharmony_ci				if (Sgl_isinfinity(opnd2)) {
5962306a36Sopenharmony_ci					/*
6062306a36Sopenharmony_ci					 * invalid since both operands
6162306a36Sopenharmony_ci					 * are infinity
6262306a36Sopenharmony_ci					 */
6362306a36Sopenharmony_ci					if (Is_invalidtrap_enabled())
6462306a36Sopenharmony_ci                                		return(INVALIDEXCEPTION);
6562306a36Sopenharmony_ci                                	Set_invalidflag();
6662306a36Sopenharmony_ci                                	Sgl_makequietnan(result);
6762306a36Sopenharmony_ci					*dstptr = result;
6862306a36Sopenharmony_ci					return(NOEXCEPTION);
6962306a36Sopenharmony_ci				}
7062306a36Sopenharmony_ci				/*
7162306a36Sopenharmony_ci			 	 * return infinity
7262306a36Sopenharmony_ci			 	 */
7362306a36Sopenharmony_ci				Sgl_setinfinity_exponentmantissa(result);
7462306a36Sopenharmony_ci				*dstptr = result;
7562306a36Sopenharmony_ci				return(NOEXCEPTION);
7662306a36Sopenharmony_ci			}
7762306a36Sopenharmony_ci		}
7862306a36Sopenharmony_ci		else {
7962306a36Sopenharmony_ci                	/*
8062306a36Sopenharmony_ci                 	 * is NaN; signaling or quiet?
8162306a36Sopenharmony_ci                 	 */
8262306a36Sopenharmony_ci                	if (Sgl_isone_signaling(opnd1)) {
8362306a36Sopenharmony_ci                        	/* trap if INVALIDTRAP enabled */
8462306a36Sopenharmony_ci                        	if (Is_invalidtrap_enabled())
8562306a36Sopenharmony_ci                            		return(INVALIDEXCEPTION);
8662306a36Sopenharmony_ci                        	/* make NaN quiet */
8762306a36Sopenharmony_ci                        	Set_invalidflag();
8862306a36Sopenharmony_ci                        	Sgl_set_quiet(opnd1);
8962306a36Sopenharmony_ci                	}
9062306a36Sopenharmony_ci			/*
9162306a36Sopenharmony_ci			 * is second operand a signaling NaN?
9262306a36Sopenharmony_ci			 */
9362306a36Sopenharmony_ci			else if (Sgl_is_signalingnan(opnd2)) {
9462306a36Sopenharmony_ci                        	/* trap if INVALIDTRAP enabled */
9562306a36Sopenharmony_ci                        	if (Is_invalidtrap_enabled())
9662306a36Sopenharmony_ci                            		return(INVALIDEXCEPTION);
9762306a36Sopenharmony_ci                        	/* make NaN quiet */
9862306a36Sopenharmony_ci                        	Set_invalidflag();
9962306a36Sopenharmony_ci                        	Sgl_set_quiet(opnd2);
10062306a36Sopenharmony_ci                		*dstptr = opnd2;
10162306a36Sopenharmony_ci                		return(NOEXCEPTION);
10262306a36Sopenharmony_ci			}
10362306a36Sopenharmony_ci                	/*
10462306a36Sopenharmony_ci                 	 * return quiet NaN
10562306a36Sopenharmony_ci                 	 */
10662306a36Sopenharmony_ci                	*dstptr = opnd1;
10762306a36Sopenharmony_ci                	return(NOEXCEPTION);
10862306a36Sopenharmony_ci		}
10962306a36Sopenharmony_ci	}
11062306a36Sopenharmony_ci	/*
11162306a36Sopenharmony_ci	 * check second operand for NaN's or infinity
11262306a36Sopenharmony_ci	 */
11362306a36Sopenharmony_ci	if (Sgl_isinfinity_exponent(opnd2)) {
11462306a36Sopenharmony_ci		if (Sgl_iszero_mantissa(opnd2)) {
11562306a36Sopenharmony_ci			/*
11662306a36Sopenharmony_ci			 * return zero
11762306a36Sopenharmony_ci			 */
11862306a36Sopenharmony_ci			Sgl_setzero_exponentmantissa(result);
11962306a36Sopenharmony_ci			*dstptr = result;
12062306a36Sopenharmony_ci			return(NOEXCEPTION);
12162306a36Sopenharmony_ci		}
12262306a36Sopenharmony_ci                /*
12362306a36Sopenharmony_ci                 * is NaN; signaling or quiet?
12462306a36Sopenharmony_ci                 */
12562306a36Sopenharmony_ci                if (Sgl_isone_signaling(opnd2)) {
12662306a36Sopenharmony_ci                        /* trap if INVALIDTRAP enabled */
12762306a36Sopenharmony_ci                        if (Is_invalidtrap_enabled()) return(INVALIDEXCEPTION);
12862306a36Sopenharmony_ci                        /* make NaN quiet */
12962306a36Sopenharmony_ci                        Set_invalidflag();
13062306a36Sopenharmony_ci                        Sgl_set_quiet(opnd2);
13162306a36Sopenharmony_ci                }
13262306a36Sopenharmony_ci                /*
13362306a36Sopenharmony_ci                 * return quiet NaN
13462306a36Sopenharmony_ci                 */
13562306a36Sopenharmony_ci                *dstptr = opnd2;
13662306a36Sopenharmony_ci                return(NOEXCEPTION);
13762306a36Sopenharmony_ci	}
13862306a36Sopenharmony_ci	/*
13962306a36Sopenharmony_ci	 * check for division by zero
14062306a36Sopenharmony_ci	 */
14162306a36Sopenharmony_ci	if (Sgl_iszero_exponentmantissa(opnd2)) {
14262306a36Sopenharmony_ci		if (Sgl_iszero_exponentmantissa(opnd1)) {
14362306a36Sopenharmony_ci			/* invalid since both operands are zero */
14462306a36Sopenharmony_ci			if (Is_invalidtrap_enabled()) return(INVALIDEXCEPTION);
14562306a36Sopenharmony_ci                        Set_invalidflag();
14662306a36Sopenharmony_ci                        Sgl_makequietnan(result);
14762306a36Sopenharmony_ci			*dstptr = result;
14862306a36Sopenharmony_ci			return(NOEXCEPTION);
14962306a36Sopenharmony_ci		}
15062306a36Sopenharmony_ci		if (Is_divisionbyzerotrap_enabled())
15162306a36Sopenharmony_ci                        return(DIVISIONBYZEROEXCEPTION);
15262306a36Sopenharmony_ci                Set_divisionbyzeroflag();
15362306a36Sopenharmony_ci                Sgl_setinfinity_exponentmantissa(result);
15462306a36Sopenharmony_ci		*dstptr = result;
15562306a36Sopenharmony_ci		return(NOEXCEPTION);
15662306a36Sopenharmony_ci	}
15762306a36Sopenharmony_ci	/*
15862306a36Sopenharmony_ci	 * Generate exponent
15962306a36Sopenharmony_ci	 */
16062306a36Sopenharmony_ci	dest_exponent = Sgl_exponent(opnd1) - Sgl_exponent(opnd2) + SGL_BIAS;
16162306a36Sopenharmony_ci
16262306a36Sopenharmony_ci	/*
16362306a36Sopenharmony_ci	 * Generate mantissa
16462306a36Sopenharmony_ci	 */
16562306a36Sopenharmony_ci	if (Sgl_isnotzero_exponent(opnd1)) {
16662306a36Sopenharmony_ci		/* set hidden bit */
16762306a36Sopenharmony_ci		Sgl_clear_signexponent_set_hidden(opnd1);
16862306a36Sopenharmony_ci	}
16962306a36Sopenharmony_ci	else {
17062306a36Sopenharmony_ci		/* check for zero */
17162306a36Sopenharmony_ci		if (Sgl_iszero_mantissa(opnd1)) {
17262306a36Sopenharmony_ci			Sgl_setzero_exponentmantissa(result);
17362306a36Sopenharmony_ci			*dstptr = result;
17462306a36Sopenharmony_ci			return(NOEXCEPTION);
17562306a36Sopenharmony_ci		}
17662306a36Sopenharmony_ci                /* is denormalized; want to normalize */
17762306a36Sopenharmony_ci                Sgl_clear_signexponent(opnd1);
17862306a36Sopenharmony_ci                Sgl_leftshiftby1(opnd1);
17962306a36Sopenharmony_ci		Sgl_normalize(opnd1,dest_exponent);
18062306a36Sopenharmony_ci	}
18162306a36Sopenharmony_ci	/* opnd2 needs to have hidden bit set with msb in hidden bit */
18262306a36Sopenharmony_ci	if (Sgl_isnotzero_exponent(opnd2)) {
18362306a36Sopenharmony_ci		Sgl_clear_signexponent_set_hidden(opnd2);
18462306a36Sopenharmony_ci	}
18562306a36Sopenharmony_ci	else {
18662306a36Sopenharmony_ci                /* is denormalized; want to normalize */
18762306a36Sopenharmony_ci                Sgl_clear_signexponent(opnd2);
18862306a36Sopenharmony_ci                Sgl_leftshiftby1(opnd2);
18962306a36Sopenharmony_ci		while(Sgl_iszero_hiddenhigh7mantissa(opnd2)) {
19062306a36Sopenharmony_ci			Sgl_leftshiftby8(opnd2);
19162306a36Sopenharmony_ci			dest_exponent += 8;
19262306a36Sopenharmony_ci		}
19362306a36Sopenharmony_ci		if(Sgl_iszero_hiddenhigh3mantissa(opnd2)) {
19462306a36Sopenharmony_ci			Sgl_leftshiftby4(opnd2);
19562306a36Sopenharmony_ci			dest_exponent += 4;
19662306a36Sopenharmony_ci		}
19762306a36Sopenharmony_ci		while(Sgl_iszero_hidden(opnd2)) {
19862306a36Sopenharmony_ci			Sgl_leftshiftby1(opnd2);
19962306a36Sopenharmony_ci			dest_exponent += 1;
20062306a36Sopenharmony_ci		}
20162306a36Sopenharmony_ci	}
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	/* Divide the source mantissas */
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_ci	/*
20662306a36Sopenharmony_ci	 * A non_restoring divide algorithm is used.
20762306a36Sopenharmony_ci	 */
20862306a36Sopenharmony_ci	Sgl_subtract(opnd1,opnd2,opnd1);
20962306a36Sopenharmony_ci	Sgl_setzero(opnd3);
21062306a36Sopenharmony_ci	for (count=1;count<=SGL_P && Sgl_all(opnd1);count++) {
21162306a36Sopenharmony_ci		Sgl_leftshiftby1(opnd1);
21262306a36Sopenharmony_ci		Sgl_leftshiftby1(opnd3);
21362306a36Sopenharmony_ci		if (Sgl_iszero_sign(opnd1)) {
21462306a36Sopenharmony_ci			Sgl_setone_lowmantissa(opnd3);
21562306a36Sopenharmony_ci			Sgl_subtract(opnd1,opnd2,opnd1);
21662306a36Sopenharmony_ci		}
21762306a36Sopenharmony_ci		else Sgl_addition(opnd1,opnd2,opnd1);
21862306a36Sopenharmony_ci	}
21962306a36Sopenharmony_ci	if (count <= SGL_P) {
22062306a36Sopenharmony_ci		Sgl_leftshiftby1(opnd3);
22162306a36Sopenharmony_ci		Sgl_setone_lowmantissa(opnd3);
22262306a36Sopenharmony_ci		Sgl_leftshift(opnd3,SGL_P-count);
22362306a36Sopenharmony_ci		if (Sgl_iszero_hidden(opnd3)) {
22462306a36Sopenharmony_ci			Sgl_leftshiftby1(opnd3);
22562306a36Sopenharmony_ci			dest_exponent--;
22662306a36Sopenharmony_ci		}
22762306a36Sopenharmony_ci	}
22862306a36Sopenharmony_ci	else {
22962306a36Sopenharmony_ci		if (Sgl_iszero_hidden(opnd3)) {
23062306a36Sopenharmony_ci			/* need to get one more bit of result */
23162306a36Sopenharmony_ci			Sgl_leftshiftby1(opnd1);
23262306a36Sopenharmony_ci			Sgl_leftshiftby1(opnd3);
23362306a36Sopenharmony_ci			if (Sgl_iszero_sign(opnd1)) {
23462306a36Sopenharmony_ci				Sgl_setone_lowmantissa(opnd3);
23562306a36Sopenharmony_ci				Sgl_subtract(opnd1,opnd2,opnd1);
23662306a36Sopenharmony_ci			}
23762306a36Sopenharmony_ci			else Sgl_addition(opnd1,opnd2,opnd1);
23862306a36Sopenharmony_ci			dest_exponent--;
23962306a36Sopenharmony_ci		}
24062306a36Sopenharmony_ci		if (Sgl_iszero_sign(opnd1)) guardbit = TRUE;
24162306a36Sopenharmony_ci		stickybit = Sgl_all(opnd1);
24262306a36Sopenharmony_ci	}
24362306a36Sopenharmony_ci	inexact = guardbit | stickybit;
24462306a36Sopenharmony_ci
24562306a36Sopenharmony_ci	/*
24662306a36Sopenharmony_ci	 * round result
24762306a36Sopenharmony_ci	 */
24862306a36Sopenharmony_ci	if (inexact && (dest_exponent > 0 || Is_underflowtrap_enabled())) {
24962306a36Sopenharmony_ci		Sgl_clear_signexponent(opnd3);
25062306a36Sopenharmony_ci		switch (Rounding_mode()) {
25162306a36Sopenharmony_ci			case ROUNDPLUS:
25262306a36Sopenharmony_ci				if (Sgl_iszero_sign(result))
25362306a36Sopenharmony_ci					Sgl_increment_mantissa(opnd3);
25462306a36Sopenharmony_ci				break;
25562306a36Sopenharmony_ci			case ROUNDMINUS:
25662306a36Sopenharmony_ci				if (Sgl_isone_sign(result))
25762306a36Sopenharmony_ci					Sgl_increment_mantissa(opnd3);
25862306a36Sopenharmony_ci				break;
25962306a36Sopenharmony_ci			case ROUNDNEAREST:
26062306a36Sopenharmony_ci				if (guardbit) {
26162306a36Sopenharmony_ci			   	if (stickybit || Sgl_isone_lowmantissa(opnd3))
26262306a36Sopenharmony_ci			      	    Sgl_increment_mantissa(opnd3);
26362306a36Sopenharmony_ci				}
26462306a36Sopenharmony_ci		}
26562306a36Sopenharmony_ci		if (Sgl_isone_hidden(opnd3)) dest_exponent++;
26662306a36Sopenharmony_ci	}
26762306a36Sopenharmony_ci	Sgl_set_mantissa(result,opnd3);
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci        /*
27062306a36Sopenharmony_ci         * Test for overflow
27162306a36Sopenharmony_ci         */
27262306a36Sopenharmony_ci	if (dest_exponent >= SGL_INFINITY_EXPONENT) {
27362306a36Sopenharmony_ci                /* trap if OVERFLOWTRAP enabled */
27462306a36Sopenharmony_ci                if (Is_overflowtrap_enabled()) {
27562306a36Sopenharmony_ci                        /*
27662306a36Sopenharmony_ci                         * Adjust bias of result
27762306a36Sopenharmony_ci                         */
27862306a36Sopenharmony_ci                        Sgl_setwrapped_exponent(result,dest_exponent,ovfl);
27962306a36Sopenharmony_ci                        *dstptr = result;
28062306a36Sopenharmony_ci                        if (inexact)
28162306a36Sopenharmony_ci                            if (Is_inexacttrap_enabled())
28262306a36Sopenharmony_ci                                return(OVERFLOWEXCEPTION | INEXACTEXCEPTION);
28362306a36Sopenharmony_ci                            else Set_inexactflag();
28462306a36Sopenharmony_ci                        return(OVERFLOWEXCEPTION);
28562306a36Sopenharmony_ci                }
28662306a36Sopenharmony_ci		Set_overflowflag();
28762306a36Sopenharmony_ci                /* set result to infinity or largest number */
28862306a36Sopenharmony_ci		Sgl_setoverflow(result);
28962306a36Sopenharmony_ci		inexact = TRUE;
29062306a36Sopenharmony_ci	}
29162306a36Sopenharmony_ci        /*
29262306a36Sopenharmony_ci         * Test for underflow
29362306a36Sopenharmony_ci         */
29462306a36Sopenharmony_ci	else if (dest_exponent <= 0) {
29562306a36Sopenharmony_ci                /* trap if UNDERFLOWTRAP enabled */
29662306a36Sopenharmony_ci                if (Is_underflowtrap_enabled()) {
29762306a36Sopenharmony_ci                        /*
29862306a36Sopenharmony_ci                         * Adjust bias of result
29962306a36Sopenharmony_ci                         */
30062306a36Sopenharmony_ci                        Sgl_setwrapped_exponent(result,dest_exponent,unfl);
30162306a36Sopenharmony_ci                        *dstptr = result;
30262306a36Sopenharmony_ci                        if (inexact)
30362306a36Sopenharmony_ci                            if (Is_inexacttrap_enabled())
30462306a36Sopenharmony_ci                                return(UNDERFLOWEXCEPTION | INEXACTEXCEPTION);
30562306a36Sopenharmony_ci                            else Set_inexactflag();
30662306a36Sopenharmony_ci                        return(UNDERFLOWEXCEPTION);
30762306a36Sopenharmony_ci                }
30862306a36Sopenharmony_ci
30962306a36Sopenharmony_ci		/* Determine if should set underflow flag */
31062306a36Sopenharmony_ci		is_tiny = TRUE;
31162306a36Sopenharmony_ci		if (dest_exponent == 0 && inexact) {
31262306a36Sopenharmony_ci			switch (Rounding_mode()) {
31362306a36Sopenharmony_ci			case ROUNDPLUS:
31462306a36Sopenharmony_ci				if (Sgl_iszero_sign(result)) {
31562306a36Sopenharmony_ci					Sgl_increment(opnd3);
31662306a36Sopenharmony_ci					if (Sgl_isone_hiddenoverflow(opnd3))
31762306a36Sopenharmony_ci                			    is_tiny = FALSE;
31862306a36Sopenharmony_ci					Sgl_decrement(opnd3);
31962306a36Sopenharmony_ci				}
32062306a36Sopenharmony_ci				break;
32162306a36Sopenharmony_ci			case ROUNDMINUS:
32262306a36Sopenharmony_ci				if (Sgl_isone_sign(result)) {
32362306a36Sopenharmony_ci					Sgl_increment(opnd3);
32462306a36Sopenharmony_ci					if (Sgl_isone_hiddenoverflow(opnd3))
32562306a36Sopenharmony_ci                			    is_tiny = FALSE;
32662306a36Sopenharmony_ci					Sgl_decrement(opnd3);
32762306a36Sopenharmony_ci				}
32862306a36Sopenharmony_ci				break;
32962306a36Sopenharmony_ci			case ROUNDNEAREST:
33062306a36Sopenharmony_ci				if (guardbit && (stickybit ||
33162306a36Sopenharmony_ci				    Sgl_isone_lowmantissa(opnd3))) {
33262306a36Sopenharmony_ci				      	Sgl_increment(opnd3);
33362306a36Sopenharmony_ci					if (Sgl_isone_hiddenoverflow(opnd3))
33462306a36Sopenharmony_ci                			    is_tiny = FALSE;
33562306a36Sopenharmony_ci					Sgl_decrement(opnd3);
33662306a36Sopenharmony_ci				}
33762306a36Sopenharmony_ci				break;
33862306a36Sopenharmony_ci			}
33962306a36Sopenharmony_ci		}
34062306a36Sopenharmony_ci
34162306a36Sopenharmony_ci                /*
34262306a36Sopenharmony_ci                 * denormalize result or set to signed zero
34362306a36Sopenharmony_ci                 */
34462306a36Sopenharmony_ci		stickybit = inexact;
34562306a36Sopenharmony_ci		Sgl_denormalize(opnd3,dest_exponent,guardbit,stickybit,inexact);
34662306a36Sopenharmony_ci
34762306a36Sopenharmony_ci		/* return rounded number */
34862306a36Sopenharmony_ci		if (inexact) {
34962306a36Sopenharmony_ci			switch (Rounding_mode()) {
35062306a36Sopenharmony_ci			case ROUNDPLUS:
35162306a36Sopenharmony_ci				if (Sgl_iszero_sign(result)) {
35262306a36Sopenharmony_ci					Sgl_increment(opnd3);
35362306a36Sopenharmony_ci				}
35462306a36Sopenharmony_ci				break;
35562306a36Sopenharmony_ci			case ROUNDMINUS:
35662306a36Sopenharmony_ci				if (Sgl_isone_sign(result))  {
35762306a36Sopenharmony_ci					Sgl_increment(opnd3);
35862306a36Sopenharmony_ci				}
35962306a36Sopenharmony_ci				break;
36062306a36Sopenharmony_ci			case ROUNDNEAREST:
36162306a36Sopenharmony_ci				if (guardbit && (stickybit ||
36262306a36Sopenharmony_ci				    Sgl_isone_lowmantissa(opnd3))) {
36362306a36Sopenharmony_ci			      		Sgl_increment(opnd3);
36462306a36Sopenharmony_ci				}
36562306a36Sopenharmony_ci				break;
36662306a36Sopenharmony_ci			}
36762306a36Sopenharmony_ci                	if (is_tiny) Set_underflowflag();
36862306a36Sopenharmony_ci                }
36962306a36Sopenharmony_ci		Sgl_set_exponentmantissa(result,opnd3);
37062306a36Sopenharmony_ci	}
37162306a36Sopenharmony_ci	else Sgl_set_exponent(result,dest_exponent);
37262306a36Sopenharmony_ci	*dstptr = result;
37362306a36Sopenharmony_ci	/* check for inexact */
37462306a36Sopenharmony_ci	if (inexact) {
37562306a36Sopenharmony_ci		if (Is_inexacttrap_enabled()) return(INEXACTEXCEPTION);
37662306a36Sopenharmony_ci		else  Set_inexactflag();
37762306a36Sopenharmony_ci	}
37862306a36Sopenharmony_ci	return(NOEXCEPTION);
37962306a36Sopenharmony_ci}
380