Add a var_types_classification for simd (#82616)
authorTanner Gooding <tagoo@outlook.com>
Fri, 24 Feb 2023 20:39:54 +0000 (12:39 -0800)
committerGitHub <noreply@github.com>
Fri, 24 Feb 2023 20:39:54 +0000 (12:39 -0800)
* Add a var_types_classification for simd

* Ensure TYP_SIMD are actually marked VTF_VEC

src/coreclr/jit/typelist.h
src/coreclr/jit/vartype.h

index f7af257..ae804f5 100644 (file)
@@ -58,10 +58,10 @@ DEF_TP(LCLBLK  ,"lclBlk"  , TYP_LCLBLK,  TI_ERROR, 0,  0,  0,   1, 4, VTF_ANY) /
 
 #ifdef FEATURE_SIMD
 // Amd64: The size and alignment of SIMD vector varies at JIT time based on whether target arch supports AVX or SSE2.
-DEF_TP(SIMD8    ,"simd8"  , TYP_SIMD8,   TI_STRUCT, 8, 8,  8,   2, 8, VTF_S)
-DEF_TP(SIMD12   ,"simd12" , TYP_SIMD12,  TI_STRUCT,12,16, 16,   4,16, VTF_S)
-DEF_TP(SIMD16   ,"simd16" , TYP_SIMD16,  TI_STRUCT,16,16, 16,   4,16, VTF_S)
-DEF_TP(SIMD32   ,"simd32" , TYP_SIMD32,  TI_STRUCT,32,32, 32,   8,16, VTF_S)
+DEF_TP(SIMD8    ,"simd8"  , TYP_SIMD8,   TI_STRUCT, 8, 8,  8,   2, 8, VTF_S|VTF_VEC)
+DEF_TP(SIMD12   ,"simd12" , TYP_SIMD12,  TI_STRUCT,12,16, 16,   4,16, VTF_S|VTF_VEC)
+DEF_TP(SIMD16   ,"simd16" , TYP_SIMD16,  TI_STRUCT,16,16, 16,   4,16, VTF_S|VTF_VEC)
+DEF_TP(SIMD32   ,"simd32" , TYP_SIMD32,  TI_STRUCT,32,32, 32,   8,16, VTF_S|VTF_VEC)
 #endif // FEATURE_SIMD
 
 DEF_TP(UNKNOWN ,"unknown" ,TYP_UNKNOWN,  TI_ERROR, 0,  0,  0,   0, 0, VTF_ANY)
index 33c4110..a51dbff 100644 (file)
@@ -17,6 +17,7 @@ enum var_types_classification
     VTF_BYR = 0x0010, // type is Byref
     VTF_I   = 0x0020, // is machine sized
     VTF_S   = 0x0040, // is a struct type
+    VTF_VEC = 0x0080, // is a vector type
 };
 
 #include "vartypesdef.h"
@@ -61,30 +62,16 @@ inline var_types TypeGet(var_types v)
     return v;
 }
 
-#ifdef FEATURE_SIMD
-template <class T>
-inline bool varTypeIsSIMD(T vt)
-{
-    switch (TypeGet(vt))
-    {
-        case TYP_SIMD8:
-        case TYP_SIMD12:
-        case TYP_SIMD16:
-        case TYP_SIMD32:
-            return true;
-        default:
-            return false;
-    }
-}
-#else  // FEATURE_SIMD
-
-// Always return false if FEATURE_SIMD is not enabled
 template <class T>
 inline bool varTypeIsSIMD(T vt)
 {
+#ifdef FEATURE_SIMD
+    return ((varTypeClassification[TypeGet(vt)] & VTF_VEC) != 0);
+#else
+    // Always return false if FEATURE_SIMD is not enabled
     return false;
-}
 #endif // !FEATURE_SIMD
+}
 
 template <class T>
 inline bool varTypeIsIntegral(T vt)