/* Copyright (c) 2009 Ian Piumarta
 * All rights reserved.
 * See the file COPYING for details.
 */

#include "_mpint.h"

/* r = r * a */

mp_t *mp_mul(mp_t *r, mp_t *a)
{
  if (mp_zerop(r)) return r;
  if (mp_zerop(a)) return mp_clear(r);
#if 1
  mp_t m= MP_INITIALISER;
  mp_t p= MP_INITIALISER;
  mp_t t= MP_INITIALISER;
  mp_size_t i, w= r->width;
  mp_copy(&m, a);
  for (i= 0;  i < w;  ++i) {
    mp_digit_t d= _mp_digitAt(r, i);
    mp_copy(&t, &m);
    mp_mul_d(&t, d);
    mp_add(&p, &t);
    mp_shiftl(&m, MP_BITS);
  }
  mp_copy(r, &p);
  mp_clear(&m);
  mp_clear(&p);
  mp_clear(&t);
#else
  mp_t m= MP_INITIALISER;
  mp_t p= MP_INITIALISER;
  mp_copy(&m, a);
  while (!mp_zerop(&m)) {
    if (1 & _mp_digitAt(&m, 0)) {
      mp_add(&p, r);
    }
    mp_shiftr(&m, 1);
    mp_shiftl( r, 1);
  }
  mp_copy(r, &p);
  mp_clear(&m);
  mp_clear(&p);
#endif
  return r;
}

