
Go to the source code of this file.
Defines | |
| #define | _FP_FRAC_DECL_4(X) _FP_W_TYPE X##_f[4] |
| #define | _FP_FRAC_COPY_4(D, S) |
| #define | _FP_FRAC_SET_4(X, I) __FP_FRAC_SET_4(X, I) |
| #define | _FP_FRAC_HIGH_4(X) (X##_f[3]) |
| #define | _FP_FRAC_LOW_4(X) (X##_f[0]) |
| #define | _FP_FRAC_WORD_4(X, w) (X##_f[w]) |
| #define | _FP_FRAC_SLL_4(X, N) |
| #define | _FP_FRAC_SRL_4(X, N) |
| #define | _FP_FRAC_SRST_4(X, S, N, size) |
| #define | _FP_FRAC_SRS_4(X, N, size) |
| #define | _FP_FRAC_ADD_4(R, X, Y) |
| #define | _FP_FRAC_SUB_4(R, X, Y) |
| #define | _FP_FRAC_DEC_4(X, Y) |
| #define | _FP_FRAC_ADDI_4(X, I) __FP_FRAC_ADDI_4(X##_f[3], X##_f[2], X##_f[1], X##_f[0], I) |
| #define | _FP_ZEROFRAC_4 0,0,0,0 |
| #define | _FP_MINFRAC_4 0,0,0,1 |
| #define | _FP_MAXFRAC_4 (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0) |
| #define | _FP_FRAC_ZEROP_4(X) ((X##_f[0] | X##_f[1] | X##_f[2] | X##_f[3]) == 0) |
| #define | _FP_FRAC_NEGP_4(X) ((_FP_WS_TYPE)X##_f[3] < 0) |
| #define | _FP_FRAC_OVERP_4(fs, X) (_FP_FRAC_HIGH_##fs(X) & _FP_OVERFLOW_##fs) |
| #define | _FP_FRAC_CLEAR_OVERP_4(fs, X) (_FP_FRAC_HIGH_##fs(X) &= ~_FP_OVERFLOW_##fs) |
| #define | _FP_FRAC_EQ_4(X, Y) |
| #define | _FP_FRAC_GT_4(X, Y) |
| #define | _FP_FRAC_GE_4(X, Y) |
| #define | _FP_FRAC_CLZ_4(R, X) |
| #define | _FP_UNPACK_RAW_4(fs, X, val) |
| #define | _FP_UNPACK_RAW_4_P(fs, X, val) |
| #define | _FP_PACK_RAW_4(fs, val, X) |
| #define | _FP_PACK_RAW_4_P(fs, val, X) |
| #define | _FP_MUL_MEAT_4_wide(wfracbits, R, X, Y, doit) |
| #define | _FP_MUL_MEAT_4_gmp(wfracbits, R, X, Y) |
| #define | umul_ppppmnnn(p3, p2, p1, p0, m, n2, n1, n0) |
| #define | _FP_DIV_MEAT_4_udiv(fs, R, X, Y) |
| #define | _FP_SQRT_MEAT_4(R, S, T, X, q) |
| #define | __FP_FRAC_SET_4(X, I3, I2, I1, I0) (X##_f[3] = I3, X##_f[2] = I2, X##_f[1] = I1, X##_f[0] = I0) |
| #define | __FP_FRAC_ADD_3(r2, r1, r0, x2, x1, x0, y2, y1, y0) |
| #define | __FP_FRAC_ADD_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) |
| #define | __FP_FRAC_SUB_3(r2, r1, r0, x2, x1, x0, y2, y1, y0) |
| #define | __FP_FRAC_SUB_4(r3, r2, r1, r0, x3, x2, x1, x0, y3, y2, y1, y0) |
| #define | __FP_FRAC_DEC_3(x2, x1, x0, y2, y1, y0) |
| #define | __FP_FRAC_DEC_4(x3, x2, x1, x0, y3, y2, y1, y0) |
| #define | __FP_FRAC_ADDI_4(x3, x2, x1, x0, i) |
| #define | _FP_FRAC_COPY_1_4(D, S) (D##_f = S##_f[0]) |
| #define | _FP_FRAC_COPY_2_4(D, S) |
| #define | _FP_FRAC_ASSEMBLE_4(r, X, rsize) |
| #define | _FP_FRAC_DISASSEMBLE_4(X, r, rsize) |
| #define | _FP_FRAC_COPY_4_1(D, S) |
| #define | _FP_FRAC_COPY_4_2(D, S) |
| #define _FP_FRAC_ASSEMBLE_4 | ( | r, | |||
| X, | |||||
| rsize | ) |
Value:
do { \ if (rsize <= _FP_W_TYPE_SIZE) \ r = X##_f[0]; \ else if (rsize <= 2*_FP_W_TYPE_SIZE) \ { \ r = X##_f[1]; \ r <<= _FP_W_TYPE_SIZE; \ r += X##_f[0]; \ } \ else \ { \ /* I'm feeling lazy so we deal with int == 3words (implausible)*/ \ /* and int == 4words as a single case. */ \ r = X##_f[3]; \ r <<= _FP_W_TYPE_SIZE; \ r += X##_f[2]; \ r <<= _FP_W_TYPE_SIZE; \ r += X##_f[1]; \ r <<= _FP_W_TYPE_SIZE; \ r += X##_f[0]; \ } \ } while (0)
Value:
do { \ if (X##_f[3]) \ { \ __FP_CLZ(R,X##_f[3]); \ } \ else if (X##_f[2]) \ { \ __FP_CLZ(R,X##_f[2]); \ R += _FP_W_TYPE_SIZE; \ } \ else if (X##_f[1]) \ { \ __FP_CLZ(R,X##_f[1]); \ R += _FP_W_TYPE_SIZE*2; \ } \ else \ { \ __FP_CLZ(R,X##_f[0]); \ R += _FP_W_TYPE_SIZE*3; \ } \ } while(0)
| #define _FP_FRAC_COPY_2_4 | ( | D, | |||
| S | ) |
| #define _FP_FRAC_COPY_4 | ( | D, | |||
| S | ) |
| #define _FP_FRAC_COPY_4_1 | ( | D, | |||
| S | ) |
| #define _FP_FRAC_COPY_4_2 | ( | D, | |||
| S | ) |
| #define _FP_FRAC_DEC_4 | ( | X, | |||
| Y | ) |
| #define _FP_FRAC_DISASSEMBLE_4 | ( | X, | |||
| r, | |||||
| rsize | ) |
Value:
do { \ X##_f[0] = r; \ X##_f[1] = (rsize <= _FP_W_TYPE_SIZE ? 0 : r >> _FP_W_TYPE_SIZE); \ X##_f[2] = (rsize <= 2*_FP_W_TYPE_SIZE ? 0 : r >> 2*_FP_W_TYPE_SIZE); \ X##_f[3] = (rsize <= 3*_FP_W_TYPE_SIZE ? 0 : r >> 3*_FP_W_TYPE_SIZE); \ } while (0);
| #define _FP_FRAC_EQ_4 | ( | X, | |||
| Y | ) |
| #define _FP_FRAC_GE_4 | ( | X, | |||
| Y | ) |
| #define _FP_FRAC_GT_4 | ( | X, | |||
| Y | ) |
| #define _FP_FRAC_SLL_4 | ( | X, | |||
| N | ) |
Value:
do { \ _FP_I_TYPE _up, _down, _skip, _i; \ _skip = (N) / _FP_W_TYPE_SIZE; \ _up = (N) % _FP_W_TYPE_SIZE; \ _down = _FP_W_TYPE_SIZE - _up; \ if (!_up) \ for (_i = 3; _i >= _skip; --_i) \ X##_f[_i] = X##_f[_i-_skip]; \ else \ { \ for (_i = 3; _i > _skip; --_i) \ X##_f[_i] = X##_f[_i-_skip] << _up \ | X##_f[_i-_skip-1] >> _down; \ X##_f[_i--] = X##_f[0] << _up; \ } \ for (; _i >= 0; --_i) \ X##_f[_i] = 0; \ } while (0)
| #define _FP_FRAC_SRL_4 | ( | X, | |||
| N | ) |
Value:
do { \ _FP_I_TYPE _up, _down, _skip, _i; \ _skip = (N) / _FP_W_TYPE_SIZE; \ _down = (N) % _FP_W_TYPE_SIZE; \ _up = _FP_W_TYPE_SIZE - _down; \ if (!_down) \ for (_i = 0; _i <= 3-_skip; ++_i) \ X##_f[_i] = X##_f[_i+_skip]; \ else \ { \ for (_i = 0; _i < 3-_skip; ++_i) \ X##_f[_i] = X##_f[_i+_skip] >> _down \ | X##_f[_i+_skip+1] << _up; \ X##_f[_i++] = X##_f[3] >> _down; \ } \ for (; _i < 4; ++_i) \ X##_f[_i] = 0; \ } while (0)
Value:
do { \ _FP_I_TYPE _up, _down, _skip, _i; \ _FP_W_TYPE _s; \ _skip = (N) / _FP_W_TYPE_SIZE; \ _down = (N) % _FP_W_TYPE_SIZE; \ _up = _FP_W_TYPE_SIZE - _down; \ for (_s = _i = 0; _i < _skip; ++_i) \ _s |= X##_f[_i]; \ if (!_down) \ for (_i = 0; _i <= 3-_skip; ++_i) \ X##_f[_i] = X##_f[_i+_skip]; \ else \ { \ _s |= X##_f[_i] << _up; \ for (_i = 0; _i < 3-_skip; ++_i) \ X##_f[_i] = X##_f[_i+_skip] >> _down \ | X##_f[_i+_skip+1] << _up; \ X##_f[_i++] = X##_f[3] >> _down; \ } \ for (; _i < 4; ++_i) \ X##_f[_i] = 0; \ S = (_s != 0); \ } while (0)
| #define _FP_MAXFRAC_4 (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0), (~(_FP_WS_TYPE)0) |
Value:
do { \ _FP_FRAC_DECL_8(_z); \ \ mpn_mul_n(_z_f, _x_f, _y_f, 4); \ \ /* 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_8(_z, wfracbits-1, 2*wfracbits); \ __FP_FRAC_SET_4(R, _FP_FRAC_WORD_8(_z,3), _FP_FRAC_WORD_8(_z,2), \ _FP_FRAC_WORD_8(_z,1), _FP_FRAC_WORD_8(_z,0)); \ } while (0)
1.5.6