nir: Add support for 1-bit data types
This commit adds support for 1-bit Booleans and integers. Booleans obviously take a value of true or false. Because we have to define the semantics of 1-bit signed and unsigned integers, we define uint1_t to take values of 0 and 1 and int1_t to take values of 0 and -1. 1-bit arithmetic is then well-defined in the usual way, just with fewer bits. The definition of int1_t and uint1_t doesn't usually matter but we do need something for purposes of constant folding. Reviewed-by: Eric Anholt <eric@anholt.net> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Tested-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl>
This commit is contained in:

committed by
Jason Ekstrand

parent
2fe8708ffd
commit
3191a82372
@@ -332,7 +332,10 @@ nir_imm_intN_t(nir_builder *build, uint64_t x, unsigned bit_size)
|
||||
|
||||
memset(&v, 0, sizeof(v));
|
||||
assert(bit_size <= 64);
|
||||
v.i64[0] = x & (~0ull >> (64 - bit_size));
|
||||
if (bit_size == 1)
|
||||
v.b[0] = x & 1;
|
||||
else
|
||||
v.i64[0] = x & (~0ull >> (64 - bit_size));
|
||||
|
||||
return nir_build_imm(build, 1, bit_size, v);
|
||||
}
|
||||
@@ -351,6 +354,13 @@ nir_imm_ivec4(nir_builder *build, int x, int y, int z, int w)
|
||||
return nir_build_imm(build, 4, 32, v);
|
||||
}
|
||||
|
||||
static inline nir_ssa_def *
|
||||
nir_imm_boolN_t(nir_builder *build, bool x, unsigned bit_size)
|
||||
{
|
||||
/* We use a 0/-1 convention for all booleans regardless of size */
|
||||
return nir_imm_intN_t(build, -(int)x, bit_size);
|
||||
}
|
||||
|
||||
static inline nir_ssa_def *
|
||||
nir_build_alu(nir_builder *build, nir_op op, nir_ssa_def *src0,
|
||||
nir_ssa_def *src1, nir_ssa_def *src2, nir_ssa_def *src3)
|
||||
|
Reference in New Issue
Block a user