pan/va: Lower FADD_RSCALE.f32 to FMA_RSCALE.f32
authorAlyssa Rosenzweig <alyssa@collabora.com>
Fri, 17 Jun 2022 14:40:27 +0000 (10:40 -0400)
committerMarge Bot <emma+marge@anholt.net>
Tue, 21 Jun 2022 22:42:34 +0000 (22:42 +0000)
We generate FADD_RSCALE.f32 in our sample variables implementations. Valhall
doesn't have a dedicated FADD_RSCALE.f32 implementation, it should be aliased to
FMA_RSCALE.f32. Handle that alias in isel lowering. This will fix:

   dEQP-GLES31.functional.shaders.multisample_interpolation.interpolate_at_offset.*

Signed-off-by: Alyssa Rosenzweig <alyssa@collabora.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/17101>

src/panfrost/bifrost/valhall/test/test-lower-isel.cpp
src/panfrost/bifrost/valhall/va_lower_isel.c

index f9c3b78..97ff639 100644 (file)
@@ -125,6 +125,14 @@ TEST_F(LowerIsel, MuxInt8) {
    NEGCASE(bi_mux_v4i8(b, x, y, z, BI_MUX_FP_ZERO));
 }
 
+TEST_F(LowerIsel, FaddRscale) {
+   CASE(bi_fadd_rscale_f32_to(b, reg, x, y, z, BI_SPECIAL_NONE),
+        bi_fma_rscale_f32_to(b, reg, x, bi_imm_f32(1.0), y, z, BI_SPECIAL_NONE));
+
+   CASE(bi_fadd_rscale_f32_to(b, reg, x, y, z, BI_SPECIAL_N),
+        bi_fma_rscale_f32_to(b, reg, x, bi_imm_f32(1.0), y, z, BI_SPECIAL_N));
+}
+
 TEST_F(LowerIsel, Smoke) {
    NEGCASE(bi_fadd_f32_to(b, reg, reg, reg));
    NEGCASE(bi_csel_s32_to(b, reg, reg, reg, reg, reg, BI_CMPF_LT));
index ad54a93..a43ddc5 100644 (file)
@@ -111,6 +111,14 @@ va_lower_isel(bi_instr *I)
 
       break;
 
+   /* FADD_RSCALE.f32(x, y, z) -> FMA_RSCALE.f32(x, 1.0, y, z) */
+   case BI_OPCODE_FADD_RSCALE_F32:
+      I->op = BI_OPCODE_FMA_RSCALE_F32;
+      I->src[3] = I->src[2];
+      I->src[2] = I->src[1];
+      I->src[1] = bi_imm_f32(1.0);
+      break;
+
    default:
       break;
    }