[Arm64] Don't generate hardware intrinsic method bodies (#39753)
authorEgor Chesakov <Egor.Chesakov@microsoft.com>
Sat, 25 Jul 2020 18:33:55 +0000 (11:33 -0700)
committerGitHub <noreply@github.com>
Sat, 25 Jul 2020 18:33:55 +0000 (11:33 -0700)
* Don't generate hardware intrinsic method bodies on Arm64 in zapinfo.cpp

* Treat Vector64 and Vector128 methods as intrinsics on Arm64 in zapinfo.cpp

src/coreclr/src/zap/zapinfo.cpp

index 08c143d..e997efa 100644 (file)
@@ -450,7 +450,7 @@ void ZapInfo::CompileMethod()
     }
 #endif
 
-#if defined(TARGET_X86) || defined(TARGET_AMD64)
+#if defined(TARGET_X86) || defined(TARGET_AMD64) || defined(TARGET_ARM64)
     if (methodAttribs & CORINFO_FLG_JIT_INTRINSIC)
     {
         // Skip generating hardware intrinsic method bodies.
@@ -2164,15 +2164,17 @@ DWORD FilterNamedIntrinsicMethodAttribs(ZapInfo* pZapInfo, DWORD attribs, CORINF
         // is because they often change the code they emit based on what ISAs are supported by the compiler,
         // but we don't know what the target machine will support.
         //
-        // Additionally, we make sure none of the hardware intrinsic method bodies (except ARM64) get pregenerated in crossgen
+        // Additionally, we make sure none of the hardware intrinsic method bodies get pregenerated in crossgen
         // (see ZapInfo::CompileMethod) but get JITted instead. The JITted method will have the correct
         // answer for the CPU the code is running on.
 
-        // For Arm64, AdvSimd/ArmBase is the baseline that is suported and hence we do pregenerate the method bodies
-        // of ARM64 harware intrinsic.
-        fTreatAsRegularMethodCall = (fIsGetIsSupportedMethod && fIsPlatformHWIntrinsic);
-#if !defined(TARGET_ARM64)
-        fTreatAsRegularMethodCall |= (!fIsPlatformHWIntrinsic && fIsHWIntrinsic);
+        fTreatAsRegularMethodCall = fIsGetIsSupportedMethod && fIsPlatformHWIntrinsic;
+
+#if defined(TARGET_ARM64)
+        // On Arm64 AdvSimd ISA is required by CoreCLR, so we can expand Vector64<T> and Vector128<T> methods.
+        fTreatAsRegularMethodCall |= !fIsPlatformHWIntrinsic && fIsHWIntrinsic && (strcmp(className, "Vector64`1") != 0) && (strcmp(className, "Vector128`1") != 0);
+#else
+        fTreatAsRegularMethodCall |= !fIsPlatformHWIntrinsic && fIsHWIntrinsic;
 #endif 
 
         if (fIsPlatformHWIntrinsic)