Module: Mesa
Branch: main
Commit: e6f548018089d2d36215b8117e68393d35772648
URL:    
http://cgit.freedesktop.org/mesa/mesa/commit/?id=e6f548018089d2d36215b8117e68393d35772648

Author: Danylo Piliaiev <[email protected]>
Date:   Thu Jan  6 16:24:20 2022 +0200

ir3: Add cat7 sleep instruction

Has short and long variants, long seem to be ~20 times longer.
The exact difference between it and a bunch of nops is unknown.

The emission of this instruction were not observed in the wild.

Signed-off-by: Danylo Piliaiev <[email protected]>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/14419>

---

 src/freedreno/ir3/instr-a3xx.h   |  1 +
 src/freedreno/ir3/ir3_lexer.l    |  1 +
 src/freedreno/ir3/ir3_parser.y   |  2 ++
 src/freedreno/ir3/tests/disasm.c |  1 +
 src/freedreno/isa/ir3-cat7.xml   | 31 +++++++++++++++++++++++++++++++
 5 files changed, 36 insertions(+)

diff --git a/src/freedreno/ir3/instr-a3xx.h b/src/freedreno/ir3/instr-a3xx.h
index cc298458d1f..57e90aa58ce 100644
--- a/src/freedreno/ir3/instr-a3xx.h
+++ b/src/freedreno/ir3/instr-a3xx.h
@@ -361,6 +361,7 @@ typedef enum {
    /* category 7: */
    OPC_BAR             = _OPC(7, 0),
    OPC_FENCE           = _OPC(7, 1),
+   OPC_SLEEP           = _OPC(7, 2),
    OPC_ICINV           = _OPC(7, 3),
    OPC_DCCLN           = _OPC(7, 4),
    OPC_DCINV           = _OPC(7, 5),
diff --git a/src/freedreno/ir3/ir3_lexer.l b/src/freedreno/ir3/ir3_lexer.l
index bb969b03c29..7bd6cdfe1a2 100644
--- a/src/freedreno/ir3/ir3_lexer.l
+++ b/src/freedreno/ir3/ir3_lexer.l
@@ -382,6 +382,7 @@ static int parse_reg(const char *str)
                                   /* category 7: */
 "bar"                             return TOKEN(T_OP_BAR);
 "fence"                           return TOKEN(T_OP_FENCE);
+"sleep.l"                         return TOKEN(T_OP_SLEEP);
 "icinv"                           return TOKEN(T_OP_ICINV);
 "dccln.all"                       return TOKEN(T_OP_DCCLN);
 "dcinv.all"                       return TOKEN(T_OP_DCINV);
diff --git a/src/freedreno/ir3/ir3_parser.y b/src/freedreno/ir3/ir3_parser.y
index e0d06d2bcbe..929989115a9 100644
--- a/src/freedreno/ir3/ir3_parser.y
+++ b/src/freedreno/ir3/ir3_parser.y
@@ -621,6 +621,7 @@ static void print_token(FILE *file, int type, YYSTYPE value)
 /* category 7: */
 %token <tok> T_OP_BAR
 %token <tok> T_OP_FENCE
+%token <tok> T_OP_SLEEP
 %token <tok> T_OP_ICINV
 %token <tok> T_OP_DCCLN
 %token <tok> T_OP_DCINV
@@ -1295,6 +1296,7 @@ cat7_data_cache:   T_OP_DCCLN              { 
new_instr(OPC_DCCLN); }
 
 cat7_instr:        cat7_barrier
 |                  cat7_data_cache
+|                  T_OP_SLEEP              { new_instr(OPC_SLEEP); }
 |                  T_OP_ICINV              { new_instr(OPC_ICINV); }
 
 raw_instr: T_RAW   {new_instr(OPC_META_RAW)->raw.value = $1;}
diff --git a/src/freedreno/ir3/tests/disasm.c b/src/freedreno/ir3/tests/disasm.c
index 277f827716b..c40302c577d 100644
--- a/src/freedreno/ir3/tests/disasm.c
+++ b/src/freedreno/ir3/tests/disasm.c
@@ -418,6 +418,7 @@ static const struct test {
    INSTR_6XX(e0fa0000_00000000, "fence.g.l.r.w"),
    INSTR_6XX(e09a0000_00000000, "fence.r.w"),
    INSTR_6XX(f0420000_00000000, "(sy)bar.g"),
+   INSTR_6XX(e1080000_00000000, "sleep.l"),
    INSTR_6XX(e2080000_00000000, "dccln.all"),
 
    INSTR_6XX(ffffffff_ffffffff, "raw 0xFFFFFFFFFFFFFFFF"),
diff --git a/src/freedreno/isa/ir3-cat7.xml b/src/freedreno/isa/ir3-cat7.xml
index f3fd1b8f097..7b32155fda2 100644
--- a/src/freedreno/isa/ir3-cat7.xml
+++ b/src/freedreno/isa/ir3-cat7.xml
@@ -80,6 +80,37 @@ SOFTWARE.
        </encode>
 </bitset>
 
+<enum name="#sleep-duration">
+       <value val="0" display=".s">
+               <doc>
+                       Short sleep
+               </doc>
+       </value>
+       <value val="1" display=".l">
+               <doc>
+                       Long sleep, around 20x longer than short
+               </doc>
+       </value>
+</enum>
+
+<bitset name="sleep" extends="#instruction-cat7">
+       <doc>
+               Short/Long Sleep
+               TODO: how is it different from a bunch of nops?
+       </doc>
+       <display>
+               {SY}{JP}{NAME}{DURATION}
+       </display>
+       <pattern low="45" high="50">xxxxxx</pattern>
+       <field   pos="51"          name="DURATION" type="#sleep-duration"/>
+       <pattern low="52" high="54">xxx</pattern>
+       <pattern low="55" high="58">0010</pattern>
+       <encode>
+               <!-- TODO: read duration -->
+               <map name="DURATION">1</map>
+       </encode>
+</bitset>
+
 <bitset name="icinv" extends="#instruction-cat7">
        <doc>
                Seem to be Instruction Cache Invalidate, supported by the fact

Reply via email to