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