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,