nir: add split versions of (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-07 08:37:38 -07:00
committed by Samuel Iglesias Gonsálvez
parent b093808d26
commit 663e6421df

View File

@@ -298,6 +298,29 @@ unop_horiz("unpack_half_2x16_split_x", 1, tfloat32, 1, tuint32,
unop_horiz("unpack_half_2x16_split_y", 1, tfloat32, 1, tuint32,
"unpack_half_1x16((uint16_t)(src0.x >> 16))")
unop_convert("unpack_double_2x32_split_x", tuint32, tuint64, """
union {
uint64_t u64;
struct {
uint32_t x;
uint32_t y;
};
} di;
di.u64 = src0;
dst = di.x;
""")
unop_convert("unpack_double_2x32_split_y", tuint32, tuint64, """
union {
uint64_t u64;
struct {
uint32_t x;
uint32_t y;
};
} di;
di.u64 = src0;
dst = di.y;
""")
# Bit operations, part of ARB_gpu_shader5.
@@ -563,6 +586,19 @@ binop("fpow", tfloat, "", "bit_size == 64 ? powf(src0, src1) : pow(src0, src1)")
binop_horiz("pack_half_2x16_split", 1, tuint32, 1, tfloat32, 1, tfloat32,
"pack_half_1x16(src0.x) | (pack_half_1x16(src1.x) << 16)")
binop_convert("pack_double_2x32_split", tuint64, tuint32, "", """
union {
uint64_t u64;
struct {
uint32_t x;
uint32_t y;
};
} di;
di.x = src0;
di.y = src1;
dst = di.u64;
""")
# bfm implements the behavior of the first operation of the SM5 "bfi" assembly
# and that of the "bfi1" i965 instruction. That is, it has undefined behavior
# if either of its arguments are 32.