private static DecimalImpl mulInt(final long d1Base, final long d2Base, final int d2Factor)
  {
	final long d1_1 = d1Base / MUL_COMPONENT;
	final long d1_2 = d1Base % MUL_COMPONENT;
	final long d2_1 = d2Base / MUL_COMPONENT;
	final long d2_2 = d2Base % MUL_COMPONENT;
	final long r11 = d1_1 * d2_1;
	final long r12 = d1_1 * d2_2;
	final long r21 = d1_2 * d2_1;
	final long r22 = d1_2 * d2_2;
	if (r11 == 0)
	{ // few numbers only
	  final long r2 = r12 + r21;
	  final int scale2 = DPU.findFactorByLimit(r2);
	  final long base2 = DPU.getScaledBase(r2, scale2);
	  final int scale3 = MUL_SCALE_2 - scale2;
	  final long base3 = DPU.getScaledBase(r22, -scale3);
	  return safegetInstance(base2 + base3, d2Factor - MUL_SCALE_2 + scale2);
	}
	else
	{
	  final int scale1 = DPU.findFactorByLimit(r11);
	  final long base1 = DPU.getScaledBase(r11, scale1);
	  final int scale2 = MUL_SCALE_2 - scale1;
	  final long base2 = DPU.getScaledBase(r12 + r21, -scale2);
	  final int scale3 = MUL_SCALE_2 + scale2;
	  final long base3 = DPU.getScaledBase(r22 + (scale2 > 0 ? ((r12 + r21) % DPU.getScale(scale2)) : 0), -scale3);
	  return safegetInstance(base1 + base2 + base3, d2Factor - MUL_SCALE_2 - MUL_SCALE_2 + scale1);
	}
  }