From: Hyeongseok Oh Date: Thu, 6 Apr 2017 08:56:58 +0000 (+0900) Subject: Modify THUNK_PARAM generated in SaveWork X-Git-Tag: accepted/tizen/base/20180629.140029~1528^2~1 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=998d32c328b8c249d42a5e53c860e2ba8d456cd1;p=platform%2Fupstream%2Fcoreclr.git Modify THUNK_PARAM generated in SaveWork - Use parameter r4 to pass Indirection from code generated by R2R - Define REG_R2R_INDIRECT_PARAM in ARM32 to merge with ARM64 routine --- diff --git a/src/jit/gentree.cpp b/src/jit/gentree.cpp index 4f1b724..1d125b4 100644 --- a/src/jit/gentree.cpp +++ b/src/jit/gentree.cpp @@ -5524,16 +5524,11 @@ unsigned Compiler::gtSetEvalOrder(GenTree* tree) } #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 diff --git a/src/jit/lower.cpp b/src/jit/lower.cpp index 487054e..3235305 100644 --- a/src/jit/lower.cpp +++ b/src/jit/lower.cpp @@ -2542,7 +2542,7 @@ GenTree* Lowering::LowerDirectCall(GenTreeCall* call) 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()) @@ -2550,12 +2550,6 @@ GenTree* Lowering::LowerDirectCall(GenTreeCall* call) 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; diff --git a/src/jit/target.h b/src/jit/target.h index a775186..7221e26 100644 --- a/src/jit/target.h +++ b/src/jit/target.h @@ -1376,6 +1376,11 @@ typedef unsigned short regPairNoSmall; // arm: need 12 bits #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 diff --git a/src/zap/zapimport.cpp b/src/zap/zapimport.cpp index 3e4e45d..f256bee 100644 --- a/src/zap/zapimport.cpp +++ b/src/zap/zapimport.cpp @@ -2098,47 +2098,33 @@ DWORD ZapIndirectHelperThunk::SaveWorker(ZapWriter * pZapWriter) #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()) @@ -2154,19 +2140,18 @@ DWORD ZapIndirectHelperThunk::SaveWorker(ZapWriter * pZapWriter) 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())