swr/rast: Add VPOPCNT
authorGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 2 Mar 2018 06:54:38 +0000 (00:54 -0600)
committerGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 9 Mar 2018 15:36:23 +0000 (09:36 -0600)
Supports popcnt on vector masks (e.g. <8 x i1>)

Reviewed-by: Bruce Cherniak <bruce.cherniak@intel.com>
src/gallium/drivers/swr/rasterizer/jitter/builder_misc.cpp
src/gallium/drivers/swr/rasterizer/jitter/builder_misc.h

index 0738d02332104e1f8c9f2d4e1f30b8fa7f7e6e63..0148d8eb8aceb4153cff5fc40b9a4e110989d2ca 100644 (file)
@@ -835,6 +835,14 @@ namespace SwrJit
         return CALL(pCtPop, std::initializer_list<Value*>{a});
     }
 
+    //////////////////////////////////////////////////////////////////////////
+    /// @brief pop count on vector mask (e.g. <8 x i1>)
+    Value* Builder::VPOPCNT(Value* a)
+    {
+        Value* b = BITCAST(VMASK(a), mSimdFP32Ty);
+        return POPCNT(VMOVMSKPS(b));
+    }
+
     //////////////////////////////////////////////////////////////////////////
     /// @brief C functions called by LLVM IR
     //////////////////////////////////////////////////////////////////////////
index 50d7a1e71fafd680807aa7f565bfcf656d043ab0..5195678b4c409848a6a00071edc22130ee5466fb 100644 (file)
@@ -148,6 +148,7 @@ CallInst *PRINT(const std::string &printStr);
 CallInst *PRINT(const std::string &printStr,const std::initializer_list<Value*> &printArgs);
 
 Value* POPCNT(Value* a);
+Value* VPOPCNT(Value* a);
 
 Value* DEBUGTRAP();
 Value* INT3() { return DEBUGTRAP(); }