Fixing a few small issues with the SIMD vs SIMD HWIntrinsics (dotnet/coreclr#21097)
authorTanner Gooding <tagoo@outlook.com>
Mon, 26 Nov 2018 19:44:51 +0000 (11:44 -0800)
committerGitHub <noreply@github.com>
Mon, 26 Nov 2018 19:44:51 +0000 (11:44 -0800)
* Fixing the simdHandleCache to add entries for Vector64FloatHandle and Vector128FloatHandle

* Fixing two places that were calling just OperIsSIMD() rather than OperIsSIMDorSimdHWintrinsic()

Commit migrated from https://github.com/dotnet/coreclr/commit/570bda3870a8c3b479384b21e1e1bdd427fdd3a1

src/coreclr/src/jit/compiler.h
src/coreclr/src/jit/hwintrinsic.cpp
src/coreclr/src/jit/lowerarmarch.cpp
src/coreclr/src/jit/morph.cpp
src/coreclr/src/jit/simd.cpp

index 1ffd5e0..1e5663f 100644 (file)
@@ -7536,12 +7536,12 @@ private:
 #ifdef FEATURE_HW_INTRINSICS
 #if defined(_TARGET_ARM64_)
         CORINFO_CLASS_HANDLE Vector64FloatHandle;
-        CORINFO_CLASS_HANDLE Vector64UIntHandle;
+        CORINFO_CLASS_HANDLE Vector64IntHandle;
         CORINFO_CLASS_HANDLE Vector64UShortHandle;
         CORINFO_CLASS_HANDLE Vector64UByteHandle;
         CORINFO_CLASS_HANDLE Vector64ShortHandle;
         CORINFO_CLASS_HANDLE Vector64ByteHandle;
-        CORINFO_CLASS_HANDLE Vector64IntHandle;
+        CORINFO_CLASS_HANDLE Vector64UIntHandle;
 #endif // defined(_TARGET_ARM64_)
         CORINFO_CLASS_HANDLE Vector128FloatHandle;
         CORINFO_CLASS_HANDLE Vector128DoubleHandle;
index a2f741e..a87f40f 100644 (file)
@@ -117,8 +117,8 @@ CORINFO_CLASS_HANDLE Compiler::gtGetStructHandleForHWSIMD(var_types simdType, va
         {
             case TYP_FLOAT:
                 return m_simdHandleCache->Vector64FloatHandle;
-            case TYP_UINT:
-                return m_simdHandleCache->Vector64UIntHandle;
+            case TYP_INT:
+                return m_simdHandleCache->Vector64IntHandle;
             case TYP_USHORT:
                 return m_simdHandleCache->Vector64UShortHandle;
             case TYP_UBYTE:
@@ -127,8 +127,8 @@ CORINFO_CLASS_HANDLE Compiler::gtGetStructHandleForHWSIMD(var_types simdType, va
                 return m_simdHandleCache->Vector64ShortHandle;
             case TYP_BYTE:
                 return m_simdHandleCache->Vector64ByteHandle;
-            case TYP_INT:
-                return m_simdHandleCache->Vector64IntHandle;
+            case TYP_UINT:
+                return m_simdHandleCache->Vector64UIntHandle;
             default:
                 assert(!"Didn't find a class handle for simdType");
         }
index 2ad167e..d8d23eb 100644 (file)
@@ -357,7 +357,7 @@ void Lowering::LowerBlockStore(GenTreeBlk* blkNode)
                 addr->ClearContained();
             }
         }
-        else if (!source->IsMultiRegCall() && !source->OperIsSIMD())
+        else if (!source->IsMultiRegCall() && !source->OperIsSIMDorSimdHWintrinsic())
         {
             assert(source->IsLocal());
             MakeSrcContained(blkNode, source);
index fb7ab00..863ebba 100644 (file)
@@ -1594,8 +1594,9 @@ void fgArgInfo::ArgsComplete()
                 else if (isMultiRegArg && varTypeIsSIMD(argx->TypeGet()))
                 {
                     // SIMD types do not need the optimization below due to their sizes
-                    if (argx->OperIs(GT_SIMD) || (argx->OperIs(GT_OBJ) && argx->AsObj()->gtOp1->OperIs(GT_ADDR) &&
-                                                  argx->AsObj()->gtOp1->gtOp.gtOp1->OperIs(GT_SIMD)))
+                    if (argx->OperIsSIMDorSimdHWintrinsic() ||
+                        (argx->OperIs(GT_OBJ) && argx->AsObj()->gtOp1->OperIs(GT_ADDR) &&
+                         argx->AsObj()->gtOp1->gtOp.gtOp1->OperIsSIMDorSimdHWintrinsic()))
                     {
                         curArgTabEntry->needTmp = true;
                     }
index 1f735a1..ccebc78 100644 (file)
@@ -437,15 +437,15 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u
             size         = Vector256SizeBytes;
             JITDUMP("  Known type Vector256<ulong>\n");
         }
-        else if (typeHnd == m_simdHandleCache->Vector256FloatHandle)
+        else
+#endif // defined(_TARGET_XARCH)
+            if (typeHnd == m_simdHandleCache->Vector128FloatHandle)
         {
             simdBaseType = TYP_FLOAT;
-            size         = Vector256SizeBytes;
-            JITDUMP("  Known type Vector256<float>\n");
+            size         = Vector128SizeBytes;
+            JITDUMP("  Known type Vector128<float>\n");
         }
-        else
-#endif // defined(_TARGET_XARCH)
-            if (typeHnd == m_simdHandleCache->Vector128DoubleHandle)
+        else if (typeHnd == m_simdHandleCache->Vector128DoubleHandle)
         {
             simdBaseType = TYP_DOUBLE;
             size         = Vector128SizeBytes;
@@ -499,7 +499,14 @@ var_types Compiler::getBaseTypeAndSizeOfSIMDType(CORINFO_CLASS_HANDLE typeHnd, u
             size         = Vector128SizeBytes;
             JITDUMP("  Known type Vector128<ulong>\n");
         }
+        else
 #if defined(_TARGET_ARM64_)
+            if (typeHnd == m_simdHandleCache->Vector64FloatHandle)
+        {
+            simdBaseType = TYP_FLOAT;
+            size         = Vector64SizeBytes;
+            JITDUMP("  Known type Vector64<float>\n");
+        }
         else if (typeHnd == m_simdHandleCache->Vector64IntHandle)
         {
             simdBaseType = TYP_INT;