Esempio n. 1
0
        public static void EmitDataLoadOper2(AILEmitterCtx Context)
        {
            switch (Context.CurrOp)
            {
            case IAOpCodeAluImm Op:
                Context.EmitLdc_I(Op.Imm);
                break;

            case IAOpCodeAluRs Op:
                Context.EmitLdintzr(Op.Rm);

                switch (Op.ShiftType)
                {
                case AShiftType.Lsl: Context.EmitLsl(Op.Shift); break;

                case AShiftType.Lsr: Context.EmitLsr(Op.Shift); break;

                case AShiftType.Asr: Context.EmitAsr(Op.Shift); break;

                case AShiftType.Ror: Context.EmitRor(Op.Shift); break;
                }
                break;

            case IAOpCodeAluRx Op:
                Context.EmitLdintzr(Op.Rm);
                Context.EmitCast(Op.IntType);
                Context.EmitLsl(Op.Shift);
                break;
            }
        }
Esempio n. 2
0
        private static void EmitLoadAddress(AILEmitterCtx Context)
        {
            switch (Context.CurrOp)
            {
            case AOpCodeMemImm Op:
                Context.EmitLdint(Op.Rn);

                if (!Op.PostIdx)
                {
                    //Pre-indexing.
                    Context.EmitLdc_I(Op.Imm);

                    Context.Emit(OpCodes.Add);
                }
                break;

            case AOpCodeMemReg Op:
                Context.EmitLdint(Op.Rn);
                Context.EmitLdintzr(Op.Rm);
                Context.EmitCast(Op.IntType);

                if (Op.Shift)
                {
                    Context.EmitLsl(Op.Size);
                }

                Context.Emit(OpCodes.Add);
                break;
            }

            //Save address to Scratch var since the register value may change.
            Context.Emit(OpCodes.Dup);

            Context.EmitSttmp();
        }