[Mesa-dev] [PATCH 12/13] nir: add pack_double_2x32_split_y opcode

Samuel Iglesias Gonsálvez siglesias at igalia.com
Tue Apr 12 08:05:21 UTC 2016


From: Iago Toral Quiroga <itoral at igalia.com>

This is useful when we only need to modify the high 32-bit chunk of a double.
This is a common case, because this is the part that encodes the exponent
which we manipulate in some double lowering passes. Although we can accomplish
the same by using pack_double_2x32, this new opcode is better for register
pressure, since we don't have to unpack both parts of the double and keep
the low 32-bits around until we can recombine the new exponent.

We will use this opcode in the set_exponent() function of the double lowering
pass and with that we will fix spilling issues in some dmat4 divide
piglit tests on Intel.
---
 src/compiler/nir/nir_opcodes.py | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/src/compiler/nir/nir_opcodes.py b/src/compiler/nir/nir_opcodes.py
index 9f62e08..f92dd8d 100644
--- a/src/compiler/nir/nir_opcodes.py
+++ b/src/compiler/nir/nir_opcodes.py
@@ -276,6 +276,20 @@ di.i2 = src0.y;
 dst.x = di.u64;
 """)
 
+opcode("pack_double_2x32_split_y", 0, tuint64, [0, 0], [tuint64, tuint32], "", """
+union {
+    uint64_t u64;
+    struct {
+        uint32_t i1;
+        uint32_t i2;
+    };
+} di;
+
+di.u64 = src0;
+di.i1 = src1;
+dst = di.u64;
+""")
+
 unop_horiz("unpack_double_2x32", 2, tuint32, 1, tuint64, """
 union {
     uint64_t u64;
-- 
2.5.0



More information about the mesa-dev mailing list