private TestCondition GenerateTestExpression(ConditionOperand cOp, bool invert) { ConditionCode cc = ConditionCode.ALWAYS; FlagM flags = 0; switch (cOp.Code) { case CondCode.nz: cc = invert ? ConditionCode.EQ : ConditionCode.NE; flags = FlagM.ZF; break; case CondCode.z: cc = invert ? ConditionCode.NE : ConditionCode.EQ; flags = FlagM.ZF; break; case CondCode.nc: cc = invert ? ConditionCode.ULT : ConditionCode.UGE; flags = FlagM.CF; break; case CondCode.c: cc = invert ? ConditionCode.UGE : ConditionCode.ULT; flags = FlagM.CF; break; case CondCode.po: cc = invert ? ConditionCode.PE : ConditionCode.PO; flags = FlagM.PF; break; case CondCode.pe: cc = invert ? ConditionCode.PO : ConditionCode.PE; flags = FlagM.PF; break; case CondCode.p: cc = invert ? ConditionCode.SG : ConditionCode.NS; flags = FlagM.PF; break; case CondCode.m: cc = invert ? ConditionCode.NS : ConditionCode.SG; flags = FlagM.PF; break; } return(emitter.Test( cc, FlagGroup(flags))); }
private void EmitBranch(ConditionOperand cOp, Address dst) { m.Branch( GenerateTestExpression(cOp, false), dst, InstrClass.ConditionalTransfer); }
private void EmitBranch(ConditionOperand cOp, ImmediateOperand dst) { emitter.Branch( GenerateTestExpression(cOp, false), Address.Ptr16(dst.Value.ToUInt16()), RtlClass.Transfer); }
private void EmitBranch(ConditionOperand cOp, Address dst) { rtlc.Class = RtlClass.ConditionalTransfer; emitter.Branch( GenerateTestExpression(cOp, false), dst, RtlClass.ConditionalTransfer); }