[Mesa-dev] [PATCH 45/95] i965/vec4: split double-precision bcsel

Iago Toral Quiroga itoral at igalia.com
Tue Jul 19 10:40:42 UTC 2016

There is a hardware bug affecting compressed double-precision bcsel
instructions in align16 mode by which they won't read predication mask
properly, leading to incorrect behavior at least in non-uniform control
flow scenarios. The bug does not affect other predicated instructions
and it does not affect bcsel in Align1 mode either. This was found
empirically and verified by Curro in the simulator.

Fix this by splitting double-precision bcsel in Align16 mode to use an
execution size of 4.
 src/mesa/drivers/dri/i965/brw_vec4.cpp | 6 ++++++
 1 file changed, 6 insertions(+)

diff --git a/src/mesa/drivers/dri/i965/brw_vec4.cpp b/src/mesa/drivers/dri/i965/brw_vec4.cpp
index 88bf895..610c45d 100644
--- a/src/mesa/drivers/dri/i965/brw_vec4.cpp
+++ b/src/mesa/drivers/dri/i965/brw_vec4.cpp
@@ -1969,6 +1969,12 @@ get_lowered_simd_width(const struct brw_device_info *devinfo,
    unsigned lowered_width = MIN2(8, inst->exec_size);
+   /* Align16 8-wide double-precision bcsel does not work well. Verified
+    * empirically.
+    */
+   if (inst->opcode == BRW_OPCODE_SEL)
+      lowered_width = MIN2(lowered_width, 4);
    /* HSW PRM, 3D Media GPGPU Engine, Region Alignment Rules for Direct
     * Register Addressing:

More information about the mesa-dev mailing list