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; } }
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(); }