freedreno/afuc: Add iret

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/6368>
This commit is contained in:
Connor Abbott 2020-08-17 20:29:20 +02:00 committed by Marge Bot
parent a2c14ac070
commit b2b19234d8
5 changed files with 17 additions and 2 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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);

View file

@ -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);

View file

@ -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); }