Example #1
0
 public bool VisitDepositBits(DepositBits d, TypeVariable tv)
 {
     MeetDataType(d, tv.DataType);
     d.Source.Accept(this, d.Source.TypeVariable);
     d.InsertedBits.Accept(this, d.InsertedBits.TypeVariable);
     return(false);
 }
Example #2
0
        public bool Match(DepositBits dpb)
        {
            this.dpbUse = dpb;
            if (!(dpb.Source is Identifier idDef))
            {
                return(false);
            }
            var stms = ctx.GetDefiningStatementClosure(idDef);

            if (stms.Count == 0)
            {
                return(false);
            }
            var items = stms.Select(GetDpbDetails).ToList();
            var first = items[0].idSrc;

            if (items.All(i => i.idSrc != null && i.idSrc == first && i.dpbDef.BitPosition == dpbUse.BitPosition))
            {
                this.idDef = idDef;
                this.idSrc = items[0].idSrc;
                return(true);
            }
            else
            {
                return(false);
            }
        }
Example #3
0
        public bool Match(DepositBits dpb)
        {
            this.dpbUse = dpb;
            if (!(dpb.Source is Identifier idDef))
            {
                return(false);
            }
            var expDef = ctx.GetDefiningExpression(idDef);

            if (expDef == null)
            {
                return(false);
            }
            if (!(expDef is DepositBits dpbDef))
            {
                return(false);
            }
            if (!(dpbDef.Source is Identifier idSrc))
            {
                return(false);
            }
            this.idDef  = idDef;
            this.dpbDef = dpbDef;
            this.idSrc  = idSrc;
            return(dpbDef.BitPosition == dpbUse.BitPosition);
        }
        public virtual Expression VisitDepositBits(DepositBits d)
        {
            var src  = d.Source.Accept(this);
            var bits = d.InsertedBits.Accept(this);

            return(new DepositBits(src, bits, d.BitPosition));
        }
Example #5
0
        public bool Match(DepositBits dpb)
        {
            this.dpbUse = dpb;
            if (!dpb.Source.As(out idDef))
            {
                return(false);
            }
            var expDef = ctx.GetDefiningExpression(idDef);

            if (expDef == null)
            {
                return(false);
            }
            if (!expDef.As(out dpbDef))
            {
                return(false);
            }
            if (!dpbDef.Source.As(out idSrc))
            {
                return(false);
            }
            return
                (dpbDef.BitCount == dpbUse.BitCount &&
                 dpbDef.BitPosition == dpbUse.BitPosition);
        }
Example #6
0
        public SlicerResult VisitDepositBits(DepositBits d, BackwardSlicerContext ctx)
        {
            var srSrc  = d.Source.Accept(this, ctx);
            var brBits = RangeOf(d.InsertedBits);
            var srBits = d.InsertedBits.Accept(this, new BackwardSlicerContext(ctx.Type, brBits));

            if (brBits == ctx.BitRange)
            {
                return(new SlicerResult
                {
                    SrcExpr = d.InsertedBits,
                    LiveExprs = srBits.LiveExprs
                });
            }
            else
            {
                return(new SlicerResult
                {
                    SrcExpr = new DepositBits(d.Source, d.InsertedBits, d.BitPosition),
                    LiveExprs = srSrc.LiveExprs.Concat(srBits.LiveExprs)
                                .GroupBy(e => e.Key)
                                .ToDictionary(k => k.Key, v => v.Max(vv => vv.Value)),
                });
            }
        }
Example #7
0
        public virtual Expression VisitDepositBits(DepositBits d)
        {
            var src  = d.Source.Accept(this);
            var bits = d.InsertedBits.Accept(this);

            if (src == Constant.Invalid || bits == Constant.Invalid)
            {
                return(Constant.Invalid);
            }
            d = new DepositBits(src, bits, d.BitPosition);
            while (dpbdpbRule.Match(d))
            {
                Changed = true;
                d       = dpbdpbRule.Transform();
            }
            if (dpbConstantRule.Match(d))
            {
                Changed = true;
                return(dpbConstantRule.Transform());
            }
            if (selfdpbRule.Match(d))
            {
                Changed = true;
                return(selfdpbRule.Transform());
            }
            return(d);
        }
Example #8
0
        /// <summary>
        /// Creates an instruction:
        ///     a = foo(b)
        /// or
        ///     foo(b)
        ///  depending on whether the signature returns a value or is of
        /// type 'void'
        /// </summary>
        /// <returns></returns>
        public Instruction CreateInstruction()
        {
            var idOut = BindReturnValue();
            var dtOut = sigCallee.ReturnValue != null
                ? sigCallee.ReturnValue.DataType
                : VoidType.Instance;
            var        actuals = BindArguments(frame, sigCallee);
            Expression appl    = new Application(
                callee,
                dtOut,
                actuals.ToArray());

            if (idOut == null)
            {
                return(new SideEffect(appl));
            }
            else
            {
                if (idOut.DataType.Size > sigCallee.ReturnValue.DataType.Size)
                {
                    appl = new DepositBits(idOut, appl, 0);
                }
                return(new Assignment(idOut, appl));
            }
        }
Example #9
0
        public bool Match(DepositBits dpb)
        {
            if (dpb.BitPosition != 0)
            {
                return(false);
            }
            this.e = dpb.Source as Identifier;
            if (e == null)
            {
                return(false);
            }

            var c = dpb.InsertedBits as Cast;

            if (c != null)
            {
                idUnused = e;
                return(e == c.Expression);
            }
            if (!(dpb.InsertedBits is Identifier idBits))
            {
                return(false);
            }

            if (!(ctx.GetValue(idBits) is Cast cid))
            {
                return(false);
            }
            this.idUnused = idBits;
            return(e == cid.Expression);
        }
Example #10
0
 public Expression VisitDepositBits(DepositBits d)
 {
     return(new DepositBits(
                d.Source.Accept(this),
                d.InsertedBits.Accept(this),
                d.BitPosition));
 }
Example #11
0
            public bool VisitDepositBits(DepositBits d)
            {
                var dead = d.InsertedBits.Accept(this);

                dead &= d.Source.Accept(this);
                return(dead);
            }
Example #12
0
        public BitRange VisitDepositBits(DepositBits d)
        {
            // The bits being inserted into, d.Source, are "inert"
            var br = d.InsertedBits.Accept(this);

            return(new BitRange(br.Lsb + d.BitPosition, br.Msb + d.BitPosition));
        }
Example #13
0
 public override void VisitDepositBits(DepositBits d)
 {
     // Only use the inserted bits; the source bits are
     // not strictly used by a DPB instruction.
     bitUseOffset = 0;
     cbitsUse     = 0;
     d.InsertedBits.Accept(this);
 }
Example #14
0
 void IExpressionVisitor.VisitDepositBits(DepositBits d)
 {
     writer.Write("Dpb(");
     d.Source.Accept(this);
     writer.Write(", ");
     d.InsertedBits.Accept(this);
     writer.Write(", {0}, {1})", d.BitPosition, d.BitCount);
 }
Example #15
0
 public void VisitDepositBits(DepositBits d)
 {
     writer.Write("DPB(");
     WriteExpression(d.Source);
     writer.Write(", ");
     WriteExpression(d.InsertedBits);
     writer.Write(", {0})", d.BitPosition);
 }
Example #16
0
 void IExpressionVisitor.VisitDepositBits(DepositBits d)
 {
     Method("Dpb");
     d.Source.Accept(this);
     writer.Write(", ");
     d.InsertedBits.Accept(this);
     writer.Write(", {0})", d.BitPosition);
 }
Example #17
0
        public Result VisitDepositBits(DepositBits dpb)
        {
            var d = new DepositBits(
                dpb.Source.Accept(this).PropagatedExpression,
                dpb.InsertedBits.Accept(this).PropagatedExpression,
                dpb.BitPosition);

            return(SimplifyExpression(d));
        }
Example #18
0
        public DataType VisitDepositBits(DepositBits d)
        {
            d.Source.Accept(this);
            d.InsertedBits.Accept(this);
            var dt = handler.DataTypeTrait(d, d.DataType);

            ivCur = null;
            return(dt);
        }
Example #19
0
		public bool Match(DepositBits dpb)
		{
			this.dpb = dpb;
			cSrc = dpb.Source as Constant;
			if (cSrc == null)
				return false;
			cBits = dpb.InsertedBits as Constant;
			if (cBits != null)
				return true;
			return (cSrc.ToInt32() == 0 && dpb.BitPosition == 0);
		}
Example #20
0
        public DataType VisitDepositBits(DepositBits d)
        {
            var dtSource = d.Source.Accept(this);
            var dtBits   = d.InsertedBits.Accept(this);

            if (d.TypeVariable.DataType == null)
            {
                d.TypeVariable.DataType         = dtSource;
                d.TypeVariable.OriginalDataType = dtSource;
            }
            return(d.TypeVariable.DataType);
        }
Example #21
0
        /// <summary>
        /// Inserts an alias statement.
        /// </summary>
        /// <param name="v">Variable that has been defined</param>
        /// <param name="vAlias">Other variable that is aliased by v</param>
        /// <param name="iAt"></param>
        // If a wide register is being defined by aliasing of a smaller
        // register, the expression needs to take into account the previous
        // value of the wide register. For instance, modifying cl aliases
        // cx = f(cl, cx)
        // thus:
        //	mov cl,xx
        //  mov cx,DPB(cx,cl,0,8)
        public Assignment CreateAliasInstruction(Identifier varFrom, Identifier varTo)         // Identifier v, Identifier vAlias)
        {
            if (!IsAlias(arch, varFrom, varTo))
            {
                throw new ApplicationException(string.Format("Unexpected alias pair {0} and {1}", varTo.Name, varFrom.Name));
            }

            Expression aliasExpr;

            int offsetTo   = varTo.Storage.OffsetOf(varFrom.Storage);
            int offsetFrom = varFrom.Storage.OffsetOf(varTo.Storage);

            int cbitsFrom = varFrom.DataType.BitSize;
            int cbitsTo   = varTo.DataType.BitSize;

            if (cbitsFrom < cbitsTo)
            {
                // We are replacing a part of a wider register with a narrower one.

                SequenceStorage seq = varTo.Storage as SequenceStorage;
                if (seq != null && (seq.Head == varFrom.Storage || seq.Tail == varFrom.Storage))
                {
                    aliasExpr = new MkSequence(
                        varTo.DataType,
                        proc.Frame.EnsureIdentifier(seq.Head),
                        proc.Frame.EnsureIdentifier(seq.Tail));
                }
                else
                {
                    aliasExpr = new DepositBits(varTo, varFrom, offsetTo);
                }
            }
            else if (cbitsFrom > cbitsTo)
            {
                if (offsetFrom == 0)
                {
                    aliasExpr = new Cast(varTo.DataType, varFrom);
                }
                else
                {
                    aliasExpr = new Slice(varTo.DataType, varFrom, offsetFrom);
                }
            }
            else
            {
                aliasExpr = varFrom;
            }
            return(new AliasAssignment(varTo, aliasExpr));
        }
Example #22
0
 public bool Match(DepositBits dpb)
 {
     this.dpb = dpb;
     cSrc     = dpb.Source as Constant;
     if (cSrc == null)
     {
         return(false);
     }
     cBits = dpb.InsertedBits as Constant;
     if (cBits != null)
     {
         return(true);
     }
     return(cSrc.ToInt32() == 0 && dpb.BitPosition == 0);
 }
Example #23
0
 public bool Match(DepositBits dpb)
 {
     this.dpbUse = dpb;
     if (!dpb.Source.As(out idDef))
         return false;
     var expDef = ctx.GetDefiningExpression(idDef);
     if (expDef == null)
         return false;
     if (!expDef.As(out dpbDef))
         return false;
     if (!dpbDef.Source.As(out idSrc))
         return false;
     return
         dpbDef.BitPosition == dpbUse.BitPosition;
 }
Example #24
0
 public virtual Expression VisitDepositBits(DepositBits d)
 {
     d.Source       = d.Source.Accept(this);
     d.InsertedBits = d.InsertedBits.Accept(this);
     if (dpbConstantRule.Match(d))
     {
         Changed = true;
         return(dpbConstantRule.Transform());
     }
     if (dpbdpbRule.Match(d))
     {
         Changed = true;
         return(dpbdpbRule.Transform());
     }
     return(d);
 }
Example #25
0
        public Expression VisitDepositBits(DepositBits d)
        {
            var source = d.Source.Accept(this);

            if (source == Constant.Invalid)
            {
                return(source);
            }
            var inserted = d.InsertedBits.Accept(this);

            if (inserted == Constant.Invalid)
            {
                return(inserted);
            }
            return(new DepositBits(source, inserted, d.BitPosition));
        }
Example #26
0
        public bool Match(DepositBits dpb)
        {
            if (dpb.BitPosition != 0)
            {
                return(false);
            }
            this.e = dpb.Source as Identifier;
            if (e == null)
            {
                return(false);
            }
            var c = dpb.InsertedBits as Cast;

            if (c == null)
            {
                return(false);
            }
            return(e == c.Expression);
        }
Example #27
0
 public bool Match(DepositBits dpb)
 {
     this.dpb = dpb;
     if (!(dpb.Source.DataType is PrimitiveType pt) || pt.Domain == Domain.Real)
     {
         return(false);
     }
     if (!(dpb.InsertedBits.DataType is PrimitiveType ptIns) || ptIns.Domain == Domain.Real)
     {
         return(false);
     }
     cSrc = dpb.Source as Constant;
     if (cSrc == null)
     {
         return(false);
     }
     cBits = dpb.InsertedBits as Constant;
     if (cBits != null)
     {
         return(true);
     }
     return(cSrc.ToInt32() == 0 && dpb.BitPosition == 0);
 }
Example #28
0
 public ValueSet VisitDepositBits(DepositBits d)
 {
     throw new NotImplementedException();
 }
Example #29
0
 public void VisitDepositBits(DepositBits dpb)
 {
     handler.MemAccessTrait(basePointer, dpb, dpb.DataType.Size, eField, 0);
 }
Example #30
0
 public override void VisitDepositBits(DepositBits d)
 {
     d.Source.Accept(this);
     d.InsertedBits.Accept(this);
     EnsureTypeVariable(d);
 }
Example #31
0
 public virtual void VisitDepositBits(DepositBits d)
 {
     d.Source.Accept(this);
     d.InsertedBits.Accept(this);
 }
Example #32
0
		public void VisitDepositBits(DepositBits d)
		{
			writer.Write("DPB(");
			WriteExpression(d.Source);
			writer.Write(", ");
			WriteExpression(d.InsertedBits);
			writer.Write(", {0})", d.BitPosition);
		}
Example #33
0
 public DataType VisitDepositBits(DepositBits d)
 {
     throw new NotImplementedException();
 }
		public override void VisitDepositBits(DepositBits d)
		{
			d.Source.Accept(this);
			d.InsertedBits.Accept(this);
			EnsureTypeVariable(d);
		}
Example #35
0
		public virtual void VisitDepositBits(DepositBits d)
		{
			d.Source.Accept(this);
			d.InsertedBits.Accept(this);
		}
Example #36
0
 public Expression VisitDepositBits(DepositBits d)
 {
     throw new NotImplementedException();
 }