private Expression RewriteCondition(Expression left, Expression right) { Expression e; switch (instr.Condition.Type) { case ConditionType.Tr: e = Constant.True(); break; case ConditionType.Never: e = Constant.False(); break; case ConditionType.Eq: case ConditionType.Eq64: e = m.Eq(left, right); break; case ConditionType.Ne: case ConditionType.Ne64: e = m.Ne(left, right); break; case ConditionType.Lt: e = m.Lt(left, right); break; case ConditionType.Le: e = m.Le(left, right); break; case ConditionType.Ge: case ConditionType.Ge64: e = m.Ge(left, right); break; case ConditionType.Gt: e = m.Gt(left, right); break; case ConditionType.Ult: e = m.Ult(left, right); break; case ConditionType.Ule: e = m.Ule(left, right); break; case ConditionType.Uge: case ConditionType.Uge64: e = m.Uge(left, right); break; case ConditionType.Ugt: e = m.Ugt(left, right); break; case ConditionType.Nuv: case ConditionType.Nuv64: e = m.Test(ConditionCode.OV, m.ISub(left, right)); break; case ConditionType.Nsv: //$TODO: need signed minus/unsigned minus. e = m.Test(ConditionCode.OV, m.ISub(left, right)); break; case ConditionType.Even: case ConditionType.Even64: e = m.Eq0(m.And(left, 1)); break; default: throw new NotImplementedException(instr.Condition.ToString()); } return(e); }
private Expression SignedCondition(int iop, Expression left, Expression right) { var mm = ((ImmediateOperand)instr.Operands[iop]).Value.ToInt32(); return(mm switch { 2 => m.Gt(left, right), 4 => m.Lt(left, right), 6 => m.Ne(left, right), 8 => m.Eq(left, right), 0xA => m.Ge(left, right), 0xC => m.Le(left, right), _ => Constant.False() });
private Expression RewriteCondition(Expression left, Expression right) { Expression e; switch (instr.Condition.Type) { case ConditionType.Tr: e = Constant.True(); break; case ConditionType.Never: case ConditionType.Never64: e = Constant.False(); break; case ConditionType.Eq: case ConditionType.Eq64: e = m.Eq(left, right); break; case ConditionType.Ne: case ConditionType.Ne64: e = m.Ne(left, right); break; case ConditionType.Lt: case ConditionType.Lt64: e = m.Lt(left, right); break; case ConditionType.Le: case ConditionType.Le64: e = m.Le(left, right); break; case ConditionType.Ge: case ConditionType.Ge64: e = m.Ge(left, right); break; case ConditionType.Gt: case ConditionType.Gt64: e = m.Gt(left, right); break; case ConditionType.Ult: case ConditionType.Ult64: e = m.Ult(left, right); break; case ConditionType.Ule: case ConditionType.Ule64: e = m.Ule(left, right); break; case ConditionType.Uge: case ConditionType.Uge64: e = m.Uge(left, right); break; case ConditionType.Ugt: case ConditionType.Ugt64: e = m.Ugt(left, right); break; case ConditionType.Uv: case ConditionType.Uv64: e = m.Test(ConditionCode.NO, m.USub(left, right)); break; case ConditionType.Sv: case ConditionType.Sv64: e = m.Test(ConditionCode.NO, m.ISub(left, right)); break; case ConditionType.Nuv: case ConditionType.Nuv64: e = m.Test(ConditionCode.OV, m.USub(left, right)); break; case ConditionType.Nsv: case ConditionType.Nsv64: e = m.Test(ConditionCode.OV, m.ISub(left, right)); break; case ConditionType.Even: case ConditionType.Even64: e = m.Eq0(m.And(left, 1)); break; case ConditionType.Odd: case ConditionType.Odd64: e = m.Ne0(m.And(left, 1)); break; case ConditionType.Vnz: case ConditionType.Vnz64: e = m.And(m.Eq(left, right), m.Test(ConditionCode.NO, m.ISub(left, right))); break; case ConditionType.Znv: case ConditionType.Znv64: e = m.And(m.Ne(left, right), m.Test(ConditionCode.OV, m.ISub(left, right))); break; default: throw new NotImplementedException(instr.Condition.ToString()); } return(e); }