1*38fd1498Szrj /* Software floating-point emulation. 2*38fd1498Szrj Basic one-word fraction declaration and manipulation. 3*38fd1498Szrj Copyright (C) 1997-2016 Free Software Foundation, Inc. 4*38fd1498Szrj This file is part of the GNU C Library. 5*38fd1498Szrj Contributed by Richard Henderson (rth@cygnus.com), 6*38fd1498Szrj Jakub Jelinek (jj@ultra.linux.cz), 7*38fd1498Szrj David S. Miller (davem@redhat.com) and 8*38fd1498Szrj Peter Maydell (pmaydell@chiark.greenend.org.uk). 9*38fd1498Szrj 10*38fd1498Szrj The GNU C Library is free software; you can redistribute it and/or 11*38fd1498Szrj modify it under the terms of the GNU Lesser General Public 12*38fd1498Szrj License as published by the Free Software Foundation; either 13*38fd1498Szrj version 2.1 of the License, or (at your option) any later version. 14*38fd1498Szrj 15*38fd1498Szrj In addition to the permissions in the GNU Lesser General Public 16*38fd1498Szrj License, the Free Software Foundation gives you unlimited 17*38fd1498Szrj permission to link the compiled version of this file into 18*38fd1498Szrj combinations with other programs, and to distribute those 19*38fd1498Szrj combinations without any restriction coming from the use of this 20*38fd1498Szrj file. (The Lesser General Public License restrictions do apply in 21*38fd1498Szrj other respects; for example, they cover modification of the file, 22*38fd1498Szrj and distribution when not linked into a combine executable.) 23*38fd1498Szrj 24*38fd1498Szrj The GNU C Library is distributed in the hope that it will be useful, 25*38fd1498Szrj but WITHOUT ANY WARRANTY; without even the implied warranty of 26*38fd1498Szrj MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 27*38fd1498Szrj Lesser General Public License for more details. 28*38fd1498Szrj 29*38fd1498Szrj You should have received a copy of the GNU Lesser General Public 30*38fd1498Szrj License along with the GNU C Library; if not, see 31*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 32*38fd1498Szrj 33*38fd1498Szrj #ifndef SOFT_FP_OP_1_H 34*38fd1498Szrj #define SOFT_FP_OP_1_H 1 35*38fd1498Szrj 36*38fd1498Szrj #define _FP_FRAC_DECL_1(X) _FP_W_TYPE X##_f _FP_ZERO_INIT 37*38fd1498Szrj #define _FP_FRAC_COPY_1(D, S) (D##_f = S##_f) 38*38fd1498Szrj #define _FP_FRAC_SET_1(X, I) (X##_f = I) 39*38fd1498Szrj #define _FP_FRAC_HIGH_1(X) (X##_f) 40*38fd1498Szrj #define _FP_FRAC_LOW_1(X) (X##_f) 41*38fd1498Szrj #define _FP_FRAC_WORD_1(X, w) (X##_f) 42*38fd1498Szrj 43*38fd1498Szrj #define _FP_FRAC_ADDI_1(X, I) (X##_f += I) 44*38fd1498Szrj #define _FP_FRAC_SLL_1(X, N) \ 45*38fd1498Szrj do \ 46*38fd1498Szrj { \ 47*38fd1498Szrj if (__builtin_constant_p (N) && (N) == 1) \ 48*38fd1498Szrj X##_f += X##_f; \ 49*38fd1498Szrj else \ 50*38fd1498Szrj X##_f <<= (N); \ 51*38fd1498Szrj } \ 52*38fd1498Szrj while (0) 53*38fd1498Szrj #define _FP_FRAC_SRL_1(X, N) (X##_f >>= N) 54*38fd1498Szrj 55*38fd1498Szrj /* Right shift with sticky-lsb. */ 56*38fd1498Szrj #define _FP_FRAC_SRST_1(X, S, N, sz) __FP_FRAC_SRST_1 (X##_f, S, (N), (sz)) 57*38fd1498Szrj #define _FP_FRAC_SRS_1(X, N, sz) __FP_FRAC_SRS_1 (X##_f, (N), (sz)) 58*38fd1498Szrj 59*38fd1498Szrj #define __FP_FRAC_SRST_1(X, S, N, sz) \ 60*38fd1498Szrj do \ 61*38fd1498Szrj { \ 62*38fd1498Szrj S = (__builtin_constant_p (N) && (N) == 1 \ 63*38fd1498Szrj ? X & 1 \ 64*38fd1498Szrj : (X << (_FP_W_TYPE_SIZE - (N))) != 0); \ 65*38fd1498Szrj X = X >> (N); \ 66*38fd1498Szrj } \ 67*38fd1498Szrj while (0) 68*38fd1498Szrj 69*38fd1498Szrj #define __FP_FRAC_SRS_1(X, N, sz) \ 70*38fd1498Szrj (X = (X >> (N) | (__builtin_constant_p (N) && (N) == 1 \ 71*38fd1498Szrj ? X & 1 \ 72*38fd1498Szrj : (X << (_FP_W_TYPE_SIZE - (N))) != 0))) 73*38fd1498Szrj 74*38fd1498Szrj #define _FP_FRAC_ADD_1(R, X, Y) (R##_f = X##_f + Y##_f) 75*38fd1498Szrj #define _FP_FRAC_SUB_1(R, X, Y) (R##_f = X##_f - Y##_f) 76*38fd1498Szrj #define _FP_FRAC_DEC_1(X, Y) (X##_f -= Y##_f) 77*38fd1498Szrj #define _FP_FRAC_CLZ_1(z, X) __FP_CLZ ((z), X##_f) 78*38fd1498Szrj 79*38fd1498Szrj /* Predicates. */ 80*38fd1498Szrj #define _FP_FRAC_NEGP_1(X) ((_FP_WS_TYPE) X##_f < 0) 81*38fd1498Szrj #define _FP_FRAC_ZEROP_1(X) (X##_f == 0) 82*38fd1498Szrj #define _FP_FRAC_OVERP_1(fs, X) (X##_f & _FP_OVERFLOW_##fs) 83*38fd1498Szrj #define _FP_FRAC_CLEAR_OVERP_1(fs, X) (X##_f &= ~_FP_OVERFLOW_##fs) 84*38fd1498Szrj #define _FP_FRAC_HIGHBIT_DW_1(fs, X) (X##_f & _FP_HIGHBIT_DW_##fs) 85*38fd1498Szrj #define _FP_FRAC_EQ_1(X, Y) (X##_f == Y##_f) 86*38fd1498Szrj #define _FP_FRAC_GE_1(X, Y) (X##_f >= Y##_f) 87*38fd1498Szrj #define _FP_FRAC_GT_1(X, Y) (X##_f > Y##_f) 88*38fd1498Szrj 89*38fd1498Szrj #define _FP_ZEROFRAC_1 0 90*38fd1498Szrj #define _FP_MINFRAC_1 1 91*38fd1498Szrj #define _FP_MAXFRAC_1 (~(_FP_WS_TYPE) 0) 92*38fd1498Szrj 93*38fd1498Szrj /* Unpack the raw bits of a native fp value. Do not classify or 94*38fd1498Szrj normalize the data. */ 95*38fd1498Szrj 96*38fd1498Szrj #define _FP_UNPACK_RAW_1(fs, X, val) \ 97*38fd1498Szrj do \ 98*38fd1498Szrj { \ 99*38fd1498Szrj union _FP_UNION_##fs _FP_UNPACK_RAW_1_flo; \ 100*38fd1498Szrj _FP_UNPACK_RAW_1_flo.flt = (val); \ 101*38fd1498Szrj \ 102*38fd1498Szrj X##_f = _FP_UNPACK_RAW_1_flo.bits.frac; \ 103*38fd1498Szrj X##_e = _FP_UNPACK_RAW_1_flo.bits.exp; \ 104*38fd1498Szrj X##_s = _FP_UNPACK_RAW_1_flo.bits.sign; \ 105*38fd1498Szrj } \ 106*38fd1498Szrj while (0) 107*38fd1498Szrj 108*38fd1498Szrj #define _FP_UNPACK_RAW_1_P(fs, X, val) \ 109*38fd1498Szrj do \ 110*38fd1498Szrj { \ 111*38fd1498Szrj union _FP_UNION_##fs *_FP_UNPACK_RAW_1_P_flo \ 112*38fd1498Szrj = (union _FP_UNION_##fs *) (val); \ 113*38fd1498Szrj \ 114*38fd1498Szrj X##_f = _FP_UNPACK_RAW_1_P_flo->bits.frac; \ 115*38fd1498Szrj X##_e = _FP_UNPACK_RAW_1_P_flo->bits.exp; \ 116*38fd1498Szrj X##_s = _FP_UNPACK_RAW_1_P_flo->bits.sign; \ 117*38fd1498Szrj } \ 118*38fd1498Szrj while (0) 119*38fd1498Szrj 120*38fd1498Szrj /* Repack the raw bits of a native fp value. */ 121*38fd1498Szrj 122*38fd1498Szrj #define _FP_PACK_RAW_1(fs, val, X) \ 123*38fd1498Szrj do \ 124*38fd1498Szrj { \ 125*38fd1498Szrj union _FP_UNION_##fs _FP_PACK_RAW_1_flo; \ 126*38fd1498Szrj \ 127*38fd1498Szrj _FP_PACK_RAW_1_flo.bits.frac = X##_f; \ 128*38fd1498Szrj _FP_PACK_RAW_1_flo.bits.exp = X##_e; \ 129*38fd1498Szrj _FP_PACK_RAW_1_flo.bits.sign = X##_s; \ 130*38fd1498Szrj \ 131*38fd1498Szrj (val) = _FP_PACK_RAW_1_flo.flt; \ 132*38fd1498Szrj } \ 133*38fd1498Szrj while (0) 134*38fd1498Szrj 135*38fd1498Szrj #define _FP_PACK_RAW_1_P(fs, val, X) \ 136*38fd1498Szrj do \ 137*38fd1498Szrj { \ 138*38fd1498Szrj union _FP_UNION_##fs *_FP_PACK_RAW_1_P_flo \ 139*38fd1498Szrj = (union _FP_UNION_##fs *) (val); \ 140*38fd1498Szrj \ 141*38fd1498Szrj _FP_PACK_RAW_1_P_flo->bits.frac = X##_f; \ 142*38fd1498Szrj _FP_PACK_RAW_1_P_flo->bits.exp = X##_e; \ 143*38fd1498Szrj _FP_PACK_RAW_1_P_flo->bits.sign = X##_s; \ 144*38fd1498Szrj } \ 145*38fd1498Szrj while (0) 146*38fd1498Szrj 147*38fd1498Szrj 148*38fd1498Szrj /* Multiplication algorithms: */ 149*38fd1498Szrj 150*38fd1498Szrj /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the 151*38fd1498Szrj multiplication immediately. */ 152*38fd1498Szrj 153*38fd1498Szrj #define _FP_MUL_MEAT_DW_1_imm(wfracbits, R, X, Y) \ 154*38fd1498Szrj do \ 155*38fd1498Szrj { \ 156*38fd1498Szrj R##_f = X##_f * Y##_f; \ 157*38fd1498Szrj } \ 158*38fd1498Szrj while (0) 159*38fd1498Szrj 160*38fd1498Szrj #define _FP_MUL_MEAT_1_imm(wfracbits, R, X, Y) \ 161*38fd1498Szrj do \ 162*38fd1498Szrj { \ 163*38fd1498Szrj _FP_MUL_MEAT_DW_1_imm ((wfracbits), R, X, Y); \ 164*38fd1498Szrj /* Normalize since we know where the msb of the multiplicands \ 165*38fd1498Szrj were (bit B), we know that the msb of the of the product is \ 166*38fd1498Szrj at either 2B or 2B-1. */ \ 167*38fd1498Szrj _FP_FRAC_SRS_1 (R, (wfracbits)-1, 2*(wfracbits)); \ 168*38fd1498Szrj } \ 169*38fd1498Szrj while (0) 170*38fd1498Szrj 171*38fd1498Szrj /* Given a 1W * 1W => 2W primitive, do the extended multiplication. */ 172*38fd1498Szrj 173*38fd1498Szrj #define _FP_MUL_MEAT_DW_1_wide(wfracbits, R, X, Y, doit) \ 174*38fd1498Szrj do \ 175*38fd1498Szrj { \ 176*38fd1498Szrj doit (R##_f1, R##_f0, X##_f, Y##_f); \ 177*38fd1498Szrj } \ 178*38fd1498Szrj while (0) 179*38fd1498Szrj 180*38fd1498Szrj #define _FP_MUL_MEAT_1_wide(wfracbits, R, X, Y, doit) \ 181*38fd1498Szrj do \ 182*38fd1498Szrj { \ 183*38fd1498Szrj _FP_FRAC_DECL_2 (_FP_MUL_MEAT_1_wide_Z); \ 184*38fd1498Szrj _FP_MUL_MEAT_DW_1_wide ((wfracbits), _FP_MUL_MEAT_1_wide_Z, \ 185*38fd1498Szrj X, Y, doit); \ 186*38fd1498Szrj /* Normalize since we know where the msb of the multiplicands \ 187*38fd1498Szrj were (bit B), we know that the msb of the of the product is \ 188*38fd1498Szrj at either 2B or 2B-1. */ \ 189*38fd1498Szrj _FP_FRAC_SRS_2 (_FP_MUL_MEAT_1_wide_Z, (wfracbits)-1, \ 190*38fd1498Szrj 2*(wfracbits)); \ 191*38fd1498Szrj R##_f = _FP_MUL_MEAT_1_wide_Z_f0; \ 192*38fd1498Szrj } \ 193*38fd1498Szrj while (0) 194*38fd1498Szrj 195*38fd1498Szrj /* Finally, a simple widening multiply algorithm. What fun! */ 196*38fd1498Szrj 197*38fd1498Szrj #define _FP_MUL_MEAT_DW_1_hard(wfracbits, R, X, Y) \ 198*38fd1498Szrj do \ 199*38fd1498Szrj { \ 200*38fd1498Szrj _FP_W_TYPE _FP_MUL_MEAT_DW_1_hard_xh, _FP_MUL_MEAT_DW_1_hard_xl; \ 201*38fd1498Szrj _FP_W_TYPE _FP_MUL_MEAT_DW_1_hard_yh, _FP_MUL_MEAT_DW_1_hard_yl; \ 202*38fd1498Szrj _FP_FRAC_DECL_2 (_FP_MUL_MEAT_DW_1_hard_a); \ 203*38fd1498Szrj \ 204*38fd1498Szrj /* Split the words in half. */ \ 205*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_xh = X##_f >> (_FP_W_TYPE_SIZE/2); \ 206*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_xl \ 207*38fd1498Szrj = X##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1); \ 208*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_yh = Y##_f >> (_FP_W_TYPE_SIZE/2); \ 209*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_yl \ 210*38fd1498Szrj = Y##_f & (((_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2)) - 1); \ 211*38fd1498Szrj \ 212*38fd1498Szrj /* Multiply the pieces. */ \ 213*38fd1498Szrj R##_f0 = _FP_MUL_MEAT_DW_1_hard_xl * _FP_MUL_MEAT_DW_1_hard_yl; \ 214*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_a_f0 \ 215*38fd1498Szrj = _FP_MUL_MEAT_DW_1_hard_xh * _FP_MUL_MEAT_DW_1_hard_yl; \ 216*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_a_f1 \ 217*38fd1498Szrj = _FP_MUL_MEAT_DW_1_hard_xl * _FP_MUL_MEAT_DW_1_hard_yh; \ 218*38fd1498Szrj R##_f1 = _FP_MUL_MEAT_DW_1_hard_xh * _FP_MUL_MEAT_DW_1_hard_yh; \ 219*38fd1498Szrj \ 220*38fd1498Szrj /* Reassemble into two full words. */ \ 221*38fd1498Szrj if ((_FP_MUL_MEAT_DW_1_hard_a_f0 += _FP_MUL_MEAT_DW_1_hard_a_f1) \ 222*38fd1498Szrj < _FP_MUL_MEAT_DW_1_hard_a_f1) \ 223*38fd1498Szrj R##_f1 += (_FP_W_TYPE) 1 << (_FP_W_TYPE_SIZE/2); \ 224*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_a_f1 \ 225*38fd1498Szrj = _FP_MUL_MEAT_DW_1_hard_a_f0 >> (_FP_W_TYPE_SIZE/2); \ 226*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard_a_f0 \ 227*38fd1498Szrj = _FP_MUL_MEAT_DW_1_hard_a_f0 << (_FP_W_TYPE_SIZE/2); \ 228*38fd1498Szrj _FP_FRAC_ADD_2 (R, R, _FP_MUL_MEAT_DW_1_hard_a); \ 229*38fd1498Szrj } \ 230*38fd1498Szrj while (0) 231*38fd1498Szrj 232*38fd1498Szrj #define _FP_MUL_MEAT_1_hard(wfracbits, R, X, Y) \ 233*38fd1498Szrj do \ 234*38fd1498Szrj { \ 235*38fd1498Szrj _FP_FRAC_DECL_2 (_FP_MUL_MEAT_1_hard_z); \ 236*38fd1498Szrj _FP_MUL_MEAT_DW_1_hard ((wfracbits), \ 237*38fd1498Szrj _FP_MUL_MEAT_1_hard_z, X, Y); \ 238*38fd1498Szrj \ 239*38fd1498Szrj /* Normalize. */ \ 240*38fd1498Szrj _FP_FRAC_SRS_2 (_FP_MUL_MEAT_1_hard_z, \ 241*38fd1498Szrj (wfracbits) - 1, 2*(wfracbits)); \ 242*38fd1498Szrj R##_f = _FP_MUL_MEAT_1_hard_z_f0; \ 243*38fd1498Szrj } \ 244*38fd1498Szrj while (0) 245*38fd1498Szrj 246*38fd1498Szrj 247*38fd1498Szrj /* Division algorithms: */ 248*38fd1498Szrj 249*38fd1498Szrj /* Basic. Assuming the host word size is >= 2*FRACBITS, we can do the 250*38fd1498Szrj division immediately. Give this macro either _FP_DIV_HELP_imm for 251*38fd1498Szrj C primitives or _FP_DIV_HELP_ldiv for the ISO function. Which you 252*38fd1498Szrj choose will depend on what the compiler does with divrem4. */ 253*38fd1498Szrj 254*38fd1498Szrj #define _FP_DIV_MEAT_1_imm(fs, R, X, Y, doit) \ 255*38fd1498Szrj do \ 256*38fd1498Szrj { \ 257*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_imm_q, _FP_DIV_MEAT_1_imm_r; \ 258*38fd1498Szrj X##_f <<= (X##_f < Y##_f \ 259*38fd1498Szrj ? R##_e--, _FP_WFRACBITS_##fs \ 260*38fd1498Szrj : _FP_WFRACBITS_##fs - 1); \ 261*38fd1498Szrj doit (_FP_DIV_MEAT_1_imm_q, _FP_DIV_MEAT_1_imm_r, X##_f, Y##_f); \ 262*38fd1498Szrj R##_f = _FP_DIV_MEAT_1_imm_q | (_FP_DIV_MEAT_1_imm_r != 0); \ 263*38fd1498Szrj } \ 264*38fd1498Szrj while (0) 265*38fd1498Szrj 266*38fd1498Szrj /* GCC's longlong.h defines a 2W / 1W => (1W,1W) primitive udiv_qrnnd 267*38fd1498Szrj that may be useful in this situation. This first is for a primitive 268*38fd1498Szrj that requires normalization, the second for one that does not. Look 269*38fd1498Szrj for UDIV_NEEDS_NORMALIZATION to tell which your machine needs. */ 270*38fd1498Szrj 271*38fd1498Szrj #define _FP_DIV_MEAT_1_udiv_norm(fs, R, X, Y) \ 272*38fd1498Szrj do \ 273*38fd1498Szrj { \ 274*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_nh; \ 275*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_nl; \ 276*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_q; \ 277*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_r; \ 278*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_norm_y; \ 279*38fd1498Szrj \ 280*38fd1498Szrj /* Normalize Y -- i.e. make the most significant bit set. */ \ 281*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_y = Y##_f << _FP_WFRACXBITS_##fs; \ 282*38fd1498Szrj \ 283*38fd1498Szrj /* Shift X op correspondingly high, that is, up one full word. */ \ 284*38fd1498Szrj if (X##_f < Y##_f) \ 285*38fd1498Szrj { \ 286*38fd1498Szrj R##_e--; \ 287*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nl = 0; \ 288*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nh = X##_f; \ 289*38fd1498Szrj } \ 290*38fd1498Szrj else \ 291*38fd1498Szrj { \ 292*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nl = X##_f << (_FP_W_TYPE_SIZE - 1); \ 293*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nh = X##_f >> 1; \ 294*38fd1498Szrj } \ 295*38fd1498Szrj \ 296*38fd1498Szrj udiv_qrnnd (_FP_DIV_MEAT_1_udiv_norm_q, \ 297*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_r, \ 298*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nh, \ 299*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_nl, \ 300*38fd1498Szrj _FP_DIV_MEAT_1_udiv_norm_y); \ 301*38fd1498Szrj R##_f = (_FP_DIV_MEAT_1_udiv_norm_q \ 302*38fd1498Szrj | (_FP_DIV_MEAT_1_udiv_norm_r != 0)); \ 303*38fd1498Szrj } \ 304*38fd1498Szrj while (0) 305*38fd1498Szrj 306*38fd1498Szrj #define _FP_DIV_MEAT_1_udiv(fs, R, X, Y) \ 307*38fd1498Szrj do \ 308*38fd1498Szrj { \ 309*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_nh, _FP_DIV_MEAT_1_udiv_nl; \ 310*38fd1498Szrj _FP_W_TYPE _FP_DIV_MEAT_1_udiv_q, _FP_DIV_MEAT_1_udiv_r; \ 311*38fd1498Szrj if (X##_f < Y##_f) \ 312*38fd1498Szrj { \ 313*38fd1498Szrj R##_e--; \ 314*38fd1498Szrj _FP_DIV_MEAT_1_udiv_nl = X##_f << _FP_WFRACBITS_##fs; \ 315*38fd1498Szrj _FP_DIV_MEAT_1_udiv_nh = X##_f >> _FP_WFRACXBITS_##fs; \ 316*38fd1498Szrj } \ 317*38fd1498Szrj else \ 318*38fd1498Szrj { \ 319*38fd1498Szrj _FP_DIV_MEAT_1_udiv_nl = X##_f << (_FP_WFRACBITS_##fs - 1); \ 320*38fd1498Szrj _FP_DIV_MEAT_1_udiv_nh = X##_f >> (_FP_WFRACXBITS_##fs + 1); \ 321*38fd1498Szrj } \ 322*38fd1498Szrj udiv_qrnnd (_FP_DIV_MEAT_1_udiv_q, _FP_DIV_MEAT_1_udiv_r, \ 323*38fd1498Szrj _FP_DIV_MEAT_1_udiv_nh, _FP_DIV_MEAT_1_udiv_nl, \ 324*38fd1498Szrj Y##_f); \ 325*38fd1498Szrj R##_f = _FP_DIV_MEAT_1_udiv_q | (_FP_DIV_MEAT_1_udiv_r != 0); \ 326*38fd1498Szrj } \ 327*38fd1498Szrj while (0) 328*38fd1498Szrj 329*38fd1498Szrj 330*38fd1498Szrj /* Square root algorithms: 331*38fd1498Szrj We have just one right now, maybe Newton approximation 332*38fd1498Szrj should be added for those machines where division is fast. */ 333*38fd1498Szrj 334*38fd1498Szrj #define _FP_SQRT_MEAT_1(R, S, T, X, q) \ 335*38fd1498Szrj do \ 336*38fd1498Szrj { \ 337*38fd1498Szrj while ((q) != _FP_WORK_ROUND) \ 338*38fd1498Szrj { \ 339*38fd1498Szrj T##_f = S##_f + (q); \ 340*38fd1498Szrj if (T##_f <= X##_f) \ 341*38fd1498Szrj { \ 342*38fd1498Szrj S##_f = T##_f + (q); \ 343*38fd1498Szrj X##_f -= T##_f; \ 344*38fd1498Szrj R##_f += (q); \ 345*38fd1498Szrj } \ 346*38fd1498Szrj _FP_FRAC_SLL_1 (X, 1); \ 347*38fd1498Szrj (q) >>= 1; \ 348*38fd1498Szrj } \ 349*38fd1498Szrj if (X##_f) \ 350*38fd1498Szrj { \ 351*38fd1498Szrj if (S##_f < X##_f) \ 352*38fd1498Szrj R##_f |= _FP_WORK_ROUND; \ 353*38fd1498Szrj R##_f |= _FP_WORK_STICKY; \ 354*38fd1498Szrj } \ 355*38fd1498Szrj } \ 356*38fd1498Szrj while (0) 357*38fd1498Szrj 358*38fd1498Szrj /* Assembly/disassembly for converting to/from integral types. 359*38fd1498Szrj No shifting or overflow handled here. */ 360*38fd1498Szrj 361*38fd1498Szrj #define _FP_FRAC_ASSEMBLE_1(r, X, rsize) ((r) = X##_f) 362*38fd1498Szrj #define _FP_FRAC_DISASSEMBLE_1(X, r, rsize) (X##_f = (r)) 363*38fd1498Szrj 364*38fd1498Szrj 365*38fd1498Szrj /* Convert FP values between word sizes. */ 366*38fd1498Szrj 367*38fd1498Szrj #define _FP_FRAC_COPY_1_1(D, S) (D##_f = S##_f) 368*38fd1498Szrj 369*38fd1498Szrj #endif /* !SOFT_FP_OP_1_H */ 370