예제 #1
0
        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)));
        }
예제 #2
0
 private void EmitBranch(ConditionOperand cOp, Address dst)
 {
     m.Branch(
         GenerateTestExpression(cOp, false),
         dst,
         InstrClass.ConditionalTransfer);
 }
예제 #3
0
 private void EmitBranch(ConditionOperand cOp, ImmediateOperand dst)
 {
     emitter.Branch(
         GenerateTestExpression(cOp, false),
         Address.Ptr16(dst.Value.ToUInt16()),
         RtlClass.Transfer);
 }
예제 #4
0
 private void EmitBranch(ConditionOperand cOp, Address dst)
 {
     rtlc.Class = RtlClass.ConditionalTransfer;
     emitter.Branch(
         GenerateTestExpression(cOp, false),
         dst,
         RtlClass.ConditionalTransfer);
 }