nir/builder: Handle f2b conversions specially in nir_type_convert

No shader-db or fossil-db changes on any Intel platform.

Reviewed-by: Alyssa Rosenzweig <alyssa.rosenzweig@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20509>
This commit is contained in:
Ian Romanick 2022-11-01 18:28:46 -07:00 committed by Marge Bot
parent b265020b82
commit 024122c069

View file

@ -552,21 +552,32 @@ nir_type_convert(nir_builder *b,
const nir_alu_type src_base =
(nir_alu_type) nir_alu_type_get_base_type(src_type);
/* b2b and f2b use the regular type conversion path, but i2b is implemented
* as src != 0.
/* b2b uses the regular type conversion path, but i2b and f2b are
* implemented as src != 0.
*/
if (dst_base == nir_type_bool && (src_base == nir_type_int ||
src_base == nir_type_uint)) {
if (dst_base == nir_type_bool && src_base != nir_type_bool) {
nir_op opcode;
const unsigned dst_bit_size = nir_alu_type_get_type_size(dest_type);
switch (dst_bit_size) {
case 1: opcode = nir_op_ine; break;
case 8: opcode = nir_op_ine8; break;
case 16: opcode = nir_op_ine16; break;
case 32: opcode = nir_op_ine32; break;
default: unreachable("Invalid Boolean size.");
if (src_base == nir_type_float) {
switch (dst_bit_size) {
case 1: opcode = nir_op_fneu; break;
case 8: opcode = nir_op_fneu8; break;
case 16: opcode = nir_op_fneu16; break;
case 32: opcode = nir_op_fneu32; break;
default: unreachable("Invalid Boolean size.");
}
} else {
assert(src_base == nir_type_int || src_base == nir_type_uint);
switch (dst_bit_size) {
case 1: opcode = nir_op_ine; break;
case 8: opcode = nir_op_ine8; break;
case 16: opcode = nir_op_ine16; break;
case 32: opcode = nir_op_ine32; break;
default: unreachable("Invalid Boolean size.");
}
}
return nir_build_alu(b, opcode, src,