private void RewriteCmp(H8Instruction instr) { var right = OpSrc(instr.Operands[0]); var left = OpSrc(instr.Operands[1]); EmitCond(NZVC, m.ISub(left, right)); }
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); }
private void RewriteSub(H8Instruction instr) { var src = OpSrc(instr.Operands[0]); var dst = OpDst(instr.Operands[1], src, m.ISub); EmitCond(NZVC, dst); }
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); }
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)); }
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)); }
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()); }
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()); }
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()); }
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()); }
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); }
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()); }
private void RewriteLdc(H8Instruction instr) { m.Assign(binder.EnsureFlagGroup(NZVC), OpSrc(instr.Operands[0])); }
private void RewriteSubs(H8Instruction instr) { var src = OpSrc(instr.Operands[0]); var dst = OpDst(instr.Operands[1], src, m.ISub); }
private void RewriteBranch(H8Instruction instr) { m.Goto(((AddressOperand)instr.Operands[0]).Address); }
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); }
private void RewriteJmp(H8Instruction instr) { var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress; m.Goto(target); }
private void RewriteJsr(H8Instruction instr) { var target = ((MemoryAccess)OpSrc(instr.Operands[0])).EffectiveAddress; m.Call(target, 2); //$REVIEW: what about 'advanced mode'? }
private void EmitUnitTest(H8Instruction instr, string message = "") { var testgenSvc = arch.Services.GetService <ITestGenerationService>(); testgenSvc?.ReportMissingRewriter("H8Rw", instr, instr.Mnemonic.ToString(), rdr, message); }