public void VpCastCast() { var m = new ProcedureBuilder(); m.Store( m.Word32(0x1234000), m.Cast( PrimitiveType.Real32, m.Cast( PrimitiveType.Real64, m.Load(PrimitiveType.Real32, m.Word32(0x123400))))); m.Return(); mr.ReplayAll(); RunFileTest(m, "Analysis/VpCastCast.txt"); }
public void VpUndoUnnecessarySlicingOfSegmentPointer() { var m = new ProcedureBuilder(); var es = m.Reg16("es", 1); var bx = m.Reg16("bx", 3); var es_bx = m.Frame.EnsureSequence(es.Storage, bx.Storage, PrimitiveType.Word32); m.Assign(es_bx, m.SegMem(PrimitiveType.Word32, es, bx)); m.Assign(es, m.Slice(PrimitiveType.Word16, es_bx, 16)); m.Assign(bx, m.Cast(PrimitiveType.Word16, es_bx)); m.SegStore(es, m.IAdd(bx, 4), m.Byte(3)); var ssa = RunTest(m); var sExp = #region Expected @"es:es def: def es uses: es_bx_3 = Mem0[es:bx:word32] bx:bx def: def bx uses: es_bx_3 = Mem0[es:bx:word32] Mem0:Global memory def: def Mem0 uses: es_bx_3 = Mem0[es:bx:word32] es_bx_3: orig: es_bx def: es_bx_3 = Mem0[es:bx:word32] uses: es_4 = SLICE(es_bx_3, word16, 16) bx_5 = (word16) es_bx_3 Mem0[es_bx_3 + 0x0004:byte] = 0x03 es_4: orig: es def: es_4 = SLICE(es_bx_3, word16, 16) bx_5: orig: bx def: bx_5 = (word16) es_bx_3 Mem6: orig: Mem0 def: Mem0[es_bx_3 + 0x0004:byte] = 0x03 // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: def es def bx def Mem0 // succ: l1 l1: es_bx_3 = Mem0[es:bx:word32] es_4 = SLICE(es_bx_3, word16, 16) bx_5 = (word16) es_bx_3 Mem0[es_bx_3 + 0x0004:byte] = 0x03 ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void VpLoadDpbSmallerCast() { var m = new ProcedureBuilder(); var a2 = m.Reg32("a2", 10); var d3 = m.Reg32("d3", 3); var tmp = m.Temp(PrimitiveType.Word16, "tmp"); m.Assign(tmp, m.LoadW(a2)); m.Assign(d3, m.Dpb(d3, tmp, 0)); m.Store(m.IAdd(a2, 4), m.Cast(PrimitiveType.Byte, d3)); SsaState ssa = RunTest(m); var sExp = #region Expected @"a2:a2 def: def a2 uses: tmp_2 = Mem0[a2:word16] Mem5[a2 + 0x00000004:byte] = (byte) tmp_2 Mem0:Global memory def: def Mem0 uses: tmp_2 = Mem0[a2:word16] tmp_2: orig: tmp def: tmp_2 = Mem0[a2:word16] uses: d3_4 = DPB(d3, tmp_2, 0) Mem5[a2 + 0x00000004:byte] = (byte) tmp_2 d3:d3 def: def d3 uses: d3_4 = DPB(d3, tmp_2, 0) d3_4: orig: d3 def: d3_4 = DPB(d3, tmp_2, 0) Mem5: orig: Mem0 def: Mem5[a2 + 0x00000004:byte] = (byte) tmp_2 // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: def a2 def Mem0 def d3 // succ: l1 l1: tmp_2 = Mem0[a2:word16] d3_4 = DPB(d3, tmp_2, 0) Mem5[a2 + 0x00000004:byte] = (byte) tmp_2 ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void VpCastRealConstant() { var m = new ProcedureBuilder(); var r1 = m.Reg32("r1", 1); m.Assign(r1, m.Cast(PrimitiveType.Real32, ConstantReal.Real64(1))); var ssa = RunTest(m); var sExp = #region Expected @"r1_0: orig: r1 def: r1_0 = 1.0F // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: // succ: l1 l1: r1_0 = 1.0F ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
public void Usb_ParseFunctionDeclaration_WithRegisterArgs() { var arch = new FakeArchitecture(); var m = new ProcedureBuilder(arch, "test"); var r1 = m.Reg32("r1", 1); var r2 = m.Reg32("r2", 2); m.Store(m.Word32(0x123400), m.Cast(PrimitiveType.Byte, r1)); m.Store(m.Word32(0x123404), m.Cast(PrimitiveType.Real32, r2)); m.Return(); var usb = new UserSignatureBuilder(program); usb.ApplySignatureToProcedure( Address.Create(PrimitiveType.Pointer32, 0x1000), new ProcedureSignature( null, new Identifier("r2", PrimitiveType.Char, r1.Storage), // perverse but legal. new Identifier("r1", PrimitiveType.Real32, r2.Storage)), m.Procedure); var sExp = @"// test // Return size: 0 void test(char r2, real32 r1) test_entry: // succ: l1 l1: r1 = r2 r2 = r1 Mem0[0x00123400:byte] = (byte) r1 Mem0[0x00123404:real32] = (real32) r2 return // succ: test_exit test_exit: "; var sb = new StringWriter(); m.Procedure.Write(false, sb); Assert.AreEqual(sExp, sb.ToString()); }