73 lines
		
	
	
		
			762 B
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			73 lines
		
	
	
		
			762 B
		
	
	
	
		
			C
		
	
	
	
 | 
						|
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;
 | 
						|
}
 | 
						|
 | 
						|
 |