From 068c84f2754b29d83bda37163c9916c836e126ce Mon Sep 17 00:00:00 2001 From: Rhys Perry Date: Wed, 16 Nov 2022 20:08:07 +0000 Subject: [PATCH] aco: add support for fp32 addition atomics Signed-off-by: Rhys Perry Reviewed-by: Bas Nieuwenhuizen Reviewed-by: Samuel Pitoiset Part-of: --- src/amd/compiler/aco_instruction_selection.cpp | 16 ++++++++++++++++ .../compiler/aco_instruction_selection_setup.cpp | 3 +++ 2 files changed, 19 insertions(+) diff --git a/src/amd/compiler/aco_instruction_selection.cpp b/src/amd/compiler/aco_instruction_selection.cpp index 13ad32a2f61..6de9a9eac3a 100644 --- a/src/amd/compiler/aco_instruction_selection.cpp +++ b/src/amd/compiler/aco_instruction_selection.cpp @@ -6666,6 +6666,11 @@ visit_image_atomic(isel_context* ctx, nir_intrinsic_instr* instr) buf_op64 = aco_opcode::buffer_atomic_cmpswap_x2; image_op = aco_opcode::image_atomic_cmpswap; break; + case nir_intrinsic_bindless_image_atomic_fadd: + buf_op = aco_opcode::buffer_atomic_add_f32; + buf_op64 = aco_opcode::num_opcodes; + image_op = aco_opcode::num_opcodes; + break; case nir_intrinsic_bindless_image_atomic_fmin: buf_op = aco_opcode::buffer_atomic_fmin; buf_op64 = aco_opcode::buffer_atomic_fmin_x2; @@ -6860,6 +6865,10 @@ visit_atomic_ssbo(isel_context* ctx, nir_intrinsic_instr* instr) op32 = aco_opcode::buffer_atomic_cmpswap; op64 = aco_opcode::buffer_atomic_cmpswap_x2; break; + case nir_intrinsic_ssbo_atomic_fadd: + op32 = aco_opcode::buffer_atomic_add_f32; + op64 = aco_opcode::num_opcodes; + break; case nir_intrinsic_ssbo_atomic_fmin: op32 = aco_opcode::buffer_atomic_fmin; op64 = aco_opcode::buffer_atomic_fmin_x2; @@ -7118,6 +7127,10 @@ visit_global_atomic(isel_context* ctx, nir_intrinsic_instr* instr) op32 = global ? aco_opcode::global_atomic_cmpswap : aco_opcode::flat_atomic_cmpswap; op64 = global ? aco_opcode::global_atomic_cmpswap_x2 : aco_opcode::flat_atomic_cmpswap_x2; break; + case nir_intrinsic_global_atomic_fadd_amd: + op32 = global ? aco_opcode::global_atomic_add_f32 : aco_opcode::flat_atomic_add_f32; + op64 = aco_opcode::num_opcodes; + break; case nir_intrinsic_global_atomic_fmin_amd: op32 = global ? aco_opcode::global_atomic_fmin : aco_opcode::flat_atomic_fmin; op64 = global ? aco_opcode::global_atomic_fmin_x2 : aco_opcode::flat_atomic_fmin_x2; @@ -8336,6 +8349,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_bindless_image_atomic_xor: case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: + case nir_intrinsic_bindless_image_atomic_fadd: case nir_intrinsic_bindless_image_atomic_fmin: case nir_intrinsic_bindless_image_atomic_fmax: visit_image_atomic(ctx, instr); break; case nir_intrinsic_load_ssbo: visit_load_ssbo(ctx, instr); break; @@ -8355,6 +8369,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_global_atomic_xor_amd: case nir_intrinsic_global_atomic_exchange_amd: case nir_intrinsic_global_atomic_comp_swap_amd: + case nir_intrinsic_global_atomic_fadd_amd: case nir_intrinsic_global_atomic_fmin_amd: case nir_intrinsic_global_atomic_fmax_amd: visit_global_atomic(ctx, instr); break; case nir_intrinsic_ssbo_atomic_add: @@ -8367,6 +8382,7 @@ visit_intrinsic(isel_context* ctx, nir_intrinsic_instr* instr) case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: case nir_intrinsic_ssbo_atomic_comp_swap: + case nir_intrinsic_ssbo_atomic_fadd: case nir_intrinsic_ssbo_atomic_fmin: case nir_intrinsic_ssbo_atomic_fmax: visit_atomic_ssbo(ctx, instr); break; case nir_intrinsic_load_scratch: visit_load_scratch(ctx, instr); break; diff --git a/src/amd/compiler/aco_instruction_selection_setup.cpp b/src/amd/compiler/aco_instruction_selection_setup.cpp index abde629d0e5..a6c98dd51c0 100644 --- a/src/amd/compiler/aco_instruction_selection_setup.cpp +++ b/src/amd/compiler/aco_instruction_selection_setup.cpp @@ -638,6 +638,7 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_ssbo_atomic_xor: case nir_intrinsic_ssbo_atomic_exchange: case nir_intrinsic_ssbo_atomic_comp_swap: + case nir_intrinsic_ssbo_atomic_fadd: case nir_intrinsic_ssbo_atomic_fmin: case nir_intrinsic_ssbo_atomic_fmax: case nir_intrinsic_global_atomic_add_amd: @@ -650,6 +651,7 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_global_atomic_xor_amd: case nir_intrinsic_global_atomic_exchange_amd: case nir_intrinsic_global_atomic_comp_swap_amd: + case nir_intrinsic_global_atomic_fadd_amd: case nir_intrinsic_global_atomic_fmin_amd: case nir_intrinsic_global_atomic_fmax_amd: case nir_intrinsic_bindless_image_atomic_add: @@ -662,6 +664,7 @@ init_context(isel_context* ctx, nir_shader* shader) case nir_intrinsic_bindless_image_atomic_xor: case nir_intrinsic_bindless_image_atomic_exchange: case nir_intrinsic_bindless_image_atomic_comp_swap: + case nir_intrinsic_bindless_image_atomic_fadd: case nir_intrinsic_bindless_image_atomic_fmin: case nir_intrinsic_bindless_image_atomic_fmax: case nir_intrinsic_bindless_image_size: