예제 #1
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteCmp(H8Instruction instr)
        {
            var right = OpSrc(instr.Operands[0]);
            var left  = OpSrc(instr.Operands[1]);

            EmitCond(NZVC, m.ISub(left, right));
        }
예제 #2
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteShift(H8Instruction instr, Func <Expression, Expression, Expression> fn)
        {
            var src = OpSrc(instr.Operands[0]);

            m.Assign(src, fn(src, Constant.Int32(1)));
            EmitCond(NZVC, src);
        }
예제 #3
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteSub(H8Instruction instr)
        {
            var src = OpSrc(instr.Operands[0]);
            var dst = OpDst(instr.Operands[1], src, m.ISub);

            EmitCond(NZVC, dst);
        }
예제 #4
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteAddxSubx(H8Instruction instr, Func <Expression, Expression, Expression> fn)
        {
            var src = OpSrc(instr.Operands[0]);
            var dst = OpDst(instr.Operands[1], src, (d, s) => fn(fn(d, s), binder.EnsureFlagGroup(C)));

            EmitCond(NZVC, dst);
        }
예제 #5
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteBset(H8Instruction instr, Expression value)
        {
            var pos = OpSrc(instr.Operands[0]);
            var dst = OpSrc(instr.Operands[1]);

            m.Assign(dst, host.PseudoProcedure("__bst", dst.DataType, dst, value, pos));
        }
예제 #6
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteBtst(H8Instruction instr, FlagGroupStorage flag)
        {
            var right = OpSrc(instr.Operands[0]);
            var left  = OpSrc(instr.Operands[1]);
            var dst   = binder.EnsureFlagGroup(flag);

            m.Assign(dst, host.PseudoProcedure("__btst", dst.DataType, left, right));
        }
예제 #7
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteMov(H8Instruction instr)
        {
            var src = OpSrc(instr.Operands[0]);
            var dst = OpDst(instr.Operands[1], src, (d, s) => s);

            EmitCond(NZ, dst);
            m.Assign(binder.EnsureFlagGroup(V), Constant.False());
        }
예제 #8
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteUnaryLogical(H8Instruction instr, Func <Expression, Expression> fn)
        {
            var src = OpSrc(instr.Operands[0]);

            m.Assign(src, fn(src));
            EmitCond(NZ, src);
            m.Assign(binder.EnsureFlagGroup(V), Constant.False());
        }
예제 #9
0
        private void RewriteRotationX(H8Instruction instr, IntrinsicProcedure intrinsic)
        {
            var src = OpSrc(instr.Operands[0]);
            var c   = binder.EnsureFlagGroup(C);

            m.Assign(src, m.Fn(intrinsic, src, Constant.Int32(1), c));
            EmitCond(NZC, src);
            m.Assign(binder.EnsureFlagGroup(V), Constant.False());
        }
예제 #10
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteRotationX(H8Instruction instr, string intrinsicName)
        {
            var src = OpSrc(instr.Operands[0]);
            var c   = binder.EnsureFlagGroup(C);

            m.Assign(src, host.PseudoProcedure(intrinsicName, src.DataType,
                                               src, Constant.Int32(1), c));
            EmitCond(NZC, src);
            m.Assign(binder.EnsureFlagGroup(V), Constant.False());
        }
예제 #11
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteMulxu(H8Instruction instr)
        {
            var right = OpSrc(instr.Operands[0]);
            var left  = (Identifier)OpSrc(instr.Operands[1]);
            var dst   = binder.EnsureRegister(arch.GetRegister(
                                                  left.Storage.Domain,
                                                  new BitRange(0, left.DataType.BitSize * 2)) !);
            var umul = m.UMul(left, right);

            umul.DataType = dst.DataType;
            m.Assign(dst, umul);
        }
예제 #12
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteExt(H8Instruction instr, Domain domain)
        {
            var dstRange = new BitRange(0, instr.Size !.BitSize);
            var srcRange = new BitRange(0, instr.Size !.BitSize / 2);
            var dt       = PrimitiveType.Create(domain, dstRange.Extent);
            var dst      = (Identifier)OpSrc(instr.Operands[0]);
            var src      = binder.EnsureRegister(arch.GetRegister(
                                                     dst.Storage.Domain,
                                                     srcRange) !);

            m.Assign(dst, m.Convert(src, src.DataType, dt));
            EmitCond(Z, dst);
            m.Assign(binder.EnsureFlagGroup(N), Constant.False());
            m.Assign(binder.EnsureFlagGroup(V), Constant.False());
        }
예제 #13
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
 private void RewriteLdc(H8Instruction instr)
 {
     m.Assign(binder.EnsureFlagGroup(NZVC), OpSrc(instr.Operands[0]));
 }
예제 #14
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
 private void RewriteSubs(H8Instruction instr)
 {
     var src = OpSrc(instr.Operands[0]);
     var dst = OpDst(instr.Operands[1], src, m.ISub);
 }
예제 #15
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
 private void RewriteBranch(H8Instruction instr)
 {
     m.Goto(((AddressOperand)instr.Operands[0]).Address);
 }
예제 #16
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteBranch(H8Instruction instr, ConditionCode cc, FlagGroupStorage grf)
        {
            var test = m.Test(cc, binder.EnsureFlagGroup(grf));

            m.Branch(test, ((AddressOperand)instr.Operands[0]).Address);
        }
예제 #17
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteJmp(H8Instruction instr)
        {
            var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress;

            m.Goto(target);
        }
예제 #18
0
파일: H8Rewriter.cs 프로젝트: tgiphil/reko
        private void RewriteJsr(H8Instruction instr)
        {
            var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress;

            m.Call(target, 2);      //$REVIEW: what about 'advanced mode'?
        }
예제 #19
0
파일: H8Rewriter.cs 프로젝트: ntzwq/reko
        private void EmitUnitTest(H8Instruction instr, string message = "")
        {
            var testgenSvc = arch.Services.GetService <ITestGenerationService>();

            testgenSvc?.ReportMissingRewriter("H8Rw", instr, instr.Mnemonic.ToString(), rdr, message);
        }