Ejemplo n.º 1
0
        private void RewriteCmp(H8Instruction instr)
        {
            var right = OpSrc(instr.Operands[0]);
            var left  = OpSrc(instr.Operands[1]);

            EmitCond(NZVC, m.ISub(left, right));
        }
Ejemplo n.º 2
0
        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);
        }
Ejemplo n.º 3
0
        private void RewriteSub(H8Instruction instr)
        {
            var src = OpSrc(instr.Operands[0]);
            var dst = OpDst(instr.Operands[1], src, m.ISub);

            EmitCond(NZVC, dst);
        }
Ejemplo n.º 4
0
        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);
        }
Ejemplo n.º 5
0
        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));
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        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());
        }
Ejemplo n.º 8
0
        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());
        }
Ejemplo n.º 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());
        }
Ejemplo n.º 10
0
        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());
        }
Ejemplo n.º 11
0
        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);
        }
Ejemplo n.º 12
0
        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());
        }
Ejemplo n.º 13
0
 private void RewriteLdc(H8Instruction instr)
 {
     m.Assign(binder.EnsureFlagGroup(NZVC), OpSrc(instr.Operands[0]));
 }
Ejemplo n.º 14
0
 private void RewriteSubs(H8Instruction instr)
 {
     var src = OpSrc(instr.Operands[0]);
     var dst = OpDst(instr.Operands[1], src, m.ISub);
 }
Ejemplo n.º 15
0
 private void RewriteBranch(H8Instruction instr)
 {
     m.Goto(((AddressOperand)instr.Operands[0]).Address);
 }
Ejemplo n.º 16
0
        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);
        }
Ejemplo n.º 17
0
        private void RewriteJmp(H8Instruction instr)
        {
            var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress;

            m.Goto(target);
        }
Ejemplo n.º 18
0
        private void RewriteJsr(H8Instruction instr)
        {
            var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress;

            m.Call(target, 2);      //$REVIEW: what about 'advanced mode'?
        }
Ejemplo n.º 19
0
        private void EmitUnitTest(H8Instruction instr, string message = "")
        {
            var testgenSvc = arch.Services.GetService <ITestGenerationService>();

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