instr-a2xx.h revision 7ec681f3
1/*
2 * Copyright (c) 2012 Rob Clark <robdclark@gmail.com>
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 * SOFTWARE.
22 */
23
24#ifndef INSTR_A2XX_H_
25#define INSTR_A2XX_H_
26
27#define PACKED __attribute__((__packed__))
28
29#include "util/u_math.h"
30#include "adreno_common.xml.h"
31#include "adreno_pm4.xml.h"
32#include "a2xx.xml.h"
33
34/*
35 * ALU instructions:
36 */
37
38typedef enum {
39   ADDs = 0,
40   ADD_PREVs = 1,
41   MULs = 2,
42   MUL_PREVs = 3,
43   MUL_PREV2s = 4,
44   MAXs = 5,
45   MINs = 6,
46   SETEs = 7,
47   SETGTs = 8,
48   SETGTEs = 9,
49   SETNEs = 10,
50   FRACs = 11,
51   TRUNCs = 12,
52   FLOORs = 13,
53   EXP_IEEE = 14,
54   LOG_CLAMP = 15,
55   LOG_IEEE = 16,
56   RECIP_CLAMP = 17,
57   RECIP_FF = 18,
58   RECIP_IEEE = 19,
59   RECIPSQ_CLAMP = 20,
60   RECIPSQ_FF = 21,
61   RECIPSQ_IEEE = 22,
62   MOVAs = 23,
63   MOVA_FLOORs = 24,
64   SUBs = 25,
65   SUB_PREVs = 26,
66   PRED_SETEs = 27,
67   PRED_SETNEs = 28,
68   PRED_SETGTs = 29,
69   PRED_SETGTEs = 30,
70   PRED_SET_INVs = 31,
71   PRED_SET_POPs = 32,
72   PRED_SET_CLRs = 33,
73   PRED_SET_RESTOREs = 34,
74   KILLEs = 35,
75   KILLGTs = 36,
76   KILLGTEs = 37,
77   KILLNEs = 38,
78   KILLONEs = 39,
79   SQRT_IEEE = 40,
80   MUL_CONST_0 = 42,
81   MUL_CONST_1 = 43,
82   ADD_CONST_0 = 44,
83   ADD_CONST_1 = 45,
84   SUB_CONST_0 = 46,
85   SUB_CONST_1 = 47,
86   SIN = 48,
87   COS = 49,
88   RETAIN_PREV = 50,
89   SCALAR_NONE = 63,
90} instr_scalar_opc_t;
91
92typedef enum {
93   ADDv = 0,
94   MULv = 1,
95   MAXv = 2,
96   MINv = 3,
97   SETEv = 4,
98   SETGTv = 5,
99   SETGTEv = 6,
100   SETNEv = 7,
101   FRACv = 8,
102   TRUNCv = 9,
103   FLOORv = 10,
104   MULADDv = 11,
105   CNDEv = 12,
106   CNDGTEv = 13,
107   CNDGTv = 14,
108   DOT4v = 15,
109   DOT3v = 16,
110   DOT2ADDv = 17,
111   CUBEv = 18,
112   MAX4v = 19,
113   PRED_SETE_PUSHv = 20,
114   PRED_SETNE_PUSHv = 21,
115   PRED_SETGT_PUSHv = 22,
116   PRED_SETGTE_PUSHv = 23,
117   KILLEv = 24,
118   KILLGTv = 25,
119   KILLGTEv = 26,
120   KILLNEv = 27,
121   DSTv = 28,
122   MOVAv = 29,
123   VECTOR_NONE = 31,
124} instr_vector_opc_t;
125
126typedef struct PACKED {
127   /* dword0: */
128   uint8_t vector_dest : 6;
129   uint8_t vector_dest_rel : 1;
130   uint8_t low_precision_16b_fp : 1;
131   uint8_t scalar_dest : 6;
132   uint8_t scalar_dest_rel : 1;
133   uint8_t export_data : 1;
134   uint8_t vector_write_mask : 4;
135   uint8_t scalar_write_mask : 4;
136   uint8_t vector_clamp : 1;
137   uint8_t scalar_clamp : 1;
138   instr_scalar_opc_t scalar_opc : 6;
139   /* dword1: */
140   uint8_t src3_swiz : 8;
141   uint8_t src2_swiz : 8;
142   uint8_t src1_swiz : 8;
143   uint8_t src3_reg_negate : 1;
144   uint8_t src2_reg_negate : 1;
145   uint8_t src1_reg_negate : 1;
146   uint8_t pred_select : 2;
147   uint8_t relative_addr : 1;
148   uint8_t const_1_rel_abs : 1;
149   uint8_t const_0_rel_abs : 1;
150   /* dword2: */
151   union {
152      struct {
153         uint8_t src3_reg : 6;
154         uint8_t src3_reg_select : 1;
155         uint8_t src3_reg_abs : 1;
156         uint8_t src2_reg : 6;
157         uint8_t src2_reg_select : 1;
158         uint8_t src2_reg_abs : 1;
159         uint8_t src1_reg : 6;
160         uint8_t src1_reg_select : 1;
161         uint8_t src1_reg_abs : 1;
162      };
163      /* constants have full 8-bit index */
164      struct {
165         uint8_t src3_reg_byte : 8;
166         uint8_t src2_reg_byte : 8;
167         uint8_t src1_reg_byte : 8;
168      };
169   };
170   instr_vector_opc_t vector_opc : 5;
171   uint8_t src3_sel : 1;
172   uint8_t src2_sel : 1;
173   uint8_t src1_sel : 1;
174} instr_alu_t;
175
176/*
177 * CF instructions:
178 */
179
180typedef enum {
181   NOP = 0,
182   EXEC = 1,
183   EXEC_END = 2,
184   COND_EXEC = 3,
185   COND_EXEC_END = 4,
186   COND_PRED_EXEC = 5,
187   COND_PRED_EXEC_END = 6,
188   LOOP_START = 7,
189   LOOP_END = 8,
190   COND_CALL = 9,
191   RETURN = 10,
192   COND_JMP = 11,
193   ALLOC = 12,
194   COND_EXEC_PRED_CLEAN = 13,
195   COND_EXEC_PRED_CLEAN_END = 14,
196   MARK_VS_FETCH_DONE = 15,
197} instr_cf_opc_t;
198
199typedef enum {
200   RELATIVE_ADDR = 0,
201   ABSOLUTE_ADDR = 1,
202} instr_addr_mode_t;
203
204typedef enum {
205   SQ_NO_ALLOC = 0,
206   SQ_POSITION = 1,
207   SQ_PARAMETER_PIXEL = 2,
208   SQ_MEMORY = 3,
209} instr_alloc_type_t;
210
211typedef struct PACKED {
212   uint16_t address : 9;
213   uint8_t reserved0 : 3;
214   uint8_t count : 3;
215   uint8_t yeild : 1;
216   uint16_t serialize : 12;
217   uint32_t vc : 6; /* vertex cache? */
218   uint32_t bool_addr : 8;
219   uint8_t condition : 1;
220   instr_addr_mode_t address_mode : 1;
221   instr_cf_opc_t opc : 4;
222} instr_cf_exec_t;
223
224typedef struct PACKED {
225   uint16_t address : 10;
226   uint8_t reserved0 : 6;
227   uint8_t loop_id : 5;
228   uint32_t reserved1 : 22;
229   instr_addr_mode_t address_mode : 1;
230   instr_cf_opc_t opc : 4;
231} instr_cf_loop_t;
232
233typedef struct PACKED {
234   uint16_t address : 10;
235   uint8_t reserved0 : 3;
236   uint8_t force_call : 1;
237   uint8_t predicated_jmp : 1;
238   uint32_t reserved1 : 18;
239   uint8_t direction : 1;
240   uint32_t bool_addr : 8;
241   uint8_t condition : 1;
242   instr_addr_mode_t address_mode : 1;
243   instr_cf_opc_t opc : 4;
244} instr_cf_jmp_call_t;
245
246typedef struct PACKED {
247   uint8_t size : 4;
248   uint64_t reserved0 : 36;
249   uint8_t no_serial : 1;
250   instr_alloc_type_t buffer_select : 2;
251   uint8_t alloc_mode : 1;
252   instr_cf_opc_t opc : 4;
253} instr_cf_alloc_t;
254
255typedef union PACKED {
256   instr_cf_exec_t exec;
257   instr_cf_loop_t loop;
258   instr_cf_jmp_call_t jmp_call;
259   instr_cf_alloc_t alloc;
260   struct PACKED {
261      uint64_t dummy : 44;
262      instr_cf_opc_t opc : 4;
263   };
264} instr_cf_t;
265
266/*
267 * FETCH instructions:
268 */
269
270typedef enum {
271   VTX_FETCH = 0,
272   TEX_FETCH = 1,
273   TEX_GET_BORDER_COLOR_FRAC = 16,
274   TEX_GET_COMP_TEX_LOD = 17,
275   TEX_GET_GRADIENTS = 18,
276   TEX_GET_WEIGHTS = 19,
277   TEX_SET_TEX_LOD = 24,
278   TEX_SET_GRADIENTS_H = 25,
279   TEX_SET_GRADIENTS_V = 26,
280   TEX_RESERVED_4 = 27,
281} instr_fetch_opc_t;
282
283typedef enum {
284   TEX_FILTER_POINT = 0,
285   TEX_FILTER_LINEAR = 1,
286   TEX_FILTER_BASEMAP = 2, /* only applicable for mip-filter */
287   TEX_FILTER_USE_FETCH_CONST = 3,
288} instr_tex_filter_t;
289
290typedef enum {
291   ANISO_FILTER_DISABLED = 0,
292   ANISO_FILTER_MAX_1_1 = 1,
293   ANISO_FILTER_MAX_2_1 = 2,
294   ANISO_FILTER_MAX_4_1 = 3,
295   ANISO_FILTER_MAX_8_1 = 4,
296   ANISO_FILTER_MAX_16_1 = 5,
297   ANISO_FILTER_USE_FETCH_CONST = 7,
298} instr_aniso_filter_t;
299
300typedef enum {
301   ARBITRARY_FILTER_2X4_SYM = 0,
302   ARBITRARY_FILTER_2X4_ASYM = 1,
303   ARBITRARY_FILTER_4X2_SYM = 2,
304   ARBITRARY_FILTER_4X2_ASYM = 3,
305   ARBITRARY_FILTER_4X4_SYM = 4,
306   ARBITRARY_FILTER_4X4_ASYM = 5,
307   ARBITRARY_FILTER_USE_FETCH_CONST = 7,
308} instr_arbitrary_filter_t;
309
310typedef enum {
311   SAMPLE_CENTROID = 0,
312   SAMPLE_CENTER = 1,
313} instr_sample_loc_t;
314
315typedef enum a2xx_sq_surfaceformat instr_surf_fmt_t;
316
317typedef struct PACKED {
318   /* dword0: */
319   instr_fetch_opc_t opc : 5;
320   uint32_t src_reg : 6;
321   uint8_t src_reg_am : 1;
322   uint32_t dst_reg : 6;
323   uint8_t dst_reg_am : 1;
324   uint8_t fetch_valid_only : 1;
325   uint32_t const_idx : 5;
326   uint8_t tx_coord_denorm : 1;
327   uint8_t src_swiz : 6;
328   /* dword1: */
329   uint16_t dst_swiz : 12;
330   instr_tex_filter_t mag_filter : 2;
331   instr_tex_filter_t min_filter : 2;
332   instr_tex_filter_t mip_filter : 2;
333   instr_aniso_filter_t aniso_filter : 3;
334   instr_arbitrary_filter_t arbitrary_filter : 3;
335   instr_tex_filter_t vol_mag_filter : 2;
336   instr_tex_filter_t vol_min_filter : 2;
337   uint8_t use_comp_lod : 1;
338   uint8_t use_reg_lod : 2; /* 0 for cube, 1 for 2d */
339   uint8_t pred_select : 1;
340   /* dword2: */
341   uint8_t use_reg_gradients : 1;
342   instr_sample_loc_t sample_location : 1;
343   uint32_t lod_bias : 7;
344   uint8_t unused : 7;
345   uint8_t offset_x : 5;
346   uint32_t offset_y : 5;
347   uint8_t offset_z : 5;
348   uint8_t pred_condition : 1;
349} instr_fetch_tex_t;
350
351typedef struct PACKED {
352   /* dword0: */
353   instr_fetch_opc_t opc : 5;
354   uint32_t src_reg : 6;
355   uint8_t src_reg_am : 1;
356   uint32_t dst_reg : 6;
357   uint8_t dst_reg_am : 1;
358   uint8_t must_be_one : 1;
359   uint32_t const_index : 5;
360   uint8_t const_index_sel : 2;
361   uint8_t reserved0 : 3;
362   uint8_t src_swiz : 2;
363   /* dword1: */
364   uint16_t dst_swiz : 12;
365   uint8_t format_comp_all : 1; /* '1' for signed, '0' for unsigned? */
366   uint8_t num_format_all : 1;  /* '0' for normalized, '1' for unnormalized */
367   uint8_t signed_rf_mode_all : 1;
368   uint8_t reserved1 : 1;
369   instr_surf_fmt_t format : 6;
370   uint8_t reserved2 : 2;
371   uint8_t exp_adjust_all : 6;
372   uint8_t reserved3 : 1;
373   uint8_t pred_select : 1;
374   /* dword2: */
375   uint8_t stride : 8;
376   uint32_t offset : 22;
377   uint8_t reserved4 : 1;
378   uint8_t pred_condition : 1;
379} instr_fetch_vtx_t;
380
381typedef union PACKED {
382   instr_fetch_tex_t tex;
383   instr_fetch_vtx_t vtx;
384   struct PACKED {
385      /* dword0: */
386      instr_fetch_opc_t opc : 5;
387      uint32_t dummy0 : 27;
388      /* dword1: */
389      uint32_t dummy1 : 31;
390      uint8_t pred_select : 1;
391      /* dword2: */
392      uint32_t dummy2 : 31;
393      uint8_t pred_condition : 1;
394   };
395} instr_fetch_t;
396
397typedef union PACKED {
398   instr_alu_t alu;
399   instr_fetch_t fetch;
400} instr_t;
401
402#endif /* INSTR_H_ */
403