struct fp_ext * fp_fsgldiv(struct fp_ext *dest, struct fp_ext *src) { int exp; unsigned long quot, rem; dprint(PINSTR, "fsgldiv\n"); fp_dyadic_check(dest, src); /* calculate the correct sign now, as it's necessary for infinities */ dest->sign = src->sign ^ dest->sign; /* Handle infinities */ if (IS_INF(dest)) { /* infinity / infinity = NaN (quiet, as always) */ if (IS_INF(src)) fp_set_nan(dest); /* infinity / anything else = infinity (with approprate sign) */ return dest; } if (IS_INF(src)) { /* anything / infinity = zero (with appropriate sign) */ dest->exp = 0; dest->mant.m64 = 0; dest->lowmant = 0; return dest; } /* zeroes */ if (IS_ZERO(dest)) { /* zero / zero = NaN */ if (IS_ZERO(src)) fp_set_nan(dest); /* zero / anything else = zero */ return dest; } if (IS_ZERO(src)) { /* anything / zero = infinity (with appropriate sign) */ fp_set_sr(FPSR_EXC_DZ); dest->exp = 0x7fff; dest->mant.m64 = 0; return dest; } exp = dest->exp - src->exp + 0x3fff; dest->mant.m32[0] &= 0xffffff00; src->mant.m32[0] &= 0xffffff00; /* do the 32-bit divide */ if (dest->mant.m32[0] >= src->mant.m32[0]) { fp_sub64(dest->mant, src->mant); fp_div64(quot, rem, dest->mant.m32[0], 0, src->mant.m32[0]); dest->mant.m32[0] = 0x80000000 | (quot >> 1); dest->mant.m32[1] = (quot & 1) | rem; /* only for rounding */ } else {
struct fp_ext * fp_fsgldiv(struct fp_ext *dest, struct fp_ext *src) { int exp; unsigned long quot, rem; dprint(PINSTR, "fsgldiv\n"); fp_dyadic_check(dest, src); /* */ dest->sign = src->sign ^ dest->sign; /* */ if (IS_INF(dest)) { /* */ if (IS_INF(src)) fp_set_nan(dest); /* */ return dest; } if (IS_INF(src)) { /* */ dest->exp = 0; dest->mant.m64 = 0; dest->lowmant = 0; return dest; } /* */ if (IS_ZERO(dest)) { /* */ if (IS_ZERO(src)) fp_set_nan(dest); /* */ return dest; } if (IS_ZERO(src)) { /* */ fp_set_sr(FPSR_EXC_DZ); dest->exp = 0x7fff; dest->mant.m64 = 0; return dest; } exp = dest->exp - src->exp + 0x3fff; dest->mant.m32[0] &= 0xffffff00; src->mant.m32[0] &= 0xffffff00; /* */ if (dest->mant.m32[0] >= src->mant.m32[0]) { fp_sub64(dest->mant, src->mant); fp_div64(quot, rem, dest->mant.m32[0], 0, src->mant.m32[0]); dest->mant.m32[0] = 0x80000000 | (quot >> 1); dest->mant.m32[1] = (quot & 1) | rem; /* */ } else {