public void VpMulBy6() { var m = new ProcedureBuilder(); var r1 = m.Reg16("r1", 1); var r2 = m.Reg16("r1", 2); m.Assign(r2, r1); // r1 m.Assign(r1, m.Shl(r1, 1)); // r1 * 2 m.Assign(r1, m.IAdd(r1, r2)); // r1 * 3 m.Assign(r1, m.Shl(r1, 1)); // r1 * 6 var ssa = RunTest(m); var sExp = #region Expected @"r1:r1 def: def r1 uses: r1_1 = r1 r1_2 = r1 << 0x01 r1_3 = r1 * 0x0003 r1_4 = r1 * 0x0006 r1_1: orig: r1 def: r1_1 = r1 r1_2: orig: r1 def: r1_2 = r1 << 0x01 r1_3: orig: r1 def: r1_3 = r1 * 0x0003 r1_4: orig: r1 def: r1_4 = r1 * 0x0006 // ProcedureBuilder // Return size: 0 void ProcedureBuilder() ProcedureBuilder_entry: def r1 // succ: l1 l1: r1_1 = r1 r1_2 = r1 << 0x01 r1_3 = r1 * 0x0003 r1_4 = r1 * 0x0006 ProcedureBuilder_exit: "; #endregion AssertStringsEqual(sExp, ssa); }
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); }