#include "intlong.h"
extern void norm(bit16 *a, bit16 *b);
extern bit32 scprod(void);

void xrotate(bit16 *v, bit16 x)
{
  bit16 t[3];
  t[0] = v[6];
  t[1] = v[7];
  t[2] = v[8];
  v[6] -= div14(mul16(v[3],x));
  v[7] -= div14(mul16(v[4],x));
  v[8] -= div14(mul16(v[5],x));
  v[3] += div14(mul16(t[0],x));
  v[4] += div14(mul16(t[1],x));
  v[5] += div14(mul16(t[2],x));
  norm(v+3,v+3);
  norm(v+6,v+6);
}

void yrotate(bit16 *v, bit16 x)
{
  bit16 t[3];
  t[0] = v[6];
  t[1] = v[7];
  t[2] = v[8];
  v[6] -= div14(mul16(v[0],x));
  v[7] -= div14(mul16(v[1],x));
  v[8] -= div14(mul16(v[2],x));
  v[0] += div14(mul16(t[0],x));
  v[1] += div14(mul16(t[1],x));
  v[2] += div14(mul16(t[2],x));
  norm(v,v);
  norm(v+3,v+3);
}

void norm(bit16 *a, bit16 *b)
{
  register bit32 v = mul16(a[0],a[0])+mul16(a[1],a[1])+mul16(a[2],a[2]);
  bit16 g,m;
  if((v < 268304400l) || (v > 268566544l)) {
    g = 0;
    for(m=16384; m != 0; m /= 2) {
      g |= m;
      if(mul16(g,g) > v) {
        g ^= m;
      }
    }
    b[0] = mul16(a[0],16384) / g;
    b[1] = mul16(a[1],16384) / g;
    b[2] = mul16(a[2],16384) / g;
  }
}
