void* decSingleShift (decSingle* _0, const decSingle* _1, const decSingle* _2, decContext* ctx) noexcept { decNumber _0num; decNumber _1num; decNumber _2num; decSingleToNumber (_1, &_1num); decSingleToNumber (_2, &_2num); decNumberShift (&_0num, &_1num, &_2num, ctx); return decSingleFromNumber (_0, &_0num, ctx); }
DEC_TYPE FUNC_NAME (_Decimal128 hi, _Decimal128 mid, _Decimal128 low) { DEC_TYPE result; /* hi = m_hi * 10^34 * mid = m_mid * 10^17 * low = m_low * 10^0 * * Note, m_hi is only at most 5 digits for int128. */ decNumber dn_hi, dn_mid, dn_low, dn_result; decNumber dn_hi_s, dn_mid_s, dn_result_s; decNumber dn_17, dn_34; decContext context; decContextDefault (&context, DEC_INIT_DECIMAL128); /* Hack, we're using 39 digits here. */ context.digits = 39; decNumberFromInt32(&dn_17, 17); decNumberFromInt32(&dn_34, 34); __DECIMAL_TO_DECNUMBER (&hi, &dn_hi, 128); __DECIMAL_TO_DECNUMBER (&mid, &dn_mid, 128); __DECIMAL_TO_DECNUMBER (&low, &dn_low, 128); /* Rotate addends into proper position. */ decNumberShift(&dn_hi_s,&dn_hi,&dn_34,&context); decNumberShift(&dn_mid_s,&dn_mid,&dn_17,&context); /* Sum the three components. */ decNumberAdd(&dn_result_s, &dn_hi_s, &dn_mid_s, &context); decNumberAdd(&dn_result, &dn_result_s, &dn_low, &context); /* Convert to the destination format. */ FUNC_CONVERT_FROM_DN (&dn_result, &result, &context); /* Don't care about exceptions here... I don't think. */ return result; }