}
#ifdef FEATURE_READYTORUN_COMPILER
-#if defined(_TARGET_ARM64_)
+#if defined(_TARGET_ARM64_) || defined(_TARGET_ARM_)
if (tree->gtCall.IsR2RRelativeIndir())
{
ftreg |= RBM_R2R_INDIRECT_PARAM;
}
-#elif defined(_TARGET_ARM_)
- if (tree->gtCall.IsR2RRelativeIndir())
- {
- ftreg |= RBM_JUMP_THUNK_PARAM;
- }
#endif
#endif
GenTree* indir = Ind(cellAddr);
#ifdef FEATURE_READYTORUN_COMPILER
-#if defined(_TARGET_ARM64_)
+#if defined(_TARGET_ARM64_) || defined(_TARGET_ARM_)
// For arm64, we dispatch code same as VSD using X11 for indirection cell address,
// which ZapIndirectHelperThunk expects.
if (call->IsR2RRelativeIndir())
cellAddr->gtRegNum = REG_R2R_INDIRECT_PARAM;
indir->gtRegNum = REG_JUMP_THUNK_PARAM;
}
-#elif defined(_TARGET_ARM_)
- if (call->IsR2RRelativeIndir())
- {
- cellAddr->gtRegNum = REG_JUMP_THUNK_PARAM;
- indir->gtRegNum = REG_VIRTUAL_STUB_PARAM;
- }
#endif
#endif
result = indir;
#define RBM_VIRTUAL_STUB_PARAM RBM_R4
#define PREDICT_REG_VIRTUAL_STUB_PARAM PREDICT_REG_R4
+ // R2R indirect call. Use the same registers as VSD
+ #define REG_R2R_INDIRECT_PARAM REG_R4
+ #define RBM_R2R_INDIRECT_PARAM RBM_R4
+ #define PREDICT_REG_RER_INDIRECT_PARAM PREDICT_REG_R4
+
// Registers used by PInvoke frame setup
#define REG_PINVOKE_FRAME REG_R4
#define RBM_PINVOKE_FRAME RBM_R4
#elif defined(_TARGET_ARM_)
if (IsDelayLoadHelper())
{
- // Indirection
- if (IsVSD())
- {
- // push r4
- *(WORD *)(p + 0) = 0xB410;
- p += 2;
- }
- else
- {
- // push r12
- *(WORD *)(p + 0) = 0xF84D;
- *(WORD *)(p + 2) = 0xCD04;
- p += 4;
- }
+ // r4 contains indirection cell
+ // push r4
+ *(WORD *)(p + 0) = 0xB410;
+ p += 2;
- // mov r12, index
- *(WORD *)(p + 0) = 0xF04F;
+ // mov r4, index
_ASSERTE(GetSectionIndex() <= 0x7F);
- *(WORD *)(p + 2) = 0x0C00 | (BYTE)GetSectionIndex();
- p += 4;
+ *(WORD *)(p + 0) = 0x2400 | (BYTE)GetSectionIndex();
+ p += 2;
- // push r12
- *(WORD *)(p + 0) = 0xF84D;
- *(WORD *)(p + 2) = 0xCD04;
- p += 4;
+ // push r4
+ *(WORD *)(p + 0) = 0xB410;
+ p += 2;
- // mov r12, [module]
- MovRegImm(p, 12);
+ // mov r4, [module]
+ MovRegImm(p, 4);
if (pImage != NULL)
pImage->WriteReloc(buffer, (int) (p - buffer), pImage->GetImportTable()->GetHelperImport(READYTORUN_HELPER_Module), 0, IMAGE_REL_BASED_THUMB_MOV32);
p += 8;
- // ldr r12, [r12]
- *(WORD *)(p + 0) = 0xF8DC;
- *(WORD *)(p + 2) = 0xC000;
- p += 4;
+ // ldr r4, [r4]
+ *(WORD *)p = 0x6824;
+ p += 2;
- // push r12
- *(WORD *)(p + 0) = 0xF84D;
- *(WORD *)(p + 2) = 0xCD04;
- p += 4;
+ // push r4
+ *(WORD *)(p + 0) = 0xB410;
+ p += 2;
}
else
if (IsLazyHelper())
p += 2;
}
- // mov r12, [helper]
- MovRegImm(p, 12);
+ // mov r4, [helper]
+ MovRegImm(p, 4);
if (pImage != NULL)
pImage->WriteReloc(buffer, (int) (p - buffer), pImage->GetImportTable()->GetHelperImport(GetReadyToRunHelper()), 0, IMAGE_REL_BASED_THUMB_MOV32);
p += 8;
- // ldr r12, [r12]
- *(WORD *)(p + 0) = 0xF8DC;
- *(WORD *)(p + 2) = 0xC000;
- p += 4;
+ // ldr r4, [r4]
+ *(WORD *)p = 0x6824;
+ p += 2;
- // bx r12
- *(WORD *)p = 0x4760;
+ // bx r4
+ *(WORD *)p = 0x4720;
p += 2;
#elif defined(_TARGET_ARM64_)
if (IsDelayLoadHelper())