public AstNodeStm Vbfy2() => VecVd.SetVector(index =>
        {
            switch (index)
            {
            case 0: return(VecVs[0] + VecVs[2]);

            case 1: return(VecVs[1] + VecVs[3]);

            case 2: return(VecVs[0] - VecVs[2]);

            case 3: return(VecVs[1] - VecVs[3]);

            default: throw (new InvalidOperationException("vbfy2.Assert!"));
            }
        }, _pc);
        public AstNodeStm _vcmovtf(bool True)
        {
            var register = (int)_instruction.Imm3;

            Func <int, AstNodeExpr> vcc = index =>
            {
                AstNodeExpr ret = _ast.Vcc(index);
                if (!True)
                {
                    ret = _ast.Unary("!", ret);
                }
                return(ret);
            };

            if (register < 6)
            {
                // TODO: CHECK THIS!
                return(_ast.IfElse(
                           vcc(register),
                           VecVd.SetVector(index => VecVs[index], _pc),
                           _ast.Statements(
                               _ast.Assign(_ast.PrefixSourceEnabled(), false),
                               //ast.If(ast.PrefixDestinationEnabled(), VEC_VD.SetVector(Index => VEC_VD[Index], PC))
                               _ast.If(_ast.PrefixDestinationEnabled(), VecVd.SetVector(index => VecVd[index], _pc))
                               )
                           ));
            }

            if (register == 6)
            {
                return(VecVd.SetVector(index => _ast.Ternary(vcc(index), VecVs[index], VecVd[index]), _pc));
            }

            // Register == 7

            // Never copy (checked on a PSP)
            return(_ast.Statement());
        }
 public AstNodeStm Vi2F()
 {
     return(VecVd.SetVector(
                index => _ast.CallStatic((Func <float, int, float>)MathFloat.Scalb, _ast.Cast <float>(VecVsI[index]),
                                         -(int)_instruction.Imm5), _pc));
 }
 public AstNodeStm Vmov()
 {
     PrefixTarget.Consume();
     return(VecVd.SetVector(index => VecVs[index], _pc));
 }
 public AstNodeStm Vone() => VecVd.SetVector(index => 1f, _pc);
 public AstNodeStm Vzero() => VecVd.SetVector(index => 0f, _pc);
 public AstNodeStm Vrndf2() => VecVd.SetVector(
     index => _ast.CallStatic((Func <CpuThreadState, float>)CpuEmitterUtils._vrndf2, _ast.CpuThreadStateExpr),
     _pc);
 public AstNodeStm Vrcp() => VecVd.SetVector(index => 1f / VecVs[index], _pc);
 public AstNodeStm Vidt() => VecVd.SetVector(index => (index == (_instruction.Imm7 % OneTwo)) ? 1f : 0f, _pc);
 public AstNodeStm Vmul() => VecVd.SetVector(index => VecVs[index] * VecVt[index], _pc);
 public AstNodeStm Vdiv() => VecVd.SetVector(index => VecVs[index] / VecVt[index], _pc);
 public AstNodeStm Vsub() => VecVd.SetVector(index => VecVs[index] - VecVt[index], _pc);
 public AstNodeStm Vadd() => VecVd.SetVector(index => VecVs[index] + VecVt[index], _pc);
 public AstNodeStm Vmax() => VecVd.SetVector(
     index => _ast.CallStatic((Func <float, float, float>)MathFloat.Max, VecVs[index], VecVt[index]), _pc);
 public AstNodeStm Vscl() => VecVd.SetVector(index => VecVs[index] * CelVt.Get(), _pc);
 public AstNodeStm Vneg() => VecVd.SetVector(index => - VecVs[index], _pc);
 public AstNodeStm Vsgn() =>
 VecVd.SetVector(index => _ast.CallStatic((Func <float, float>)MathFloat.Sign, VecVs[index]), _pc);
 public AstNodeStm Vwbn() => VecVd.SetVector(
     index => _ast.CallStatic((Func <float, int, float>)_vwbn_impl, VecVs[index], (int)_instruction.Imm8),
     _pc);
 private AstNodeStm _vfpu_call_ff(Delegate Delegate) =>
 VecVd.SetVector(index => _ast.CallStatic(Delegate, VecVs[index]), _pc);
 public AstNodeStm Vsge() => VecVd.SetVector(
     index => _ast.CallStatic((Func <float, float, float>)CpuEmitterUtils._vsge_impl, VecVs[index],
                              VecVt[index]), _pc);