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; }