Commit 608c87af authored by Jesse Natalie's avatar Jesse Natalie Committed by Marge Bot
Browse files

nir/vtn: SPIR-V bit count opcodes (core and extension) dest size mismatches nir



SPIR-V dest sizes match the input, while nir is always int32. Insert
casts from the nir op to the expected SPIR-V dest.
Reviewed-by: Boris Brezillon's avatarBoris Brezillon <boris.brezillon@collabora.com>
Reviewed-by: Jason Ekstrand's avatarJason Ekstrand <jason@jlekstrand.net>
Part-of: <!6313>
parent a54695dd
Pipeline #195531 waiting for manual action with stages
...@@ -257,7 +257,6 @@ vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b, ...@@ -257,7 +257,6 @@ vtn_nir_alu_op_for_spirv_opcode(struct vtn_builder *b,
case SpvOpBitFieldSExtract: return nir_op_ibitfield_extract; case SpvOpBitFieldSExtract: return nir_op_ibitfield_extract;
case SpvOpBitFieldUExtract: return nir_op_ubitfield_extract; case SpvOpBitFieldUExtract: return nir_op_ubitfield_extract;
case SpvOpBitReverse: return nir_op_bitfield_reverse; case SpvOpBitReverse: return nir_op_bitfield_reverse;
case SpvOpBitCount: return nir_op_bit_count;
case SpvOpUCountLeadingZerosINTEL: return nir_op_uclz; case SpvOpUCountLeadingZerosINTEL: return nir_op_uclz;
/* SpvOpUCountTrailingZerosINTEL is handled elsewhere. */ /* SpvOpUCountTrailingZerosINTEL is handled elsewhere. */
...@@ -640,6 +639,14 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode, ...@@ -640,6 +639,14 @@ vtn_handle_alu(struct vtn_builder *b, SpvOp opcode,
nir_imm_int(&b->nb, 32u)); nir_imm_int(&b->nb, 32u));
break; break;
case SpvOpBitCount: {
/* bit_count always returns int32, but the SPIR-V opcode just says the return
* value needs to be big enough to store the number of bits.
*/
dest->def = nir_u2u(&b->nb, nir_bit_count(&b->nb, src[0]), glsl_get_bit_size(dest_type));
break;
}
default: { default: {
bool swap; bool swap;
unsigned src_bit_size = glsl_get_bit_size(vtn_src[0]->type); unsigned src_bit_size = glsl_get_bit_size(vtn_src[0]->type);
......
...@@ -117,8 +117,11 @@ handle_alu(struct vtn_builder *b, enum OpenCLstd_Entrypoints opcode, ...@@ -117,8 +117,11 @@ handle_alu(struct vtn_builder *b, enum OpenCLstd_Entrypoints opcode,
unsigned num_srcs, nir_ssa_def **srcs, unsigned num_srcs, nir_ssa_def **srcs,
const struct glsl_type *dest_type) const struct glsl_type *dest_type)
{ {
return nir_build_alu(&b->nb, nir_alu_op_for_opencl_opcode(b, opcode), nir_ssa_def *ret = nir_build_alu(&b->nb, nir_alu_op_for_opencl_opcode(b, opcode),
srcs[0], srcs[1], srcs[2], NULL); srcs[0], srcs[1], srcs[2], NULL);
if (opcode == OpenCLstd_Popcount)
ret = nir_u2u(&b->nb, ret, glsl_get_bit_size(dest_type));
return ret;
} }
static nir_ssa_def * static nir_ssa_def *
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment