static void decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn) { decContext set; decContextDefault (&set, DEC_INIT_DECIMAL128); set.traps = 0; switch (r->cl) { case rvc_zero: decNumberZero (dn); break; case rvc_inf: decNumberFromString (dn, (char *)"Infinity", &set); break; case rvc_nan: if (r->signalling) decNumberFromString (dn, (char *)"snan", &set); else decNumberFromString (dn, (char *)"nan", &set); break; case rvc_normal: gcc_assert (r->decimal); decimal128ToNumber ((decimal128 *) r->sig, dn); break; default: gcc_unreachable (); } /* Fix up sign bit. */ if (r->sign != decNumberIsNegative (dn)) dn->bits ^= DECNEG; }
static void decimal_to_decnumber (const REAL_VALUE_TYPE *r, decNumber *dn) { decContext set; decContextDefault (&set, DEC_INIT_DECIMAL128); set.traps = 0; switch (r->cl) { case rvc_zero: decNumberZero (dn); break; case rvc_inf: decNumberFromString (dn, "Infinity", &set); break; case rvc_nan: if (r->signalling) decNumberFromString (dn, "snan", &set); else decNumberFromString (dn, "nan", &set); break; case rvc_normal: if (!r->decimal) { /* dconst{1,2,m1,half} are used in various places in the middle-end and optimizers, allow them here as an exception by converting them to decimal. */ if (memcmp (r, &dconst1, sizeof (*r)) == 0) { decNumberFromString (dn, "1", &set); break; } if (memcmp (r, &dconst2, sizeof (*r)) == 0) { decNumberFromString (dn, "2", &set); break; } if (memcmp (r, &dconstm1, sizeof (*r)) == 0) { decNumberFromString (dn, "-1", &set); break; } if (memcmp (r, &dconsthalf, sizeof (*r)) == 0) { decNumberFromString (dn, "0.5", &set); break; } gcc_unreachable (); } decimal128ToNumber ((const decimal128 *) r->sig, dn); break; default: gcc_unreachable (); } /* Fix up sign bit. */ if (r->sign != decNumberIsNegative (dn)) dn->bits ^= DECNEG; }
char * decimal128ToEngString (const decimal128 *d128, char *string) { decNumber dn; /* work */ decimal128ToNumber (d128, &dn); decNumberToEngString (&dn, string); return string; }
int isinfd128 (_Decimal128 arg) { decNumber dn; decimal128 d128; __host_to_ieee_128 (arg, &d128); decimal128ToNumber (&d128, &dn); return (decNumberIsInfinite (&dn)); }
/* Two little utility routines to convert decimal128s to decNumbers and back and to * extract elements form a decimal128 matrix. */ static void matrix_get128(decNumber *r, const decimal128 *base, int row, int col, int ncols) { decimal128ToNumber(base + matrix_idx(row, col, ncols), r); }