^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) #ifdef __NO_PA_HDRS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) PA header file -- do not include this header file for non-PA builds.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) /* 32-bit word grabbing functions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define Dbl_firstword(value) Dallp1(value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define Dbl_secondword(value) Dallp2(value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define Dbl_thirdword(value) dummy_location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define Dbl_fourthword(value) dummy_location
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define Dbl_sign(object) Dsign(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define Dbl_exponent(object) Dexponent(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define Dbl_signexponent(object) Dsignexponent(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define Dbl_mantissap1(object) Dmantissap1(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define Dbl_mantissap2(object) Dmantissap2(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define Dbl_exponentmantissap1(object) Dexponentmantissap1(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define Dbl_allp1(object) Dallp1(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define Dbl_allp2(object) Dallp2(object)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* dbl_and_signs ANDs the sign bits of each argument and puts the result
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * into the first argument. dbl_or_signs ors those same sign bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define Dbl_and_signs( src1dst, src2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) Dallp1(src1dst) = (Dallp1(src2)|~((unsigned int)1<<31)) & Dallp1(src1dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define Dbl_or_signs( src1dst, src2) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) Dallp1(src1dst) = (Dallp1(src2)&((unsigned int)1<<31)) | Dallp1(src1dst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /* The hidden bit is always the low bit of the exponent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define Dbl_clear_exponent_set_hidden(srcdst) Deposit_dexponent(srcdst,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define Dbl_clear_signexponent_set_hidden(srcdst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) Deposit_dsignexponent(srcdst,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #define Dbl_clear_sign(srcdst) Dallp1(srcdst) &= ~((unsigned int)1<<31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define Dbl_clear_signexponent(srcdst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) Dallp1(srcdst) &= Dmantissap1((unsigned int)-1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) /* Exponent field for doubles has already been cleared and may be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) * included in the shift. Here we need to generate two double width
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) * variable shifts. The insignificant bits can be ignored.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) * MTSAR f(varamount)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * VSHD srcdst.high,srcdst.low => srcdst.low
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) * VSHD 0,srcdst.high => srcdst.high
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * This is very difficult to model with C expressions since the shift amount
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * could exceed 32. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* varamount must be less than 64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define Dbl_rightshift(srcdstA, srcdstB, varamount) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) {if((varamount) >= 32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) Dallp2(srcdstB) = Dallp1(srcdstA) >> (varamount-32); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) Dallp1(srcdstA)=0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) else if(varamount > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) Variable_shift_double(Dallp1(srcdstA), Dallp2(srcdstB), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) (varamount), Dallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) Dallp1(srcdstA) >>= varamount; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* varamount must be less than 64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define Dbl_rightshift_exponentmantissa(srcdstA, srcdstB, varamount) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) {if((varamount) >= 32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) Dallp2(srcdstB) = Dexponentmantissap1(srcdstA) >> (varamount-32); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) Dallp1(srcdstA) &= ((unsigned int)1<<31); /* clear expmant field */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) else if(varamount > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) Variable_shift_double(Dexponentmantissap1(srcdstA), Dallp2(srcdstB), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) (varamount), Dallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) Deposit_dexponentmantissap1(srcdstA, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) (Dexponentmantissap1(srcdstA)>>varamount)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) /* varamount must be less than 64 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #define Dbl_leftshift(srcdstA, srcdstB, varamount) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) {if((varamount) >= 32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) Dallp1(srcdstA) = Dallp2(srcdstB) << (varamount-32); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) Dallp2(srcdstB)=0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) if ((varamount) > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) Dallp1(srcdstA) = (Dallp1(srcdstA) << (varamount)) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) (Dallp2(srcdstB) >> (32-(varamount))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) Dallp2(srcdstB) <<= varamount; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) } }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) #define Dbl_leftshiftby1_withextent(lefta,leftb,right,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) Shiftdouble(Dallp1(lefta), Dallp2(leftb), 31, Dallp1(resulta)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) Shiftdouble(Dallp2(leftb), Extall(right), 31, Dallp2(resultb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #define Dbl_rightshiftby1_withextent(leftb,right,dst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) Extall(dst) = (Dallp2(leftb) << 31) | ((unsigned int)Extall(right) >> 1) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) Extlow(right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) #define Dbl_arithrightshiftby1(srcdstA,srcdstB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) Shiftdouble(Dallp1(srcdstA),Dallp2(srcdstB),1,Dallp2(srcdstB));\
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) Dallp1(srcdstA) = (int)Dallp1(srcdstA) >> 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) /* Sign extend the sign bit with an integer destination */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) #define Dbl_signextendedsign(value) Dsignedsign(value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) #define Dbl_isone_hidden(dbl_value) (Is_dhidden(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) /* Singles and doubles may include the sign and exponent fields. The
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) * hidden bit and the hidden overflow must be included. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) #define Dbl_increment(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) if( (Dallp2(dbl_valueB) += 1) == 0 ) Dallp1(dbl_valueA) += 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #define Dbl_increment_mantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) if( (Dmantissap2(dbl_valueB) += 1) == 0 ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) Deposit_dmantissap1(dbl_valueA,dbl_valueA+1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define Dbl_decrement(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if( Dallp2(dbl_valueB) == 0 ) Dallp1(dbl_valueA) -= 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) Dallp2(dbl_valueB) -= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #define Dbl_isone_sign(dbl_value) (Is_dsign(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define Dbl_isone_hiddenoverflow(dbl_value) (Is_dhiddenoverflow(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #define Dbl_isone_lowmantissap1(dbl_valueA) (Is_dlowp1(dbl_valueA)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #define Dbl_isone_lowmantissap2(dbl_valueB) (Is_dlowp2(dbl_valueB)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define Dbl_isone_signaling(dbl_value) (Is_dsignaling(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #define Dbl_is_signalingnan(dbl_value) (Dsignalingnan(dbl_value)==0xfff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) #define Dbl_isnotzero(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (Dallp1(dbl_valueA) || Dallp2(dbl_valueB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #define Dbl_isnotzero_hiddenhigh7mantissa(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) (Dhiddenhigh7mantissa(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) #define Dbl_isnotzero_exponent(dbl_value) (Dexponent(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) #define Dbl_isnotzero_mantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) (Dmantissap1(dbl_valueA) || Dmantissap2(dbl_valueB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #define Dbl_isnotzero_mantissap1(dbl_valueA) (Dmantissap1(dbl_valueA)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) #define Dbl_isnotzero_mantissap2(dbl_valueB) (Dmantissap2(dbl_valueB)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define Dbl_isnotzero_exponentmantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) (Dexponentmantissap1(dbl_valueA) || Dmantissap2(dbl_valueB))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #define Dbl_isnotzero_low4p2(dbl_value) (Dlow4p2(dbl_value)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #define Dbl_iszero(dbl_valueA,dbl_valueB) (Dallp1(dbl_valueA)==0 && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) Dallp2(dbl_valueB)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) #define Dbl_iszero_allp1(dbl_value) (Dallp1(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) #define Dbl_iszero_allp2(dbl_value) (Dallp2(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define Dbl_iszero_hidden(dbl_value) (Is_dhidden(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define Dbl_iszero_hiddenoverflow(dbl_value) (Is_dhiddenoverflow(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define Dbl_iszero_hiddenhigh3mantissa(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) (Dhiddenhigh3mantissa(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define Dbl_iszero_hiddenhigh7mantissa(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) (Dhiddenhigh7mantissa(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define Dbl_iszero_sign(dbl_value) (Is_dsign(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define Dbl_iszero_exponent(dbl_value) (Dexponent(dbl_value)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define Dbl_iszero_mantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) (Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) #define Dbl_iszero_exponentmantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) (Dexponentmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #define Dbl_isinfinity_exponent(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) (Dexponent(dbl_value)==DBL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define Dbl_isnotinfinity_exponent(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) (Dexponent(dbl_value)!=DBL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define Dbl_isinfinity(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) (Dexponent(dbl_valueA)==DBL_INFINITY_EXPONENT && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define Dbl_isnan(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) (Dexponent(dbl_valueA)==DBL_INFINITY_EXPONENT && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) (Dmantissap1(dbl_valueA)!=0 || Dmantissap2(dbl_valueB)!=0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define Dbl_isnotnan(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) (Dexponent(dbl_valueA)!=DBL_INFINITY_EXPONENT || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) (Dmantissap1(dbl_valueA)==0 && Dmantissap2(dbl_valueB)==0))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #define Dbl_islessthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) (Dallp1(dbl_op1a) < Dallp1(dbl_op2a) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) Dallp2(dbl_op1b) < Dallp2(dbl_op2b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #define Dbl_isgreaterthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) (Dallp1(dbl_op1a) > Dallp1(dbl_op2a) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) Dallp2(dbl_op1b) > Dallp2(dbl_op2b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #define Dbl_isnotlessthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) (Dallp1(dbl_op1a) > Dallp1(dbl_op2a) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) Dallp2(dbl_op1b) >= Dallp2(dbl_op2b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #define Dbl_isnotgreaterthan(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) (Dallp1(dbl_op1a) < Dallp1(dbl_op2a) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) (Dallp1(dbl_op1a) == Dallp1(dbl_op2a) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) Dallp2(dbl_op1b) <= Dallp2(dbl_op2b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) #define Dbl_isequal(dbl_op1a,dbl_op1b,dbl_op2a,dbl_op2b) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) ((Dallp1(dbl_op1a) == Dallp1(dbl_op2a)) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) (Dallp2(dbl_op1b) == Dallp2(dbl_op2b)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) #define Dbl_leftshiftby8(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),24,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) Dallp2(dbl_valueB) <<= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) #define Dbl_leftshiftby7(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),25,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) Dallp2(dbl_valueB) <<= 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) #define Dbl_leftshiftby4(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),28,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) Dallp2(dbl_valueB) <<= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) #define Dbl_leftshiftby3(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),29,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) Dallp2(dbl_valueB) <<= 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) #define Dbl_leftshiftby2(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),30,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) Dallp2(dbl_valueB) <<= 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) #define Dbl_leftshiftby1(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),31,Dallp1(dbl_valueA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) Dallp2(dbl_valueB) <<= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) #define Dbl_rightshiftby8(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),8,Dallp2(dbl_valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) Dallp1(dbl_valueA) >>= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) #define Dbl_rightshiftby4(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),4,Dallp2(dbl_valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) Dallp1(dbl_valueA) >>= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) #define Dbl_rightshiftby2(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),2,Dallp2(dbl_valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) Dallp1(dbl_valueA) >>= 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) #define Dbl_rightshiftby1(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) Shiftdouble(Dallp1(dbl_valueA),Dallp2(dbl_valueB),1,Dallp2(dbl_valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) Dallp1(dbl_valueA) >>= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) /* This magnitude comparison uses the signless first words and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) * the regular part2 words. The comparison is graphically:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) * 1st greater? -------------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) * |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) * 1st less?-----------------+---------
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) * | |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) * 2nd greater or equal----->| |
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) * False True
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) #define Dbl_ismagnitudeless(leftB,rightB,signlessleft,signlessright) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) ((signlessleft <= signlessright) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) ( (signlessleft < signlessright) || (Dallp2(leftB)<Dallp2(rightB)) ))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) #define Dbl_copytoint_exponentmantissap1(src,dest) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) dest = Dexponentmantissap1(src)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* 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 231) * case the adjacent bit) bit set. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) #define Dbl_set_quiet(dbl_value) Deposit_dhigh2mantissa(dbl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) #define Dbl_set_exponent(dbl_value, exp) Deposit_dexponent(dbl_value,exp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) #define Dbl_set_mantissa(desta,destb,valuea,valueb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) Deposit_dmantissap1(desta,valuea); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) Dmantissap2(destb) = Dmantissap2(valueb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) #define Dbl_set_mantissap1(desta,valuea) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) Deposit_dmantissap1(desta,valuea)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) #define Dbl_set_mantissap2(destb,valueb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) Dmantissap2(destb) = Dmantissap2(valueb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) #define Dbl_set_exponentmantissa(desta,destb,valuea,valueb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) Deposit_dexponentmantissap1(desta,valuea); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) Dmantissap2(destb) = Dmantissap2(valueb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) #define Dbl_set_exponentmantissap1(dest,value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) Deposit_dexponentmantissap1(dest,value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) #define Dbl_copyfromptr(src,desta,destb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) Dallp1(desta) = src->wd0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) Dallp2(destb) = src->wd1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) #define Dbl_copytoptr(srca,srcb,dest) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) dest->wd0 = Dallp1(srca); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) dest->wd1 = Dallp2(srcb)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) /* An infinity is represented with the max exponent and a zero mantissa */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) #define Dbl_setinfinity_exponent(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) Deposit_dexponent(dbl_value,DBL_INFINITY_EXPONENT)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) #define Dbl_setinfinity_exponentmantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) Deposit_dexponentmantissap1(dbl_valueA, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH)))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) Dmantissap2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) #define Dbl_setinfinitypositive(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) Dallp1(dbl_valueA) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) = (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) Dmantissap2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) #define Dbl_setinfinitynegative(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) Dallp1(dbl_valueA) = ((unsigned int)1<<31) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) Dmantissap2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) #define Dbl_setinfinity(dbl_valueA,dbl_valueB,sign) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) Dallp1(dbl_valueA) = ((unsigned int)sign << 31) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) (DBL_INFINITY_EXPONENT << (32-(1+DBL_EXP_LENGTH))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) Dmantissap2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) #define Dbl_sethigh4bits(dbl_value, extsign) Deposit_dhigh4p1(dbl_value,extsign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #define Dbl_set_sign(dbl_value,sign) Deposit_dsign(dbl_value,sign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) #define Dbl_invert_sign(dbl_value) Deposit_dsign(dbl_value,~Dsign(dbl_value))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) #define Dbl_setone_sign(dbl_value) Deposit_dsign(dbl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) #define Dbl_setone_lowmantissap2(dbl_value) Deposit_dlowp2(dbl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #define Dbl_setzero_sign(dbl_value) Dallp1(dbl_value) &= 0x7fffffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) #define Dbl_setzero_exponent(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) Dallp1(dbl_value) &= 0x800fffff
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #define Dbl_setzero_mantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) Dallp1(dbl_valueA) &= 0xfff00000; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) Dallp2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #define Dbl_setzero_mantissap1(dbl_value) Dallp1(dbl_value) &= 0xfff00000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) #define Dbl_setzero_mantissap2(dbl_value) Dallp2(dbl_value) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) #define Dbl_setzero_exponentmantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) Dallp1(dbl_valueA) &= 0x80000000; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) Dallp2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) #define Dbl_setzero_exponentmantissap1(dbl_valueA) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) Dallp1(dbl_valueA) &= 0x80000000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) #define Dbl_setzero(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) Dallp1(dbl_valueA) = 0; Dallp2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) #define Dbl_setzerop1(dbl_value) Dallp1(dbl_value) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) #define Dbl_setzerop2(dbl_value) Dallp2(dbl_value) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) #define Dbl_setnegativezero(dbl_value) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) Dallp1(dbl_value) = (unsigned int)1 << 31; Dallp2(dbl_value) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #define Dbl_setnegativezerop1(dbl_value) Dallp1(dbl_value) = (unsigned int)1<<31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) /* Use the following macro for both overflow & underflow conditions */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) #define ovfl -
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #define unfl +
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) #define Dbl_setwrapped_exponent(dbl_value,exponent,op) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) Deposit_dexponent(dbl_value,(exponent op DBL_WRAP))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #define Dbl_setlargestpositive(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) Dallp1(dbl_valueA) = ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) Dallp2(dbl_valueB) = 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) #define Dbl_setlargestnegative(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) Dallp1(dbl_valueA) = ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) | ((unsigned int)1<<31); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) Dallp2(dbl_valueB) = 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) #define Dbl_setlargest_exponentmantissa(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) Deposit_dexponentmantissap1(dbl_valueA, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) (((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 320) | ((1<<(32-(1+DBL_EXP_LENGTH))) - 1 ))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 321) Dallp2(dbl_valueB) = 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 322)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 323) #define Dbl_setnegativeinfinity(dbl_valueA,dbl_valueB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 324) Dallp1(dbl_valueA) = ((1<<DBL_EXP_LENGTH) | DBL_INFINITY_EXPONENT) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 325) << (32-(1+DBL_EXP_LENGTH)) ; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 326) Dallp2(dbl_valueB) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 327) #define Dbl_setlargest(dbl_valueA,dbl_valueB,sign) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 328) Dallp1(dbl_valueA) = ((unsigned int)sign << 31) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 329) ((DBL_EMAX+DBL_BIAS) << (32-(1+DBL_EXP_LENGTH))) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 330) ((1 << (32-(1+DBL_EXP_LENGTH))) - 1 ); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 331) Dallp2(dbl_valueB) = 0xFFFFFFFF
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 332)
^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 Dbl_right_align(srcdstA,srcdstB,shift,extent) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 336) if( shift >= 32 ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 337) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 338) /* Big shift requires examining the portion shift off \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 339) the end to properly set inexact. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 340) if(shift < 64) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 341) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 342) if(shift > 32) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 343) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 344) Variable_shift_double(Dallp1(srcdstA),Dallp2(srcdstB), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 345) shift-32, Extall(extent)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 346) if(Dallp2(srcdstB) << 64 - (shift)) Ext_setone_low(extent); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 347) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 348) else Extall(extent) = Dallp2(srcdstB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 349) Dallp2(srcdstB) = Dallp1(srcdstA) >> (shift - 32); \
^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) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 353) Extall(extent) = Dallp1(srcdstA); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 354) if(Dallp2(srcdstB)) Ext_setone_low(extent); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 355) Dallp2(srcdstB) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 356) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 357) Dallp1(srcdstA) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 358) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 359) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 360) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 361) /* Small alignment is simpler. Extension is easily set. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 362) if (shift > 0) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 363) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 364) Extall(extent) = Dallp2(srcdstB) << 32 - (shift); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 365) Variable_shift_double(Dallp1(srcdstA),Dallp2(srcdstB),shift, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 366) Dallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 367) Dallp1(srcdstA) >>= shift; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 368) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 369) else Extall(extent) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 370) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 371)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 372) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 373) * Here we need to shift the result right to correct for an overshift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 374) * (due to the exponent becoming negative) during normalization.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 375) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 376) #define Dbl_fix_overshift(srcdstA,srcdstB,shift,extent) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 377) Extall(extent) = Dallp2(srcdstB) << 32 - (shift); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 378) Dallp2(srcdstB) = (Dallp1(srcdstA) << 32 - (shift)) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 379) (Dallp2(srcdstB) >> (shift)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 380) Dallp1(srcdstA) = Dallp1(srcdstA) >> shift
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 381)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 382) #define Dbl_hiddenhigh3mantissa(dbl_value) Dhiddenhigh3mantissa(dbl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 383) #define Dbl_hidden(dbl_value) Dhidden(dbl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 384) #define Dbl_lowmantissap2(dbl_value) Dlowp2(dbl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 385)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 386) /* The left argument is never smaller than the right argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 387) #define Dbl_subtract(lefta,leftb,righta,rightb,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 388) if( Dallp2(rightb) > Dallp2(leftb) ) Dallp1(lefta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 389) Dallp2(resultb) = Dallp2(leftb) - Dallp2(rightb); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 390) Dallp1(resulta) = Dallp1(lefta) - Dallp1(righta)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 391)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 392) /* Subtract right augmented with extension from left augmented with zeros and
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 393) * store into result and extension. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 394) #define Dbl_subtract_withextension(lefta,leftb,righta,rightb,extent,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 395) Dbl_subtract(lefta,leftb,righta,rightb,resulta,resultb); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 396) if( (Extall(extent) = 0-Extall(extent)) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 397) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 398) if((Dallp2(resultb)--) == 0) Dallp1(resulta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 399) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 400)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 401) #define Dbl_addition(lefta,leftb,righta,rightb,resulta,resultb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 402) /* If the sum of the low words is less than either source, then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 403) * an overflow into the next word occurred. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 404) Dallp1(resulta) = Dallp1(lefta) + Dallp1(righta); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 405) if((Dallp2(resultb) = Dallp2(leftb) + Dallp2(rightb)) < Dallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 406) Dallp1(resulta)++
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 407)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 408) #define Dbl_xortointp1(left,right,result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 409) result = Dallp1(left) XOR Dallp1(right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 410)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 411) #define Dbl_xorfromintp1(left,right,result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 412) Dallp1(result) = left XOR Dallp1(right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 413)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 414) #define Dbl_swap_lower(left,right) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 415) Dallp2(left) = Dallp2(left) XOR Dallp2(right); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 416) Dallp2(right) = Dallp2(left) XOR Dallp2(right); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 417) Dallp2(left) = Dallp2(left) XOR Dallp2(right)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 418)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 419) /* Need to Initialize */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 420) #define Dbl_makequietnan(desta,destb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 421) Dallp1(desta) = ((DBL_EMAX+DBL_BIAS)+1)<< (32-(1+DBL_EXP_LENGTH)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 422) | (1<<(32-(1+DBL_EXP_LENGTH+2))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 423) Dallp2(destb) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 424) #define Dbl_makesignalingnan(desta,destb) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 425) Dallp1(desta) = ((DBL_EMAX+DBL_BIAS)+1)<< (32-(1+DBL_EXP_LENGTH)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 426) | (1<<(32-(1+DBL_EXP_LENGTH+1))); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 427) Dallp2(destb) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 428)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 429) #define Dbl_normalize(dbl_opndA,dbl_opndB,exponent) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 430) while(Dbl_iszero_hiddenhigh7mantissa(dbl_opndA)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 431) Dbl_leftshiftby8(dbl_opndA,dbl_opndB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 432) exponent -= 8; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 433) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 434) if(Dbl_iszero_hiddenhigh3mantissa(dbl_opndA)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 435) Dbl_leftshiftby4(dbl_opndA,dbl_opndB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 436) exponent -= 4; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 437) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 438) while(Dbl_iszero_hidden(dbl_opndA)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 439) Dbl_leftshiftby1(dbl_opndA,dbl_opndB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 440) exponent -= 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 441) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 442)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 443) #define Twoword_add(src1dstA,src1dstB,src2A,src2B) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 444) /* \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 445) * want this macro to generate: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 446) * ADD src1dstB,src2B,src1dstB; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 447) * ADDC src1dstA,src2A,src1dstA; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 448) */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 449) if ((src1dstB) + (src2B) < (src1dstB)) Dallp1(src1dstA)++; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 450) Dallp1(src1dstA) += (src2A); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 451) Dallp2(src1dstB) += (src2B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 452)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 453) #define Twoword_subtract(src1dstA,src1dstB,src2A,src2B) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 454) /* \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 455) * want this macro to generate: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 456) * SUB src1dstB,src2B,src1dstB; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 457) * SUBB src1dstA,src2A,src1dstA; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 458) */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 459) if ((src1dstB) < (src2B)) Dallp1(src1dstA)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 460) Dallp1(src1dstA) -= (src2A); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 461) Dallp2(src1dstB) -= (src2B)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 462)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 463) #define Dbl_setoverflow(resultA,resultB) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 464) /* set result to infinity or largest number */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 465) switch (Rounding_mode()) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 466) case ROUNDPLUS: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 467) if (Dbl_isone_sign(resultA)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 468) Dbl_setlargestnegative(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 469) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 470) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 471) Dbl_setinfinitypositive(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 472) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 473) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 474) case ROUNDMINUS: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 475) if (Dbl_iszero_sign(resultA)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 476) Dbl_setlargestpositive(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 477) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 478) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 479) Dbl_setinfinitynegative(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 480) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 481) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 482) case ROUNDNEAREST: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 483) Dbl_setinfinity_exponentmantissa(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 484) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 485) case ROUNDZERO: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 486) Dbl_setlargest_exponentmantissa(resultA,resultB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 487) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 488)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 489) #define Dbl_denormalize(opndp1,opndp2,exponent,guard,sticky,inexact) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 490) Dbl_clear_signexponent_set_hidden(opndp1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 491) if (exponent >= (1-DBL_P)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 492) if (exponent >= -31) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 493) guard = (Dallp2(opndp2) >> -exponent) & 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 494) if (exponent < 0) sticky |= Dallp2(opndp2) << (32+exponent); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 495) if (exponent > -31) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 496) Variable_shift_double(opndp1,opndp2,1-exponent,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 497) Dallp1(opndp1) >>= 1-exponent; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 498) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 499) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 500) Dallp2(opndp2) = Dallp1(opndp1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 501) Dbl_setzerop1(opndp1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 502) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 503) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 504) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 505) guard = (Dallp1(opndp1) >> -32-exponent) & 1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 506) if (exponent == -32) sticky |= Dallp2(opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 507) else sticky |= (Dallp2(opndp2) | Dallp1(opndp1) << 64+exponent); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 508) Dallp2(opndp2) = Dallp1(opndp1) >> -31-exponent; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 509) Dbl_setzerop1(opndp1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 510) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 511) inexact = guard | sticky; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 512) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 513) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 514) guard = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 515) sticky |= (Dallp1(opndp1) | Dallp2(opndp2)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 516) Dbl_setzero(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 517) inexact = sticky; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 518) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 519)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 520) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 521) * The fused multiply add instructions requires a double extended format,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 522) * with 106 bits of mantissa.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 523) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 524) #define DBLEXT_THRESHOLD 106
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 525)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 526) #define Dblext_setzero(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 527) Dextallp1(valA) = 0; Dextallp2(valB) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 528) Dextallp3(valC) = 0; Dextallp4(valD) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 529)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 530)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 531) #define Dblext_isnotzero_mantissap3(valC) (Dextallp3(valC)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 532) #define Dblext_isnotzero_mantissap4(valD) (Dextallp3(valD)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 533) #define Dblext_isone_lowp2(val) (Dextlowp2(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 534) #define Dblext_isone_highp3(val) (Dexthighp3(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 535) #define Dblext_isnotzero_low31p3(val) (Dextlow31p3(val)!=0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 536) #define Dblext_iszero(valA,valB,valC,valD) (Dextallp1(valA)==0 && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 537) Dextallp2(valB)==0 && Dextallp3(valC)==0 && Dextallp4(valD)==0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 538)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 539) #define Dblext_copy(srca,srcb,srcc,srcd,desta,destb,destc,destd) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 540) Dextallp1(desta) = Dextallp4(srca); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 541) Dextallp2(destb) = Dextallp4(srcb); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 542) Dextallp3(destc) = Dextallp4(srcc); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 543) Dextallp4(destd) = Dextallp4(srcd)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 544)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 545) #define Dblext_swap_lower(leftp2,leftp3,leftp4,rightp2,rightp3,rightp4) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 546) Dextallp2(leftp2) = Dextallp2(leftp2) XOR Dextallp2(rightp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 547) Dextallp2(rightp2) = Dextallp2(leftp2) XOR Dextallp2(rightp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 548) Dextallp2(leftp2) = Dextallp2(leftp2) XOR Dextallp2(rightp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 549) Dextallp3(leftp3) = Dextallp3(leftp3) XOR Dextallp3(rightp3); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 550) Dextallp3(rightp3) = Dextallp3(leftp3) XOR Dextallp3(rightp3); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 551) Dextallp3(leftp3) = Dextallp3(leftp3) XOR Dextallp3(rightp3); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 552) Dextallp4(leftp4) = Dextallp4(leftp4) XOR Dextallp4(rightp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 553) Dextallp4(rightp4) = Dextallp4(leftp4) XOR Dextallp4(rightp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 554) Dextallp4(leftp4) = Dextallp4(leftp4) XOR Dextallp4(rightp4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 555)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 556) #define Dblext_setone_lowmantissap4(dbl_value) Deposit_dextlowp4(dbl_value,1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 557)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 558) /* The high bit is always zero so arithmetic or logical shifts will work. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 559) #define Dblext_right_align(srcdstA,srcdstB,srcdstC,srcdstD,shift) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 560) {int shiftamt, sticky; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 561) shiftamt = shift % 32; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 562) sticky = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 563) switch (shift/32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 564) case 0: if (shiftamt > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 565) sticky = Dextallp4(srcdstD) << 32 - (shiftamt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 566) Variable_shift_double(Dextallp3(srcdstC), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 567) Dextallp4(srcdstD),shiftamt,Dextallp4(srcdstD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 568) Variable_shift_double(Dextallp2(srcdstB), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 569) Dextallp3(srcdstC),shiftamt,Dextallp3(srcdstC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 570) Variable_shift_double(Dextallp1(srcdstA), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 571) Dextallp2(srcdstB),shiftamt,Dextallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 572) Dextallp1(srcdstA) >>= shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 573) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 574) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 575) case 1: if (shiftamt > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 576) sticky = (Dextallp3(srcdstC) << 31 - shiftamt) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 577) Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 578) Variable_shift_double(Dextallp2(srcdstB), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 579) Dextallp3(srcdstC),shiftamt,Dextallp4(srcdstD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 580) Variable_shift_double(Dextallp1(srcdstA), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 581) Dextallp2(srcdstB),shiftamt,Dextallp3(srcdstC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 582) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 583) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 584) sticky = Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 585) Dextallp4(srcdstD) = Dextallp3(srcdstC); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 586) Dextallp3(srcdstC) = Dextallp2(srcdstB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 587) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 588) Dextallp2(srcdstB) = Dextallp1(srcdstA) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 589) Dextallp1(srcdstA) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 590) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 591) case 2: if (shiftamt > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 592) sticky = (Dextallp2(srcdstB) << 31 - shiftamt) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 593) Dextallp3(srcdstC) | Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 594) Variable_shift_double(Dextallp1(srcdstA), \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 595) Dextallp2(srcdstB),shiftamt,Dextallp4(srcdstD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 596) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 597) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 598) sticky = Dextallp3(srcdstC) | Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 599) Dextallp4(srcdstD) = Dextallp2(srcdstB); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 600) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 601) Dextallp3(srcdstC) = Dextallp1(srcdstA) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 602) Dextallp1(srcdstA) = Dextallp2(srcdstB) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 603) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 604) case 3: if (shiftamt > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 605) sticky = (Dextallp1(srcdstA) << 31 - shiftamt) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 606) Dextallp2(srcdstB) | Dextallp3(srcdstC) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 607) Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 608) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 609) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 610) sticky = Dextallp2(srcdstB) | Dextallp3(srcdstC) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 611) Dextallp4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 612) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 613) Dextallp4(srcdstD) = Dextallp1(srcdstA) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 614) Dextallp1(srcdstA) = Dextallp2(srcdstB) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 615) Dextallp3(srcdstC) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 616) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 617) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 618) if (sticky) Dblext_setone_lowmantissap4(srcdstD); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 619) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 620)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 621) /* The left argument is never smaller than the right argument */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 622) #define Dblext_subtract(lefta,leftb,leftc,leftd,righta,rightb,rightc,rightd,resulta,resultb,resultc,resultd) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 623) if( Dextallp4(rightd) > Dextallp4(leftd) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 624) if( (Dextallp3(leftc)--) == 0) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 625) if( (Dextallp2(leftb)--) == 0) Dextallp1(lefta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 626) Dextallp4(resultd) = Dextallp4(leftd) - Dextallp4(rightd); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 627) if( Dextallp3(rightc) > Dextallp3(leftc) ) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 628) if( (Dextallp2(leftb)--) == 0) Dextallp1(lefta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 629) Dextallp3(resultc) = Dextallp3(leftc) - Dextallp3(rightc); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 630) if( Dextallp2(rightb) > Dextallp2(leftb) ) Dextallp1(lefta)--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 631) Dextallp2(resultb) = Dextallp2(leftb) - Dextallp2(rightb); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 632) Dextallp1(resulta) = Dextallp1(lefta) - Dextallp1(righta)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 633)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 634) #define Dblext_addition(lefta,leftb,leftc,leftd,righta,rightb,rightc,rightd,resulta,resultb,resultc,resultd) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 635) /* If the sum of the low words is less than either source, then \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 636) * an overflow into the next word occurred. */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 637) if ((Dextallp4(resultd) = Dextallp4(leftd)+Dextallp4(rightd)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 638) Dextallp4(rightd)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 639) if((Dextallp3(resultc) = Dextallp3(leftc)+Dextallp3(rightc)+1) <= \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 640) Dextallp3(rightc)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 641) if((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)+1) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 642) <= Dextallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 643) Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 644) else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 645) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 646) if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 647) Dextallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 648) Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 649) else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 650) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 651) if ((Dextallp3(resultc) = Dextallp3(leftc)+Dextallp3(rightc)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 652) Dextallp3(rightc)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 653) if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)+1) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 654) <= Dextallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 655) Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 656) else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 657) else \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 658) if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 659) Dextallp2(rightb)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 660) Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 661) else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 662)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 663)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 664) #define Dblext_arithrightshiftby1(srcdstA,srcdstB,srcdstC,srcdstD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 665) Shiftdouble(Dextallp3(srcdstC),Dextallp4(srcdstD),1,Dextallp4(srcdstD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 666) Shiftdouble(Dextallp2(srcdstB),Dextallp3(srcdstC),1,Dextallp3(srcdstC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 667) Shiftdouble(Dextallp1(srcdstA),Dextallp2(srcdstB),1,Dextallp2(srcdstB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 668) Dextallp1(srcdstA) = (int)Dextallp1(srcdstA) >> 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 669)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 670) #define Dblext_leftshiftby8(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 671) Shiftdouble(Dextallp1(valA),Dextallp2(valB),24,Dextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 672) Shiftdouble(Dextallp2(valB),Dextallp3(valC),24,Dextallp2(valB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 673) Shiftdouble(Dextallp3(valC),Dextallp4(valD),24,Dextallp3(valC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 674) Dextallp4(valD) <<= 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 675) #define Dblext_leftshiftby4(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 676) Shiftdouble(Dextallp1(valA),Dextallp2(valB),28,Dextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 677) Shiftdouble(Dextallp2(valB),Dextallp3(valC),28,Dextallp2(valB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 678) Shiftdouble(Dextallp3(valC),Dextallp4(valD),28,Dextallp3(valC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 679) Dextallp4(valD) <<= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 680) #define Dblext_leftshiftby3(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 681) Shiftdouble(Dextallp1(valA),Dextallp2(valB),29,Dextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 682) Shiftdouble(Dextallp2(valB),Dextallp3(valC),29,Dextallp2(valB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 683) Shiftdouble(Dextallp3(valC),Dextallp4(valD),29,Dextallp3(valC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 684) Dextallp4(valD) <<= 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 685) #define Dblext_leftshiftby2(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 686) Shiftdouble(Dextallp1(valA),Dextallp2(valB),30,Dextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 687) Shiftdouble(Dextallp2(valB),Dextallp3(valC),30,Dextallp2(valB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 688) Shiftdouble(Dextallp3(valC),Dextallp4(valD),30,Dextallp3(valC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 689) Dextallp4(valD) <<= 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 690) #define Dblext_leftshiftby1(valA,valB,valC,valD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 691) Shiftdouble(Dextallp1(valA),Dextallp2(valB),31,Dextallp1(valA)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 692) Shiftdouble(Dextallp2(valB),Dextallp3(valC),31,Dextallp2(valB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 693) Shiftdouble(Dextallp3(valC),Dextallp4(valD),31,Dextallp3(valC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 694) Dextallp4(valD) <<= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 695)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 696) #define Dblext_rightshiftby4(valueA,valueB,valueC,valueD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 697) Shiftdouble(Dextallp3(valueC),Dextallp4(valueD),4,Dextallp4(valueD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 698) Shiftdouble(Dextallp2(valueB),Dextallp3(valueC),4,Dextallp3(valueC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 699) Shiftdouble(Dextallp1(valueA),Dextallp2(valueB),4,Dextallp2(valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 700) Dextallp1(valueA) >>= 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 701) #define Dblext_rightshiftby1(valueA,valueB,valueC,valueD) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 702) Shiftdouble(Dextallp3(valueC),Dextallp4(valueD),1,Dextallp4(valueD)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 703) Shiftdouble(Dextallp2(valueB),Dextallp3(valueC),1,Dextallp3(valueC)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 704) Shiftdouble(Dextallp1(valueA),Dextallp2(valueB),1,Dextallp2(valueB)); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 705) Dextallp1(valueA) >>= 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 706)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 707) #define Dblext_xortointp1(left,right,result) Dbl_xortointp1(left,right,result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 708)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 709) #define Dblext_xorfromintp1(left,right,result) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 710) Dbl_xorfromintp1(left,right,result)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 711)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 712) #define Dblext_copytoint_exponentmantissap1(src,dest) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 713) Dbl_copytoint_exponentmantissap1(src,dest)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 714)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 715) #define Dblext_ismagnitudeless(leftB,rightB,signlessleft,signlessright) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 716) Dbl_ismagnitudeless(leftB,rightB,signlessleft,signlessright)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 717)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 718) #define Dbl_copyto_dblext(src1,src2,dest1,dest2,dest3,dest4) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 719) Dextallp1(dest1) = Dallp1(src1); Dextallp2(dest2) = Dallp2(src2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 720) Dextallp3(dest3) = 0; Dextallp4(dest4) = 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 721)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 722) #define Dblext_set_sign(dbl_value,sign) Dbl_set_sign(dbl_value,sign)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 723) #define Dblext_clear_signexponent_set_hidden(srcdst) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 724) Dbl_clear_signexponent_set_hidden(srcdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 725) #define Dblext_clear_signexponent(srcdst) Dbl_clear_signexponent(srcdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 726) #define Dblext_clear_sign(srcdst) Dbl_clear_sign(srcdst)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 727) #define Dblext_isone_hidden(dbl_value) Dbl_isone_hidden(dbl_value)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 728)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 729) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 730) * The Fourword_add() macro assumes that integers are 4 bytes in size.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 731) * It will break if this is not the case.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 732) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 733)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 734) #define Fourword_add(src1dstA,src1dstB,src1dstC,src1dstD,src2A,src2B,src2C,src2D) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 735) /* \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 736) * want this macro to generate: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 737) * ADD src1dstD,src2D,src1dstD; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 738) * ADDC src1dstC,src2C,src1dstC; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 739) * ADDC src1dstB,src2B,src1dstB; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 740) * ADDC src1dstA,src2A,src1dstA; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 741) */ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 742) if ((unsigned int)(src1dstD += (src2D)) < (unsigned int)(src2D)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 743) if ((unsigned int)(src1dstC += (src2C) + 1) <= \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 744) (unsigned int)(src2C)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 745) if ((unsigned int)(src1dstB += (src2B) + 1) <= \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 746) (unsigned int)(src2B)) src1dstA++; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 747) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 748) else if ((unsigned int)(src1dstB += (src2B)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 749) (unsigned int)(src2B)) src1dstA++; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 750) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 751) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 752) if ((unsigned int)(src1dstC += (src2C)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 753) (unsigned int)(src2C)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 754) if ((unsigned int)(src1dstB += (src2B) + 1) <= \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 755) (unsigned int)(src2B)) src1dstA++; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 756) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 757) else if ((unsigned int)(src1dstB += (src2B)) < \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 758) (unsigned int)(src2B)) src1dstA++; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 759) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 760) src1dstA += (src2A)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 761)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 762) #define Dblext_denormalize(opndp1,opndp2,opndp3,opndp4,exponent,is_tiny) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 763) {int shiftamt, sticky; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 764) is_tiny = TRUE; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 765) if (exponent == 0 && (Dextallp3(opndp3) || Dextallp4(opndp4))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 766) switch (Rounding_mode()) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 767) case ROUNDPLUS: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 768) if (Dbl_iszero_sign(opndp1)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 769) Dbl_increment(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 770) if (Dbl_isone_hiddenoverflow(opndp1)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 771) is_tiny = FALSE; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 772) Dbl_decrement(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 773) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 774) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 775) case ROUNDMINUS: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 776) if (Dbl_isone_sign(opndp1)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 777) Dbl_increment(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 778) if (Dbl_isone_hiddenoverflow(opndp1)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 779) is_tiny = FALSE; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 780) Dbl_decrement(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 781) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 782) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 783) case ROUNDNEAREST: \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 784) if (Dblext_isone_highp3(opndp3) && \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 785) (Dblext_isone_lowp2(opndp2) || \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 786) Dblext_isnotzero_low31p3(opndp3))) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 787) Dbl_increment(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 788) if (Dbl_isone_hiddenoverflow(opndp1)) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 789) is_tiny = FALSE; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 790) Dbl_decrement(opndp1,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 791) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 792) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 793) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 794) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 795) Dblext_clear_signexponent_set_hidden(opndp1); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 796) if (exponent >= (1-QUAD_P)) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 797) shiftamt = (1-exponent) % 32; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 798) switch((1-exponent)/32) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 799) case 0: sticky = Dextallp4(opndp4) << 32-(shiftamt); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 800) Variableshiftdouble(opndp3,opndp4,shiftamt,opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 801) Variableshiftdouble(opndp2,opndp3,shiftamt,opndp3); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 802) Variableshiftdouble(opndp1,opndp2,shiftamt,opndp2); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 803) Dextallp1(opndp1) >>= shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 804) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 805) case 1: sticky = (Dextallp3(opndp3) << 32-(shiftamt)) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 806) Dextallp4(opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 807) Variableshiftdouble(opndp2,opndp3,shiftamt,opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 808) Variableshiftdouble(opndp1,opndp2,shiftamt,opndp3); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 809) Dextallp2(opndp2) = Dextallp1(opndp1) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 810) Dextallp1(opndp1) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 811) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 812) case 2: sticky = (Dextallp2(opndp2) << 32-(shiftamt)) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 813) Dextallp3(opndp3) | Dextallp4(opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 814) Variableshiftdouble(opndp1,opndp2,shiftamt,opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 815) Dextallp3(opndp3) = Dextallp1(opndp1) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 816) Dextallp1(opndp1) = Dextallp2(opndp2) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 817) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 818) case 3: sticky = (Dextallp1(opndp1) << 32-(shiftamt)) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 819) Dextallp2(opndp2) | Dextallp3(opndp3) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 820) Dextallp4(opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 821) Dextallp4(opndp4) = Dextallp1(opndp1) >> shiftamt; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 822) Dextallp1(opndp1) = Dextallp2(opndp2) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 823) Dextallp3(opndp3) = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 824) break; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 825) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 826) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 827) else { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 828) sticky = Dextallp1(opndp1) | Dextallp2(opndp2) | \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 829) Dextallp3(opndp3) | Dextallp4(opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 830) Dblext_setzero(opndp1,opndp2,opndp3,opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 831) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 832) if (sticky) Dblext_setone_lowmantissap4(opndp4); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 833) exponent = 0; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 834) }