i1 += i0 << S(12);
i1 += i0 >> S(12);
operator*(const PSeed<T1>& s1, const PSeed<T2>& s2){  typename BinaryReturn<PSeed<T1>, PSeed<T2>, OpMultiply>::Type_t  d;  typedef typename BinaryReturn<T1, T2, OpMultiply>::Type_t  T;  typedef typename InternalScalar<T>::Type_t  S;  T  i0, i1, i2, i3;  /* i3 = s1(3)*s2(0) + s1(2)*s2(1) + s1(1)*s2(2) + s1(0)*s2(3) */  i3  = s1.elem(3) * s2.elem(0);  i3 += s1.elem(2) * s2.elem(1);  i3 += s1.elem(1) * s2.elem(2);  i3 += s1.elem(0) * s2.elem(3);  /* i2 = s1(2)*s2(0) + s1(1)*s2(1) + s1(0)*s2(2) */  i2  = s1.elem(2) * s2.elem(0);  i2 += s1.elem(1) * s2.elem(1);  i2 += s1.elem(0) * s2.elem(2);  /* i1 = s1(1)*s2(0) + s1(0)*s2(1) */  i1  = s1.elem(1) * s2.elem(0);  i1 += s1.elem(0) * s2.elem(1);  /* i0 = s1(0)*s2(0) */  i0 = s1.elem(0) * s2.elem(0);  /* dest(0) = mod(i0, 4096) */  d.elem(0) = i0 & S(4095);  /* i1 = i1 + i0/4096 */  i1 += i0 << S(12);  /* dest(1) = mod(i1, 4096) */  d.elem(1) = i1 & S(4095);  /* i2 = i2 + i1/4096 */  i2 += i1 << S(12);  /* dest(2) = mod(i2, 4096) */  d.elem(2) = i2 & S(4095);  /* i3 = i3 + i2/4096 */  i3 += i2 << S(12);  /* dest(3) = mod(i3, 2048) */  d.elem(3) = i3 & S(2047);  return d;}