📄 dbl_float.h
字号:
Dextallp4(leftp4) = Dextallp4(leftp4) XOR Dextallp4(rightp4)#define Dblext_setone_lowmantissap4(dbl_value) Deposit_dextlowp4(dbl_value,1)/* The high bit is always zero so arithmetic or logical shifts will work. */#define Dblext_right_align(srcdstA,srcdstB,srcdstC,srcdstD,shift) \ {int shiftamt, sticky; \ shiftamt = shift % 32; \ sticky = 0; \ switch (shift/32) { \ case 0: if (shiftamt > 0) { \ sticky = Dextallp4(srcdstD) << 32 - (shiftamt); \ Variable_shift_double(Dextallp3(srcdstC), \ Dextallp4(srcdstD),shiftamt,Dextallp4(srcdstD)); \ Variable_shift_double(Dextallp2(srcdstB), \ Dextallp3(srcdstC),shiftamt,Dextallp3(srcdstC)); \ Variable_shift_double(Dextallp1(srcdstA), \ Dextallp2(srcdstB),shiftamt,Dextallp2(srcdstB)); \ Dextallp1(srcdstA) >>= shiftamt; \ } \ break; \ case 1: if (shiftamt > 0) { \ sticky = (Dextallp3(srcdstC) << 31 - shiftamt) | \ Dextallp4(srcdstD); \ Variable_shift_double(Dextallp2(srcdstB), \ Dextallp3(srcdstC),shiftamt,Dextallp4(srcdstD)); \ Variable_shift_double(Dextallp1(srcdstA), \ Dextallp2(srcdstB),shiftamt,Dextallp3(srcdstC)); \ } \ else { \ sticky = Dextallp4(srcdstD); \ Dextallp4(srcdstD) = Dextallp3(srcdstC); \ Dextallp3(srcdstC) = Dextallp2(srcdstB); \ } \ Dextallp2(srcdstB) = Dextallp1(srcdstA) >> shiftamt; \ Dextallp1(srcdstA) = 0; \ break; \ case 2: if (shiftamt > 0) { \ sticky = (Dextallp2(srcdstB) << 31 - shiftamt) | \ Dextallp3(srcdstC) | Dextallp4(srcdstD); \ Variable_shift_double(Dextallp1(srcdstA), \ Dextallp2(srcdstB),shiftamt,Dextallp4(srcdstD)); \ } \ else { \ sticky = Dextallp3(srcdstC) | Dextallp4(srcdstD); \ Dextallp4(srcdstD) = Dextallp2(srcdstB); \ } \ Dextallp3(srcdstC) = Dextallp1(srcdstA) >> shiftamt; \ Dextallp1(srcdstA) = Dextallp2(srcdstB) = 0; \ break; \ case 3: if (shiftamt > 0) { \ sticky = (Dextallp1(srcdstA) << 31 - shiftamt) | \ Dextallp2(srcdstB) | Dextallp3(srcdstC) | \ Dextallp4(srcdstD); \ } \ else { \ sticky = Dextallp2(srcdstB) | Dextallp3(srcdstC) | \ Dextallp4(srcdstD); \ } \ Dextallp4(srcdstD) = Dextallp1(srcdstA) >> shiftamt; \ Dextallp1(srcdstA) = Dextallp2(srcdstB) = 0; \ Dextallp3(srcdstC) = 0; \ break; \ } \ if (sticky) Dblext_setone_lowmantissap4(srcdstD); \ }/* The left argument is never smaller than the right argument */#define Dblext_subtract(lefta,leftb,leftc,leftd,righta,rightb,rightc,rightd,resulta,resultb,resultc,resultd) \ if( Dextallp4(rightd) > Dextallp4(leftd) ) \ if( (Dextallp3(leftc)--) == 0) \ if( (Dextallp2(leftb)--) == 0) Dextallp1(lefta)--; \ Dextallp4(resultd) = Dextallp4(leftd) - Dextallp4(rightd); \ if( Dextallp3(rightc) > Dextallp3(leftc) ) \ if( (Dextallp2(leftb)--) == 0) Dextallp1(lefta)--; \ Dextallp3(resultc) = Dextallp3(leftc) - Dextallp3(rightc); \ if( Dextallp2(rightb) > Dextallp2(leftb) ) Dextallp1(lefta)--; \ Dextallp2(resultb) = Dextallp2(leftb) - Dextallp2(rightb); \ Dextallp1(resulta) = Dextallp1(lefta) - Dextallp1(righta)#define Dblext_addition(lefta,leftb,leftc,leftd,righta,rightb,rightc,rightd,resulta,resultb,resultc,resultd) \ /* If the sum of the low words is less than either source, then \ * an overflow into the next word occurred. */ \ if ((Dextallp4(resultd) = Dextallp4(leftd)+Dextallp4(rightd)) < \ Dextallp4(rightd)) \ if((Dextallp3(resultc) = Dextallp3(leftc)+Dextallp3(rightc)+1) <= \ Dextallp3(rightc)) \ if((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)+1) \ <= Dextallp2(rightb)) \ Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \ else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \ else \ if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)) < \ Dextallp2(rightb)) \ Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \ else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \ else \ if ((Dextallp3(resultc) = Dextallp3(leftc)+Dextallp3(rightc)) < \ Dextallp3(rightc)) \ if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)+1) \ <= Dextallp2(rightb)) \ Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \ else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta); \ else \ if ((Dextallp2(resultb) = Dextallp2(leftb)+Dextallp2(rightb)) < \ Dextallp2(rightb)) \ Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)+1; \ else Dextallp1(resulta) = Dextallp1(lefta)+Dextallp1(righta)#define Dblext_arithrightshiftby1(srcdstA,srcdstB,srcdstC,srcdstD) \ Shiftdouble(Dextallp3(srcdstC),Dextallp4(srcdstD),1,Dextallp4(srcdstD)); \ Shiftdouble(Dextallp2(srcdstB),Dextallp3(srcdstC),1,Dextallp3(srcdstC)); \ Shiftdouble(Dextallp1(srcdstA),Dextallp2(srcdstB),1,Dextallp2(srcdstB)); \ Dextallp1(srcdstA) = (int)Dextallp1(srcdstA) >> 1 #define Dblext_leftshiftby8(valA,valB,valC,valD) \ Shiftdouble(Dextallp1(valA),Dextallp2(valB),24,Dextallp1(valA)); \ Shiftdouble(Dextallp2(valB),Dextallp3(valC),24,Dextallp2(valB)); \ Shiftdouble(Dextallp3(valC),Dextallp4(valD),24,Dextallp3(valC)); \ Dextallp4(valD) <<= 8#define Dblext_leftshiftby4(valA,valB,valC,valD) \ Shiftdouble(Dextallp1(valA),Dextallp2(valB),28,Dextallp1(valA)); \ Shiftdouble(Dextallp2(valB),Dextallp3(valC),28,Dextallp2(valB)); \ Shiftdouble(Dextallp3(valC),Dextallp4(valD),28,Dextallp3(valC)); \ Dextallp4(valD) <<= 4#define Dblext_leftshiftby3(valA,valB,valC,valD) \ Shiftdouble(Dextallp1(valA),Dextallp2(valB),29,Dextallp1(valA)); \ Shiftdouble(Dextallp2(valB),Dextallp3(valC),29,Dextallp2(valB)); \ Shiftdouble(Dextallp3(valC),Dextallp4(valD),29,Dextallp3(valC)); \ Dextallp4(valD) <<= 3#define Dblext_leftshiftby2(valA,valB,valC,valD) \ Shiftdouble(Dextallp1(valA),Dextallp2(valB),30,Dextallp1(valA)); \ Shiftdouble(Dextallp2(valB),Dextallp3(valC),30,Dextallp2(valB)); \ Shiftdouble(Dextallp3(valC),Dextallp4(valD),30,Dextallp3(valC)); \ Dextallp4(valD) <<= 2#define Dblext_leftshiftby1(valA,valB,valC,valD) \ Shiftdouble(Dextallp1(valA),Dextallp2(valB),31,Dextallp1(valA)); \ Shiftdouble(Dextallp2(valB),Dextallp3(valC),31,Dextallp2(valB)); \ Shiftdouble(Dextallp3(valC),Dextallp4(valD),31,Dextallp3(valC)); \ Dextallp4(valD) <<= 1#define Dblext_rightshiftby4(valueA,valueB,valueC,valueD) \ Shiftdouble(Dextallp3(valueC),Dextallp4(valueD),4,Dextallp4(valueD)); \ Shiftdouble(Dextallp2(valueB),Dextallp3(valueC),4,Dextallp3(valueC)); \ Shiftdouble(Dextallp1(valueA),Dextallp2(valueB),4,Dextallp2(valueB)); \ Dextallp1(valueA) >>= 4#define Dblext_rightshiftby1(valueA,valueB,valueC,valueD) \ Shiftdouble(Dextallp3(valueC),Dextallp4(valueD),1,Dextallp4(valueD)); \ Shiftdouble(Dextallp2(valueB),Dextallp3(valueC),1,Dextallp3(valueC)); \ Shiftdouble(Dextallp1(valueA),Dextallp2(valueB),1,Dextallp2(valueB)); \ Dextallp1(valueA) >>= 1#define Dblext_xortointp1(left,right,result) Dbl_xortointp1(left,right,result)#define Dblext_xorfromintp1(left,right,result) \ Dbl_xorfromintp1(left,right,result)#define Dblext_copytoint_exponentmantissap1(src,dest) \ Dbl_copytoint_exponentmantissap1(src,dest)#define Dblext_ismagnitudeless(leftB,rightB,signlessleft,signlessright) \ Dbl_ismagnitudeless(leftB,rightB,signlessleft,signlessright)#define Dbl_copyto_dblext(src1,src2,dest1,dest2,dest3,dest4) \ Dextallp1(dest1) = Dallp1(src1); Dextallp2(dest2) = Dallp2(src2); \ Dextallp3(dest3) = 0; Dextallp4(dest4) = 0#define Dblext_set_sign(dbl_value,sign) Dbl_set_sign(dbl_value,sign) #define Dblext_clear_signexponent_set_hidden(srcdst) \ Dbl_clear_signexponent_set_hidden(srcdst) #define Dblext_clear_signexponent(srcdst) Dbl_clear_signexponent(srcdst) #define Dblext_clear_sign(srcdst) Dbl_clear_sign(srcdst) #define Dblext_isone_hidden(dbl_value) Dbl_isone_hidden(dbl_value) /* * The Fourword_add() macro assumes that integers are 4 bytes in size. * It will break if this is not the case. */#define Fourword_add(src1dstA,src1dstB,src1dstC,src1dstD,src2A,src2B,src2C,src2D) \ /* \ * want this macro to generate: \ * ADD src1dstD,src2D,src1dstD; \ * ADDC src1dstC,src2C,src1dstC; \ * ADDC src1dstB,src2B,src1dstB; \ * ADDC src1dstA,src2A,src1dstA; \ */ \ if ((unsigned int)(src1dstD += (src2D)) < (unsigned int)(src2D)) { \ if ((unsigned int)(src1dstC += (src2C) + 1) <= \ (unsigned int)(src2C)) { \ if ((unsigned int)(src1dstB += (src2B) + 1) <= \ (unsigned int)(src2B)) src1dstA++; \ } \ else if ((unsigned int)(src1dstB += (src2B)) < \ (unsigned int)(src2B)) src1dstA++; \ } \ else { \ if ((unsigned int)(src1dstC += (src2C)) < \ (unsigned int)(src2C)) { \ if ((unsigned int)(src1dstB += (src2B) + 1) <= \ (unsigned int)(src2B)) src1dstA++; \ } \ else if ((unsigned int)(src1dstB += (src2B)) < \ (unsigned int)(src2B)) src1dstA++; \ } \ src1dstA += (src2A)#define Dblext_denormalize(opndp1,opndp2,opndp3,opndp4,exponent,is_tiny) \ {int shiftamt, sticky; \ is_tiny = TRUE; \ if (exponent == 0 && (Dextallp3(opndp3) || Dextallp4(opndp4))) { \ switch (Rounding_mode()) { \ case ROUNDPLUS: \ if (Dbl_iszero_sign(opndp1)) { \ Dbl_increment(opndp1,opndp2); \ if (Dbl_isone_hiddenoverflow(opndp1)) \ is_tiny = FALSE; \ Dbl_decrement(opndp1,opndp2); \ } \ break; \ case ROUNDMINUS: \ if (Dbl_isone_sign(opndp1)) { \ Dbl_increment(opndp1,opndp2); \ if (Dbl_isone_hiddenoverflow(opndp1)) \ is_tiny = FALSE; \ Dbl_decrement(opndp1,opndp2); \ } \ break; \ case ROUNDNEAREST: \ if (Dblext_isone_highp3(opndp3) && \ (Dblext_isone_lowp2(opndp2) || \ Dblext_isnotzero_low31p3(opndp3))) { \ Dbl_increment(opndp1,opndp2); \ if (Dbl_isone_hiddenoverflow(opndp1)) \ is_tiny = FALSE; \ Dbl_decrement(opndp1,opndp2); \ } \ break; \ } \ } \ Dblext_clear_signexponent_set_hidden(opndp1); \ if (exponent >= (1-QUAD_P)) { \ shiftamt = (1-exponent) % 32; \ switch((1-exponent)/32) { \ case 0: sticky = Dextallp4(opndp4) << 32-(shiftamt); \ Variableshiftdouble(opndp3,opndp4,shiftamt,opndp4); \ Variableshiftdouble(opndp2,opndp3,shiftamt,opndp3); \ Variableshiftdouble(opndp1,opndp2,shiftamt,opndp2); \ Dextallp1(opndp1) >>= shiftamt; \ break; \ case 1: sticky = (Dextallp3(opndp3) << 32-(shiftamt)) | \ Dextallp4(opndp4); \ Variableshiftdouble(opndp2,opndp3,shiftamt,opndp4); \ Variableshiftdouble(opndp1,opndp2,shiftamt,opndp3); \ Dextallp2(opndp2) = Dextallp1(opndp1) >> shiftamt; \ Dextallp1(opndp1) = 0; \ break; \ case 2: sticky = (Dextallp2(opndp2) << 32-(shiftamt)) | \ Dextallp3(opndp3) | Dextallp4(opndp4); \ Variableshiftdouble(opndp1,opndp2,shiftamt,opndp4); \ Dextallp3(opndp3) = Dextallp1(opndp1) >> shiftamt; \ Dextallp1(opndp1) = Dextallp2(opndp2) = 0; \ break; \ case 3: sticky = (Dextallp1(opndp1) << 32-(shiftamt)) | \ Dextallp2(opndp2) | Dextallp3(opndp3) | \ Dextallp4(opndp4); \ Dextallp4(opndp4) = Dextallp1(opndp1) >> shiftamt; \ Dextallp1(opndp1) = Dextallp2(opndp2) = 0; \ Dextallp3(opndp3) = 0; \ break; \ } \ } \ else { \ sticky = Dextallp1(opndp1) | Dextallp2(opndp2) | \ Dextallp3(opndp3) | Dextallp4(opndp4); \ Dblext_setzero(opndp1,opndp2,opndp3,opndp4); \ } \ if (sticky) Dblext_setone_lowmantissap4(opndp4); \ exponent = 0; \ }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -