diff --git a/src/compiler/nir/nir_builtin_builder.h b/src/compiler/nir/nir_builtin_builder.h index 7a93add8f7d..45e59c51ea3 100644 --- a/src/compiler/nir/nir_builtin_builder.h +++ b/src/compiler/nir/nir_builtin_builder.h @@ -144,13 +144,21 @@ nir_bitselect(nir_builder *b, nir_def *x, nir_def *y, nir_def *s) static inline nir_def * nir_copysign(nir_builder *b, nir_def *x, nir_def *y) { - uint64_t masks = 1ull << (x->bit_size - 1); - uint64_t maskv = ~masks; + if (b->shader->options->no_integers) { + /* Unlike the integer path, this is not signed zero correct. We assume + * integerless backends don't care. + */ + nir_def *abs = nir_fabs(b, x); + return nir_bcsel(b, nir_flt_imm(b, y, 0.0), nir_fneg(b, abs), abs); + } else { + uint64_t masks = 1ull << (x->bit_size - 1); + uint64_t maskv = ~masks; - nir_def *s = nir_imm_intN_t(b, masks, x->bit_size); - nir_def *v = nir_imm_intN_t(b, maskv, x->bit_size); + nir_def *s = nir_imm_intN_t(b, masks, x->bit_size); + nir_def *v = nir_imm_intN_t(b, maskv, x->bit_size); - return nir_ior(b, nir_iand(b, x, v), nir_iand(b, y, s)); + return nir_ior(b, nir_iand(b, x, v), nir_iand(b, y, s)); + } } static inline nir_def *