diff options
Diffstat (limited to 'libgcc/soft-fp/op-2.h')
-rw-r--r-- | libgcc/soft-fp/op-2.h | 402 |
1 files changed, 223 insertions, 179 deletions
diff --git a/libgcc/soft-fp/op-2.h b/libgcc/soft-fp/op-2.h index 160990fe4e8..50028f72d29 100644 --- a/libgcc/soft-fp/op-2.h +++ b/libgcc/soft-fp/op-2.h @@ -122,16 +122,16 @@ do \ { \ if (X##_f1) \ - __FP_CLZ (R, X##_f1); \ + __FP_CLZ ((R), X##_f1); \ else \ { \ - __FP_CLZ (R, X##_f0); \ - R += _FP_W_TYPE_SIZE; \ + __FP_CLZ ((R), X##_f0); \ + (R) += _FP_W_TYPE_SIZE; \ } \ } \ while (0) -/* Predicates */ +/* Predicates. */ #define _FP_FRAC_NEGP_2(X) ((_FP_WS_TYPE) X##_f1 < 0) #define _FP_FRAC_ZEROP_2(X) ((X##_f1 | X##_f0) == 0) #define _FP_FRAC_OVERP_2(fs, X) (_FP_FRAC_HIGH_##fs (X) & _FP_OVERFLOW_##fs) @@ -148,9 +148,7 @@ #define _FP_MINFRAC_2 0, 1 #define _FP_MAXFRAC_2 (~(_FP_WS_TYPE) 0), (~(_FP_WS_TYPE) 0) -/* - * Internals - */ +/* Internals. */ #define __FP_FRAC_SET_2(X, I1, I0) (X##_f0 = I0, X##_f1 = I1) @@ -158,11 +156,11 @@ do \ { \ if (xh) \ - __FP_CLZ (R, xh); \ + __FP_CLZ ((R), xh); \ else \ { \ - __FP_CLZ (R, xl); \ - R += _FP_W_TYPE_SIZE; \ + __FP_CLZ ((R), xl); \ + (R) += _FP_W_TYPE_SIZE; \ } \ } \ while (0) @@ -182,12 +180,12 @@ (rh = xh - yh - ((rl = xl - yl) > xl)) # endif # ifndef __FP_FRAC_DEC_2 -# define __FP_FRAC_DEC_2(xh, xl, yh, yl) \ - do \ - { \ - UWtype _t = xl; \ - xh -= yh + ((xl -= yl) > _t); \ - } \ +# define __FP_FRAC_DEC_2(xh, xl, yh, yl) \ + do \ + { \ + UWtype __FP_FRAC_DEC_2_t = xl; \ + xh -= yh + ((xl -= yl) > __FP_FRAC_DEC_2_t); \ + } \ while (0) # endif @@ -205,91 +203,95 @@ #endif -/* - * Unpack the raw bits of a native fp value. Do not classify or - * normalize the data. - */ +/* Unpack the raw bits of a native fp value. Do not classify or + normalize the data. */ -#define _FP_UNPACK_RAW_2(fs, X, val) \ - do \ - { \ - union _FP_UNION_##fs _flo; \ - _flo.flt = (val); \ - \ - X##_f0 = _flo.bits.frac0; \ - X##_f1 = _flo.bits.frac1; \ - X##_e = _flo.bits.exp; \ - X##_s = _flo.bits.sign; \ - } \ +#define _FP_UNPACK_RAW_2(fs, X, val) \ + do \ + { \ + union _FP_UNION_##fs _FP_UNPACK_RAW_2_flo; \ + _FP_UNPACK_RAW_2_flo.flt = (val); \ + \ + X##_f0 = _FP_UNPACK_RAW_2_flo.bits.frac0; \ + X##_f1 = _FP_UNPACK_RAW_2_flo.bits.frac1; \ + X##_e = _FP_UNPACK_RAW_2_flo.bits.exp; \ + X##_s = _FP_UNPACK_RAW_2_flo.bits.sign; \ + } \ while (0) -#define _FP_UNPACK_RAW_2_P(fs, X, val) \ - do \ - { \ - union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val); \ - \ - X##_f0 = _flo->bits.frac0; \ - X##_f1 = _flo->bits.frac1; \ - X##_e = _flo->bits.exp; \ - X##_s = _flo->bits.sign; \ - } \ +#define _FP_UNPACK_RAW_2_P(fs, X, val) \ + do \ + { \ + union _FP_UNION_##fs *_FP_UNPACK_RAW_2_P_flo \ + = (union _FP_UNION_##fs *) (val); \ + \ + X##_f0 = _FP_UNPACK_RAW_2_P_flo->bits.frac0; \ + X##_f1 = _FP_UNPACK_RAW_2_P_flo->bits.frac1; \ + X##_e = _FP_UNPACK_RAW_2_P_flo->bits.exp; \ + X##_s = _FP_UNPACK_RAW_2_P_flo->bits.sign; \ + } \ while (0) -/* - * Repack the raw bits of a native fp value. - */ +/* Repack the raw bits of a native fp value. */ #define _FP_PACK_RAW_2(fs, val, X) \ do \ { \ - union _FP_UNION_##fs _flo; \ + union _FP_UNION_##fs _FP_PACK_RAW_2_flo; \ \ - _flo.bits.frac0 = X##_f0; \ - _flo.bits.frac1 = X##_f1; \ - _flo.bits.exp = X##_e; \ - _flo.bits.sign = X##_s; \ + _FP_PACK_RAW_2_flo.bits.frac0 = X##_f0; \ + _FP_PACK_RAW_2_flo.bits.frac1 = X##_f1; \ + _FP_PACK_RAW_2_flo.bits.exp = X##_e; \ + _FP_PACK_RAW_2_flo.bits.sign = X##_s; \ \ - (val) = _flo.flt; \ + (val) = _FP_PACK_RAW_2_flo.flt; \ } \ while (0) -#define _FP_PACK_RAW_2_P(fs, val, X) \ - do \ - { \ - union _FP_UNION_##fs *_flo = (union _FP_UNION_##fs *) (val); \ - \ - _flo->bits.frac0 = X##_f0; \ - _flo->bits.frac1 = X##_f1; \ - _flo->bits.exp = X##_e; \ - _flo->bits.sign = X##_s; \ - } \ +#define _FP_PACK_RAW_2_P(fs, val, X) \ + do \ + { \ + union _FP_UNION_##fs *_FP_PACK_RAW_2_P_flo \ + = (union _FP_UNION_##fs *) (val); \ + \ + _FP_PACK_RAW_2_P_flo->bits.frac0 = X##_f0; \ + _FP_PACK_RAW_2_P_flo->bits.frac1 = X##_f1; \ + _FP_PACK_RAW_2_P_flo->bits.exp = X##_e; \ + _FP_PACK_RAW_2_P_flo->bits.sign = X##_s; \ + } \ while (0) -/* - * Multiplication algorithms: - */ +/* Multiplication algorithms: */ /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ #define _FP_MUL_MEAT_DW_2_wide(wfracbits, R, X, Y, doit) \ do \ { \ - _FP_FRAC_DECL_2 (_b); \ - _FP_FRAC_DECL_2 (_c); \ + _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_b); \ + _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_c); \ \ - doit (_FP_FRAC_WORD_4 (R, 1), _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0); \ - doit (_b_f1, _b_f0, X##_f0, Y##_f1); \ - doit (_c_f1, _c_f0, X##_f1, Y##_f0); \ - doit (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), X##_f1, Y##_f1); \ + doit (_FP_FRAC_WORD_4 (R, 1), _FP_FRAC_WORD_4 (R, 0), \ + X##_f0, Y##_f0); \ + doit (_FP_MUL_MEAT_DW_2_wide_b_f1, _FP_MUL_MEAT_DW_2_wide_b_f0, \ + X##_f0, Y##_f1); \ + doit (_FP_MUL_MEAT_DW_2_wide_c_f1, _FP_MUL_MEAT_DW_2_wide_c_f0, \ + X##_f1, Y##_f0); \ + doit (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ + X##_f1, Y##_f1); \ \ __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _FP_FRAC_WORD_4 (R, 1), 0, _b_f1, _b_f0, \ + _FP_FRAC_WORD_4 (R, 1), 0, \ + _FP_MUL_MEAT_DW_2_wide_b_f1, \ + _FP_MUL_MEAT_DW_2_wide_b_f0, \ _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ _FP_FRAC_WORD_4 (R, 1)); \ __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0, \ + _FP_FRAC_WORD_4 (R, 1), 0, \ + _FP_MUL_MEAT_DW_2_wide_c_f1, \ + _FP_MUL_MEAT_DW_2_wide_c_f0, \ _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ _FP_FRAC_WORD_4 (R, 1)); \ } \ @@ -298,16 +300,18 @@ #define _FP_MUL_MEAT_2_wide(wfracbits, R, X, Y, doit) \ do \ { \ - _FP_FRAC_DECL_4 (_z); \ + _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_wide_z); \ \ - _FP_MUL_MEAT_DW_2_wide (wfracbits, _z, X, Y, doit); \ + _FP_MUL_MEAT_DW_2_wide ((wfracbits), _FP_MUL_MEAT_2_wide_z, \ + X, Y, doit); \ \ /* Normalize since we know where the msb of the multiplicands \ were (bit B), we know that the msb of the of the product is \ at either 2B or 2B-1. */ \ - _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits); \ - R##_f0 = _FP_FRAC_WORD_4 (_z, 0); \ - R##_f1 = _FP_FRAC_WORD_4 (_z, 1); \ + _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_wide_z, (wfracbits)-1, \ + 2*(wfracbits)); \ + R##_f0 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_z, 0); \ + R##_f1 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_z, 1); \ } \ while (0) @@ -318,35 +322,51 @@ #define _FP_MUL_MEAT_DW_2_wide_3mul(wfracbits, R, X, Y, doit) \ do \ { \ - _FP_FRAC_DECL_2 (_b); \ - _FP_FRAC_DECL_2 (_c); \ - _FP_W_TYPE _d; \ - int _c1, _c2; \ + _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_3mul_b); \ + _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_2_wide_3mul_c); \ + _FP_W_TYPE _FP_MUL_MEAT_DW_2_wide_3mul_d; \ + int _FP_MUL_MEAT_DW_2_wide_3mul_c1; \ + int _FP_MUL_MEAT_DW_2_wide_3mul_c2; \ \ - _b_f0 = X##_f0 + X##_f1; \ - _c1 = _b_f0 < X##_f0; \ - _b_f1 = Y##_f0 + Y##_f1; \ - _c2 = _b_f1 < Y##_f0; \ - doit (_d, _FP_FRAC_WORD_4 (R, 0), X##_f0, Y##_f0); \ - doit (_FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1), _b_f0, _b_f1); \ - doit (_c_f1, _c_f0, X##_f1, Y##_f1); \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f0 = X##_f0 + X##_f1; \ + _FP_MUL_MEAT_DW_2_wide_3mul_c1 \ + = _FP_MUL_MEAT_DW_2_wide_3mul_b_f0 < X##_f0; \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f1 = Y##_f0 + Y##_f1; \ + _FP_MUL_MEAT_DW_2_wide_3mul_c2 \ + = _FP_MUL_MEAT_DW_2_wide_3mul_b_f1 < Y##_f0; \ + doit (_FP_MUL_MEAT_DW_2_wide_3mul_d, _FP_FRAC_WORD_4 (R, 0), \ + X##_f0, Y##_f0); \ + doit (_FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1), \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f0, \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f1); \ + doit (_FP_MUL_MEAT_DW_2_wide_3mul_c_f1, \ + _FP_MUL_MEAT_DW_2_wide_3mul_c_f0, X##_f1, Y##_f1); \ \ - _b_f0 &= -_c2; \ - _b_f1 &= -_c1; \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f0 \ + &= -_FP_MUL_MEAT_DW_2_wide_3mul_c2; \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f1 \ + &= -_FP_MUL_MEAT_DW_2_wide_3mul_c1; \ __FP_FRAC_ADD_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _FP_FRAC_WORD_4 (R, 1), (_c1 & _c2), 0, _d, \ + _FP_FRAC_WORD_4 (R, 1), \ + (_FP_MUL_MEAT_DW_2_wide_3mul_c1 \ + & _FP_MUL_MEAT_DW_2_wide_3mul_c2), 0, \ + _FP_MUL_MEAT_DW_2_wide_3mul_d, \ 0, _FP_FRAC_WORD_4 (R, 2), _FP_FRAC_WORD_4 (R, 1)); \ __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _b_f0); \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f0); \ __FP_FRAC_ADDI_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _b_f1); \ + _FP_MUL_MEAT_DW_2_wide_3mul_b_f1); \ __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ _FP_FRAC_WORD_4 (R, 1), \ - 0, _d, _FP_FRAC_WORD_4 (R, 0)); \ + 0, _FP_MUL_MEAT_DW_2_wide_3mul_d, \ + _FP_FRAC_WORD_4 (R, 0)); \ __FP_FRAC_DEC_3 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _FP_FRAC_WORD_4 (R, 1), 0, _c_f1, _c_f0); \ + _FP_FRAC_WORD_4 (R, 1), 0, \ + _FP_MUL_MEAT_DW_2_wide_3mul_c_f1, \ + _FP_MUL_MEAT_DW_2_wide_3mul_c_f0); \ __FP_FRAC_ADD_2 (_FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2), \ - _c_f1, _c_f0, \ + _FP_MUL_MEAT_DW_2_wide_3mul_c_f1, \ + _FP_MUL_MEAT_DW_2_wide_3mul_c_f0, \ _FP_FRAC_WORD_4 (R, 3), _FP_FRAC_WORD_4 (R, 2)); \ } \ while (0) @@ -354,45 +374,51 @@ #define _FP_MUL_MEAT_2_wide_3mul(wfracbits, R, X, Y, doit) \ do \ { \ - _FP_FRAC_DECL_4 (_z); \ + _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_wide_3mul_z); \ \ - _FP_MUL_MEAT_DW_2_wide_3mul (wfracbits, _z, X, Y, doit); \ + _FP_MUL_MEAT_DW_2_wide_3mul ((wfracbits), \ + _FP_MUL_MEAT_2_wide_3mul_z, \ + X, Y, doit); \ \ /* Normalize since we know where the msb of the multiplicands \ were (bit B), we know that the msb of the of the product is \ at either 2B or 2B-1. */ \ - _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits); \ - R##_f0 = _FP_FRAC_WORD_4 (_z, 0); \ - R##_f1 = _FP_FRAC_WORD_4 (_z, 1); \ + _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_wide_3mul_z, \ + (wfracbits)-1, 2*(wfracbits)); \ + R##_f0 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_3mul_z, 0); \ + R##_f1 = _FP_FRAC_WORD_4 (_FP_MUL_MEAT_2_wide_3mul_z, 1); \ } \ while (0) #define _FP_MUL_MEAT_DW_2_gmp(wfracbits, R, X, Y) \ do \ { \ - _FP_W_TYPE _x[2], _y[2]; \ - _x[0] = X##_f0; \ - _x[1] = X##_f1; \ - _y[0] = Y##_f0; \ - _y[1] = Y##_f1; \ + _FP_W_TYPE _FP_MUL_MEAT_DW_2_gmp_x[2]; \ + _FP_W_TYPE _FP_MUL_MEAT_DW_2_gmp_y[2]; \ + _FP_MUL_MEAT_DW_2_gmp_x[0] = X##_f0; \ + _FP_MUL_MEAT_DW_2_gmp_x[1] = X##_f1; \ + _FP_MUL_MEAT_DW_2_gmp_y[0] = Y##_f0; \ + _FP_MUL_MEAT_DW_2_gmp_y[1] = Y##_f1; \ \ - mpn_mul_n (R##_f, _x, _y, 2); \ + mpn_mul_n (R##_f, _FP_MUL_MEAT_DW_2_gmp_x, \ + _FP_MUL_MEAT_DW_2_gmp_y, 2); \ } \ while (0) #define _FP_MUL_MEAT_2_gmp(wfracbits, R, X, Y) \ do \ { \ - _FP_FRAC_DECL_4 (_z); \ + _FP_FRAC_DECL_4 (_FP_MUL_MEAT_2_gmp_z); \ \ - _FP_MUL_MEAT_DW_2_gmp (wfracbits, _z, X, Y); \ + _FP_MUL_MEAT_DW_2_gmp ((wfracbits), _FP_MUL_MEAT_2_gmp_z, X, Y); \ \ /* Normalize since we know where the msb of the multiplicands \ were (bit B), we know that the msb of the of the product is \ at either 2B or 2B-1. */ \ - _FP_FRAC_SRS_4 (_z, wfracbits-1, 2*wfracbits); \ - R##_f0 = _z_f[0]; \ - R##_f1 = _z_f[1]; \ + _FP_FRAC_SRS_4 (_FP_MUL_MEAT_2_gmp_z, (wfracbits)-1, \ + 2*(wfracbits)); \ + R##_f0 = _FP_MUL_MEAT_2_gmp_z_f[0]; \ + R##_f1 = _FP_MUL_MEAT_2_gmp_z_f[1]; \ } \ while (0) @@ -428,7 +454,7 @@ _p240, _q240, _r240, _s240; \ UDItype _t240, _u240, _v240, _w240, _x240, _y240 = 0; \ \ - if (wfracbits < 106 || wfracbits > 120) \ + if ((wfracbits) < 106 || (wfracbits) > 120) \ abort (); \ \ setfetz; \ @@ -500,116 +526,136 @@ } \ while (0) -/* - * Division algorithms: - */ +/* Division algorithms: */ #define _FP_DIV_MEAT_2_udiv(fs, R, X, Y) \ do \ { \ - _FP_W_TYPE _n_f2, _n_f1, _n_f0, _r_f1, _r_f0, _m_f1, _m_f0; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f2; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f1; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_n_f0; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_r_f1; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_r_f0; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_m_f1; \ + _FP_W_TYPE _FP_DIV_MEAT_2_udiv_m_f0; \ if (_FP_FRAC_GE_2 (X, Y)) \ { \ - _n_f2 = X##_f1 >> 1; \ - _n_f1 = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \ - _n_f0 = X##_f0 << (_FP_W_TYPE_SIZE - 1); \ + _FP_DIV_MEAT_2_udiv_n_f2 = X##_f1 >> 1; \ + _FP_DIV_MEAT_2_udiv_n_f1 \ + = X##_f1 << (_FP_W_TYPE_SIZE - 1) | X##_f0 >> 1; \ + _FP_DIV_MEAT_2_udiv_n_f0 \ + = X##_f0 << (_FP_W_TYPE_SIZE - 1); \ } \ else \ { \ R##_e--; \ - _n_f2 = X##_f1; \ - _n_f1 = X##_f0; \ - _n_f0 = 0; \ + _FP_DIV_MEAT_2_udiv_n_f2 = X##_f1; \ + _FP_DIV_MEAT_2_udiv_n_f1 = X##_f0; \ + _FP_DIV_MEAT_2_udiv_n_f0 = 0; \ } \ \ /* Normalize, i.e. make the most significant bit of the \ - denominator set. */ \ + denominator set. */ \ _FP_FRAC_SLL_2 (Y, _FP_WFRACXBITS_##fs); \ \ - udiv_qrnnd (R##_f1, _r_f1, _n_f2, _n_f1, Y##_f1); \ - umul_ppmm (_m_f1, _m_f0, R##_f1, Y##_f0); \ - _r_f0 = _n_f0; \ - if (_FP_FRAC_GT_2 (_m, _r)) \ + udiv_qrnnd (R##_f1, _FP_DIV_MEAT_2_udiv_r_f1, \ + _FP_DIV_MEAT_2_udiv_n_f2, _FP_DIV_MEAT_2_udiv_n_f1, \ + Y##_f1); \ + umul_ppmm (_FP_DIV_MEAT_2_udiv_m_f1, _FP_DIV_MEAT_2_udiv_m_f0, \ + R##_f1, Y##_f0); \ + _FP_DIV_MEAT_2_udiv_r_f0 = _FP_DIV_MEAT_2_udiv_n_f0; \ + if (_FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m, _FP_DIV_MEAT_2_udiv_r)) \ { \ R##_f1--; \ - _FP_FRAC_ADD_2 (_r, Y, _r); \ - if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r)) \ + _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y, \ + _FP_DIV_MEAT_2_udiv_r); \ + if (_FP_FRAC_GE_2 (_FP_DIV_MEAT_2_udiv_r, Y) \ + && _FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m, \ + _FP_DIV_MEAT_2_udiv_r)) \ { \ R##_f1--; \ - _FP_FRAC_ADD_2 (_r, Y, _r); \ + _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y, \ + _FP_DIV_MEAT_2_udiv_r); \ } \ } \ - _FP_FRAC_DEC_2 (_r, _m); \ + _FP_FRAC_DEC_2 (_FP_DIV_MEAT_2_udiv_r, _FP_DIV_MEAT_2_udiv_m); \ \ - if (_r_f1 == Y##_f1) \ + if (_FP_DIV_MEAT_2_udiv_r_f1 == Y##_f1) \ { \ /* This is a special case, not an optimization \ - (_r/Y##_f1 would not fit into UWtype). \ - As _r is guaranteed to be < Y, R##_f0 can be either \ - (UWtype)-1 or (UWtype)-2. But as we know what kind \ - of bits it is (sticky, guard, round), we don't care. \ - We also don't care what the reminder is, because the \ - guard bit will be set anyway. -jj */ \ + (_FP_DIV_MEAT_2_udiv_r/Y##_f1 would not fit into UWtype). \ + As _FP_DIV_MEAT_2_udiv_r is guaranteed to be < Y, \ + R##_f0 can be either (UWtype)-1 or (UWtype)-2. But as we \ + know what kind of bits it is (sticky, guard, round), \ + we don't care. We also don't care what the reminder is, \ + because the guard bit will be set anyway. -jj */ \ R##_f0 = -1; \ } \ else \ { \ - udiv_qrnnd (R##_f0, _r_f1, _r_f1, _r_f0, Y##_f1); \ - umul_ppmm (_m_f1, _m_f0, R##_f0, Y##_f0); \ - _r_f0 = 0; \ - if (_FP_FRAC_GT_2 (_m, _r)) \ + udiv_qrnnd (R##_f0, _FP_DIV_MEAT_2_udiv_r_f1, \ + _FP_DIV_MEAT_2_udiv_r_f1, \ + _FP_DIV_MEAT_2_udiv_r_f0, Y##_f1); \ + umul_ppmm (_FP_DIV_MEAT_2_udiv_m_f1, \ + _FP_DIV_MEAT_2_udiv_m_f0, R##_f0, Y##_f0); \ + _FP_DIV_MEAT_2_udiv_r_f0 = 0; \ + if (_FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m, \ + _FP_DIV_MEAT_2_udiv_r)) \ { \ R##_f0--; \ - _FP_FRAC_ADD_2 (_r, Y, _r); \ - if (_FP_FRAC_GE_2 (_r, Y) && _FP_FRAC_GT_2 (_m, _r)) \ + _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y, \ + _FP_DIV_MEAT_2_udiv_r); \ + if (_FP_FRAC_GE_2 (_FP_DIV_MEAT_2_udiv_r, Y) \ + && _FP_FRAC_GT_2 (_FP_DIV_MEAT_2_udiv_m, \ + _FP_DIV_MEAT_2_udiv_r)) \ { \ R##_f0--; \ - _FP_FRAC_ADD_2 (_r, Y, _r); \ + _FP_FRAC_ADD_2 (_FP_DIV_MEAT_2_udiv_r, Y, \ + _FP_DIV_MEAT_2_udiv_r); \ } \ } \ - if (!_FP_FRAC_EQ_2 (_r, _m)) \ + if (!_FP_FRAC_EQ_2 (_FP_DIV_MEAT_2_udiv_r, \ + _FP_DIV_MEAT_2_udiv_m)) \ R##_f0 |= _FP_WORK_STICKY; \ } \ } \ while (0) -/* - * Square root algorithms: - * We have just one right now, maybe Newton approximation - * should be added for those machines where division is fast. - */ +/* Square root algorithms: + We have just one right now, maybe Newton approximation + should be added for those machines where division is fast. */ #define _FP_SQRT_MEAT_2(R, S, T, X, q) \ do \ { \ while (q) \ { \ - T##_f1 = S##_f1 + q; \ + T##_f1 = S##_f1 + (q); \ if (T##_f1 <= X##_f1) \ { \ - S##_f1 = T##_f1 + q; \ + S##_f1 = T##_f1 + (q); \ X##_f1 -= T##_f1; \ - R##_f1 += q; \ + R##_f1 += (q); \ } \ _FP_FRAC_SLL_2 (X, 1); \ - q >>= 1; \ + (q) >>= 1; \ } \ - q = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1); \ - while (q != _FP_WORK_ROUND) \ + (q) = (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE - 1); \ + while ((q) != _FP_WORK_ROUND) \ { \ - T##_f0 = S##_f0 + q; \ + T##_f0 = S##_f0 + (q); \ T##_f1 = S##_f1; \ if (T##_f1 < X##_f1 \ || (T##_f1 == X##_f1 && T##_f0 <= X##_f0)) \ { \ - S##_f0 = T##_f0 + q; \ + S##_f0 = T##_f0 + (q); \ S##_f1 += (T##_f0 > S##_f0); \ _FP_FRAC_DEC_2 (X, T); \ - R##_f0 += q; \ + R##_f0 += (q); \ } \ _FP_FRAC_SLL_2 (X, 1); \ - q >>= 1; \ + (q) >>= 1; \ } \ if (X##_f0 | X##_f1) \ { \ @@ -622,31 +668,29 @@ while (0) -/* - * Assembly/disassembly for converting to/from integral types. - * No shifting or overflow handled here. - */ +/* Assembly/disassembly for converting to/from integral types. + No shifting or overflow handled here. */ #define _FP_FRAC_ASSEMBLE_2(r, X, rsize) \ - (void) ((rsize <= _FP_W_TYPE_SIZE) \ - ? ({ r = X##_f0; }) \ + (void) (((rsize) <= _FP_W_TYPE_SIZE) \ + ? ({ (r) = X##_f0; }) \ : ({ \ - r = X##_f1; \ - r <<= _FP_W_TYPE_SIZE; \ - r += X##_f0; \ + (r) = X##_f1; \ + (r) <<= _FP_W_TYPE_SIZE; \ + (r) += X##_f0; \ })) -#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \ - do \ - { \ - X##_f0 = r; \ - X##_f1 = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ - } \ +#define _FP_FRAC_DISASSEMBLE_2(X, r, rsize) \ + do \ + { \ + X##_f0 = (r); \ + X##_f1 = ((rsize) <= _FP_W_TYPE_SIZE \ + ? 0 \ + : (r) >> _FP_W_TYPE_SIZE); \ + } \ while (0) -/* - * Convert FP values between word sizes - */ +/* Convert FP values between word sizes. */ #define _FP_FRAC_COPY_1_2(D, S) (D##_f = S##_f0) |