From 17bb5a067a9e31ceee972f76dc8d3294c101b3aa Mon Sep 17 00:00:00 2001 From: Alyssa Rosenzweig Date: Fri, 16 Apr 2021 20:49:23 -0400 Subject: [PATCH] agx: Add saturated integer add/subtract support Just a flag on the regular iadd instruction. Signed-off-by: Alyssa Rosenzweig Acked-by: Jason Ekstrand Acked-by: Bas Nieuwenhuizen Part-of: --- src/asahi/compiler/agx_compile.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/asahi/compiler/agx_compile.c b/src/asahi/compiler/agx_compile.c index d2068567df6..d9215c80e61 100644 --- a/src/asahi/compiler/agx_compile.c +++ b/src/asahi/compiler/agx_compile.c @@ -263,6 +263,34 @@ agx_emit_alu(agx_builder *b, nir_alu_instr *instr) case nir_op_ineg: return agx_iadd_to(b, dst, agx_zero(), agx_neg(s0), 0); case nir_op_imul: return agx_imad_to(b, dst, s0, s1, agx_zero(), 0); + case nir_op_iadd_sat: + { + agx_instr *I = agx_iadd_to(b, dst, s0, s1, 0); + I->saturate = true; + return I; + } + + case nir_op_isub_sat: + { + agx_instr *I = agx_iadd_to(b, dst, s0, agx_neg(s1), 0); + I->saturate = true; + return I; + } + + case nir_op_uadd_sat: + { + agx_instr *I = agx_iadd_to(b, dst, agx_abs(s0), agx_abs(s1), 0); + I->saturate = true; + return I; + } + + case nir_op_usub_sat: + { + agx_instr *I = agx_iadd_to(b, dst, agx_abs(s0), agx_neg(agx_abs(s1)), 0); + I->saturate = true; + return I; + } + case nir_op_fsat: { agx_instr *I = agx_fadd_to(b, dst, s0, agx_negzero());