Lines Matching +full:vdd +full:- +full:1

8  * This C source file is part of the SoftFloat IEC/IEEE Floating-point
14 * National Science Foundation under grant MIP-9311980. The original version
15 * of this code was written as part of a project to build a fixed-point vector
28 * (1) they include prominent notice that the work is derivative, and (2) they
51 str, d->sign != 0, d->exponent, d->significand); in vfp_double_dump()
56 int bits = 31 - fls(vd->significand >> 32); in vfp_double_normalise_denormal()
58 bits = 63 - fls(vd->significand); in vfp_double_normalise_denormal()
63 vd->exponent -= bits - 1; in vfp_double_normalise_denormal()
64 vd->significand <<= bits; in vfp_double_normalise_denormal()
81 if (vd->exponent == 2047 && (vd->significand == 0 || exceptions)) in vfp_double_normaliseround()
85 * Special-case zero. in vfp_double_normaliseround()
87 if (vd->significand == 0) { in vfp_double_normaliseround()
88 vd->exponent = 0; in vfp_double_normaliseround()
92 exponent = vd->exponent; in vfp_double_normaliseround()
93 significand = vd->significand; in vfp_double_normaliseround()
95 shift = 32 - fls(significand >> 32); in vfp_double_normaliseround()
97 shift = 64 - fls(significand); in vfp_double_normaliseround()
99 exponent -= shift; in vfp_double_normaliseround()
104 vd->exponent = exponent; in vfp_double_normaliseround()
105 vd->significand = significand; in vfp_double_normaliseround()
114 significand = vfp_shiftright64jamming(significand, -exponent); in vfp_double_normaliseround()
117 vd->exponent = exponent; in vfp_double_normaliseround()
118 vd->significand = significand; in vfp_double_normaliseround()
121 if (!(significand & ((1ULL << (VFP_DOUBLE_LOW_BITS + 1)) - 1))) in vfp_double_normaliseround()
132 incr = 1ULL << VFP_DOUBLE_LOW_BITS; in vfp_double_normaliseround()
133 if ((significand & (1ULL << (VFP_DOUBLE_LOW_BITS + 1))) == 0) in vfp_double_normaliseround()
134 incr -= 1; in vfp_double_normaliseround()
137 } else if ((rmode == FPSCR_ROUND_PLUSINF) ^ (vd->sign != 0)) in vfp_double_normaliseround()
138 incr = (1ULL << (VFP_DOUBLE_LOW_BITS + 1)) - 1; in vfp_double_normaliseround()
146 exponent += 1; in vfp_double_normaliseround()
147 significand = (significand >> 1) | (significand & 1); in vfp_double_normaliseround()
148 incr >>= 1; in vfp_double_normaliseround()
150 vd->exponent = exponent; in vfp_double_normaliseround()
151 vd->significand = significand; in vfp_double_normaliseround()
158 * number) are non-zero, the result is inexact. in vfp_double_normaliseround()
160 if (significand & ((1 << (VFP_DOUBLE_LOW_BITS + 1)) - 1)) in vfp_double_normaliseround()
174 vd->exponent = 2045; in vfp_double_normaliseround()
175 vd->significand = 0x7fffffffffffffffULL; in vfp_double_normaliseround()
177 vd->exponent = 2047; /* infinity */ in vfp_double_normaliseround()
178 vd->significand = 0; in vfp_double_normaliseround()
181 if (significand >> (VFP_DOUBLE_LOW_BITS + 1) == 0) in vfp_double_normaliseround()
187 vd->exponent = exponent; in vfp_double_normaliseround()
188 vd->significand = significand >> 1; in vfp_double_normaliseround()
207 vfp_propagate_nan(struct vfp_double *vdd, struct vfp_double *vdn, in vfp_propagate_nan() argument
220 * Default NaN mode - always returns a quiet NaN in vfp_propagate_nan()
225 * Contemporary mode - select the first signalling in vfp_propagate_nan()
236 nan->significand |= VFP_DOUBLE_SIGNIFICAND_QNAN; in vfp_propagate_nan()
239 *vdd = *nan; in vfp_propagate_nan()
270 struct vfp_double vdm, vdd; in vfp_double_fsqrt() local
276 struct vfp_double *vdp = &vdd; in vfp_double_fsqrt()
294 * sqrt(+/- 0) == +/- 0 in vfp_double_fsqrt()
316 vdd.sign = 0; in vfp_double_fsqrt()
317 vdd.exponent = ((vdm.exponent - 1023) >> 1) + 1023; in vfp_double_fsqrt()
318 vdd.significand = (u64)vfp_estimate_sqrt_significand(vdm.exponent, vdm.significand >> 32) << 31; in vfp_double_fsqrt()
320 vfp_double_dump("sqrt estimate1", &vdd); in vfp_double_fsqrt()
322 vdm.significand >>= 1 + (vdm.exponent & 1); in vfp_double_fsqrt()
323 vdd.significand += 2 + vfp_estimate_div128to64(vdm.significand, 0, vdd.significand); in vfp_double_fsqrt()
325 vfp_double_dump("sqrt estimate2", &vdd); in vfp_double_fsqrt()
330 if ((vdd.significand & VFP_DOUBLE_LOW_BITS_MASK) <= 5) { in vfp_double_fsqrt()
331 if (vdd.significand < 2) { in vfp_double_fsqrt()
332 vdd.significand = ~0ULL; in vfp_double_fsqrt()
336 mul64to128(&termh, &terml, vdd.significand, vdd.significand); in vfp_double_fsqrt()
339 vdd.significand -= 1; in vfp_double_fsqrt()
340 shift64left(&termh, &terml, vdd.significand); in vfp_double_fsqrt()
341 terml |= 1; in vfp_double_fsqrt()
344 vdd.significand |= (remh | reml) != 0; in vfp_double_fsqrt()
347 vdd.significand = vfp_shiftright64jamming(vdd.significand, 1); in vfp_double_fsqrt()
349 return vfp_double_normaliseround(dd, &vdd, fpscr, 0, "fsqrt"); in vfp_double_fsqrt()
366 if (signal_on_qnan || !(vfp_double_packed_mantissa(m) & (1ULL << (VFP_DOUBLE_MANTISSA_BITS - 1)))) in vfp_compare()
376 if (signal_on_qnan || !(vfp_double_packed_mantissa(d) & (1ULL << (VFP_DOUBLE_MANTISSA_BITS - 1)))) in vfp_compare()
426 return vfp_compare(dd, 1, dm, fpscr); in vfp_double_fcmpe()
436 return vfp_compare(dd, 1, VFP_REG_ZERO, fpscr); in vfp_double_fcmpez()
473 vsd.exponent = vdm.exponent - (1023 - 127); in vfp_double_fcvts()
488 vdm.exponent = 1023 + 63 - 1; in vfp_double_fuito()
500 vdm.exponent = 1023 + 63 - 1; in vfp_double_fsito()
501 vdm.significand = vdm.sign ? -m : m; in vfp_double_fsito()
528 } else if (vdm.exponent >= 1023 - 1) { in vfp_double_ftoui()
529 int shift = 1023 + 63 - vdm.exponent; in vfp_double_ftoui()
533 * 2^0 <= m < 2^32-2^8 in vfp_double_ftoui()
535 d = (vdm.significand << 1) >> shift; in vfp_double_ftoui()
536 rem = vdm.significand << (65 - shift); in vfp_double_ftoui()
540 if ((d & 1) == 0) in vfp_double_ftoui()
541 incr -= 1; in vfp_double_ftoui()
550 d += 1; in vfp_double_ftoui()
565 d = 1; in vfp_double_ftoui()
610 } else if (vdm.exponent >= 1023 - 1) { in vfp_double_ftosi()
611 int shift = 1023 + 63 - vdm.exponent; /* 58 */ in vfp_double_ftosi()
614 d = (vdm.significand << 1) >> shift; in vfp_double_ftosi()
615 rem = vdm.significand << (65 - shift); in vfp_double_ftosi()
619 if ((d & 1) == 0) in vfp_double_ftosi()
620 incr -= 1; in vfp_double_ftosi()
628 d += 1; in vfp_double_ftosi()
636 d = -d; in vfp_double_ftosi()
642 d = 1; in vfp_double_ftosi()
644 d = -1; in vfp_double_ftosi()
683 vfp_double_fadd_nonnumber(struct vfp_double *vdd, struct vfp_double *vdn, in vfp_double_fadd_nonnumber() argument
697 if (vdn->sign ^ vdm->sign) { in vfp_double_fadd_nonnumber()
699 * different signs -> invalid in vfp_double_fadd_nonnumber()
705 * same signs -> valid in vfp_double_fadd_nonnumber()
711 * One infinity and one number -> infinity in vfp_double_fadd_nonnumber()
718 return vfp_propagate_nan(vdd, vdn, vdm, fpscr); in vfp_double_fadd_nonnumber()
720 *vdd = *vdp; in vfp_double_fadd_nonnumber()
725 vfp_double_add(struct vfp_double *vdd, struct vfp_double *vdn, in vfp_double_add() argument
731 if (vdn->significand & (1ULL << 63) || in vfp_double_add()
732 vdm->significand & (1ULL << 63)) { in vfp_double_add()
743 if (vdn->exponent < vdm->exponent) { in vfp_double_add()
753 if (vdn->exponent == 2047) in vfp_double_add()
754 return vfp_double_fadd_nonnumber(vdd, vdn, vdm, fpscr); in vfp_double_add()
761 *vdd = *vdn; in vfp_double_add()
766 exp_diff = vdn->exponent - vdm->exponent; in vfp_double_add()
767 m_sig = vfp_shiftright64jamming(vdm->significand, exp_diff); in vfp_double_add()
772 if (vdn->sign ^ vdm->sign) { in vfp_double_add()
773 m_sig = vdn->significand - m_sig; in vfp_double_add()
775 vdd->sign = vfp_sign_negate(vdd->sign); in vfp_double_add()
776 m_sig = -m_sig; in vfp_double_add()
778 vdd->sign = (fpscr & FPSCR_RMODE_MASK) == in vfp_double_add()
782 m_sig += vdn->significand; in vfp_double_add()
784 vdd->significand = m_sig; in vfp_double_add()
790 vfp_double_multiply(struct vfp_double *vdd, struct vfp_double *vdn, in vfp_double_multiply() argument
801 if (vdn->exponent < vdm->exponent) { in vfp_double_multiply()
805 pr_debug("VFP: swapping M <-> N\n"); in vfp_double_multiply()
808 vdd->sign = vdn->sign ^ vdm->sign; in vfp_double_multiply()
813 if (vdn->exponent == 2047) { in vfp_double_multiply()
814 if (vdn->significand || (vdm->exponent == 2047 && vdm->significand)) in vfp_double_multiply()
815 return vfp_propagate_nan(vdd, vdn, vdm, fpscr); in vfp_double_multiply()
816 if ((vdm->exponent | vdm->significand) == 0) { in vfp_double_multiply()
817 *vdd = vfp_double_default_qnan; in vfp_double_multiply()
820 vdd->exponent = vdn->exponent; in vfp_double_multiply()
821 vdd->significand = 0; in vfp_double_multiply()
829 if ((vdm->exponent | vdm->significand) == 0) { in vfp_double_multiply()
830 vdd->exponent = 0; in vfp_double_multiply()
831 vdd->significand = 0; in vfp_double_multiply()
837 * as the addition case - though this time we have +1 from in vfp_double_multiply()
840 vdd->exponent = vdn->exponent + vdm->exponent - 1023 + 2; in vfp_double_multiply()
841 vdd->significand = vfp_hi64multiply64(vdn->significand, vdm->significand); in vfp_double_multiply()
843 vfp_double_dump("VDD", vdd); in vfp_double_multiply()
847 #define NEG_MULTIPLY (1 << 0)
848 #define NEG_SUBTRACT (1 << 1)
853 struct vfp_double vdd, vdp, vdn, vdm; in vfp_double_multiply_accumulate() local
874 exceptions |= vfp_double_add(&vdd, &vdn, &vdp, fpscr); in vfp_double_multiply_accumulate()
876 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, func); in vfp_double_multiply_accumulate()
892 * sd = sd - (sn * sm)
900 * sd = -sd + (sn * sm)
908 * sd = -sd - (sn * sm)
920 struct vfp_double vdd, vdn, vdm; in vfp_double_fmul() local
931 exceptions = vfp_double_multiply(&vdd, &vdn, &vdm, fpscr); in vfp_double_fmul()
932 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fmul"); in vfp_double_fmul()
936 * sd = -(sn * sm)
940 struct vfp_double vdd, vdn, vdm; in vfp_double_fnmul() local
951 exceptions = vfp_double_multiply(&vdd, &vdn, &vdm, fpscr); in vfp_double_fnmul()
952 vdd.sign = vfp_sign_negate(vdd.sign); in vfp_double_fnmul()
954 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fnmul"); in vfp_double_fnmul()
962 struct vfp_double vdd, vdn, vdm; in vfp_double_fadd() local
973 exceptions = vfp_double_add(&vdd, &vdn, &vdm, fpscr); in vfp_double_fadd()
975 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fadd"); in vfp_double_fadd()
979 * sd = sn - sm
983 struct vfp_double vdd, vdn, vdm; in vfp_double_fsub() local
999 exceptions = vfp_double_add(&vdd, &vdn, &vdm, fpscr); in vfp_double_fsub()
1001 return vfp_double_normaliseround(dd, &vdd, fpscr, exceptions, "fsub"); in vfp_double_fsub()
1009 struct vfp_double vdd, vdn, vdm; in vfp_double_fdiv() local
1016 vdd.sign = vdn.sign ^ vdm.sign; in vfp_double_fdiv()
1066 vdd.exponent = vdn.exponent - vdm.exponent + 1023 - 1; in vfp_double_fdiv()
1067 vdm.significand <<= 1; in vfp_double_fdiv()
1069 vdn.significand >>= 1; in vfp_double_fdiv()
1070 vdd.exponent++; in vfp_double_fdiv()
1072 vdd.significand = vfp_estimate_div128to64(vdn.significand, 0, vdm.significand); in vfp_double_fdiv()
1073 if ((vdd.significand & 0x1ff) <= 2) { in vfp_double_fdiv()
1075 mul64to128(&termh, &terml, vdm.significand, vdd.significand); in vfp_double_fdiv()
1078 vdd.significand -= 1; in vfp_double_fdiv()
1081 vdd.significand |= (reml != 0); in vfp_double_fdiv()
1083 return vfp_double_normaliseround(dd, &vdd, fpscr, 0, "fdiv"); in vfp_double_fdiv()
1086 exceptions = vfp_propagate_nan(&vdd, &vdn, &vdm, fpscr); in vfp_double_fdiv()
1088 vfp_put_double(vfp_double_pack(&vdd), dd); in vfp_double_fdiv()
1092 exceptions = vfp_propagate_nan(&vdd, &vdm, &vdn, fpscr); in vfp_double_fdiv()
1096 vdd.exponent = 0; in vfp_double_fdiv()
1097 vdd.significand = 0; in vfp_double_fdiv()
1103 vdd.exponent = 2047; in vfp_double_fdiv()
1104 vdd.significand = 0; in vfp_double_fdiv()
1137 vecstride = (1 + ((fpscr & FPSCR_STRIDE_MASK) == FPSCR_STRIDE_MASK)); in vfp_double_cpdo()
1145 if (fop->flags & OP_SD) in vfp_double_cpdo()
1153 if (fop->flags & OP_SM) in vfp_double_cpdo()
1159 * If destination bank is zero, vector length is always '1'. in vfp_double_cpdo()
1162 if ((fop->flags & OP_SCALAR) || (FREG_BANK(dest) == 0)) in vfp_double_cpdo()
1168 (veclen >> FPSCR_LENGTH_BIT) + 1); in vfp_double_cpdo()
1170 if (!fop->fn) in vfp_double_cpdo()
1173 for (vecitr = 0; vecitr <= veclen; vecitr += 1 << FPSCR_LENGTH_BIT) { in vfp_double_cpdo()
1177 type = fop->flags & OP_SD ? 's' : 'd'; in vfp_double_cpdo()
1187 except = fop->fn(dest, dn, dm, fpscr); in vfp_double_cpdo()