nir: add support for (un)pack_double_2x32

v2 (Sam):
- Use uint64 instead of float64 for sources and destinations. (Connor)

Signed-off-by: Samuel Iglesias Gonsálvez <siglesias@igalia.com>
Reviewed-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Connor Abbott 2015-08-14 12:20:37 -07:00 committed by Samuel Iglesias Gonsálvez
parent d5d6260329
commit 9e31e0a21b
2 changed files with 35 additions and 0 deletions

View file

@ -1422,6 +1422,12 @@ nir_visitor::visit(ir_expression *ir)
case ir_unop_unpack_half_2x16:
result = nir_unpack_half_2x16(&b, srcs[0]);
break;
case ir_unop_pack_double_2x32:
result = nir_pack_double_2x32(&b, srcs[0]);
break;
case ir_unop_unpack_double_2x32:
result = nir_unpack_double_2x32(&b, srcs[0]);
break;
case ir_unop_bitfield_reverse:
result = nir_bitfield_reverse(&b, srcs[0]);
break;

View file

@ -95,6 +95,7 @@ tuint = "uint"
tfloat32 = "float32"
tint32 = "int32"
tuint32 = "uint32"
tuint64 = "uint64"
tfloat64 = "float64"
commutative = "commutative "
@ -261,6 +262,34 @@ dst.x = (src0.x << 0) |
(src0.w << 24);
""")
unop_horiz("pack_double_2x32", 1, tuint64, 2, tuint32, """
union {
uint64_t u64;
struct {
uint32_t i1;
uint32_t i2;
};
} di;
di.i1 = src0.x;
di.i2 = src0.y;
dst.x = di.u64;
""")
unop_horiz("unpack_double_2x32", 2, tuint32, 1, tuint64, """
union {
uint64_t u64;
struct {
uint32_t i1;
uint32_t i2;
};
} di;
di.u64 = src0.x;
dst.x = di.i1;
dst.y = di.i2;
""")
# Lowered floating point unpacking operations.