public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Substract( BitVecExpr a, BitVecExpr b, BoolExpr carry, Context ctx ) { if (carry.IsFalse) { return(Substract(a, b, ctx)); } uint nBits = a.SortSize; BitVecExpr bv0_1bit = ctx.MkBV(0, 1); BitVecExpr bv1_1bit = ctx.MkBV(1, 1); BitVecExpr ax = ctx.MkConcat(bv0_1bit, a); BitVecExpr bx = ctx.MkConcat(bv0_1bit, b); BitVecExpr bx2 = ctx.MkBVAdd(bx, ctx.MkITE(carry, ctx.MkBV(1, nBits + 1), ctx.MkBV(0, nBits + 1)) as BitVecExpr); BitVecExpr rx = ctx.MkBVSub(ax, bx2); BitVecExpr result = ctx.MkExtract(nBits - 1, 0, rx); BoolExpr cf = ToolsFlags.Create_CF_Sub(ax, bx2, nBits, ctx); BoolExpr of = ToolsFlags.Create_OF_Sub(ax, bx2, nBits, ctx); BoolExpr af = ToolsFlags.Create_AF_Sub(ax, bx2, ctx); return(result : result, cf : cf, of : of, af : af); }
public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Addition( BitVecExpr a, BitVecExpr b, BoolExpr carry, Context ctx) { Contract.Requires(ctx != null); Contract.Requires(a != null); //if (carry.IsFalse) return Addition(a, b, ctx); uint nBits = a.SortSize; BitVecExpr bv0_1bit = ctx.MkBV(0, 1); BitVecExpr bv1_1bit = ctx.MkBV(1, 1); BitVecExpr ax = ctx.MkZeroExt(1, a); BitVecExpr bx = ctx.MkZeroExt(1, b); BitVecExpr carryBV = ctx.MkITE(carry, ctx.MkBV(1, nBits + 1), ctx.MkBV(0, nBits + 1)) as BitVecExpr; BitVecExpr bx2 = ctx.MkBVAdd(bx, carryBV); BitVecExpr rx = ctx.MkBVAdd(ax, bx2); BitVecExpr result = ctx.MkExtract(nBits - 1, 0, rx); BoolExpr cf = ToolsFlags.Create_CF_Add(ax, bx2, nBits, ctx); BoolExpr of = ToolsFlags.Create_OF_Add(ax, bx2, nBits, ctx); BoolExpr af = ToolsFlags.Create_AF_Add(ax, bx2, ctx); return(result : result, cf : cf, of : of, af : af); }
public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Addition( BitVecExpr a, BitVecExpr b, Context ctx) { BitVecExpr result = ctx.MkBVAdd(a, b); BoolExpr cf = ToolsFlags.Create_CF_Add(a, b, a.SortSize, ctx); BoolExpr of = ToolsFlags.Create_OF_Add(a, b, a.SortSize, ctx); BoolExpr af = ToolsFlags.Create_AF_Add(a, b, ctx); return(result : result, cf : cf, of : of, af : af); }
public static (BitVecExpr result, BoolExpr cf, BoolExpr of, BoolExpr af) Substract( BitVecExpr a, BitVecExpr b, Context ctx) { uint nBits = a.SortSize; BitVecExpr result = ctx.MkBVSub(a, b); BoolExpr cf = ToolsFlags.Create_CF_Sub(a, b, nBits, ctx); BoolExpr of = ToolsFlags.Create_OF_Sub(a, b, nBits, ctx); BoolExpr af = ToolsFlags.Create_AF_Sub(a, b, ctx); return(result : result, cf : cf, of : of, af : af); }
public void Set_SF_ZF_PF(BitVecExpr value) { Debug.Assert(value != null); this.Empty = false; lock (this._ctxLock) { Context ctx = this._ctx; value = value.Translate(ctx) as BitVecExpr; this.Set(Flags.SF, ToolsFlags.Create_SF(value, value.SortSize, ctx)); this.Set(Flags.ZF, ToolsFlags.Create_ZF(value, ctx)); this.Set(Flags.PF, ToolsFlags.Create_PF(value, ctx)); } }
public void Set_SF_ZF_PF(BitVecExpr value) { Contract.Requires(value != null); this.Empty = false; lock (this.ctxLock_) { Context ctx = this.ctx_; value = value.Translate(ctx) as BitVecExpr; this.Set(Flags.SF, ToolsFlags.Create_SF(value, value.SortSize, ctx)); this.Set(Flags.ZF, ToolsFlags.Create_ZF(value, ctx)); this.Set(Flags.PF, ToolsFlags.Create_PF(value, ctx)); } }