Exemplo n.º 1
0
        public static IReadable Invoke(string scopeName, IReference storage, IntExpression lhs, IntExpression rhs,
                                       ActionOnThreeLowRegisters registerAction, ActionOnTwoLowRegistersAndAByte byteAction)
        {
            var f = FuncBuilder.Instance;

            using (f.OpenScope(scopeName)) {
                var sm        = new StorageManager(storage);
                var lhsResult = lhs.EvaluateTo(sm.ForLhs(rhs));
                var rhsResult = rhs.EvaluateTo(sm.ForRhs(lhsResult));

                var storageReg   = storage.ProposeRegisterOrScratch0();
                var lhsReg       = lhsResult.ToRegister(f.Scratch0);
                var rhsRegOrByte = rhsResult.ToRegisterOrByte(f.Scratch1);
                if (rhsRegOrByte.IsRegister)
                {
                    registerAction(storageReg, lhsReg, rhsRegOrByte.Register);
                }
                else
                {
                    byteAction(storageReg, lhsReg, rhsRegOrByte.Byte);
                }
                storage.FromRegister(storageReg);
                return(storage);
            }
        }
Exemplo n.º 2
0
        protected IReadable EvaluateToHelper(IReference storage, ActionOnThreeLowRegisters regAction, ActionOnTwoLowRegistersAndAByte byteAction)
        {
            var f = FuncBuilder.Instance;

            using (f.OpenScope("indirectReferenceEval")) {
                var declarer      = f.Declare;
                var baseStorage   = declarer.Int("base");
                var offsetStorage = declarer.Int("offset");

                var baseResult   = baseAddress.EvaluateTo(baseStorage);
                var offsetResult = offset.EvaluateTo(offsetStorage);

                var storageReg      = storage.ProposeRegisterOrScratch0();
                var baseReg         = baseResult.ToRegister(f.Scratch0);
                var offsetRegOrByte = offsetResult.ToRegisterOrUnsignedConstant(exclusiveUpperBoundForConstantOffset, f.Scratch1);
                if (offsetRegOrByte.IsRegister)
                {
                    regAction(storageReg, baseReg, offsetRegOrByte.Register);
                }
                else
                {
                    byteAction(storageReg, baseReg, offsetRegOrByte.Byte);
                }
                storage.FromRegister(storageReg);
                return(storage);
            }
        }
Exemplo n.º 3
0
        protected override IReadable EvaluateToHelper(IReference storage)
        {
            var emitter=CodeGenerator.Emitter;

              var myAddress=label.GetLabelAddressBestEffort();

              var targetRegister=storage.ProposeRegisterOrScratch0();
              emitter.EmitLoadAddress(Format12OpCode.LDADDR_PC, targetRegister, myAddress, wantThumbAdjustment);
              storage.FromRegister(targetRegister);
              return storage;
        }
Exemplo n.º 4
0
        protected override IReadable EvaluateToHelper(IReference storage)
        {
            var emitter=CodeGenerator.Emitter;

              var exprResult=expr.EvaluateTo(storage);
              var storageReg=storage.ProposeRegisterOrScratch0();
              var exprReg=exprResult.ToRegister(storageReg);
              emitter.Emit(OpCodes.Format4OpCode.NEG, storageReg, exprReg);
              storage.FromRegister(storageReg);
              return storage;
        }
Exemplo n.º 5
0
        protected override IReadable EvaluateToHelper(IReference storage)
        {
            var emitter = CodeGenerator.Emitter;

            var exprResult = expr.EvaluateTo(storage);
            var storageReg = storage.ProposeRegisterOrScratch0();
            var exprReg    = exprResult.ToRegister(storageReg);

            emitter.Emit(OpCodes.Format4OpCode.NEG, storageReg, exprReg);
            storage.FromRegister(storageReg);
            return(storage);
        }
Exemplo n.º 6
0
        protected override IReadable EvaluateToHelper(IReference storage)
        {
            var emitter = CodeGenerator.Emitter;

            var myAddress = label.GetLabelAddressBestEffort();

            var targetRegister = storage.ProposeRegisterOrScratch0();

            emitter.EmitLoadAddress(Format12OpCode.LDADDR_PC, targetRegister, myAddress, wantThumbAdjustment);
            storage.FromRegister(targetRegister);
            return(storage);
        }
Exemplo n.º 7
0
 public static void SpecialAssignAny(IReference lhs, Expression rhs)
 {
     var f=FuncBuilder.Instance;
       var lhsWasLivePriorToThisAssignment=f.IsLive(lhs);
       var rhsReadable=rhs.EvaluateTo(lhs);
       if(!ReferenceEquals(lhs, rhsReadable)) {
     var lhsReg=lhs.ProposeRegisterOrScratch0();
     var rhsReg=rhsReadable.ToRegister(lhsReg);
     lhs.FromRegister(rhsReg);
       }
       //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage)
       //in its very-own assignment.
       if(!lhsWasLivePriorToThisAssignment) {
     f.UndoNoteRead(new[] {lhs});
       }
 }
Exemplo n.º 8
0
        public static void SpecialAssignAny(IReference lhs, Expression rhs)
        {
            var f = FuncBuilder.Instance;
            var lhsWasLivePriorToThisAssignment = f.IsLive(lhs);
            var rhsReadable = rhs.EvaluateTo(lhs);

            if (!ReferenceEquals(lhs, rhsReadable))
            {
                var lhsReg = lhs.ProposeRegisterOrScratch0();
                var rhsReg = rhsReadable.ToRegister(lhsReg);
                lhs.FromRegister(rhsReg);
            }
            //Don't decide that a variable is live just because it was referenced (or it was used as temporary storage)
            //in its very-own assignment.
            if (!lhsWasLivePriorToThisAssignment)
            {
                f.UndoNoteRead(new[] { lhs });
            }
        }
Exemplo n.º 9
0
        public static IReadable Invoke(string scopeName, IReference storage, IntExpression lhs, IntExpression rhs,
      ActionOnThreeLowRegisters registerAction, ActionOnTwoLowRegistersAndAByte byteAction)
        {
            var f=FuncBuilder.Instance;

              using(f.OpenScope(scopeName)) {
            var sm=new StorageManager(storage);
            var lhsResult=lhs.EvaluateTo(sm.ForLhs(rhs));
            var rhsResult=rhs.EvaluateTo(sm.ForRhs(lhsResult));

            var storageReg=storage.ProposeRegisterOrScratch0();
            var lhsReg=lhsResult.ToRegister(f.Scratch0);
            var rhsRegOrByte=rhsResult.ToRegisterOrByte(f.Scratch1);
            if(rhsRegOrByte.IsRegister) {
              registerAction(storageReg, lhsReg, rhsRegOrByte.Register);
            } else {
              byteAction(storageReg, lhsReg, rhsRegOrByte.Byte);
            }
            storage.FromRegister(storageReg);
            return storage;
              }
        }
Exemplo n.º 10
0
        protected IReadable EvaluateToHelper(IReference storage, ActionOnThreeLowRegisters regAction, ActionOnTwoLowRegistersAndAByte byteAction)
        {
            var f=FuncBuilder.Instance;
              using(f.OpenScope("indirectReferenceEval")) {
            var declarer=f.Declare;
            var baseStorage=declarer.Int("base");
            var offsetStorage=declarer.Int("offset");

            var baseResult=baseAddress.EvaluateTo(baseStorage);
            var offsetResult=offset.EvaluateTo(offsetStorage);

            var storageReg=storage.ProposeRegisterOrScratch0();
            var baseReg=baseResult.ToRegister(f.Scratch0);
            var offsetRegOrByte=offsetResult.ToRegisterOrUnsignedConstant(exclusiveUpperBoundForConstantOffset, f.Scratch1);
            if(offsetRegOrByte.IsRegister) {
              regAction(storageReg, baseReg, offsetRegOrByte.Register);
            } else {
              byteAction(storageReg, baseReg, offsetRegOrByte.Byte);
            }
            storage.FromRegister(storageReg);
            return storage;
              }
        }