Moving the simdSizeOfHWIntrinsic and numArgsOfHWIntrinsic methods to be static method...
authorTanner Gooding <tagoo@outlook.com>
Sat, 2 Jun 2018 16:49:04 +0000 (09:49 -0700)
committerTanner Gooding <tagoo@outlook.com>
Sat, 2 Jun 2018 21:23:38 +0000 (14:23 -0700)
src/jit/compiler.h
src/jit/gentree.cpp
src/jit/hwintrinsicArm64.cpp
src/jit/hwintrinsicArm64.h
src/jit/hwintrinsiccodegenxarch.cpp
src/jit/hwintrinsicxarch.cpp
src/jit/hwintrinsicxarch.h
src/jit/lowerxarch.cpp
src/jit/lsraarm64.cpp
src/jit/lsraxarch.cpp

index a5dc916cf446a2522f3876ea22910ac52a4fc493..aa1f469d0a978cffb6f61c4ee0037afb6476b198 100644 (file)
@@ -1460,6 +1460,10 @@ class Compiler
     friend class ObjectAllocator;
     friend struct GenTree;
 
+#ifdef FEATURE_HW_INTRINSICS
+    friend struct HWIntrinsicInfo;
+#endif // FEATURE_HW_INTRINSICS
+
 #ifndef _TARGET_64BIT_
     friend class DecomposeLongs;
 #endif // !_TARGET_64BIT_
@@ -2959,9 +2963,6 @@ protected:
                                        CORINFO_SIG_INFO*     sig,
                                        bool                  mustExpand);
 
-public:
-    static int numArgsOfHWIntrinsic(GenTreeHWIntrinsic* node);
-
 protected:
 #ifdef _TARGET_XARCH_
     static bool isIntrinsicAnIsSupportedPropertyGetter(NamedIntrinsic intrinsic);
@@ -3012,7 +3013,6 @@ protected:
                                 bool                  mustExpand);
     bool compSupportsHWIntrinsic(InstructionSet isa);
     bool isScalarISA(InstructionSet isa);
-    unsigned simdSizeOfHWIntrinsic(NamedIntrinsic intrinsic, CORINFO_SIG_INFO* sig);
     static GenTree* lastOpOfHWIntrinsic(GenTreeHWIntrinsic* node, int numArgs);
 
 protected:
index fce62b70050f6bc20f4b9d585907da475bf8c2c6..b40c026367a2eac814fc93ee42f3f91ed0512572 100644 (file)
@@ -17583,7 +17583,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoad()
         // Some AVX instructions here also have MemoryLoad sematics
 
         // Do we have 3 operands?
-        if (Compiler::numArgsOfHWIntrinsic(this) != 3)
+        if (HWIntrinsicInfo::lookupNumArgs(this) != 3)
         {
             return false;
         }
@@ -17618,7 +17618,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryStore()
         // Some AVX instructions here also have MemoryStore sematics
 
         // Do we have 3 operands?
-        if (Compiler::numArgsOfHWIntrinsic(this) != 3)
+        if (HWIntrinsicInfo::lookupNumArgs(this) != 3)
         {
             return false;
         }
@@ -17650,7 +17650,7 @@ bool GenTreeHWIntrinsic::OperIsMemoryLoadOrStore()
         // Some AVX instructions here also have MemoryLoad or MemoryStore sematics
 
         // Do we have 3 operands?
-        if (Compiler::numArgsOfHWIntrinsic(this) != 3)
+        if (HWIntrinsicInfo::lookupNumArgs(this) != 3)
         {
             return false;
         }
index c64ff6e4641c2fc55cb1fc7e38274bd87cd25e94..280bd3eedc141ad9819d0c444cf384a00168bd09 100644 (file)
@@ -139,7 +139,7 @@ bool Compiler::impCheckImmediate(GenTree* immediateOp, unsigned int max)
 }
 
 //------------------------------------------------------------------------
-// numArgsOfHWIntrinsic: gets the number of arguments for the hardware intrinsic.
+// lookupNumArgs: gets the number of arguments for the hardware intrinsic.
 // This attempts to do a table based lookup but will fallback to the number
 // of operands in 'node' if the table entry is -1.
 //
@@ -149,7 +149,7 @@ bool Compiler::impCheckImmediate(GenTree* immediateOp, unsigned int max)
 // Return Value:
 //     number of arguments
 //
-int Compiler::numArgsOfHWIntrinsic(GenTreeHWIntrinsic* node)
+int HWIntrinsicInfo::lookupNumArgs(const GenTreeHWIntrinsic* node)
 {
     NamedIntrinsic intrinsic = node->gtHWIntrinsicId;
 
index c0d3ffd360d1716285534f322bf03575e93a8eb1..e60288a26c9c8ea740ac4e5492c3047dbf7bcf40 100644 (file)
@@ -52,6 +52,7 @@ struct HWIntrinsicInfo
     instruction    instrs[3];
 
     static const HWIntrinsicInfo& lookup(NamedIntrinsic id);
+    static int lookupNumArgs(const GenTreeHWIntrinsic* node);
 
     static const char* lookupName(NamedIntrinsic id)
     {
index fddf16233cce7b157b40c685a8417cfa99f8b7e1..088e6d4a9f8eb5d869490a81f466b031a0d3c227 100644 (file)
@@ -56,7 +56,7 @@ void CodeGen::genHWIntrinsic(GenTreeHWIntrinsic* node)
     HWIntrinsicCategory category    = HWIntrinsicInfo::lookupCategory(intrinsicId);
     HWIntrinsicFlag     flags       = HWIntrinsicInfo::lookupFlags(intrinsicId);
     int                 ival        = HWIntrinsicInfo::lookupIval(intrinsicId);
-    int                 numArgs     = Compiler::numArgsOfHWIntrinsic(node);
+    int                 numArgs     = HWIntrinsicInfo::lookupNumArgs(node);
 
     assert((flags & HW_Flag_NoCodeGen) == 0);
 
@@ -1429,7 +1429,7 @@ void CodeGen::genAvxOrAvx2Intrinsic(GenTreeHWIntrinsic* node)
     emitAttr       attr        = EA_ATTR(node->gtSIMDSize);
     var_types      targetType  = node->TypeGet();
     instruction    ins         = HWIntrinsicInfo::lookupIns(intrinsicId, baseType);
-    int            numArgs     = Compiler::numArgsOfHWIntrinsic(node);
+    int            numArgs     = HWIntrinsicInfo::lookupNumArgs(node);
     GenTree*       op1         = node->gtGetOp1();
     GenTree*       op2         = node->gtGetOp2();
     regNumber      op1Reg      = REG_NA;
@@ -1708,7 +1708,7 @@ void CodeGen::genFMAIntrinsic(GenTreeHWIntrinsic* node)
     GenTree*        op1         = node->gtGetOp1();
     regNumber       targetReg   = node->gtRegNum;
 
-    assert(Compiler::numArgsOfHWIntrinsic(node) == 3);
+    assert(HWIntrinsicInfo::lookupNumArgs(node) == 3);
     assert(op1 != nullptr);
     assert(op1->OperIsList());
     assert(op1->gtGetOp2()->OperIsList());
index b8e6deca07efa4a827f9d1a4e272bbb5ef3ad285..55ead63a96d3ad5847e76dcad06f0cd841223379 100644 (file)
@@ -158,27 +158,23 @@ InstructionSet HWIntrinsicInfo::lookupIsa(const char* className)
 }
 
 //------------------------------------------------------------------------
-// simdSizeOfHWIntrinsic: get the SIMD size of this intrinsic
+// lookupSimdSize: Gets the SimdSize for a given HWIntrinsic and signature
 //
 // Arguments:
-//    intrinsic -- id of the intrinsic function.
+//    id -- The ID associated with the HWIntrinsic to lookup
+//   sig -- The signature of the HWIntrinsic to lookup
 //
 // Return Value:
-//     the SIMD size of this intrinsic
-//         - from the hwIntrinsicInfoArray table if intrinsic has NO HW_Flag_UnfixedSIMDSize
-//         - from the signature if intrinsic has HW_Flag_UnfixedSIMDSize
+//    The SIMD size for the HWIntrinsic associated with id and sig
 //
-// Note - this function is only used by the importer
-//        after importation (i.e., codegen), we can get the SIMD size from GenTreeHWIntrinsic IR
-unsigned Compiler::simdSizeOfHWIntrinsic(NamedIntrinsic intrinsic, CORINFO_SIG_INFO* sig)
+// Remarks:
+//    This function is only used by the importer. After importation, we can
+//    get the SIMD size from the GenTreeHWIntrinsic node.
+unsigned HWIntrinsicInfo::lookupSimdSize(Compiler* comp, NamedIntrinsic id, CORINFO_SIG_INFO* sig)
 {
-    assert(intrinsic > NI_HW_INTRINSIC_START && intrinsic < NI_HW_INTRINSIC_END);
-
-    HWIntrinsicFlag flags = HWIntrinsicInfo::lookupFlags(intrinsic);
-
-    if ((flags & HW_Flag_UnfixedSIMDSize) == 0)
+    if ((lookupFlags(id) & HW_Flag_UnfixedSIMDSize) == 0)
     {
-        return hwIntrinsicInfoArray[intrinsic - NI_HW_INTRINSIC_START - 1].simdSize;
+        return lookupSimdSize(id);
     }
 
     CORINFO_CLASS_HANDLE typeHnd = nullptr;
@@ -189,37 +185,31 @@ unsigned Compiler::simdSizeOfHWIntrinsic(NamedIntrinsic intrinsic, CORINFO_SIG_I
     }
     else
     {
-        assert((flags & HW_Flag_BaseTypeFromFirstArg) != 0);
-        typeHnd = info.compCompHnd->getArgClass(sig, sig->args);
+        assert((lookupFlags(id) & HW_Flag_BaseTypeFromFirstArg) != 0);
+        typeHnd = comp->info.compCompHnd->getArgClass(sig, sig->args);
     }
 
     unsigned  simdSize = 0;
-    var_types baseType = getBaseTypeAndSizeOfSIMDType(typeHnd, &simdSize);
-    assert(simdSize > 0 && baseType != TYP_UNKNOWN);
+    var_types baseType = comp->getBaseTypeAndSizeOfSIMDType(typeHnd, &simdSize);
+    assert((simdSize > 0) && (baseType != TYP_UNKNOWN));
     return simdSize;
 }
 
 //------------------------------------------------------------------------
-// numArgsOfHWIntrinsic: gets the number of arguments for the hardware intrinsic.
-// This attempts to do a table based lookup but will fallback to the number
-// of operands in 'node' if the table entry is -1.
+// lookupNumArgs: Gets the number of args for a given HWIntrinsic
 //
 // Arguments:
-//    node      -- GenTreeHWIntrinsic* node with nullptr default value
+//    node -- The HWIntrinsic node to get the number of args for
 //
 // Return Value:
-//     number of arguments
-//
-int Compiler::numArgsOfHWIntrinsic(GenTreeHWIntrinsic* node)
+//    The number of args for the HWIntrinsic associated with node
+int HWIntrinsicInfo::lookupNumArgs(const GenTreeHWIntrinsic* node)
 {
     assert(node != nullptr);
 
-    NamedIntrinsic intrinsic = node->gtHWIntrinsicId;
-
-    assert(intrinsic != NI_Illegal);
-    assert(intrinsic > NI_HW_INTRINSIC_START && intrinsic < NI_HW_INTRINSIC_END);
+    NamedIntrinsic id      = node->gtHWIntrinsicId;
+    int            numArgs = lookupNumArgs(id);
 
-    int numArgs = hwIntrinsicInfoArray[intrinsic - NI_HW_INTRINSIC_START - 1].numArgs;
     if (numArgs >= 0)
     {
         return numArgs;
@@ -228,7 +218,6 @@ int Compiler::numArgsOfHWIntrinsic(GenTreeHWIntrinsic* node)
     assert(numArgs == -1);
 
     GenTree* op1 = node->gtGetOp1();
-    GenTree* op2 = node->gtGetOp2();
 
     if (op1 == nullptr)
     {
@@ -237,26 +226,25 @@ int Compiler::numArgsOfHWIntrinsic(GenTreeHWIntrinsic* node)
 
     if (op1->OperIsList())
     {
-        numArgs              = 0;
+#if DEBUG
         GenTreeArgList* list = op1->AsArgList();
+        numArgs              = 0;
 
-        while (list != nullptr)
+        do
         {
             numArgs++;
             list = list->Rest();
-        }
+        } while (list != nullptr);
 
-        // We should only use a list if we have 3 operands.
-        assert(numArgs >= 3);
-        return numArgs;
-    }
+        assert(numArgs == 3);
+#endif
 
-    if (op2 == nullptr)
-    {
-        return 1;
+        return 3;
     }
 
-    return 2;
+    GenTree* op2 = node->gtGetOp2();
+
+    return (op2 == nullptr) ? 1 : 2;
 }
 
 //------------------------------------------------------------------------
@@ -728,7 +716,7 @@ GenTree* Compiler::impHWIntrinsic(NamedIntrinsic        intrinsic,
     // table-driven importer of simple intrinsics
     if (isTableDriven)
     {
-        unsigned                simdSize = simdSizeOfHWIntrinsic(intrinsic, sig);
+        unsigned                simdSize = HWIntrinsicInfo::lookupSimdSize(this, intrinsic, sig);
         CORINFO_ARG_LIST_HANDLE argList  = sig->args;
         CORINFO_CLASS_HANDLE    argClass;
         var_types               argType = TYP_UNKNOWN;
@@ -847,7 +835,7 @@ GenTree* Compiler::impSSEIntrinsic(NamedIntrinsic        intrinsic,
     GenTree* op2      = nullptr;
     GenTree* op3      = nullptr;
     GenTree* op4      = nullptr;
-    int      simdSize = simdSizeOfHWIntrinsic(intrinsic, sig);
+    int      simdSize = HWIntrinsicInfo::lookupSimdSize(this, intrinsic, sig);
 
     // The Prefetch and StoreFence intrinsics don't take any SIMD operands
     // and have a simdSize of 0
@@ -897,7 +885,7 @@ GenTree* Compiler::impSSE2Intrinsic(NamedIntrinsic        intrinsic,
     GenTree*  op1      = nullptr;
     GenTree*  op2      = nullptr;
     int       ival     = -1;
-    int       simdSize = simdSizeOfHWIntrinsic(intrinsic, sig);
+    int       simdSize = HWIntrinsicInfo::lookupSimdSize(this, intrinsic, sig);
     var_types baseType = TYP_UNKNOWN;
     var_types retType  = TYP_UNKNOWN;
 
@@ -1031,7 +1019,7 @@ GenTree* Compiler::impAvxOrAvx2Intrinsic(NamedIntrinsic        intrinsic,
     GenTree*  op1      = nullptr;
     GenTree*  op2      = nullptr;
     var_types baseType = TYP_UNKNOWN;
-    int       simdSize = simdSizeOfHWIntrinsic(intrinsic, sig);
+    int       simdSize = HWIntrinsicInfo::lookupSimdSize(this, intrinsic, sig);
 
     switch (intrinsic)
     {
index 2935057b3512850910fa12b1eac3914f7fe733bd..51fb5fff9a277cda2722edadc8c6f5f26d11a17c 100644 (file)
@@ -138,8 +138,11 @@ struct HWIntrinsicInfo
     HWIntrinsicFlag         flags;
 
     static const HWIntrinsicInfo& lookup(NamedIntrinsic id);
+
     static NamedIntrinsic lookupId(const char* className, const char* methodName);
     static InstructionSet lookupIsa(const char* className);
+    static unsigned lookupSimdSize(Compiler* comp, NamedIntrinsic id, CORINFO_SIG_INFO* sig);
+    static int lookupNumArgs(const GenTreeHWIntrinsic* node);
 
     // Member lookup
 
index 11066becc768f96435714c2584e74bcb59c426b0..ba9833ac4a433f55ac9aefd7de4b7c07f697a402 100644 (file)
@@ -2505,7 +2505,7 @@ void Lowering::ContainCheckHWIntrinsic(GenTreeHWIntrinsic* node)
     NamedIntrinsic      intrinsicID = node->gtHWIntrinsicId;
     HWIntrinsicCategory category    = HWIntrinsicInfo::lookupCategory(intrinsicID);
     HWIntrinsicFlag     flags       = HWIntrinsicInfo::lookupFlags(intrinsicID);
-    int                 numArgs     = Compiler::numArgsOfHWIntrinsic(node);
+    int                 numArgs     = HWIntrinsicInfo::lookupNumArgs(node);
     var_types           baseType    = node->gtSIMDBaseType;
 
     GenTree* op1 = node->gtGetOp1();
index fbca9ae901b5218b80fea2174a7d05c6686c3cb5..9cc17cacc02bc8b995b54ebdb6ef9dd8bf172117 100644 (file)
@@ -1027,7 +1027,7 @@ int LinearScan::BuildSIMD(GenTreeSIMD* simdTree)
 int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree)
 {
     NamedIntrinsic intrinsicID = intrinsicTree->gtHWIntrinsicId;
-    int            numArgs     = Compiler::numArgsOfHWIntrinsic(intrinsicTree);
+    int            numArgs     = HWIntrinsicInfo::lookupNumArgs(intrinsicTree);
 
     GenTree* op1      = intrinsicTree->gtGetOp1();
     GenTree* op2      = intrinsicTree->gtGetOp2();
index 15103100a4cbe75fd4d999b0ae369b273d85a0d6..43484f3d7298d008f9f52eabc95d84143d34f309 100644 (file)
@@ -2295,7 +2295,7 @@ int LinearScan::BuildHWIntrinsic(GenTreeHWIntrinsic* intrinsicTree)
     InstructionSet      isa         = HWIntrinsicInfo::lookupIsa(intrinsicId);
     HWIntrinsicCategory category    = HWIntrinsicInfo::lookupCategory(intrinsicId);
     HWIntrinsicFlag     flags       = HWIntrinsicInfo::lookupFlags(intrinsicId);
-    int                 numArgs     = Compiler::numArgsOfHWIntrinsic(intrinsicTree);
+    int                 numArgs     = HWIntrinsicInfo::lookupNumArgs(intrinsicTree);
 
     if ((isa == InstructionSet_AVX) || (isa == InstructionSet_AVX2))
     {