Modify THUNK_PARAM generated in SaveWork
authorHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 6 Apr 2017 08:56:58 +0000 (17:56 +0900)
committerHyeongseok Oh <hseok82.oh@samsung.com>
Thu, 6 Apr 2017 10:23:47 +0000 (19:23 +0900)
- Use parameter r4 to pass Indirection from code generated by R2R
- Define REG_R2R_INDIRECT_PARAM in ARM32 to merge with ARM64 routine

src/jit/gentree.cpp
src/jit/lower.cpp
src/jit/target.h
src/zap/zapimport.cpp

index 4f1b724..1d125b4 100644 (file)
@@ -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
 
index 487054e..3235305 100644 (file)
@@ -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;
index a775186..7221e26 100644 (file)
@@ -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
index 3e4e45d..f256bee 100644 (file)
@@ -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())