Mesa (master): freedreno/afuc: Add iret
GitLab Mirror
gitlab-mirror at kemper.freedesktop.org
Tue Aug 18 16:27:31 UTC 2020
Module: Mesa
Branch: master
Commit: b2b19234d81fe8fa47ad735c08049e1a6c0d2ce9
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=b2b19234d81fe8fa47ad735c08049e1a6c0d2ce9
Author: Connor Abbott <cwabbott0 at gmail.com>
Date: Mon Aug 17 20:29:20 2020 +0200
freedreno/afuc: Add iret
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6368>
---
src/freedreno/afuc/afuc.h | 5 +++++
src/freedreno/afuc/asm.c | 4 ++++
src/freedreno/afuc/disasm.c | 7 +++++--
src/freedreno/afuc/lexer.l | 1 +
src/freedreno/afuc/parser.y | 2 ++
5 files changed, 17 insertions(+), 2 deletions(-)
diff --git a/src/freedreno/afuc/afuc.h b/src/freedreno/afuc/afuc.h
index a69690a56f2..8233db04402 100644
--- a/src/freedreno/afuc/afuc.h
+++ b/src/freedreno/afuc/afuc.h
@@ -152,6 +152,11 @@ typedef union PACKED {
uint32_t uoff : 26; /* absolute (unsigned) offset */
uint32_t hdr : 6;
} call;
+ struct PACKED {
+ uint32_t pad : 25;
+ uint32_t interrupt : 1; /* return from ctxt-switch interrupt handler */
+ uint32_t hdr : 6;
+ } ret;
struct PACKED {
uint32_t pad : 26;
uint32_t hdr : 6;
diff --git a/src/freedreno/afuc/asm.c b/src/freedreno/afuc/asm.c
index 896a8555cf3..a03a89a31fa 100644
--- a/src/freedreno/afuc/asm.c
+++ b/src/freedreno/afuc/asm.c
@@ -254,6 +254,10 @@ static void emit_instructions(int outfd)
case T_OP_RET:
opc = OPC_RET;
break;
+ case T_OP_IRET:
+ opc = OPC_RET;
+ instr.ret.interrupt = 1;
+ break;
case T_OP_CALL:
opc = OPC_CALL;
instr.call.uoff = resolve_label(ai->label);
diff --git a/src/freedreno/afuc/disasm.c b/src/freedreno/afuc/disasm.c
index 5c86f4327da..f687058f615 100644
--- a/src/freedreno/afuc/disasm.c
+++ b/src/freedreno/afuc/disasm.c
@@ -656,9 +656,12 @@ static void disasm(uint32_t *buf, int sizedwords)
break;
case OPC_RET:
assert(!rep);
- if (instr->pad)
+ if (instr->ret.pad)
printf("[%08x] ; ", instrs[i]);
- printf("ret");
+ if (instr->ret.interrupt)
+ printf("iret");
+ else
+ printf("ret");
break;
case OPC_WIN:
assert(!rep);
diff --git a/src/freedreno/afuc/lexer.l b/src/freedreno/afuc/lexer.l
index 077ae657d3c..6b1ec07cade 100644
--- a/src/freedreno/afuc/lexer.l
+++ b/src/freedreno/afuc/lexer.l
@@ -78,6 +78,7 @@ extern YYSTYPE yylval;
"brne" return TOKEN(T_OP_BRNE);
"breq" return TOKEN(T_OP_BREQ);
"ret" return TOKEN(T_OP_RET);
+"iret" return TOKEN(T_OP_IRET);
"call" return TOKEN(T_OP_CALL);
"jump" return TOKEN(T_OP_JUMP);
"waitin" return TOKEN(T_OP_WAITIN);
diff --git a/src/freedreno/afuc/parser.y b/src/freedreno/afuc/parser.y
index 7b2eebd410a..657524a1f6c 100644
--- a/src/freedreno/afuc/parser.y
+++ b/src/freedreno/afuc/parser.y
@@ -153,6 +153,7 @@ label(const char *str)
%token <tok> T_OP_BRNE
%token <tok> T_OP_BREQ
%token <tok> T_OP_RET
+%token <tok> T_OP_IRET
%token <tok> T_OP_CALL
%token <tok> T_OP_JUMP
%token <tok> T_OP_WAITIN
@@ -248,6 +249,7 @@ other_instr: T_OP_CALL T_LABEL_REF { new_instr($1); label($2); }
| T_OP_PREEMPTLEAVE T_LABEL_REF { new_instr($1); label($2); }
| T_OP_SETSECURE reg ',' T_LABEL_REF { new_instr($1); src1($2); label($4); }
| T_OP_RET { new_instr($1); }
+| T_OP_IRET { new_instr($1); }
| T_OP_JUMP T_LABEL_REF { new_instr($1); label($2); }
| T_OP_WAITIN { new_instr($1); }
| T_OP_NOP { new_instr($1); }
More information about the mesa-commit
mailing list