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