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

Reply via email to