Exemple #1
0
 private void OpToString(MachineOperand op, MachineInstructionWriter writer)
 {
     if (op is ImmediateOperand)
     {
         writer.Write("#" + op.ToString());
     }
     else
     {
         writer.Write(op.ToString());
     }
 }
Exemple #2
0
 private void Write(MachineOperand op, MachineInstructionWriter writer)
 {
     var reg = op as RegisterOperand;
     if (reg != null)
     {
         writer.Write("%{0}", reg.Register.Name);
         return;
     }
     var imm = op as ImmediateOperand;
     if (imm != null)
     {
         writer.Write(imm.Value.ToString());
         return;
     }
     var mem = op as MemoryOperand;
     if (mem != null)
     {
         mem.Write(false, writer);
         return;
     }
     var idx = op as IndexedMemoryOperand;
     if (idx != null)
     {
         idx.Write(false, writer);
         return;
     }
     writer.Write(op.ToString());
 }
Exemple #3
0
 public Expression RewriteUnary(
     MachineOperand operand, 
     Address addrInstr,
     PrimitiveType dataWidth,
     Func<Expression, Expression> opGen)
 {
     var reg = operand as RegisterOperand;
     if (reg != null)
     {
         Expression r = frame.EnsureRegister(reg.Register);
         if (r.DataType.Size > dataWidth.Size)
         {
             var tmp = frame.CreateTemporary(dataWidth);
             m.Assign(tmp, opGen(m.Cast(dataWidth, r)));
             m.Assign(r, m.Dpb(r, tmp, 0, dataWidth.BitSize));
             return tmp;
         }
         else 
         {
             m.Assign(r, opGen(r));
             return r;
         }
     }
     var addr = operand as M68kAddressOperand;
     if (addr != null)
     {
         var load = m.Load(dataWidth, addr.Address);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(load));
         m.Assign(load, tmp);
         return tmp;
     }
     var mem = operand as MemoryOperand;
     if (mem != null)
     {
         var load = RewriteMemoryAccess(mem, dataWidth, addrInstr);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(load));
         m.Assign(RewriteMemoryAccess(mem,dataWidth, addrInstr), tmp);
         return tmp;
     }
     var post = operand as PostIncrementMemoryOperand;
     if (post != null)
     {
         var r = frame.EnsureRegister(post.Register);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(m.Load(dataWidth, r)));
         m.Assign(m.Load(dataWidth, r), tmp);
         m.Assign(r, m.IAdd(r, dataWidth.Size));
         return tmp;
     }
     var pre = operand as PredecrementMemoryOperand;
     if (pre != null)
     {
         var r = frame.EnsureRegister(pre.Register);
         m.Assign(r, m.ISub(r, dataWidth.Size));
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(m.Load(dataWidth, r)));
         m.Assign(m.Load(dataWidth, r), tmp);
         return tmp;
     }
     throw new NotImplementedException("Unimplemented RewriteUnary for operand type " + operand.ToString());
 }
Exemple #4
0
 public Expression RewriteDst(MachineOperand operand, Address addrInstr, PrimitiveType dataWidth, Expression src, Func<Expression ,Expression, Expression> opGen)
 {
     var reg = operand as RegisterOperand;
     if (reg != null)
     {
         Expression r = frame.EnsureRegister(reg.Register);
         Expression tmp = r;
         if (dataWidth != null && reg.Width.BitSize > dataWidth.BitSize)
         {
             Expression rSub = m.Cast(dataWidth, r);
             var srcExp = opGen(src, rSub);
             if (srcExp is Identifier || srcExp is Constant || srcExp is DepositBits)
             {
                 tmp = srcExp;
             }
             else
             {
                 tmp = frame.CreateTemporary(dataWidth);
                 m.Assign(tmp, srcExp);
             }
             src = m.Dpb(r, tmp, 0, dataWidth.BitSize);
         }
         else
         {
             src = opGen(src, r);
         }
         m.Assign(r, src);
         return tmp;
     }
     var dbl = operand as DoubleRegisterOperand;
     if (dbl != null)
     {
         Identifier h = frame.EnsureRegister(dbl.Register1);
         Identifier l = frame.EnsureRegister( dbl.Register2);
         var d = frame.EnsureSequence(h, l, PrimitiveType.Word64);
         var result = opGen(src, l);
         m.Assign(d, result);
         return d;
     }
     var addr = operand as M68kAddressOperand;
     if (addr != null)
     {
         var load = m.Load(dataWidth, addr.Address);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(src, load));
         m.Assign(load, tmp);
         return tmp;
     }
     var mem = operand as MemoryOperand;
     if (mem != null)
     {
         var load = RewriteMemoryAccess(mem, dataWidth, addrInstr);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(src, load));
         m.Assign(load, tmp);
         return tmp;
     }
     var post = operand as PostIncrementMemoryOperand;
     if (post != null)
     {
         var r = frame.EnsureRegister(post.Register);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(src, m.Load(post.Width, r))); 
         m.Assign(m.Load(dataWidth, r), tmp);
         m.Assign(r, m.IAdd(r, dataWidth.Size));
         return tmp;
     }
     var pre = operand as PredecrementMemoryOperand;
     if (pre != null)
     {
         var r = frame.EnsureRegister(pre.Register);
         src = Spill(src, r);
         m.Assign(r, m.ISub(r, dataWidth.Size));
         var load = m.Load(dataWidth, r);
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(src, load));
         m.Assign(m.Load(dataWidth, r), tmp);
         return tmp;
     }
     var indidx = operand as IndirectIndexedOperand;
     if (indidx != null)
     {
         Expression ea = frame.EnsureRegister(indidx.ARegister);
         if (indidx.Imm8 != 0)
             ea = m.IAdd(ea, Constant.Int32(indidx.Imm8));
         Expression ix = frame.EnsureRegister(indidx.XRegister);
         if (indidx.Scale > 1)
             ix = m.IMul(ix, Constant.Int32(indidx.Scale));
         var load = m.Load(dataWidth, m.IAdd(ea, ix));
         var tmp = frame.CreateTemporary(dataWidth);
         m.Assign(tmp, opGen(src, load));
         m.Assign(load, tmp);
         return tmp;
     }
     throw new NotImplementedException("Unimplemented RewriteDst for operand type " + operand.ToString());
 }