public AstNodeStm vrot()
{
uint imm5 = Instruction.IMM5;
var CosIndex = BitUtils.Extract(imm5, 0, 2);
var SinIndex = BitUtils.Extract(imm5, 2, 2);
bool NegateSin = BitUtils.ExtractBool(imm5, 4);
var Dest = VEC_VD;
var Src = CEL_VS;
AstNodeExpr Sine = ast.CallStatic((Func<float, float>)MathFloat.SinV1, Src.Get());
AstNodeExpr Cosine = ast.CallStatic((Func<float, float>)MathFloat.CosV1, Src.Get());
if (NegateSin) Sine = -Sine;
//Console.WriteLine("{0},{1},{2}", CosIndex, SinIndex, NegateSin);
return Dest.SetVector((Index) =>
{
if (Index == CosIndex) return Cosine;
if (Index == SinIndex) return Sine;
return (SinIndex == CosIndex) ? Sine : 0f;
}, PC);
}