Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^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) #ifdef __NO_PA_HDRS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  10)     PA header file -- do not include this header file for non-PA builds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  11) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  12) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  13) /* 32-bit word grabbing functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  14) #define Sgl_firstword(value) Sall(value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  15) #define Sgl_secondword(value) dummy_location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  16) #define Sgl_thirdword(value) dummy_location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  17) #define Sgl_fourthword(value) dummy_location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  19) #define Sgl_sign(object) Ssign(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  20) #define Sgl_exponent(object) Sexponent(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  21) #define Sgl_signexponent(object) Ssignexponent(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  22) #define Sgl_mantissa(object) Smantissa(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  23) #define Sgl_exponentmantissa(object) Sexponentmantissa(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  24) #define Sgl_all(object) Sall(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  25) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  26) /* sgl_and_signs ANDs the sign bits of each argument and puts the result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  27)  * into the first argument. sgl_or_signs ors those same sign bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  28) #define Sgl_and_signs( src1dst, src2)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  29)     Sall(src1dst) = (Sall(src2)|~((unsigned int)1<<31)) & Sall(src1dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  30) #define Sgl_or_signs( src1dst, src2)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  31)     Sall(src1dst) = (Sall(src2)&((unsigned int)1<<31)) | Sall(src1dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  33) /* The hidden bit is always the low bit of the exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  34) #define Sgl_clear_exponent_set_hidden(srcdst) Deposit_sexponent(srcdst,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  35) #define Sgl_clear_signexponent_set_hidden(srcdst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  36)     Deposit_ssignexponent(srcdst,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  37) #define Sgl_clear_sign(srcdst) Sall(srcdst) &= ~((unsigned int)1<<31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  38) #define Sgl_clear_signexponent(srcdst) Sall(srcdst) &= 0x007fffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  39) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  40) /* varamount must be less than 32 for the next three functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  41) #define Sgl_rightshift(srcdst, varamount)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  42)     Sall(srcdst) >>= varamount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  43) #define Sgl_leftshift(srcdst, varamount)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  44)     Sall(srcdst) <<= varamount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  45) #define Sgl_rightshift_exponentmantissa(srcdst, varamount) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  46)     Sall(srcdst) = \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  47) 	(Sexponentmantissa(srcdst) >> varamount) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  48) 	(Sall(srcdst) & ((unsigned int)1<<31))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  49) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  50) #define Sgl_leftshiftby1_withextent(left,right,result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  51)     Shiftdouble(Sall(left),Extall(right),31,Sall(result))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  52)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  53) #define Sgl_rightshiftby1_withextent(left,right,dst)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  54)     Shiftdouble(Sall(left),Extall(right),1,Extall(right))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  55) #define Sgl_arithrightshiftby1(srcdst)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  56)     Sall(srcdst) = (int)Sall(srcdst) >> 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  57)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  58) /* Sign extend the sign bit with an integer destination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  59) #define Sgl_signextendedsign(value) Ssignedsign(value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  60) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  61) #define Sgl_isone_hidden(sgl_value) (Shidden(sgl_value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  62) #define Sgl_increment(sgl_value) Sall(sgl_value) += 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  63) #define Sgl_increment_mantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  64)     Deposit_smantissa(sgl_value,sgl_value+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  65) #define Sgl_decrement(sgl_value) Sall(sgl_value) -= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  66) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  67) #define Sgl_isone_sign(sgl_value) (Is_ssign(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  68) #define Sgl_isone_hiddenoverflow(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  69)     (Is_shiddenoverflow(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  70) #define Sgl_isone_lowmantissa(sgl_value) (Is_slow(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  71) #define Sgl_isone_signaling(sgl_value) (Is_ssignaling(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  72) #define Sgl_is_signalingnan(sgl_value) (Ssignalingnan(sgl_value)==0x1ff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  73) #define Sgl_isnotzero(sgl_value) (Sall(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  74) #define Sgl_isnotzero_hiddenhigh7mantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  75)     (Shiddenhigh7mantissa(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  76) #define Sgl_isnotzero_low4(sgl_value) (Slow4(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  77) #define Sgl_isnotzero_exponent(sgl_value) (Sexponent(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  78) #define Sgl_isnotzero_mantissa(sgl_value) (Smantissa(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  79) #define Sgl_isnotzero_exponentmantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  80)     (Sexponentmantissa(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  81) #define Sgl_iszero(sgl_value) (Sall(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  82) #define Sgl_iszero_signaling(sgl_value) (Is_ssignaling(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  83) #define Sgl_iszero_hidden(sgl_value) (Is_shidden(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  84) #define Sgl_iszero_hiddenoverflow(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  85)     (Is_shiddenoverflow(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  86) #define Sgl_iszero_hiddenhigh3mantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  87)     (Shiddenhigh3mantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  88) #define Sgl_iszero_hiddenhigh7mantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  89)     (Shiddenhigh7mantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  90) #define Sgl_iszero_sign(sgl_value) (Is_ssign(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  91) #define Sgl_iszero_exponent(sgl_value) (Sexponent(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  92) #define Sgl_iszero_mantissa(sgl_value) (Smantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  93) #define Sgl_iszero_exponentmantissa(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  94)     (Sexponentmantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  95) #define Sgl_isinfinity_exponent(sgl_value) 		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  96)     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  97) #define Sgl_isnotinfinity_exponent(sgl_value) 		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  98)     (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  99) #define Sgl_isinfinity(sgl_value)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT &&	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101)     Sgl_mantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) #define Sgl_isnan(sgl_value)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)     (Sgl_exponent(sgl_value)==SGL_INFINITY_EXPONENT &&	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104)     Sgl_mantissa(sgl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #define Sgl_isnotnan(sgl_value)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)     (Sgl_exponent(sgl_value)!=SGL_INFINITY_EXPONENT ||	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107)     Sgl_mantissa(sgl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) #define Sgl_islessthan(sgl_op1,sgl_op2)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)     (Sall(sgl_op1) < Sall(sgl_op2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #define Sgl_isgreaterthan(sgl_op1,sgl_op2)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111)     (Sall(sgl_op1) > Sall(sgl_op2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) #define Sgl_isnotlessthan(sgl_op1,sgl_op2)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)     (Sall(sgl_op1) >= Sall(sgl_op2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define Sgl_isequal(sgl_op1,sgl_op2)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115)     (Sall(sgl_op1) == Sall(sgl_op2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define Sgl_leftshiftby8(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118)     Sall(sgl_value) <<= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define Sgl_leftshiftby4(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120)     Sall(sgl_value) <<= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define Sgl_leftshiftby3(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)     Sall(sgl_value) <<= 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define Sgl_leftshiftby2(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)     Sall(sgl_value) <<= 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #define Sgl_leftshiftby1(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126)     Sall(sgl_value) <<= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define Sgl_rightshiftby1(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128)     Sall(sgl_value) >>= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) #define Sgl_rightshiftby4(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130)     Sall(sgl_value) >>= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define Sgl_rightshiftby8(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)     Sall(sgl_value) >>= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define Sgl_ismagnitudeless(signlessleft,signlessright)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) /*  unsigned int signlessleft, signlessright; */			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)       (signlessleft < signlessright)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137)     
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define Sgl_copytoint_exponentmantissa(source,dest)     \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140)     dest = Sexponentmantissa(source)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) /* A quiet NaN has the high mantissa bit clear and at least on other (in this
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143)  * case the adjacent bit) bit set. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #define Sgl_set_quiet(sgl_value) Deposit_shigh2mantissa(sgl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define Sgl_set_exponent(sgl_value,exp) Deposit_sexponent(sgl_value,exp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define Sgl_set_mantissa(dest,value) Deposit_smantissa(dest,value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #define Sgl_set_exponentmantissa(dest,value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)     Deposit_sexponentmantissa(dest,value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) /*  An infinity is represented with the max exponent and a zero mantissa */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define Sgl_setinfinity_exponent(sgl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153)     Deposit_sexponent(sgl_value,SGL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define Sgl_setinfinity_exponentmantissa(sgl_value)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)     Deposit_sexponentmantissa(sgl_value, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) 	(SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define Sgl_setinfinitypositive(sgl_value)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158)     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #define Sgl_setinfinitynegative(sgl_value)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)     | ((unsigned int)1<<31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #define Sgl_setinfinity(sgl_value,sign)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163)     Sall(sgl_value) = (SGL_INFINITY_EXPONENT << (32-(1+SGL_EXP_LENGTH))) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)      ((unsigned int)sign << 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define Sgl_sethigh4bits(sgl_value, extsign)  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166)     Deposit_shigh4(sgl_value,extsign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #define Sgl_set_sign(sgl_value,sign) Deposit_ssign(sgl_value,sign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #define Sgl_invert_sign(sgl_value)  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169)     Deposit_ssign(sgl_value,~Ssign(sgl_value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #define Sgl_setone_sign(sgl_value) Deposit_ssign(sgl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #define Sgl_setone_lowmantissa(sgl_value) Deposit_slow(sgl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #define Sgl_setzero_sign(sgl_value)  Sall(sgl_value) &= 0x7fffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define Sgl_setzero_exponent(sgl_value) Sall(sgl_value) &= 0x807fffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #define Sgl_setzero_mantissa(sgl_value) Sall(sgl_value) &= 0xff800000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #define Sgl_setzero_exponentmantissa(sgl_value)  Sall(sgl_value) &= 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #define Sgl_setzero(sgl_value) Sall(sgl_value) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define Sgl_setnegativezero(sgl_value) Sall(sgl_value) = (unsigned int)1 << 31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) /* Use following macro for both overflow & underflow conditions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) #define ovfl -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define unfl +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) #define Sgl_setwrapped_exponent(sgl_value,exponent,op) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183)     Deposit_sexponent(sgl_value,(exponent op SGL_WRAP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) #define Sgl_setlargestpositive(sgl_value) 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)     Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187)                       | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1 )
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) #define Sgl_setlargestnegative(sgl_value)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189)     Sall(sgl_value) = ((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)                       | ((1<<(32-(1+SGL_EXP_LENGTH))) - 1 )		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 		      | ((unsigned int)1<<31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define Sgl_setnegativeinfinity(sgl_value)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194)     Sall(sgl_value) = 				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195)     ((1<<SGL_EXP_LENGTH) | SGL_INFINITY_EXPONENT) << (32-(1+SGL_EXP_LENGTH))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define Sgl_setlargest(sgl_value,sign) 					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197)     Sall(sgl_value) = (unsigned int)sign << 31 |			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198)         (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) 	  | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define Sgl_setlargest_exponentmantissa(sgl_value)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201)     Sall(sgl_value) = Sall(sgl_value) & ((unsigned int)1<<31) |		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202)         (((SGL_EMAX+SGL_BIAS) << (32-(1+SGL_EXP_LENGTH)))		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) 	  | ((1 << (32-(1+SGL_EXP_LENGTH))) - 1 ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) /* The high bit is always zero so arithmetic or logical shifts will work. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define Sgl_right_align(srcdst,shift,extent)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207)     /* sgl_floating_point srcdst; int shift; extension extent */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208)     if (shift < 32) {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) 	Extall(extent) = Sall(srcdst) << (32-(shift));			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210)     	Sall(srcdst) >>= shift;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)     }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)     else {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) 	Extall(extent) = Sall(srcdst);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) 	Sall(srcdst) = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215)     }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) #define Sgl_hiddenhigh3mantissa(sgl_value) Shiddenhigh3mantissa(sgl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) #define Sgl_hidden(sgl_value) Shidden(sgl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) #define Sgl_lowmantissa(sgl_value) Slow(sgl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) /* The left argument is never smaller than the right argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) #define Sgl_subtract(sgl_left,sgl_right,sgl_result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)     Sall(sgl_result) = Sall(sgl_left) - Sall(sgl_right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* Subtract right augmented with extension from left augmented with zeros and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225)  * store into result and extension. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) #define Sgl_subtract_withextension(left,right,extent,result)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227)     /* sgl_floating_point left,right,result; extension extent */	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228)   Sgl_subtract(left,right,result);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)   if((Extall(extent) = 0-Extall(extent)))				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)       Sall(result) = Sall(result)-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define Sgl_addition(sgl_left,sgl_right,sgl_result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)     Sall(sgl_result) = Sall(sgl_left) + Sall(sgl_right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define Sgl_xortointp1(left,right,result)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)     result = Sall(left) XOR Sall(right);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define Sgl_xorfromintp1(left,right,result)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239)     Sall(result) = left XOR Sall(right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) /* Need to Initialize */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) #define Sgl_makequietnan(dest)						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243)     Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244)                  | (1<<(32-(1+SGL_EXP_LENGTH+2)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) #define Sgl_makesignalingnan(dest)					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246)     Sall(dest) = ((SGL_EMAX+SGL_BIAS)+1)<< (32-(1+SGL_EXP_LENGTH))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)                  | (1<<(32-(1+SGL_EXP_LENGTH+1)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define Sgl_normalize(sgl_opnd,exponent)			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) 	while(Sgl_iszero_hiddenhigh7mantissa(sgl_opnd)) {	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) 		Sgl_leftshiftby8(sgl_opnd);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) 		exponent -= 8;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) 	}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) 	if(Sgl_iszero_hiddenhigh3mantissa(sgl_opnd)) {		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) 		Sgl_leftshiftby4(sgl_opnd);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) 		exponent -= 4;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) 	}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) 	while(Sgl_iszero_hidden(sgl_opnd)) {			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) 		Sgl_leftshiftby1(sgl_opnd);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) 		exponent -= 1;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define Sgl_setoverflow(sgl_opnd)				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) 	/* set result to infinity or largest number */		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) 	switch (Rounding_mode()) {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 		case ROUNDPLUS:					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) 			if (Sgl_isone_sign(sgl_opnd)) {		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) 				Sgl_setlargestnegative(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) 			}					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) 			else {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) 				Sgl_setinfinitypositive(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) 			}					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) 			break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) 		case ROUNDMINUS:				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) 			if (Sgl_iszero_sign(sgl_opnd)) {	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) 				Sgl_setlargestpositive(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) 			}					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) 			else {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) 				Sgl_setinfinitynegative(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) 			}					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) 			break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) 		case ROUNDNEAREST:				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) 			Sgl_setinfinity_exponentmantissa(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) 			break;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 		case ROUNDZERO:					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) 			Sgl_setlargest_exponentmantissa(sgl_opnd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) 	}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define Sgl_denormalize(opnd,exponent,guard,sticky,inexact)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) 	Sgl_clear_signexponent_set_hidden(opnd);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) 	if (exponent >= (1 - SGL_P)) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) 		guard = (Sall(opnd) >> -exponent) & 1;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) 		if (exponent < 0) sticky |= Sall(opnd) << (32+exponent); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) 		inexact = guard | sticky;				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 		Sall(opnd) >>= (1-exponent);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) 	else {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) 		guard = 0;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) 		sticky |= Sall(opnd);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) 		inexact = sticky;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) 		Sgl_setzero(opnd);					\
^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) /* 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305)  * The fused multiply add instructions requires a single extended format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)  * with 48 bits of mantissa.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define SGLEXT_THRESHOLD 48
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #define Sglext_setzero(valA,valB)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311)     Sextallp1(valA) = 0; Sextallp2(valB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) #define Sglext_isnotzero_mantissap2(valB) (Sextallp2(valB)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #define Sglext_isone_lowp1(val) (Sextlowp1(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) #define Sglext_isone_highp2(val) (Sexthighp2(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #define Sglext_isnotzero_low31p2(val) (Sextlow31p2(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define Sglext_iszero(valA,valB) (Sextallp1(valA)==0 && Sextallp2(valB)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) #define Sgl_copytoptr(src,destptr) *destptr = src
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) #define Sgl_copyfromptr(srcptr,dest) dest = *srcptr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) #define Sglext_copy(srca,srcb,desta,destb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)     Sextallp1(desta) = Sextallp1(srca);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323)     Sextallp2(destb) = Sextallp2(srcb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) #define Sgl_copyto_sglext(src1,dest1,dest2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) 	Sextallp1(dest1) = Sall(src1); Sextallp2(dest2) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #define Sglext_swap_lower(leftp2,rightp2)  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328)     Sextallp2(leftp2)  = Sextallp2(leftp2) XOR Sextallp2(rightp2);  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329)     Sextallp2(rightp2) = Sextallp2(leftp2) XOR Sextallp2(rightp2);  \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330)     Sextallp2(leftp2)  = Sextallp2(leftp2) XOR Sextallp2(rightp2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332) #define Sglext_setone_lowmantissap2(value) Deposit_dlowp2(value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 333) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 334) /* The high bit is always zero so arithmetic or logical shifts will work. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 335) #define Sglext_right_align(srcdstA,srcdstB,shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336)   {int shiftamt, sticky;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337)     shiftamt = shift % 32;						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338)     sticky = 0;								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339)     switch (shift/32) {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340)      case 0: if (shiftamt > 0) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) 	        sticky = Sextallp2(srcdstB) << 32 - (shiftamt);		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342)                 Variable_shift_double(Sextallp1(srcdstA),		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) 		 Sextallp2(srcdstB),shiftamt,Sextallp2(srcdstB));	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) 	        Sextallp1(srcdstA) >>= shiftamt;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) 	     }								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) 	     break;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347)      case 1: if (shiftamt > 0) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) 	        sticky = (Sextallp1(srcdstA) << 32 - (shiftamt)) |	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) 			 Sextallp2(srcdstB);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 350) 	     }								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 351) 	     else {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 352) 		sticky = Sextallp2(srcdstB);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) 	     }								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) 	     Sextallp2(srcdstB) = Sextallp1(srcdstA) >> shiftamt;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) 	     Sextallp1(srcdstA) = 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) 	     break;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357)     }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358)     if (sticky) Sglext_setone_lowmantissap2(srcdstB);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359)   }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /* The left argument is never smaller than the right argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) #define Sglext_subtract(lefta,leftb,righta,rightb,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363)     if( Sextallp2(rightb) > Sextallp2(leftb) ) Sextallp1(lefta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364)     Sextallp2(resultb) = Sextallp2(leftb) - Sextallp2(rightb);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365)     Sextallp1(resulta) = Sextallp1(lefta) - Sextallp1(righta)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) #define Sglext_addition(lefta,leftb,righta,rightb,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368)     /* If the sum of the low words is less than either source, then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369)      * an overflow into the next word occurred. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370)     if ((Sextallp2(resultb) = Sextallp2(leftb)+Sextallp2(rightb)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)         Sextallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) 	    Sextallp1(resulta) = Sextallp1(lefta)+Sextallp1(righta)+1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373)     else Sextallp1(resulta) = Sextallp1(lefta)+Sextallp1(righta)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) #define Sglext_arithrightshiftby1(srcdstA,srcdstB)	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377)     Shiftdouble(Sextallp1(srcdstA),Sextallp2(srcdstB),1,Sextallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378)     Sextallp1(srcdstA) = (int)Sextallp1(srcdstA) >> 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379)    
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) #define Sglext_leftshiftby8(valA,valB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)     Shiftdouble(Sextallp1(valA),Sextallp2(valB),24,Sextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382)     Sextallp2(valB) <<= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define Sglext_leftshiftby4(valA,valB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384)     Shiftdouble(Sextallp1(valA),Sextallp2(valB),28,Sextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)     Sextallp2(valB) <<= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) #define Sglext_leftshiftby3(valA,valB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387)     Shiftdouble(Sextallp1(valA),Sextallp2(valB),29,Sextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388)     Sextallp2(valB) <<= 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) #define Sglext_leftshiftby2(valA,valB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390)     Shiftdouble(Sextallp1(valA),Sextallp2(valB),30,Sextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)     Sextallp2(valB) <<= 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) #define Sglext_leftshiftby1(valA,valB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393)     Shiftdouble(Sextallp1(valA),Sextallp2(valB),31,Sextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394)     Sextallp2(valB) <<= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) #define Sglext_rightshiftby4(valueA,valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397)     Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),4,Sextallp2(valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398)     Sextallp1(valueA) >>= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) #define Sglext_rightshiftby3(valueA,valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)     Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),3,Sextallp2(valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401)     Sextallp1(valueA) >>= 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) #define Sglext_rightshiftby1(valueA,valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403)     Shiftdouble(Sextallp1(valueA),Sextallp2(valueB),1,Sextallp2(valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404)     Sextallp1(valueA) >>= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) #define Sglext_xortointp1(left,right,result) Sgl_xortointp1(left,right,result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407) #define Sglext_xorfromintp1(left,right,result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) 	Sgl_xorfromintp1(left,right,result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) #define Sglext_copytoint_exponentmantissa(src,dest) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410) 	Sgl_copytoint_exponentmantissa(src,dest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define Sglext_ismagnitudeless(signlessleft,signlessright) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) 	Sgl_ismagnitudeless(signlessleft,signlessright)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #define Sglext_set_sign(dbl_value,sign)  Sgl_set_sign(dbl_value,sign)  
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) #define Sglext_clear_signexponent_set_hidden(srcdst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) 	Sgl_clear_signexponent_set_hidden(srcdst) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) #define Sglext_clear_signexponent(srcdst) Sgl_clear_signexponent(srcdst) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418) #define Sglext_clear_sign(srcdst) Sgl_clear_sign(srcdst) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) #define Sglext_isone_hidden(dbl_value) Sgl_isone_hidden(dbl_value) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) #define Sglext_denormalize(opndp1,opndp2,exponent,is_tiny)		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422)   {int sticky;								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423)     is_tiny = TRUE;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424)     if (exponent == 0 && Sextallp2(opndp2)) {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) 	switch (Rounding_mode()) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) 	case ROUNDPLUS:							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) 		if (Sgl_iszero_sign(opndp1))				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428) 			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) 				is_tiny = FALSE;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) 		break;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) 	case ROUNDMINUS:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) 		if (Sgl_isone_sign(opndp1)) {				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) 			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) 				is_tiny = FALSE;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) 		}							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) 		break;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) 	case ROUNDNEAREST:						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) 		if (Sglext_isone_highp2(opndp2) &&			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) 		    (Sglext_isone_lowp1(opndp1) || 			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) 		     Sglext_isnotzero_low31p2(opndp2)))			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) 			if (Sgl_isone_hiddenoverflow(opndp1 + 1))	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442) 				is_tiny = FALSE;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) 		break;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445)     }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446)     Sglext_clear_signexponent_set_hidden(opndp1);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447)     if (exponent >= (1-DBL_P)) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) 	if (exponent >= -31) {						\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) 	    if (exponent > -31) {					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) 		sticky = Sextallp2(opndp2) << 31+exponent;		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) 		Variable_shift_double(opndp1,opndp2,1-exponent,opndp2);	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452) 		Sextallp1(opndp1) >>= 1-exponent;			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) 	    }								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) 	    else {							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) 		sticky = Sextallp2(opndp2);				\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) 		Sextallp2(opndp2) = Sextallp1(opndp1);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) 		Sextallp1(opndp1) = 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) 	    }								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) 	else {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) 	    sticky = (Sextallp1(opndp1) << 31+exponent) | 		\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462) 		     Sextallp2(opndp2);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) 	    Sextallp2(opndp2) = Sextallp1(opndp1) >> -31-exponent;	\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) 	    Sextallp1(opndp1) = 0;					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) 	}								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466)     }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467)     else {								\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) 	sticky = Sextallp1(opndp1) | Sextallp2(opndp2);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) 	Sglext_setzero(opndp1,opndp2);					\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470)     }									\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471)     if (sticky) Sglext_setone_lowmantissap2(opndp2);			\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472)     exponent = 0;							\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473)   }