swr/rast: Fix GATHERPS to avoid assertions.
authorGeorge Kyriazis <george.kyriazis@intel.com>
Mon, 12 Feb 2018 19:38:45 +0000 (13:38 -0600)
committerGeorge Kyriazis <george.kyriazis@intel.com>
Fri, 16 Feb 2018 16:54:00 +0000 (10:54 -0600)
With the pBase type change, LLVM was asserting because of wrong types.
Cast appropriately.

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

index 98d4354c41019ddcad78eddc976f0f3af2137d49..6e462d522f7551aca28d7f2147415b7ffb015539 100644 (file)
@@ -140,6 +140,7 @@ namespace SwrJit
     Value *Builder::GATHERPS(Value *vSrc, Value *pBase, Value *vIndices, Value *vMask, uint8_t scale)
     {
         Value *vGather;
+        Value *pBasePtr = INT_TO_PTR(pBase, PointerType::get(mInt8Ty, 0));
 
         // use avx2 gather instruction if available
         if (JM()->mArch.AVX2())
@@ -147,7 +148,7 @@ namespace SwrJit
             // force mask to <N x float>, required by vgather
             Value *mask = BITCAST(VMASK(vMask), mSimdFP32Ty);
 
-            vGather = VGATHERPS(vSrc, pBase, vIndices, mask, C(scale));
+            vGather = VGATHERPS(vSrc, pBasePtr, vIndices, mask, C(scale));
         }
         else
         {
@@ -165,7 +166,7 @@ namespace SwrJit
                 // single component byte index
                 Value *offset = VEXTRACT(vOffsets, C(i));
                 // byte pointer to component
-                Value *loadAddress = GEP(pBase, offset);
+                Value *loadAddress = GEP(pBasePtr, offset);
                 loadAddress = BITCAST(loadAddress, PointerType::get(mFP32Ty, 0));
                 // pointer to the value to load if we're masking off a component
                 Value *maskLoadAddress = GEP(vSrcPtr, { C(0), C(i) });