typedef union {
  struct {
  unsigned int msw;
  unsigned int lsw;
} s;
  long v;
} u;

long __mulsi3(u a, u b)
{
  int s;
  long pp1;
  long pp2;
  long r;

  if (a.s.msw == 0 &&
      b.s.msw == 0)
    {
      return (long)a.s.lsw * b.s.lsw;
    }

  s = 0;
  if (a.v < 0)
    {
      s = 1;
      a.v = - a.v;
    }
  if (b.v < 0)
    { 
      s = 1-s;
      b.v = - b.v;
    }

  pp1 = (long)a.s.lsw * b.s.lsw ;
  pp2 = (long)a.s.lsw * b.s.msw + (long)a.s.msw * b.s.lsw;

  pp1 += pp2 << 16;

  if (s)
    {
      pp1 = -pp1;
    }
  return pp1;
}
long __mulpsi3(long a, long b)
{
 return a*b;
}


short 
__mulhi3(short a, short b)
{
  int r;

  r = 0;
  while (a) 
    {
      if (a & 1) 
	{
	  r += b;

	}
      b<<=1;
      a>>=1;

    }
  return r;
}