public void DfaConvertConvert() { var m = new ProcedureBuilder(); var r1 = m.Register("r1"); var r2 = m.Reg64("r2", 2); m.Assign(m.Frame.EnsureRegister(m.Architecture.StackRegister), m.Frame.FramePointer); r1.DataType = PrimitiveType.Real32; r2.DataType = PrimitiveType.Real64; m.Assign(r2, m.Convert(r1, PrimitiveType.Real32, PrimitiveType.Real64)); m.MStore(m.Word32(0x123408), m.Convert(r2, PrimitiveType.Real64, PrimitiveType.Real32)); m.Return(); RunFileTest(m, "Analysis/DfaCastCast.txt"); }
public void BwIndexInMemoryAddress() { // samples of switch statement emitted // by the Microsoft VC compiler var ebp = m.Frame.EnsureRegister(Registers.ebp); var eax = m.Frame.EnsureRegister(Registers.eax); var edx = m.Frame.EnsureRegister(Registers.edx); // cmp [ebp-66],1D m.Assign(SCZO, m.Cond(m.ISub(m.Mem32(m.ISub(ebp, 0xC4)), 0x1D))); var block0 = m.CurrentBlock; m.BranchIf(new TestCondition(ConditionCode.UGT, SCZO), "default"); // mov edx,[ebp-66] // movzx eax,byte ptr [edx + 0x10000] // jmp [eax + 0x12000] m.Assign(edx, m.Mem32(m.ISub(ebp, 0xC4))); m.Assign(eax, m.Convert(m.Mem8(m.IAdd(edx, 0x10000)), PrimitiveType.Byte, PrimitiveType.Word32)); var xfer = new RtlGoto(m.Mem32(m.IAdd(eax, 0x12000)), InstrClass.Transfer); var block1 = m.CurrentBlock; var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); var ret = bw.BackwalkInstructions(Registers.eax, block1); Assert.AreEqual("None", bw.Index.ToString()); Assert.AreEqual("Mem0[ebp - 0xC4<32>:word32]", bw.IndexExpression.ToString()); Assert.AreEqual(4, bw.JumpSize); Assert.IsTrue(ret); ret = bw.BackwalkInstructions(null, block0); }
public void VpCastRealConstant() { var m = new ProcedureBuilder(); var r1 = m.Reg32("r1", 1); m.Assign(r1, m.Convert(Constant.Real64(1), PrimitiveType.Real64, PrimitiveType.Real32)); var ssa = RunTest(m); var sExp = #region Expected @"r1_1: orig: r1 def: r1_1 = 1.0F // ProcedureBuilder // Return size: 0 define ProcedureBuilder ProcedureBuilder_entry: // succ: l1 l1: r1_1 = 1.0F ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void VpCastCast() { var m = new ProcedureBuilder(); m.MStore( m.Word32(0x1234000), m.Convert( m.Convert( m.Mem(PrimitiveType.Real32, m.Word32(0x123400)), PrimitiveType.Real32, PrimitiveType.Real64), PrimitiveType.Real64, PrimitiveType.Real32)); m.Return(); Assert.IsNotNull(dynamicLinker); RunFileTest(m, "Analysis/VpCastCast.txt"); }
public void Vse_Cast_Truncate_SingleValue() { var r1 = m.Reg32("r1", 1); Given_ValueSet(r1, IVS(0, -0x43F, -0x43F)); Given_Evaluator(); var vs = vse.Evaluate(m.Convert(r1, r1.DataType, PrimitiveType.Byte)); Assert.AreEqual("0[-3F,-3F]", vs.Item1.ToString()); }
public void Larw_Multiply_Accumulate() { var sExp = @"l1: eax_2 = CONVERT(Mem0[0x5418<32>:word16], word16, int32) edx_3 = 0xF000<32> edx_eax_4 = edx_3 *s64 eax_2 eax_5 = SLICE(edx_eax_4, word32, 0) (alias) edx_9 = SLICE(edx_eax_4, word32, 32) (alias) edx_eax_17 = SEQ(edx_9, eax_5) tmp2_tmp1_18 = Mem0[0x6FF0<32>:ui64] - edx_eax_17 tmp1_6 = SLICE(tmp2_tmp1_18, word32, 0) (alias) tmp2_11 = SLICE(tmp2_tmp1_18, word32, 32) (alias) Mem7[0x6FF0<32>:word32] = tmp1_6 SCZ_8 = cond(tmp1_6) C_10 = SLICE(SCZ_8, bool, 2) (alias) Mem12[0x6FF4<32>:word32] = tmp2_11 SCZ_13 = cond(tmp2_11) C_14 = SLICE(SCZ_13, bool, 2) (alias) S_15 = SLICE(SCZ_13, bool, 0) (alias) Z_16 = SLICE(SCZ_13, bool, 1) (alias) return "; RunTest(sExp, m => { var eax = m.Reg32("eax", 0); var edx = m.Reg32("edx", 2); var edx_eax = m.Frame.EnsureSequence(PrimitiveType.Word64, edx.Storage, eax.Storage); var tmp1 = m.Temp(PrimitiveType.Word32, "tmp1"); var tmp2 = m.Temp(PrimitiveType.Word32, "tmp2"); m.Assign(eax, m.Convert(m.Mem16(m.Word32(0x5418)), PrimitiveType.Word16, PrimitiveType.Int32)); m.Assign(edx, m.Word32(0xF000)); m.Assign(edx_eax, m.SMul(PrimitiveType.Int64, edx, eax)); m.Assign(tmp1, m.ISub(m.Mem32(m.Word32(0x6FF0)), eax)); m.MStore(m.Word32(0x6FF0), tmp1); m.Assign(this.SCZ, m.Cond(tmp1)); m.Assign(tmp2, m.ISub(m.ISub(m.Mem32(m.Word32(0x6FF4)), edx), this.CF)); m.MStore(m.Word32(0x6FF4), tmp2); m.Assign(this.SCZ, m.Cond(tmp2)); block = m.Block; m.Return(); }); }
public void BwZeroExtend() { var rax = m.Reg64("rax", 0); var eax = m.Reg32("eax", 0); var al = m.Reg8("al", 0); var ecx = m.Reg32("ecx", 1); var CZ = m.Flags("CZ"); m.Assign(eax, m.Mem8(rax)); m.Assign(CZ, m.Cond(m.ISub(al, 0x78))); m.BranchIf(m.Test(ConditionCode.UGT, CZ), "ldefault"); m.Assign(ecx, m.Convert(al, al.DataType, PrimitiveType.Word32)); var xfer = new RtlGoto(m.Mem32(m.IAdd(Constant.Word32(0x00411F40), m.IMul(ecx, 8))), InstrClass.Transfer); var bw = new Backwalker <Block, Instruction>(host, xfer, expSimp); Assert.IsTrue(bw.CanBackwalk()); var ops = bw.BackWalk(m.Block); Assert.AreEqual(3, ops.Count); Assert.AreEqual("cmp 120", ops[0].ToString()); Assert.AreEqual("branch UGT", ops[1].ToString()); Assert.AreEqual("* 8", ops[2].ToString()); }
public void Exs_Cast_real() { Given_ExpressionSimplifier(); var expr = m.Convert(Constant.Real64(1.5), PrimitiveType.Real64, PrimitiveType.Real32); Assert.AreEqual("1.5F", expr.Accept(simplifier).ToString()); }
public void CceMultibitCcFromPhiNode() { var sExp = #region Expected @"// ProcedureBuilder // Return size: 0 define ProcedureBuilder ProcedureBuilder_entry: def r0 def r2 // succ: l1 l1: branch r0 <= r2 m1 // succ: m0 m1 m0: r0_5 = r0 + r2 v12_18 = r0_5 == 0<32> v9_15 = r0_5 <=u 0<32> v6_12 = r0_5 >u 0<32> goto m2 // succ: m2 m1: r0_3 = r2 - r0 v13_19 = r0_3 == 0<32> v10_16 = r0_3 <=u 0<32> v7_13 = r0_3 >u 0<32> // succ: m2 m2: v11_17 = PHI((v9_15, m0), (v10_16, m1)) v8_14 = PHI((v6_12, m0), (v7_13, m1)) v14_20 = PHI((v12_18, m0), (v13_19, m1)) Mem8[0x123400<32>:int8] = CONVERT(v8_14, bool, int8) Mem9[0x123402<32>:int8] = CONVERT(v11_17, bool, int8) Mem11[0x123404<32>:int8] = CONVERT(v14_20, bool, int8) return // succ: ProcedureBuilder_exit ProcedureBuilder_exit: "; #endregion RunStringTest(sExp, m => { var r0 = m.Reg32("r0", 0); var r2 = m.Reg32("r2", 2); var CZ = m.Flags("CZ"); var Z = m.Flags("Z"); m.BranchIf(m.Le(r0, r2), "m1"); m.Label("m0"); m.Assign(r0, m.IAdd(r0, r2)); m.Assign(CZ, m.Cond(r0)); m.Goto("m2"); m.Label("m1"); m.Assign(r0, m.ISub(r2, r0)); m.Assign(CZ, m.Cond(r0)); m.Label("m2"); //m.Assign(tmp, m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123400), m.Convert(m.Test(ConditionCode.UGT, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123402), m.Convert(m.Test(ConditionCode.ULE, CZ), PrimitiveType.Bool, PrimitiveType.SByte)); m.MStore(m.Word32(0x00123404), m.Convert(m.Test(ConditionCode.EQ, Z), PrimitiveType.Bool, PrimitiveType.SByte)); m.Return(); }); }