2005-04-17 02:20:36 +04:00
/*
* Linux / PA - RISC Project ( http : //www.parisc-linux.org/)
*
* Floating - point emulation code
* Copyright ( C ) 2001 Hewlett - Packard ( Paul Bame ) < bame @ debian . org >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 , or ( at your option )
* any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# ifdef __NO_PA_HDRS
PA header file - - do not include this header file for non - PA builds .
# endif
2007-05-11 23:42:34 +04:00
/* 32-bit word grabbing functions */
2005-04-17 02:20:36 +04:00
# define Sgl_firstword(value) Sall(value)
# define Sgl_secondword(value) dummy_location
# define Sgl_thirdword(value) dummy_location
# define Sgl_fourthword(value) dummy_location
# define Sgl_sign(object) Ssign(object)
# define Sgl_exponent(object) Sexponent(object)
# define Sgl_signexponent(object) Ssignexponent(object)
# define Sgl_mantissa(object) Smantissa(object)
# define Sgl_exponentmantissa(object) Sexponentmantissa(object)
# define Sgl_all(object) Sall(object)
2007-05-11 23:42:34 +04:00
/* sgl_and_signs ANDs the sign bits of each argument and puts the result
2005-04-17 02:20:36 +04:00
* into the first argument . sgl_or_signs ors those same sign bits */
# define Sgl_and_signs( src1dst, src2) \
Sall ( src1dst ) = ( Sall ( src2 ) | ~ ( ( unsigned int ) 1 < < 31 ) ) & Sall ( src1dst )
# define Sgl_or_signs( src1dst, src2) \
Sall ( src1dst ) = ( Sall ( src2 ) & ( ( unsigned int ) 1 < < 31 ) ) | Sall ( src1dst )
/* The hidden bit is always the low bit of the exponent */
# define Sgl_clear_exponent_set_hidden(srcdst) Deposit_sexponent(srcdst,1)
# define Sgl_clear_signexponent_set_hidden(srcdst) \
Deposit_ssignexponent ( srcdst , 1 )
# define Sgl_clear_sign(srcdst) Sall(srcdst) &= ~((unsigned int)1<<31)
# define Sgl_clear_signexponent(srcdst) Sall(srcdst) &= 0x007fffff
/* varamount must be less than 32 for the next three functions */
# define Sgl_rightshift(srcdst, varamount) \
Sall ( srcdst ) > > = varamount
# define Sgl_leftshift(srcdst, varamount) \
Sall ( srcdst ) < < = varamount
# define Sgl_rightshift_exponentmantissa(srcdst, varamount) \
Sall ( srcdst ) = \
( Sexponentmantissa ( srcdst ) > > varamount ) | \
( Sall ( srcdst ) & ( ( unsigned int ) 1 < < 31 ) )
# define Sgl_leftshiftby1_withextent(left,right,result) \
Shiftdouble ( Sall ( left ) , Extall ( right ) , 31 , Sall ( result ) )
# define Sgl_rightshiftby1_withextent(left,right,dst) \
Shiftdouble ( Sall ( left ) , Extall ( right ) , 1 , Extall ( right ) )
# define Sgl_arithrightshiftby1(srcdst) \
Sall ( srcdst ) = ( int ) Sall ( srcdst ) > > 1
/* Sign extend the sign bit with an integer destination */
# define Sgl_signextendedsign(value) Ssignedsign(value)
# define Sgl_isone_hidden(sgl_value) (Shidden(sgl_value))
# define Sgl_increment(sgl_value) Sall(sgl_value) += 1
# define Sgl_increment_mantissa(sgl_value) \
Deposit_smantissa ( sgl_value , sgl_value + 1 )
# define Sgl_decrement(sgl_value) Sall(sgl_value) -= 1
# define Sgl_isone_sign(sgl_value) (Is_ssign(sgl_value)!=0)
# define Sgl_isone_hiddenoverflow(sgl_value) \
( Is_shiddenoverflow ( sgl_value ) ! = 0 )
# define Sgl_isone_lowmantissa(sgl_value) (Is_slow(sgl_value)!=0)
# define Sgl_isone_signaling(sgl_value) (Is_ssignaling(sgl_value)!=0)
# define Sgl_is_signalingnan(sgl_value) (Ssignalingnan(sgl_value)==0x1ff)
# define Sgl_isnotzero(sgl_value) (Sall(sgl_value)!=0)
# define Sgl_isnotzero_hiddenhigh7mantissa(sgl_value) \
( Shiddenhigh7mantissa ( sgl_value ) ! = 0 )
# define Sgl_isnotzero_low4(sgl_value) (Slow4(sgl_value)!=0)
# define Sgl_isnotzero_exponent(sgl_value) (Sexponent(sgl_value)!=0)
# define Sgl_isnotzero_mantissa(sgl_value) (Smantissa(sgl_value)!=0)
# define Sgl_isnotzero_exponentmantissa(sgl_value) \
( Sexponentmantissa ( sgl_value ) ! = 0 )
# define Sgl_iszero(sgl_value) (Sall(sgl_value)==0)
# define Sgl_iszero_signaling(sgl_value) (Is_ssignaling(sgl_value)==0)
# define Sgl_iszero_hidden(sgl_value) (Is_shidden(sgl_value)==0)
# define Sgl_iszero_hiddenoverflow(sgl_value) \
( Is_shiddenoverflow ( sgl_value ) = = 0 )
# define Sgl_iszero_hiddenhigh3mantissa(sgl_value) \
( Shiddenhigh3mantissa ( sgl_value ) = = 0 )
# define Sgl_iszero_hiddenhigh7mantissa(sgl_value) \
( Shiddenhigh7mantissa ( sgl_value ) = = 0 )
# define Sgl_iszero_sign(sgl_value) (Is_ssign(sgl_value)==0)
# define Sgl_iszero_exponent(sgl_value) (Sexponent(sgl_value)==0)
# define Sgl_iszero_mantissa(sgl_value) (Smantissa(sgl_value)==0)
# define Sgl_iszero_exponentmantissa(sgl_value) \
( Sexponentmantissa ( sgl_value ) = = 0 )
# define Sgl_isinfinity_exponent(sgl_value) \
( Sgl_exponent ( sgl_value ) = = SGL_INFINITY_EXPONENT )
# define Sgl_isnotinfinity_exponent(sgl_value) \
( Sgl_exponent ( sgl_value ) ! = SGL_INFINITY_EXPONENT )
# define Sgl_isinfinity(sgl_value) \
( Sgl_exponent ( sgl_value ) = = SGL_INFINITY_EXPONENT & & \
Sgl_mantissa ( sgl_value ) = = 0 )
# define Sgl_isnan(sgl_value) \
( Sgl_exponent ( sgl_value ) = = SGL_INFINITY_EXPONENT & & \
Sgl_mantissa ( sgl_value ) ! = 0 )
# define Sgl_isnotnan(sgl_value) \
( Sgl_exponent ( sgl_value ) ! = SGL_INFINITY_EXPONENT | | \
Sgl_mantissa ( sgl_value ) = = 0 )
# define Sgl_islessthan(sgl_op1,sgl_op2) \
( Sall ( sgl_op1 ) < Sall ( sgl_op2 ) )
# define Sgl_isgreaterthan(sgl_op1,sgl_op2) \
( Sall ( sgl_op1 ) > Sall ( sgl_op2 ) )
# define Sgl_isnotlessthan(sgl_op1,sgl_op2) \
( Sall ( sgl_op1 ) > = Sall ( sgl_op2 ) )
# define Sgl_isequal(sgl_op1,sgl_op2) \
( Sall ( sgl_op1 ) = = Sall ( sgl_op2 ) )
# define Sgl_leftshiftby8(sgl_value) \
Sall ( sgl_value ) < < = 8
# define Sgl_leftshiftby4(sgl_value) \
Sall ( sgl_value ) < < = 4
# define Sgl_leftshiftby3(sgl_value) \
Sall ( sgl_value ) < < = 3
# define Sgl_leftshiftby2(sgl_value) \
Sall ( sgl_value ) < < = 2
# define Sgl_leftshiftby1(sgl_value) \
Sall ( sgl_value ) < < = 1
# define Sgl_rightshiftby1(sgl_value) \
Sall ( sgl_value ) > > = 1
# define Sgl_rightshiftby4(sgl_value) \
Sall ( sgl_value ) > > = 4
# define Sgl_rightshiftby8(sgl_value) \
Sall ( sgl_value ) > > = 8
# define Sgl_ismagnitudeless(signlessleft,signlessright) \
/* unsigned int signlessleft, signlessright; */ \
( signlessleft < signlessright )
# define Sgl_copytoint_exponentmantissa(source,dest) \
dest = Sexponentmantissa ( source )
/* A quiet NaN has the high mantissa bit clear and at least on other (in this
* case the adjacent bit ) bit set . */
# define Sgl_set_quiet(sgl_value) Deposit_shigh2mantissa(sgl_value,1)
# define Sgl_set_exponent(sgl_value,exp) Deposit_sexponent(sgl_value,exp)
# define Sgl_set_mantissa(dest,value) Deposit_smantissa(dest,value)
# define Sgl_set_exponentmantissa(dest,value) \
Deposit_sexponentmantissa ( dest , value )
/* An infinity is represented with the max exponent and a zero mantissa */
# define Sgl_setinfinity_exponent(sgl_value) \
Deposit_sexponent ( sgl_value , SGL_INFINITY_EXPONENT )
# define Sgl_setinfinity_exponentmantissa(sgl_value) \
Deposit_sexponentmantissa ( sgl_value , \
( SGL_INFINITY_EXPONENT < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) )
# define Sgl_setinfinitypositive(sgl_value) \
Sall ( sgl_value ) = ( SGL_INFINITY_EXPONENT < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) )
# define Sgl_setinfinitynegative(sgl_value) \
Sall ( sgl_value ) = ( SGL_INFINITY_EXPONENT < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) \
| ( ( unsigned int ) 1 < < 31 )
# define Sgl_setinfinity(sgl_value,sign) \
Sall ( sgl_value ) = ( SGL_INFINITY_EXPONENT < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) | \
( ( unsigned int ) sign < < 31 )
# define Sgl_sethigh4bits(sgl_value, extsign) \
Deposit_shigh4 ( sgl_value , extsign )
# define Sgl_set_sign(sgl_value,sign) Deposit_ssign(sgl_value,sign)
# define Sgl_invert_sign(sgl_value) \
Deposit_ssign ( sgl_value , ~ Ssign ( sgl_value ) )
# define Sgl_setone_sign(sgl_value) Deposit_ssign(sgl_value,1)
# define Sgl_setone_lowmantissa(sgl_value) Deposit_slow(sgl_value,1)
# define Sgl_setzero_sign(sgl_value) Sall(sgl_value) &= 0x7fffffff
# define Sgl_setzero_exponent(sgl_value) Sall(sgl_value) &= 0x807fffff
# define Sgl_setzero_mantissa(sgl_value) Sall(sgl_value) &= 0xff800000
# define Sgl_setzero_exponentmantissa(sgl_value) Sall(sgl_value) &= 0x80000000
# define Sgl_setzero(sgl_value) Sall(sgl_value) = 0
# define Sgl_setnegativezero(sgl_value) Sall(sgl_value) = (unsigned int)1 << 31
/* Use following macro for both overflow & underflow conditions */
# define ovfl -
# define unfl +
# define Sgl_setwrapped_exponent(sgl_value,exponent,op) \
Deposit_sexponent ( sgl_value , ( exponent op SGL_WRAP ) )
# define Sgl_setlargestpositive(sgl_value) \
Sall ( sgl_value ) = ( ( SGL_EMAX + SGL_BIAS ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) \
| ( ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) - 1 )
# define Sgl_setlargestnegative(sgl_value) \
Sall ( sgl_value ) = ( ( SGL_EMAX + SGL_BIAS ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) \
| ( ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) - 1 ) \
| ( ( unsigned int ) 1 < < 31 )
# define Sgl_setnegativeinfinity(sgl_value) \
Sall ( sgl_value ) = \
( ( 1 < < SGL_EXP_LENGTH ) | SGL_INFINITY_EXPONENT ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) )
# define Sgl_setlargest(sgl_value,sign) \
Sall ( sgl_value ) = ( unsigned int ) sign < < 31 | \
( ( ( SGL_EMAX + SGL_BIAS ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) \
| ( ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) - 1 ) )
# define Sgl_setlargest_exponentmantissa(sgl_value) \
Sall ( sgl_value ) = Sall ( sgl_value ) & ( ( unsigned int ) 1 < < 31 ) | \
( ( ( SGL_EMAX + SGL_BIAS ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) \
| ( ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) ) - 1 ) )
/* The high bit is always zero so arithmetic or logical shifts will work. */
# define Sgl_right_align(srcdst,shift,extent) \
/* sgl_floating_point srcdst; int shift; extension extent */ \
if ( shift < 32 ) { \
Extall ( extent ) = Sall ( srcdst ) < < ( 32 - ( shift ) ) ; \
Sall ( srcdst ) > > = shift ; \
} \
else { \
Extall ( extent ) = Sall ( srcdst ) ; \
Sall ( srcdst ) = 0 ; \
}
# define Sgl_hiddenhigh3mantissa(sgl_value) Shiddenhigh3mantissa(sgl_value)
# define Sgl_hidden(sgl_value) Shidden(sgl_value)
# define Sgl_lowmantissa(sgl_value) Slow(sgl_value)
/* The left argument is never smaller than the right argument */
# define Sgl_subtract(sgl_left,sgl_right,sgl_result) \
Sall ( sgl_result ) = Sall ( sgl_left ) - Sall ( sgl_right )
/* Subtract right augmented with extension from left augmented with zeros and
* store into result and extension . */
# define Sgl_subtract_withextension(left,right,extent,result) \
/* sgl_floating_point left,right,result; extension extent */ \
Sgl_subtract ( left , right , result ) ; \
if ( ( Extall ( extent ) = 0 - Extall ( extent ) ) ) \
Sall ( result ) = Sall ( result ) - 1
# define Sgl_addition(sgl_left,sgl_right,sgl_result) \
Sall ( sgl_result ) = Sall ( sgl_left ) + Sall ( sgl_right )
# define Sgl_xortointp1(left,right,result) \
result = Sall ( left ) XOR Sall ( right ) ;
# define Sgl_xorfromintp1(left,right,result) \
Sall ( result ) = left XOR Sall ( right )
/* Need to Initialize */
# define Sgl_makequietnan(dest) \
Sall ( dest ) = ( ( SGL_EMAX + SGL_BIAS ) + 1 ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) \
| ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH + 2 ) ) )
# define Sgl_makesignalingnan(dest) \
Sall ( dest ) = ( ( SGL_EMAX + SGL_BIAS ) + 1 ) < < ( 32 - ( 1 + SGL_EXP_LENGTH ) ) \
| ( 1 < < ( 32 - ( 1 + SGL_EXP_LENGTH + 1 ) ) )
# define Sgl_normalize(sgl_opnd,exponent) \
while ( Sgl_iszero_hiddenhigh7mantissa ( sgl_opnd ) ) { \
Sgl_leftshiftby8 ( sgl_opnd ) ; \
exponent - = 8 ; \
} \
if ( Sgl_iszero_hiddenhigh3mantissa ( sgl_opnd ) ) { \
Sgl_leftshiftby4 ( sgl_opnd ) ; \
exponent - = 4 ; \
} \
while ( Sgl_iszero_hidden ( sgl_opnd ) ) { \
Sgl_leftshiftby1 ( sgl_opnd ) ; \
exponent - = 1 ; \
}
# define Sgl_setoverflow(sgl_opnd) \
/* set result to infinity or largest number */ \
switch ( Rounding_mode ( ) ) { \
case ROUNDPLUS : \
if ( Sgl_isone_sign ( sgl_opnd ) ) { \
Sgl_setlargestnegative ( sgl_opnd ) ; \
} \
else { \
Sgl_setinfinitypositive ( sgl_opnd ) ; \
} \
break ; \
case ROUNDMINUS : \
if ( Sgl_iszero_sign ( sgl_opnd ) ) { \
Sgl_setlargestpositive ( sgl_opnd ) ; \
} \
else { \
Sgl_setinfinitynegative ( sgl_opnd ) ; \
} \
break ; \
case ROUNDNEAREST : \
Sgl_setinfinity_exponentmantissa ( sgl_opnd ) ; \
break ; \
case ROUNDZERO : \
Sgl_setlargest_exponentmantissa ( sgl_opnd ) ; \
}
# define Sgl_denormalize(opnd,exponent,guard,sticky,inexact) \
Sgl_clear_signexponent_set_hidden ( opnd ) ; \
if ( exponent > = ( 1 - SGL_P ) ) { \
guard = ( Sall ( opnd ) > > - exponent ) & 1 ; \
if ( exponent < 0 ) sticky | = Sall ( opnd ) < < ( 32 + exponent ) ; \
inexact = guard | sticky ; \
Sall ( opnd ) > > = ( 1 - exponent ) ; \
} \
else { \
guard = 0 ; \
sticky | = Sall ( opnd ) ; \
inexact = sticky ; \
Sgl_setzero ( opnd ) ; \
}
/*
* The fused multiply add instructions requires a single extended format ,
* with 48 bits of mantissa .
*/
# define SGLEXT_THRESHOLD 48
# define Sglext_setzero(valA,valB) \
Sextallp1 ( valA ) = 0 ; Sextallp2 ( valB ) = 0
# define Sglext_isnotzero_mantissap2(valB) (Sextallp2(valB)!=0)
# define Sglext_isone_lowp1(val) (Sextlowp1(val)!=0)
# define Sglext_isone_highp2(val) (Sexthighp2(val)!=0)
# define Sglext_isnotzero_low31p2(val) (Sextlow31p2(val)!=0)
# define Sglext_iszero(valA,valB) (Sextallp1(valA)==0 && Sextallp2(valB)==0)
# define Sgl_copytoptr(src,destptr) *destptr = src
# define Sgl_copyfromptr(srcptr,dest) dest = *srcptr
# define Sglext_copy(srca,srcb,desta,destb) \
Sextallp1 ( desta ) = Sextallp1 ( srca ) ; \
Sextallp2 ( destb ) = Sextallp2 ( srcb )
# define Sgl_copyto_sglext(src1,dest1,dest2) \
Sextallp1 ( dest1 ) = Sall ( src1 ) ; Sextallp2 ( dest2 ) = 0
# define Sglext_swap_lower(leftp2,rightp2) \
Sextallp2 ( leftp2 ) = Sextallp2 ( leftp2 ) XOR Sextallp2 ( rightp2 ) ; \
Sextallp2 ( rightp2 ) = Sextallp2 ( leftp2 ) XOR Sextallp2 ( rightp2 ) ; \
Sextallp2 ( leftp2 ) = Sextallp2 ( leftp2 ) XOR Sextallp2 ( rightp2 )
# define Sglext_setone_lowmantissap2(value) Deposit_dlowp2(value,1)
/* The high bit is always zero so arithmetic or logical shifts will work. */
# define Sglext_right_align(srcdstA,srcdstB,shift) \
{ int shiftamt , sticky ; \
shiftamt = shift % 32 ; \
sticky = 0 ; \
switch ( shift / 32 ) { \
case 0 : if ( shiftamt > 0 ) { \
sticky = Sextallp2 ( srcdstB ) < < 32 - ( shiftamt ) ; \
Variable_shift_double ( Sextallp1 ( srcdstA ) , \
Sextallp2 ( srcdstB ) , shiftamt , Sextallp2 ( srcdstB ) ) ; \
Sextallp1 ( srcdstA ) > > = shiftamt ; \
} \
break ; \
case 1 : if ( shiftamt > 0 ) { \
sticky = ( Sextallp1 ( srcdstA ) < < 32 - ( shiftamt ) ) | \
Sextallp2 ( srcdstB ) ; \
} \
else { \
sticky = Sextallp2 ( srcdstB ) ; \
} \
Sextallp2 ( srcdstB ) = Sextallp1 ( srcdstA ) > > shiftamt ; \
Sextallp1 ( srcdstA ) = 0 ; \
break ; \
} \
if ( sticky ) Sglext_setone_lowmantissap2 ( srcdstB ) ; \
}
/* The left argument is never smaller than the right argument */
# define Sglext_subtract(lefta,leftb,righta,rightb,resulta,resultb) \
if ( Sextallp2 ( rightb ) > Sextallp2 ( leftb ) ) Sextallp1 ( lefta ) - - ; \
Sextallp2 ( resultb ) = Sextallp2 ( leftb ) - Sextallp2 ( rightb ) ; \
Sextallp1 ( resulta ) = Sextallp1 ( lefta ) - Sextallp1 ( righta )
# define Sglext_addition(lefta,leftb,righta,rightb,resulta,resultb) \
/* If the sum of the low words is less than either source, then \
* an overflow into the next word occurred . */ \
if ( ( Sextallp2 ( resultb ) = Sextallp2 ( leftb ) + Sextallp2 ( rightb ) ) < \
Sextallp2 ( rightb ) ) \
Sextallp1 ( resulta ) = Sextallp1 ( lefta ) + Sextallp1 ( righta ) + 1 ; \
else Sextallp1 ( resulta ) = Sextallp1 ( lefta ) + Sextallp1 ( righta )
# define Sglext_arithrightshiftby1(srcdstA,srcdstB) \
Shiftdouble ( Sextallp1 ( srcdstA ) , Sextallp2 ( srcdstB ) , 1 , Sextallp2 ( srcdstB ) ) ; \
Sextallp1 ( srcdstA ) = ( int ) Sextallp1 ( srcdstA ) > > 1
# define Sglext_leftshiftby8(valA,valB) \
Shiftdouble ( Sextallp1 ( valA ) , Sextallp2 ( valB ) , 24 , Sextallp1 ( valA ) ) ; \
Sextallp2 ( valB ) < < = 8
# define Sglext_leftshiftby4(valA,valB) \
Shiftdouble ( Sextallp1 ( valA ) , Sextallp2 ( valB ) , 28 , Sextallp1 ( valA ) ) ; \
Sextallp2 ( valB ) < < = 4
# define Sglext_leftshiftby3(valA,valB) \
Shiftdouble ( Sextallp1 ( valA ) , Sextallp2 ( valB ) , 29 , Sextallp1 ( valA ) ) ; \
Sextallp2 ( valB ) < < = 3
# define Sglext_leftshiftby2(valA,valB) \
Shiftdouble ( Sextallp1 ( valA ) , Sextallp2 ( valB ) , 30 , Sextallp1 ( valA ) ) ; \
Sextallp2 ( valB ) < < = 2
# define Sglext_leftshiftby1(valA,valB) \
Shiftdouble ( Sextallp1 ( valA ) , Sextallp2 ( valB ) , 31 , Sextallp1 ( valA ) ) ; \
Sextallp2 ( valB ) < < = 1
# define Sglext_rightshiftby4(valueA,valueB) \
Shiftdouble ( Sextallp1 ( valueA ) , Sextallp2 ( valueB ) , 4 , Sextallp2 ( valueB ) ) ; \
Sextallp1 ( valueA ) > > = 4
# define Sglext_rightshiftby3(valueA,valueB) \
Shiftdouble ( Sextallp1 ( valueA ) , Sextallp2 ( valueB ) , 3 , Sextallp2 ( valueB ) ) ; \
Sextallp1 ( valueA ) > > = 3
# define Sglext_rightshiftby1(valueA,valueB) \
Shiftdouble ( Sextallp1 ( valueA ) , Sextallp2 ( valueB ) , 1 , Sextallp2 ( valueB ) ) ; \
Sextallp1 ( valueA ) > > = 1
# define Sglext_xortointp1(left,right,result) Sgl_xortointp1(left,right,result)
# define Sglext_xorfromintp1(left,right,result) \
Sgl_xorfromintp1 ( left , right , result )
# define Sglext_copytoint_exponentmantissa(src,dest) \
Sgl_copytoint_exponentmantissa ( src , dest )
# define Sglext_ismagnitudeless(signlessleft,signlessright) \
Sgl_ismagnitudeless ( signlessleft , signlessright )
# define Sglext_set_sign(dbl_value,sign) Sgl_set_sign(dbl_value,sign)
# define Sglext_clear_signexponent_set_hidden(srcdst) \
Sgl_clear_signexponent_set_hidden ( srcdst )
# define Sglext_clear_signexponent(srcdst) Sgl_clear_signexponent(srcdst)
# define Sglext_clear_sign(srcdst) Sgl_clear_sign(srcdst)
# define Sglext_isone_hidden(dbl_value) Sgl_isone_hidden(dbl_value)
# define Sglext_denormalize(opndp1,opndp2,exponent,is_tiny) \
{ int sticky ; \
is_tiny = TRUE ; \
if ( exponent = = 0 & & Sextallp2 ( opndp2 ) ) { \
switch ( Rounding_mode ( ) ) { \
case ROUNDPLUS : \
if ( Sgl_iszero_sign ( opndp1 ) ) \
if ( Sgl_isone_hiddenoverflow ( opndp1 + 1 ) ) \
is_tiny = FALSE ; \
break ; \
case ROUNDMINUS : \
if ( Sgl_isone_sign ( opndp1 ) ) { \
if ( Sgl_isone_hiddenoverflow ( opndp1 + 1 ) ) \
is_tiny = FALSE ; \
} \
break ; \
case ROUNDNEAREST : \
if ( Sglext_isone_highp2 ( opndp2 ) & & \
( Sglext_isone_lowp1 ( opndp1 ) | | \
Sglext_isnotzero_low31p2 ( opndp2 ) ) ) \
if ( Sgl_isone_hiddenoverflow ( opndp1 + 1 ) ) \
is_tiny = FALSE ; \
break ; \
} \
} \
Sglext_clear_signexponent_set_hidden ( opndp1 ) ; \
if ( exponent > = ( 1 - DBL_P ) ) { \
if ( exponent > = - 31 ) { \
if ( exponent > - 31 ) { \
sticky = Sextallp2 ( opndp2 ) < < 31 + exponent ; \
Variable_shift_double ( opndp1 , opndp2 , 1 - exponent , opndp2 ) ; \
Sextallp1 ( opndp1 ) > > = 1 - exponent ; \
} \
else { \
sticky = Sextallp2 ( opndp2 ) ; \
Sextallp2 ( opndp2 ) = Sextallp1 ( opndp1 ) ; \
Sextallp1 ( opndp1 ) = 0 ; \
} \
} \
else { \
sticky = ( Sextallp1 ( opndp1 ) < < 31 + exponent ) | \
Sextallp2 ( opndp2 ) ; \
Sextallp2 ( opndp2 ) = Sextallp1 ( opndp1 ) > > - 31 - exponent ; \
Sextallp1 ( opndp1 ) = 0 ; \
} \
} \
else { \
sticky = Sextallp1 ( opndp1 ) | Sextallp2 ( opndp2 ) ; \
Sglext_setzero ( opndp1 , opndp2 ) ; \
} \
if ( sticky ) Sglext_setone_lowmantissap2 ( opndp2 ) ; \
exponent = 0 ; \
}