BID128_FUNCTION_ARG2_NORND ( bid128_rem, x, y) BID_UINT256 P256; BID_UINT128 CX, CY, CX2, CQ, CR, T, CXS, P128, res; BID_UINT64 sign_x, sign_y, valid_y; BID_SINT64 D; int_float f64, fx; int exponent_x, exponent_y, diff_expon, bin_expon_cx, scale, scale0; BID_OPT_SAVE_BINARY_FLAGS() // unpack arguments, check for NaN or Infinity valid_y = unpack_BID128_value (&sign_y, &exponent_y, &CY, y); if (!unpack_BID128_value (&sign_x, &exponent_x, &CX, x)) { #ifdef BID_SET_STATUS_FLAGS if ((y.w[1] & SNAN_MASK64) == SNAN_MASK64) // y is sNaN __set_status_flags (pfpsf, BID_INVALID_EXCEPTION); #endif // test if x is NaN if ((x.w[1] & 0x7c00000000000000ull) == 0x7c00000000000000ull) { #ifdef BID_SET_STATUS_FLAGS if ((x.w[1] & SNAN_MASK64) == SNAN_MASK64) // y is sNaN __set_status_flags (pfpsf, BID_INVALID_EXCEPTION); #endif res.w[1] = CX.w[1] & QUIET_MASK64; res.w[0] = CX.w[0]; BID_RETURN (res);
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see <http://www.gnu.org/licenses/>. */ #define BID_128RES #include "bid_internal.h" BID128_FUNCTION_ARG2 (bid128_quantize, x, y) UINT256 CT; UINT128 CX, CY, T, CX2, CR, Stemp, res, REM_H, C2N; UINT64 sign_x, sign_y, remainder_h, carry, CY64, valid_x; int_float tempx; int exponent_x, exponent_y, digits_x, extra_digits, amount; int expon_diff, total_digits, bin_expon_cx, rmode, status; valid_x = unpack_BID128_value (&sign_x, &exponent_x, &CX, x); // unpack arguments, check for NaN or Infinity if (!unpack_BID128_value (&sign_y, &exponent_y, &CY, y)) { // y is Inf. or NaN #ifdef SET_STATUS_FLAGS if ((x.w[1] & SNAN_MASK64) == SNAN_MASK64) // y is sNaN __set_status_flags (pfpsf, INVALID_EXCEPTION); #endif // test if y is NaN if ((y.w[1] & 0x7c00000000000000ull) == 0x7c00000000000000ull) { #ifdef SET_STATUS_FLAGS if ((y.w[1] & 0x7e00000000000000ull) == 0x7e00000000000000ull) { // set status flags __set_status_flags (pfpsf, INVALID_EXCEPTION);