diff --git a/.pick_status.json b/.pick_status.json index 3bc0bb46a36..ed04b484ad9 100644 --- a/.pick_status.json +++ b/.pick_status.json @@ -121,7 +121,7 @@ "description": "r600/sfn: make sure f2u32 is lowered late and correctly for 64 bit floats", "nominated": true, "nomination_type": 1, - "resolution": 0, + "resolution": 1, "main_sha": null, "because_sha": "b3685f3ba7fddbe73f363ff4d53ca734841e4b06" }, diff --git a/src/gallium/drivers/r600/sfn/sfn_nir.cpp b/src/gallium/drivers/r600/sfn/sfn_nir.cpp index 773e70a7bc2..d3c12ef0a07 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir.cpp @@ -924,6 +924,9 @@ r600_shader_from_nir(struct r600_context *rctx, while (optimize_once(sh)) ; + if ((sh->info.bit_sizes_float | sh->info.bit_sizes_int) & 64) + NIR_PASS_V(sh, r600::r600_split_64bit_alu_and_phi); + bool late_algebraic_progress; do { late_algebraic_progress = false; diff --git a/src/gallium/drivers/r600/sfn/sfn_nir_lower_64bit.cpp b/src/gallium/drivers/r600/sfn/sfn_nir_lower_64bit.cpp index ad2144dcdd4..821e178562e 100644 --- a/src/gallium/drivers/r600/sfn/sfn_nir_lower_64bit.cpp +++ b/src/gallium/drivers/r600/sfn/sfn_nir_lower_64bit.cpp @@ -212,11 +212,11 @@ class LowerSplit64op : public NirLowerInstruction { * rounds, we have to remove the fractional part in the hi bits * For values > UINT_MAX the result is undefined */ auto src = nir_ssa_for_alu_src(b, alu, 0); - src = nir_fsub(b, src, nir_ffract(b, src)); + src = nir_fadd(b, src, nir_fneg(b, nir_ffract(b, src))); auto gt0 = nir_flt(b, nir_imm_double(b, 0.0), src); auto highval = nir_fmul_imm(b, src, 1.0 / 65536.0); auto fract = nir_ffract(b, highval); - auto high = nir_f2u32(b, nir_f2f32(b, nir_fsub(b, highval, fract))); + auto high = nir_f2u32(b, nir_f2f32(b, nir_fadd(b, highval, nir_fneg(b, fract)))); auto lowval = nir_fmul_imm(b, fract, 65536.0); auto low = nir_f2u32(b, nir_f2f32(b, lowval)); return nir_bcsel(b,