From b88cb49e4b8aba288b8ec96b4e346c74e5bd5d00 Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Tue, 13 Apr 2021 14:36:08 -0400 Subject: [PATCH] pan/bi: Add and use bi_negzero helper -0.0 is the additive identity in IEEE 754 arithmetic, not +0.0! Signed-off-by: Alyssa Rosenzweig Part-of: --- src/panfrost/bifrost/bifrost_compile.c | 20 ++++++++++---------- src/panfrost/bifrost/compiler.h | 7 +++++++ 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index 521648856b7..168dc9f5d40 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -1499,13 +1499,13 @@ bi_lower_fsincos_32(bi_builder *b, bi_index dst, bi_index s0, bool cos) bi_index cosx = bi_fcos_table_u6(b, x_u6, false); /* e^2 / 2 */ - bi_index e2_over_2 = bi_fma_rscale_f32(b, e, e, bi_neg(bi_zero()), + bi_index e2_over_2 = bi_fma_rscale_f32(b, e, e, bi_negzero(), bi_imm_u32(-1), BI_ROUND_NONE, BI_SPECIAL_NONE); /* (-e^2)/2 f''(x) */ bi_index quadratic = bi_fma_f32(b, bi_neg(e2_over_2), cos ? cosx : sinx, - bi_neg(bi_zero()), BI_ROUND_NONE); + bi_negzero(), BI_ROUND_NONE); /* e f'(x) - (e^2/2) f''(x) */ bi_instr *I = bi_fma_f32_to(b, bi_temp(b->shader), e, @@ -1637,7 +1637,7 @@ bi_emit_alu(bi_builder *b, nir_alu_instr *instr) break; case nir_op_fmul: - bi_fma_to(b, sz, dst, s0, s1, bi_zero(), BI_ROUND_NONE); + bi_fma_to(b, sz, dst, s0, s1, bi_negzero(), BI_ROUND_NONE); break; case nir_op_fsub: @@ -1648,17 +1648,17 @@ bi_emit_alu(bi_builder *b, nir_alu_instr *instr) break; case nir_op_fsat: { - bi_instr *I = bi_fadd_to(b, sz, dst, s0, bi_zero(), BI_ROUND_NONE); + bi_instr *I = bi_fadd_to(b, sz, dst, s0, bi_negzero(), BI_ROUND_NONE); I->clamp = BI_CLAMP_CLAMP_0_1; break; } case nir_op_fneg: - bi_fadd_to(b, sz, dst, bi_neg(s0), bi_zero(), BI_ROUND_NONE); + bi_fadd_to(b, sz, dst, bi_neg(s0), bi_negzero(), BI_ROUND_NONE); break; case nir_op_fabs: - bi_fadd_to(b, sz, dst, bi_abs(s0), bi_zero(), BI_ROUND_NONE); + bi_fadd_to(b, sz, dst, bi_abs(s0), bi_negzero(), BI_ROUND_NONE); break; case nir_op_fsin: @@ -1679,7 +1679,7 @@ bi_emit_alu(bi_builder *b, nir_alu_instr *instr) /* multiply by 1.0 * 2*24 */ bi_index scale = bi_fma_rscale_f32(b, s0, bi_imm_f32(1.0f), - bi_zero(), bi_imm_u32(24), BI_ROUND_NONE, + bi_negzero(), bi_imm_u32(24), BI_ROUND_NONE, BI_SPECIAL_NONE); bi_fexp_f32_to(b, dst, bi_f32_to_s32(b, scale, BI_ROUND_NONE), s0); @@ -2104,12 +2104,12 @@ bi_emit_texc_lod_88(bi_builder *b, bi_index lod, bool fp16) bi_instr *fsat = bi_fma_f32_to(b, bi_temp(b->shader), fp16 ? bi_half(lod, false) : lod, - bi_imm_f32(1.0f / max_lod), bi_zero(), BI_ROUND_NONE); + bi_imm_f32(1.0f / max_lod), bi_negzero(), BI_ROUND_NONE); fsat->clamp = BI_CLAMP_CLAMP_M1_1; bi_index fmul = bi_fma_f32(b, fsat->dest[0], bi_imm_f32(max_lod * 256.0f), - bi_zero(), BI_ROUND_NONE); + bi_negzero(), BI_ROUND_NONE); return bi_mkvec_v2i16(b, bi_half(bi_f32_to_s32(b, fmul, BI_ROUND_RTZ), false), @@ -2197,7 +2197,7 @@ bi_emit_cube_coord(bi_builder *b, bi_index coord, bi_index rcp = bi_frcp_f32(b, cubeface->dest[0]); /* Calculate 0.5 * (1.0 / max{x, y, z}) */ - bi_index fma1 = bi_fma_f32(b, rcp, bi_imm_f32(0.5f), bi_zero(), + bi_index fma1 = bi_fma_f32(b, rcp, bi_imm_f32(0.5f), bi_negzero(), BI_ROUND_NONE); /* Transform the coordinates */ diff --git a/src/panfrost/bifrost/compiler.h b/src/panfrost/bifrost/compiler.h index 49ea807ebfe..4dad8518d25 100644 --- a/src/panfrost/bifrost/compiler.h +++ b/src/panfrost/bifrost/compiler.h @@ -204,6 +204,13 @@ bi_neg(bi_index idx) return idx; } +/* Additive identity in IEEE 754 arithmetic */ +static inline bi_index +bi_negzero() +{ + return bi_neg(bi_zero()); +} + /* Replaces an index, preserving any modifiers */ static inline bi_index