Module: Mesa Branch: master Commit: d400d5e150f966653b516e7f8da714a76e97b194 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=d400d5e150f966653b516e7f8da714a76e97b194
Author: Alyssa Rosenzweig <[email protected]> Date: Wed Feb 3 13:49:49 2021 -0500 pan/bi: Implement AXCHG Signed-off-by: Alyssa Rosenzweig <[email protected]> Reviewed-by: Boris Brezillon <[email protected]> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/8848> --- src/panfrost/bifrost/bifrost_compile.c | 42 ++++++++++++++++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/src/panfrost/bifrost/bifrost_compile.c b/src/panfrost/bifrost/bifrost_compile.c index f54e1224ebe..f980598da6c 100644 --- a/src/panfrost/bifrost/bifrost_compile.c +++ b/src/panfrost/bifrost/bifrost_compile.c @@ -539,6 +539,40 @@ bi_emit_store(bi_builder *b, nir_intrinsic_instr *instr, enum bi_seg seg) seg); } +/* Exchanges the staging register with memory */ + +static void +bi_emit_axchg(bi_builder *b, nir_intrinsic_instr *instr, enum bi_seg seg) +{ + assert(seg == BI_SEG_NONE || seg == BI_SEG_WLS); + + bi_index addr = bi_src_index(&instr->src[0]); + bi_index data = bi_src_index(&instr->src[1]); + + unsigned sz = nir_src_bit_size(instr->src[1]); + assert(sz == 32 || sz == 64); + + bi_index data_words[] = { + bi_word(data, 0), + bi_word(data, 1), + }; + + bi_index inout = bi_temp_reg(b->shader); + bi_make_vec_to(b, inout, data_words, NULL, sz / 32, 32); + + bi_axchg_to(b, sz, inout, inout, + bi_word(addr, 0), + (seg == BI_SEG_NONE) ? bi_word(addr, 1) : bi_zero(), + seg); + + bi_index inout_words[] = { + bi_word(inout, 0), + bi_word(inout, 1), + }; + + bi_make_vec_to(b, bi_dest_index(&instr->dest), inout_words, NULL, sz / 32, 32); +} + static void bi_load_sysval(bi_builder *b, nir_instr *instr, unsigned nr_components, unsigned offset) @@ -654,6 +688,14 @@ bi_emit_intrinsic(bi_builder *b, nir_intrinsic_instr *instr) bi_emit_store(b, instr, BI_SEG_WLS); break; + case nir_intrinsic_global_atomic_exchange: + bi_emit_axchg(b, instr, BI_SEG_NONE); + break; + + case nir_intrinsic_shared_atomic_exchange: + bi_emit_axchg(b, instr, BI_SEG_WLS); + break; + case nir_intrinsic_load_frag_coord: bi_emit_load_frag_coord(b, instr); break; _______________________________________________ mesa-commit mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/mesa-commit
