^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) }