CSPspEmu.Core.Cpu.Emitter.CpuEmitter.vcmp C# (CSharp) Method

vcmp() public method

public vcmp ( ) : AstNodeStm
return AstNodeStm
        public AstNodeStm vcmp()
        {
            var VectorSize = Instruction.ONE_TWO;
            var Cond = Instruction.IMM4;
            var Cond2 = (ConditionEnum)Cond;
            //bool NormalFlag = (Cond & 8) == 0;
            //bool NotFlag = (Cond & 4) != 0;
            //uint TypeFlag = (Cond & 3);

            var Local_CC_TEMP = ast.Local(AstLocal.Create<bool>());
            var Local_CC_OR = ast.Local(AstLocal.Create<bool>());
            var Local_CC_AND = ast.Local(AstLocal.Create<bool>());

            return ast.Statements(
                ast.Assign(Local_CC_OR, false),
                ast.Assign(Local_CC_AND, true),

                // TODO: CHECK THIS!
                ast.AssignVCC(0, true),
                ast.AssignVCC(1, true),
                ast.AssignVCC(2, true),
                ast.AssignVCC(3, true),

                _List(VectorSize, (Index) =>
                {
                    AstNodeExpr Expr;
                    //bool UsedForAggregate;

                    var Left = VEC_VS[Index];
                    var Right = VEC_VT[Index];
                    switch (Cond2)
                    {
                        case ConditionEnum.VC_FL: Expr = ast.Immediate(false); break;
                        case ConditionEnum.VC_EQ: Expr = ast.Binary(Left, "==", Right); break;
                        case ConditionEnum.VC_LT: Expr = ast.Binary(Left, "<", Right); break;
                        //case ConditionEnum.VC_LE: Expr = ast.Binary(Left, "<=", Right); break;
                        case ConditionEnum.VC_LE: Expr = ast.CallStatic((Func<float, float, bool>)MathFloat.IsLessOrEqualsThan, Left, Right); break;

                        case ConditionEnum.VC_TR: Expr = ast.Immediate(true); break;
                        case ConditionEnum.VC_NE: Expr = ast.Binary(Left, "!=", Right); break;
                        //case ConditionEnum.VC_GE: Expr = ast.Binary(Left, ">=", Right); break;
                        case ConditionEnum.VC_GE: Expr = ast.CallStatic((Func<float, float, bool>)MathFloat.IsGreatOrEqualsThan, Left, Right); break;
                        case ConditionEnum.VC_GT: Expr = ast.Binary(Left, ">", Right); break;

                        case ConditionEnum.VC_EZ: Expr = ast.Binary(ast.Binary(Left, "==", 0.0f), "||", ast.Binary(Left, "==", -0.0f)); break;
                        case ConditionEnum.VC_EN: Expr = ast.CallStatic((Func<float, bool>)MathFloat.IsNan, Left); break;
                        case ConditionEnum.VC_EI: Expr = ast.CallStatic((Func<float, bool>)MathFloat.IsInfinity, Left); break;
                        case ConditionEnum.VC_ES: Expr = ast.CallStatic((Func<float, bool>)MathFloat.IsNanOrInfinity, Left); break;   // Tekken Dark Resurrection

                        case ConditionEnum.VC_NZ: Expr = ast.Binary(Left, "!=", 0f); break;
                        case ConditionEnum.VC_NN: Expr = ast.Unary("!", ast.CallStatic((Func<float, bool>)MathFloat.IsNan, Left)); break;
                        case ConditionEnum.VC_NI: Expr = ast.Unary("!", ast.CallStatic((Func<float, bool>)MathFloat.IsInfinity, Left)); break;
                        case ConditionEnum.VC_NS: Expr = ast.Unary("!", ast.CallStatic((Func<float, bool>)MathFloat.IsNanOrInfinity, Left)); break;

                        default: throw (new InvalidOperationException());
                    }

                    var Statements = new List<AstNodeStm>();
                    Statements.Add(ast.Assign(Local_CC_TEMP, Expr));
                    Statements.Add(ast.AssignVCC(Index, Local_CC_TEMP));
                    Statements.Add(ast.Assign(Local_CC_OR, ast.Binary(Local_CC_OR, "||", Local_CC_TEMP)));
                    Statements.Add(ast.Assign(Local_CC_AND, ast.Binary(Local_CC_AND, "&&", Local_CC_TEMP)));

                    return ast.Statements(Statements);
                }),
                ast.AssignVCC(4, Local_CC_OR),
                ast.AssignVCC(5, Local_CC_AND)
            );
        }
CpuEmitter