Mesa (main): aco: Implement isub_sat.
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Wed Jun 1 17:59:53 UTC 2022
Module: Mesa
Branch: main
Commit: d404f1964cdb820c92216cc3590a23fc97255f0d
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d404f1964cdb820c92216cc3590a23fc97255f0d
Author: Georg Lehmann <dadschoorse at gmail.com>
Date: Fri Nov 19 16:43:31 2021 +0100
aco: Implement isub_sat.
Signed-off-by: Georg Lehmann <dadschoorse at gmail.com>
Reviewed-by: Timur Kristóf <timur.kristof at gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13895>
---
src/amd/compiler/aco_instruction_selection.cpp | 29 ++++++++++++++++++++++++++
1 file changed, 29 insertions(+)
diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp
index b98fcaf85b6..a335c0f9a5c 100644
--- a/src/amd/compiler/aco_instruction_selection.cpp
+++ b/src/amd/compiler/aco_instruction_selection.cpp
@@ -2178,6 +2178,35 @@ visit_alu_instr(isel_context* ctx, nir_alu_instr* instr)
}
break;
}
+ case nir_op_isub_sat: {
+ Temp src0 = get_alu_src(ctx, instr->src[0]);
+ Temp src1 = get_alu_src(ctx, instr->src[1]);
+ if (dst.regClass() == s1) {
+ Temp cond = bld.sopc(aco_opcode::s_cmp_gt_i32, bld.def(s1, scc), src1, Operand::zero());
+ Temp bound = bld.sop2(aco_opcode::s_add_u32, bld.def(s1), bld.scc(bld.def(s1, scc)),
+ Operand::c32(INT32_MAX), cond);
+ Temp overflow = bld.tmp(s1);
+ Temp sub =
+ bld.sop2(aco_opcode::s_sub_i32, bld.def(s1), bld.scc(Definition(overflow)), src0, src1);
+ bld.sop2(aco_opcode::s_cselect_b32, Definition(dst), bound, sub, bld.scc(overflow));
+ break;
+ }
+
+ src1 = as_vgpr(ctx, src1);
+
+ if (dst.regClass() == v2b) {
+ Instruction* sub_instr =
+ bld.vop3(aco_opcode::v_sub_i16, Definition(dst), src0, src1).instr;
+ sub_instr->vop3().clamp = 1;
+ } else if (dst.regClass() == v1) {
+ Instruction* sub_instr =
+ bld.vop3(aco_opcode::v_sub_i32, Definition(dst), src0, src1).instr;
+ sub_instr->vop3().clamp = 1;
+ } else {
+ isel_err(&instr->instr, "Unimplemented NIR instr bit size");
+ }
+ break;
+ }
case nir_op_imul: {
if (dst.bytes() <= 2 && ctx->program->gfx_level >= GFX10) {
emit_vop3a_instruction(ctx, instr, aco_opcode::v_mul_lo_u16_e64, dst);
More information about the mesa-commit
mailing list