1c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors/*
2c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Copyright (c) 2016 Etnaviv Project
3c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *
4c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Permission is hereby granted, free of charge, to any person obtaining a
5c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * copy of this software and associated documentation files (the "Software"),
6c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * to deal in the Software without restriction, including without limitation
7c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * the rights to use, copy, modify, merge, publish, distribute, sub license,
8c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * and/or sell copies of the Software, and to permit persons to whom the
9c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Software is furnished to do so, subject to the following conditions:
10c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *
11c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * The above copyright notice and this permission notice (including the
12c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * next paragraph) shall be included in all copies or substantial portions
13c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * of the Software.
14c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *
15c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
18c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * DEALINGS IN THE SOFTWARE.
22c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *
23c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors * Authors:
24c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors *    Christian Gmeiner <christian.gmeiner@gmail.com>
25c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors */
26c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
27c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "etnaviv_disasm.h"
28c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
29c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include <assert.h>
30c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include <stdbool.h>
31c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include <stdio.h>
32c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include <stdlib.h>
33c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
34c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#include "hw/isa.xml.h"
35c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
36c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct instr {
37c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   /* dword0: */
38c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t opc         : 6;
39c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t cond        : 5;
40c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t sat         : 1;
41c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t dst_use     : 1;
42c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t dst_amode   : 3;
43c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t dst_reg     : 7;
44c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t dst_comps   : 4;
45c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t tex_id      : 5;
46c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
47c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   /* dword1: */
48c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t tex_amode   : 3;
49c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t tex_swiz    : 8;
50c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_use    : 1;
51c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_reg    : 9;
52c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t type_bit2   : 1;
53c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_swiz   : 8;
54c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_neg    : 1;
55c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_abs    : 1;
56c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
57c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   /* dword2: */
58c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_amode  : 3;
59c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src0_rgroup : 3;
60c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_use    : 1;
61c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_reg    : 9;
62c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t opcode_bit6 : 1;
63c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_swiz   : 8;
64c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_neg    : 1;
65c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_abs    : 1;
66c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t src1_amode  : 3;
67c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint32_t type_bit01  : 2;
68c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
69c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   /* dword3: */
70c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   union {
71c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct {
72c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src1_rgroup : 3;
73c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_use    : 1;
74c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_reg    : 9;
75c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t unk3_13     : 1;
76c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_swiz   : 8;
77c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_neg    : 1;
78c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_abs    : 1;
79c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t unk3_24     : 1;
80c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_amode  : 3;
81c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t src2_rgroup : 3;
82c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         uint32_t unk3_31     : 1;
83c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
84c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      uint32_t dword3;
85c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   };
86c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
87c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
88c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct dst_operand {
89c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   bool use;
90c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t amode;
91c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint16_t reg;
92c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t comps;
93c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
94c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
95c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct src_operand {
96c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   bool use;
97c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   bool neg;
98c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   bool abs;
99c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t rgroup;
100c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint16_t reg;
101c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t swiz;
102c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t amode;
103c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
104c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
105c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct tex_operand {
106c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t id;
107c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t amode;
108c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   uint8_t swiz;
109c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
110c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
111c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstruct opc_operands {
112c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct dst_operand *dst;
113c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct tex_operand *tex;
114c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct src_operand *src0;
115c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct src_operand *src1;
116c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct src_operand *src2;
117c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
118c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   int imm;
119c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
120c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
121c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
122c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprintf_type(uint8_t type)
123c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
124c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   switch(type) {
125c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_F32:
126c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      /* as f32 is the default print nothing */
127c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
128c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
129c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_S32:
130c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".s32");
131c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
132c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
133c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_S8:
134c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".s8");
135c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
136c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
137c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_U16:
138c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".u16");
139c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
140c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
141c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_F16:
142c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".f16");
143c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
144c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
145c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_S16:
146c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".s16");
147c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
148c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
149c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_U32:
150c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".u32");
151c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
152c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
153c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_TYPE_U8:
154c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".u8");
155c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
156c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
157c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   default:
158c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      abort();
159c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
160c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
161c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
162c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
163c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
164c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_condition(uint8_t condition)
165c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
166c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   switch (condition) {
167c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_TRUE:
168c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
169c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
170c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_GT:
171c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".GT");
172c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
173c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
174c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_LT:
175c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".LT");
176c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
177c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
178c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_GE:
179c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".GE");
180c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
181c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
182c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_LE:
183c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".LE");
184c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
185c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
186c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_EQ:
187c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".EQ");
188c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
189c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
190c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_NE:
191c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".NE");
192c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
193c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
194c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_AND:
195c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".AND");
196c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
197c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
198c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_OR:
199c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".OR");
200c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
201c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
202c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_XOR:
203c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".XOR");
204c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
205c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
206c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_NOT:
207c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".NOT");
208c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
209c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
210c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_NZ:
211c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".NZ");
212c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
213c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
214c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_GEZ:
215c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".GEZ");
216c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
217c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
218c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_GZ:
219c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".GZ");
220c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
221c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
222c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_LEZ:
223c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".LEZ");
224c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
225c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
226c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_CONDITION_LZ:
227c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(".LZ");
228c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
229c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
230c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   default:
231c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      abort();
232c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
233c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
234c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
235c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
236c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
237c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_rgroup(uint8_t rgoup)
238c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
239c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   switch (rgoup) {
240c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_RGROUP_TEMP:
241c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("t");
242c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
243c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
244c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_RGROUP_INTERNAL:
245c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("i");
246c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
247c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
248c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_RGROUP_UNIFORM_0:
249c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_RGROUP_UNIFORM_1:
250c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("u");
251c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
252c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
253c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
254c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
255c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
256c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_components(uint8_t components)
257c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
258c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (components == 15)
259c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      return;
260c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
261c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf(".");
262c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (components & INST_COMPS_X)
263c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("x");
264c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   else
265c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("_");
266c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
267c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (components & INST_COMPS_Y)
268c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("y");
269c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   else
270c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("_");
271c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
272c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (components & INST_COMPS_Z)
273c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("z");
274c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   else
275c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("_");
276c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
277c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (components & INST_COMPS_W)
278c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("w");
279c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   else
280c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("_");
281c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
282c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
283c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic inline void
284c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_swiz_comp(uint8_t swiz_comp)
285c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
286c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   switch (swiz_comp) {
287c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_SWIZ_COMP_X:
288c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("x");
289c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
290c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
291c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_SWIZ_COMP_Y:
292c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("y");
293c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
294c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
295c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_SWIZ_COMP_Z:
296c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("z");
297c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
298c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
299c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_SWIZ_COMP_W:
300c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("w");
301c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
302c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
303c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   default:
304c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      abort();
305c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
306c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
307c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
308c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
309c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
310c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_swiz(uint8_t swiz)
311c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
312c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   // if a null swizzle
313c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (swiz == 0xe4)
314c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      return;
315c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
316c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const unsigned x = swiz & 0x3;
317c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const unsigned y = (swiz & 0x0C) >> 2;
318c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const unsigned z = (swiz & 0x30) >> 4;
319c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const unsigned w = (swiz & 0xc0) >> 6;
320c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
321c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf(".");
322c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_swiz_comp(x);
323c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_swiz_comp(y);
324c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_swiz_comp(z);
325c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_swiz_comp(w);
326c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
327c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
328c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
329c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_amode(uint8_t amode)
330c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
331c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   switch (amode) {
332c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_AMODE_DIRECT:
333c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      /* nothing to output */
334c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
335c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
336c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_AMODE_ADD_A_X:
337c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("[a.x]");
338c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
339c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
340c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_AMODE_ADD_A_Y:
341c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("[a.y]");
342c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
343c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
344c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_AMODE_ADD_A_Z:
345c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("[a.z]");
346c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
347c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
348c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   case INST_AMODE_ADD_A_W:
349c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("[a.w]");
350c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
351c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
352c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   default:
353c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      abort();
354c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      break;
355c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
356c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
357c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
358c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
359c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_dst(struct dst_operand *dst, bool sep)
360c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
361c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (dst->use) {
362c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("t%u", dst->reg);
363c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_amode(dst->amode);
364c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_components(dst->comps);
365c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   } else {
366c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("void");
367c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
368c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
369c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (sep)
370c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(", ");
371c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
372c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
373c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
374c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_tex(struct tex_operand *tex, bool sep)
375c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
376c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf("tex%u", tex->id);
377c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_amode(tex->amode);
378c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_swiz(tex->swiz);
379c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
380c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (sep)
381c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(", ");
382c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
383c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
384c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
385c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_src(struct src_operand *src, bool sep)
386c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
387c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (src->use) {
388c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      if (src->neg)
389c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         printf("-");
390c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
391c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      if (src->abs)
392c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         printf("|");
393c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
394c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      if (src->rgroup == INST_RGROUP_UNIFORM_1)
395c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         src->reg += 128;
396c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
397c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_rgroup(src->rgroup);
398c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("%u", src->reg);
399c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_amode(src->amode);
400c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_swiz(src->swiz);
401c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
402c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      if (src->abs)
403c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         printf("|");
404c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   } else {
405c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("void");
406c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
407c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
408c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (sep)
409c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(", ");
410c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
411c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
412c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
413c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_opc_default(struct opc_operands *operands)
414c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
415c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_dst(operands->dst, true);
416c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src0, true);
417c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src1, true);
418c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src2, false);
419c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
420c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
421c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
422c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_opc_mov(struct opc_operands *operands)
423c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
424c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   // dst (areg)
425c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf("a%u", operands->dst->reg);
426c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_components(operands->dst->comps);
427c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf(", ");
428c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
429c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src0, true);
430c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src1, true);
431c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src2, false);
432c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
433c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
434c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
435c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_opc_tex(struct opc_operands *operands)
436c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
437c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_dst(operands->dst, true);
438c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_tex(operands->tex, true);
439c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src0, true);
440c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src1, true);
441c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src2, false);
442c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
443c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
444c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
445c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_opc_imm(struct opc_operands *operands)
446c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
447c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_dst(operands->dst, true);
448c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src0, true);
449c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   print_src(operands->src1, true);
450c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf("label_%04d", operands->imm);
451c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
452c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
453c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#define OPC_BITS 7
454c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
455c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic const struct opc_info {
456c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const char *name;
457c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   void (*print)(struct opc_operands *operands);
458c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors} opcs[1 << OPC_BITS] = {
459c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#define OPC(opc) [INST_OPCODE_##opc] = {#opc, print_opc_default}
460c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#define OPC_MOV(opc) [INST_OPCODE_##opc] = {#opc, print_opc_mov}
461c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#define OPC_TEX(opc) [INST_OPCODE_##opc] = {#opc, print_opc_tex}
462c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors#define OPC_IMM(opc) [INST_OPCODE_##opc] = {#opc, print_opc_imm}
463c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(NOP),
464c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(ADD),
465c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(MAD),
466c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(MUL),
467c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(DST),
468c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(DP3),
469c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(DP4),
470c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(DSX),
471c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(DSY),
472c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(MOV),
473c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_MOV(MOVAR),
474c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_MOV(MOVAF),
475c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(RCP),
476c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(RSQ),
477c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LITP),
478c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(SELECT),
479c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(SET),
480c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(EXP),
481c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LOG),
482c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(FRC),
483c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_IMM(CALL),
484c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(RET),
485c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_IMM(BRANCH),
486c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXKILL),
487c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXLD),
488c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXLDB),
489c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXLDD),
490c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXLDL),
491c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC_TEX(TEXLDPCF),
492c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(REP),
493c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(ENDREP),
494c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LOOP),
495c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(ENDLOOP),
496c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(SQRT),
497c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(SIN),
498c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(COS),
499c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(FLOOR),
500c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(CEIL),
501c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(SIGN),
502c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(I2F),
503c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(CMP),
504c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LOAD),
505c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(STORE),
506c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(IMULLO0),
507c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(IMULHI0),
508c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LEADZERO),
509c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(LSHIFT),
510c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(RSHIFT),
511c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(ROTATE),
512c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(OR),
513c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(AND),
514c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(XOR),
515c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   OPC(NOT),
516c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors};
517c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
518c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsstatic void
519c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsprint_instr(uint32_t *dwords, int n, enum debug_t debug)
520c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
521c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   struct instr *instr = (struct instr *)dwords;
522c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const unsigned opc = instr->opc | (instr->opcode_bit6 << 6);
523c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   const char *name = opcs[opc].name;
524c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
525c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf("%04d: ", n);
526c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (debug & PRINT_RAW)
527c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("%08x %08x %08x %08x  ", dwords[0], dwords[1], dwords[2],
528c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors             dwords[3]);
529c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
530c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   if (name) {
531c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
532c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct dst_operand dst = {
533c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .use = instr->dst_use,
534c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .amode = instr->dst_amode,
535c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .reg = instr->dst_reg,
536c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .comps = instr->dst_comps
537c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
538c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
539c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct tex_operand tex = {
540c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .id = instr->tex_id,
541c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .amode = instr->tex_amode,
542c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .swiz = instr->tex_swiz,
543c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
544c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
545c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct src_operand src0 = {
546c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .use = instr->src0_use,
547c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .neg = instr->src0_neg,
548c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .abs = instr->src0_abs,
549c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .rgroup = instr->src0_rgroup,
550c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .reg = instr->src0_reg,
551c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .swiz = instr->src0_swiz,
552c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .amode = instr->src0_amode,
553c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
554c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
555c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct src_operand src1 = {
556c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .use = instr->src1_use,
557c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .neg = instr->src1_neg,
558c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .abs = instr->src1_abs,
559c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .rgroup = instr->src1_rgroup,
560c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .reg = instr->src1_reg,
561c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .swiz = instr->src1_swiz,
562c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .amode = instr->src1_amode,
563c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
564c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
565c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct src_operand src2 = {
566c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .use = instr->src2_use,
567c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .neg = instr->src2_neg,
568c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .abs = instr->src2_abs,
569c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .rgroup = instr->src2_rgroup,
570c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .reg = instr->src2_reg,
571c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .swiz = instr->src2_swiz,
572c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .amode = instr->src2_amode,
573c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
574c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
575c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      int imm = (instr->dword3 & VIV_ISA_WORD_3_SRC2_IMM__MASK)
576c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors                >> VIV_ISA_WORD_3_SRC2_IMM__SHIFT;
577c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
578c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      struct opc_operands operands = {
579c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .dst = &dst,
580c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .tex = &tex,
581c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .src0 = &src0,
582c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .src1 = &src1,
583c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .src2 = &src2,
584c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         .imm = imm,
585c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      };
586c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
587c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      uint8_t type = instr->type_bit01 | (instr->type_bit2 << 2);
588c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
589c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("%s", name);
590c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf_type(type);
591c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      if (instr->sat)
592c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors         printf(".SAT");
593c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_condition(instr->cond);
594c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf(" ");
595c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      opcs[opc].print(&operands);
596c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   } else {
597c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      printf("unknown (%d)", instr->opc);
598c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   }
599c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
600c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   printf("\n");
601c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
602c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
603c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsvoid
604c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authorsetna_disasm(uint32_t *dwords, int sizedwords, enum debug_t debug)
605c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors{
606c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   unsigned i;
607c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
608c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   assert((sizedwords % 2) == 0);
609c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors
610c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors   for (i = 0; i < sizedwords; i += 4)
611c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors      print_instr(&dwords[i], i / 4, debug);
612c9e8b49b885242d84ba031dacef5aa4a5ac1e5b6The etnaviv authors}
613