xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/agx_opcodes.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker"""
2*61046927SAndroid Build Coastguard WorkerCopyright 2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker# SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker"""
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Workeropcodes = {}
7*61046927SAndroid Build Coastguard Workerimmediates = {}
8*61046927SAndroid Build Coastguard Workerenums = {}
9*61046927SAndroid Build Coastguard Worker
10*61046927SAndroid Build Coastguard WorkerVARIABLE = ~0
11*61046927SAndroid Build Coastguard Worker
12*61046927SAndroid Build Coastguard Workerclass Opcode(object):
13*61046927SAndroid Build Coastguard Worker   def __init__(self, name, dests, srcs, imms, is_float, can_eliminate,
14*61046927SAndroid Build Coastguard Worker                can_reorder, schedule_class, encoding_16, encoding_32):
15*61046927SAndroid Build Coastguard Worker      self.name = name
16*61046927SAndroid Build Coastguard Worker      self.dests = dests if dests != VARIABLE else 0
17*61046927SAndroid Build Coastguard Worker      self.srcs = srcs if srcs != VARIABLE else 0
18*61046927SAndroid Build Coastguard Worker      self.variable_srcs = (srcs == VARIABLE)
19*61046927SAndroid Build Coastguard Worker      self.variable_dests = (dests == VARIABLE)
20*61046927SAndroid Build Coastguard Worker      self.imms = imms
21*61046927SAndroid Build Coastguard Worker      self.is_float = is_float
22*61046927SAndroid Build Coastguard Worker      self.can_eliminate = can_eliminate
23*61046927SAndroid Build Coastguard Worker      self.can_reorder = can_reorder
24*61046927SAndroid Build Coastguard Worker      self.schedule_class = schedule_class
25*61046927SAndroid Build Coastguard Worker      self.encoding_16 = encoding_16
26*61046927SAndroid Build Coastguard Worker      self.encoding_32 = encoding_32
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Workerclass Immediate(object):
29*61046927SAndroid Build Coastguard Worker   def __init__(self, name, ctype):
30*61046927SAndroid Build Coastguard Worker      self.name = name
31*61046927SAndroid Build Coastguard Worker      self.ctype = ctype
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Workerclass Encoding(object):
34*61046927SAndroid Build Coastguard Worker   def __init__(self, description):
35*61046927SAndroid Build Coastguard Worker      (exact, mask, length_short, length_long) = description
36*61046927SAndroid Build Coastguard Worker
37*61046927SAndroid Build Coastguard Worker      # Convenience
38*61046927SAndroid Build Coastguard Worker      if length_long is None:
39*61046927SAndroid Build Coastguard Worker         length_long = length_short
40*61046927SAndroid Build Coastguard Worker
41*61046927SAndroid Build Coastguard Worker      self.exact = exact
42*61046927SAndroid Build Coastguard Worker      self.mask = mask
43*61046927SAndroid Build Coastguard Worker      self.length_short = length_short
44*61046927SAndroid Build Coastguard Worker      self.extensible = length_short != length_long
45*61046927SAndroid Build Coastguard Worker
46*61046927SAndroid Build Coastguard Worker      if self.extensible:
47*61046927SAndroid Build Coastguard Worker         assert(length_long == length_short + (4 if length_short > 8 else 2))
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Workerdef op(name, encoding_32, dests = 1, srcs = 0, imms = [], is_float = False,
50*61046927SAndroid Build Coastguard Worker        can_eliminate = True, can_reorder = True, encoding_16 = None,
51*61046927SAndroid Build Coastguard Worker        schedule_class = "none"):
52*61046927SAndroid Build Coastguard Worker   encoding_16 = Encoding(encoding_16) if encoding_16 is not None else None
53*61046927SAndroid Build Coastguard Worker   encoding_32 = Encoding(encoding_32) if encoding_32 is not None else None
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker   opcodes[name] = Opcode(name, dests, srcs, imms, is_float, can_eliminate,
56*61046927SAndroid Build Coastguard Worker                          can_reorder, schedule_class,  encoding_16, encoding_32)
57*61046927SAndroid Build Coastguard Worker
58*61046927SAndroid Build Coastguard Workerdef immediate(name, ctype = "uint32_t"):
59*61046927SAndroid Build Coastguard Worker   imm = Immediate(name, ctype)
60*61046927SAndroid Build Coastguard Worker   immediates[name] = imm
61*61046927SAndroid Build Coastguard Worker   return imm
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Workerdef enum(name, value_dict):
64*61046927SAndroid Build Coastguard Worker   enums[name] = value_dict
65*61046927SAndroid Build Coastguard Worker   return immediate(name, "enum agx_" + name)
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard WorkerL = (1 << 15)
68*61046927SAndroid Build Coastguard Worker_ = None
69*61046927SAndroid Build Coastguard Worker
70*61046927SAndroid Build Coastguard WorkerFORMAT = immediate("format", "enum agx_format")
71*61046927SAndroid Build Coastguard WorkerIMM = immediate("imm", "uint64_t")
72*61046927SAndroid Build Coastguard WorkerWRITEOUT = immediate("writeout")
73*61046927SAndroid Build Coastguard WorkerINDEX = immediate("index")
74*61046927SAndroid Build Coastguard WorkerCOMPONENT = immediate("component")
75*61046927SAndroid Build Coastguard WorkerCHANNELS = immediate("channels")
76*61046927SAndroid Build Coastguard WorkerTRUTH_TABLE = immediate("truth_table")
77*61046927SAndroid Build Coastguard WorkerROUND = immediate("round", "enum agx_round")
78*61046927SAndroid Build Coastguard WorkerSHIFT = immediate("shift")
79*61046927SAndroid Build Coastguard WorkerMASK = immediate("mask")
80*61046927SAndroid Build Coastguard WorkerBFI_MASK = immediate("bfi_mask")
81*61046927SAndroid Build Coastguard WorkerLOD_MODE = immediate("lod_mode", "enum agx_lod_mode")
82*61046927SAndroid Build Coastguard WorkerPIXEL_OFFSET = immediate("pixel_offset")
83*61046927SAndroid Build Coastguard WorkerSTACK_SIZE = immediate("stack_size", 'int16_t')
84*61046927SAndroid Build Coastguard WorkerEXPLICIT_COORDS = immediate("explicit_coords", "bool")
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard WorkerDIM = enum("dim", {
87*61046927SAndroid Build Coastguard Worker    0: '1d',
88*61046927SAndroid Build Coastguard Worker    1: '1d_array',
89*61046927SAndroid Build Coastguard Worker    2: '2d',
90*61046927SAndroid Build Coastguard Worker    3: '2d_array',
91*61046927SAndroid Build Coastguard Worker    4: '2d_ms',
92*61046927SAndroid Build Coastguard Worker    5: '3d',
93*61046927SAndroid Build Coastguard Worker    6: 'cube',
94*61046927SAndroid Build Coastguard Worker    7: 'cube_array',
95*61046927SAndroid Build Coastguard Worker    8: '2d_ms_array',
96*61046927SAndroid Build Coastguard Worker})
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard WorkerGATHER = enum("gather", {
99*61046927SAndroid Build Coastguard Worker	0b000: "none",
100*61046927SAndroid Build Coastguard Worker	0b001: "r",
101*61046927SAndroid Build Coastguard Worker	0b011: "g",
102*61046927SAndroid Build Coastguard Worker	0b101: "b",
103*61046927SAndroid Build Coastguard Worker	0b111: "a",
104*61046927SAndroid Build Coastguard Worker})
105*61046927SAndroid Build Coastguard Worker
106*61046927SAndroid Build Coastguard WorkerOFFSET = immediate("offset", "bool")
107*61046927SAndroid Build Coastguard WorkerSHADOW = immediate("shadow", "bool")
108*61046927SAndroid Build Coastguard WorkerQUERY_LOD = immediate("query_lod", "bool")
109*61046927SAndroid Build Coastguard WorkerSCOREBOARD = immediate("scoreboard")
110*61046927SAndroid Build Coastguard WorkerICOND = immediate("icond", "enum agx_icond")
111*61046927SAndroid Build Coastguard WorkerFCOND = immediate("fcond", "enum agx_fcond")
112*61046927SAndroid Build Coastguard WorkerNEST = immediate("nest")
113*61046927SAndroid Build Coastguard WorkerINVERT_COND = immediate("invert_cond")
114*61046927SAndroid Build Coastguard WorkerNEST = immediate("nest")
115*61046927SAndroid Build Coastguard WorkerTARGET = immediate("target", "agx_block *")
116*61046927SAndroid Build Coastguard WorkerZS = immediate("zs")
117*61046927SAndroid Build Coastguard WorkerSR = enum("sr", {
118*61046927SAndroid Build Coastguard Worker   0:  'threadgroup_position_in_grid.x',
119*61046927SAndroid Build Coastguard Worker   1:  'threadgroup_position_in_grid.y',
120*61046927SAndroid Build Coastguard Worker   2:  'threadgroup_position_in_grid.z',
121*61046927SAndroid Build Coastguard Worker   4:  'threads_per_threadgroup.x',
122*61046927SAndroid Build Coastguard Worker   5:  'threads_per_threadgroup.y',
123*61046927SAndroid Build Coastguard Worker   6:  'threads_per_threadgroup.z',
124*61046927SAndroid Build Coastguard Worker   8:  'dispatch_threads_per_threadgroup.x',
125*61046927SAndroid Build Coastguard Worker   9:  'dispatch_threads_per_threadgroup.y',
126*61046927SAndroid Build Coastguard Worker   10: 'dispatch_threads_per_threadgroup.z',
127*61046927SAndroid Build Coastguard Worker   14: 'samples_log2',
128*61046927SAndroid Build Coastguard Worker   20: 'core_id',
129*61046927SAndroid Build Coastguard Worker   21: 'vm_slot',
130*61046927SAndroid Build Coastguard Worker   48: 'thread_position_in_threadgroup.x',
131*61046927SAndroid Build Coastguard Worker   49: 'thread_position_in_threadgroup.y',
132*61046927SAndroid Build Coastguard Worker   50: 'thread_position_in_threadgroup.z',
133*61046927SAndroid Build Coastguard Worker   51: 'thread_index_in_threadgroup',
134*61046927SAndroid Build Coastguard Worker   52: 'thread_index_in_subgroup',
135*61046927SAndroid Build Coastguard Worker   53: 'subgroup_index_in_threadgroup',
136*61046927SAndroid Build Coastguard Worker   56: 'active_thread_index_in_quad',
137*61046927SAndroid Build Coastguard Worker   57: 'total_active_threads_in_quad',
138*61046927SAndroid Build Coastguard Worker   58: 'active_thread_index_in_subgroup',
139*61046927SAndroid Build Coastguard Worker   59: 'total_active_threads_in_subgroup',
140*61046927SAndroid Build Coastguard Worker   60: 'coverage_mask',
141*61046927SAndroid Build Coastguard Worker   62: 'backfacing',
142*61046927SAndroid Build Coastguard Worker   63: 'is_active_thread',
143*61046927SAndroid Build Coastguard Worker   80: 'thread_position_in_grid.x',
144*61046927SAndroid Build Coastguard Worker   81: 'thread_position_in_grid.y',
145*61046927SAndroid Build Coastguard Worker   82: 'thread_position_in_grid.z',
146*61046927SAndroid Build Coastguard Worker   124: 'input_sample_mask',
147*61046927SAndroid Build Coastguard Worker   144: 'helper_op',
148*61046927SAndroid Build Coastguard Worker   146: 'helper_arg_l',
149*61046927SAndroid Build Coastguard Worker   147: 'helper_arg_h',
150*61046927SAndroid Build Coastguard Worker})
151*61046927SAndroid Build Coastguard Worker
152*61046927SAndroid Build Coastguard WorkerATOMIC_OPC = enum("atomic_opc", {
153*61046927SAndroid Build Coastguard Worker	0: 'add',
154*61046927SAndroid Build Coastguard Worker	1: 'sub',
155*61046927SAndroid Build Coastguard Worker	2: 'xchg',
156*61046927SAndroid Build Coastguard Worker	3: 'cmpxchg',
157*61046927SAndroid Build Coastguard Worker	4: 'umin',
158*61046927SAndroid Build Coastguard Worker	5: 'imin',
159*61046927SAndroid Build Coastguard Worker	6: 'umax',
160*61046927SAndroid Build Coastguard Worker	7: 'imax',
161*61046927SAndroid Build Coastguard Worker	8: 'and',
162*61046927SAndroid Build Coastguard Worker	9: 'or',
163*61046927SAndroid Build Coastguard Worker	10: 'xor',
164*61046927SAndroid Build Coastguard Worker})
165*61046927SAndroid Build Coastguard Worker
166*61046927SAndroid Build Coastguard WorkerINTERPOLATION = enum("interpolation", {
167*61046927SAndroid Build Coastguard Worker    0: 'center',
168*61046927SAndroid Build Coastguard Worker    1: 'sample',
169*61046927SAndroid Build Coastguard Worker    2: 'centroid',
170*61046927SAndroid Build Coastguard Worker    # We translate sample -> sample_register at pack time for simplicity
171*61046927SAndroid Build Coastguard Worker    3: 'sample_register',
172*61046927SAndroid Build Coastguard Worker})
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard WorkerSIMD_OP = enum("simd_op", {
175*61046927SAndroid Build Coastguard Worker    0b00000: 'and',
176*61046927SAndroid Build Coastguard Worker    0b00001: 'fadd',
177*61046927SAndroid Build Coastguard Worker    0b00010: 'or',
178*61046927SAndroid Build Coastguard Worker    0b00011: 'fmul',
179*61046927SAndroid Build Coastguard Worker    0b00100: 'xor',
180*61046927SAndroid Build Coastguard Worker    0b00101: 'fmin',
181*61046927SAndroid Build Coastguard Worker    0b00111: 'fmax',
182*61046927SAndroid Build Coastguard Worker    0b10000: 'iadd',
183*61046927SAndroid Build Coastguard Worker    0b10100: 'smin',
184*61046927SAndroid Build Coastguard Worker    0b10110: 'smax',
185*61046927SAndroid Build Coastguard Worker    0b11100: 'umin',
186*61046927SAndroid Build Coastguard Worker    0b11110: 'umax',
187*61046927SAndroid Build Coastguard Worker})
188*61046927SAndroid Build Coastguard Worker
189*61046927SAndroid Build Coastguard WorkerFUNOP = lambda x: (x << 28)
190*61046927SAndroid Build Coastguard WorkerFUNOP_MASK = FUNOP((1 << 14) - 1)
191*61046927SAndroid Build Coastguard Worker
192*61046927SAndroid Build Coastguard Workerdef funop(name, opcode, schedule_class = "none"):
193*61046927SAndroid Build Coastguard Worker   op(name, (0x0A | (opcode << 28),
194*61046927SAndroid Build Coastguard Worker      0x3F | (((1 << 14) - 1) << 28), 4, 6),
195*61046927SAndroid Build Coastguard Worker      srcs = 1, is_float = True, schedule_class = schedule_class)
196*61046927SAndroid Build Coastguard Worker
197*61046927SAndroid Build Coastguard Workerdef iunop(name, opcode):
198*61046927SAndroid Build Coastguard Worker    assert(opcode < 4)
199*61046927SAndroid Build Coastguard Worker    op(name, (0x3E | (opcode << 26),
200*61046927SAndroid Build Coastguard Worker              0x7F | L | (((1 << 14) - 1) << 26),
201*61046927SAndroid Build Coastguard Worker              6, _),
202*61046927SAndroid Build Coastguard Worker       srcs = 1)
203*61046927SAndroid Build Coastguard Worker
204*61046927SAndroid Build Coastguard Worker# Listing of opcodes
205*61046927SAndroid Build Coastguard Workerfunop("floor",     0b000000)
206*61046927SAndroid Build Coastguard Workerfunop("srsqrt",    0b000001)
207*61046927SAndroid Build Coastguard Workerfunop("dfdx",      0b000100, schedule_class = "coverage")
208*61046927SAndroid Build Coastguard Workerfunop("dfdy",      0b000110, schedule_class = "coverage")
209*61046927SAndroid Build Coastguard Workerfunop("rcp",       0b001000)
210*61046927SAndroid Build Coastguard Workerfunop("rsqrt",     0b001001)
211*61046927SAndroid Build Coastguard Workerfunop("sin_pt_1",  0b001010)
212*61046927SAndroid Build Coastguard Workerfunop("log2",      0b001100)
213*61046927SAndroid Build Coastguard Workerfunop("exp2",      0b001101)
214*61046927SAndroid Build Coastguard Workerfunop("sin_pt_2",  0b001110)
215*61046927SAndroid Build Coastguard Workerfunop("ceil",      0b010000)
216*61046927SAndroid Build Coastguard Workerfunop("trunc",     0b100000)
217*61046927SAndroid Build Coastguard Workerfunop("roundeven", 0b110000)
218*61046927SAndroid Build Coastguard Worker
219*61046927SAndroid Build Coastguard Workeriunop("bitrev",    0b01)
220*61046927SAndroid Build Coastguard Workeriunop("popcount",  0b10)
221*61046927SAndroid Build Coastguard Workeriunop("ffs",       0b11)
222*61046927SAndroid Build Coastguard Worker
223*61046927SAndroid Build Coastguard Workerop("fadd",
224*61046927SAndroid Build Coastguard Worker      encoding_16 = (0x26, 0x3F, 4, 6),
225*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x2A, 0x3F, 4, 6),
226*61046927SAndroid Build Coastguard Worker      srcs = 2, is_float = True)
227*61046927SAndroid Build Coastguard Worker
228*61046927SAndroid Build Coastguard Workerop("fma",
229*61046927SAndroid Build Coastguard Worker      encoding_16 = (0x36, 0x3F, 6, 8),
230*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x3A, 0x3F, 6, 8),
231*61046927SAndroid Build Coastguard Worker      srcs = 3, is_float = True)
232*61046927SAndroid Build Coastguard Worker
233*61046927SAndroid Build Coastguard Workerop("fmul",
234*61046927SAndroid Build Coastguard Worker      encoding_16 = (0x16, 0x3F, 4, 6),
235*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x1A, 0x3F, 4, 6),
236*61046927SAndroid Build Coastguard Worker      srcs = 2, is_float = True)
237*61046927SAndroid Build Coastguard Worker
238*61046927SAndroid Build Coastguard Workerop("mov_imm",
239*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x62, 0xFF, 6, 8),
240*61046927SAndroid Build Coastguard Worker      encoding_16 = (0x62, 0xFF, 4, 6),
241*61046927SAndroid Build Coastguard Worker      imms = [IMM])
242*61046927SAndroid Build Coastguard Worker
243*61046927SAndroid Build Coastguard Workerop("iadd",
244*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x0E, 0x3F | L, 8, _),
245*61046927SAndroid Build Coastguard Worker      srcs = 2, imms = [SHIFT])
246*61046927SAndroid Build Coastguard Worker
247*61046927SAndroid Build Coastguard Workerop("imad",
248*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x1E, 0x3F | L, 8, _),
249*61046927SAndroid Build Coastguard Worker      srcs = 3, imms = [SHIFT])
250*61046927SAndroid Build Coastguard Worker
251*61046927SAndroid Build Coastguard Workerop("bfi",
252*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x2E, 0x7F | (0x3 << 26), 8, _),
253*61046927SAndroid Build Coastguard Worker      srcs = 3, imms = [BFI_MASK])
254*61046927SAndroid Build Coastguard Worker
255*61046927SAndroid Build Coastguard Workerop("bfeil",
256*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x2E | L, 0x7F | L | (0x3 << 26), 8, _),
257*61046927SAndroid Build Coastguard Worker      srcs = 3, imms = [BFI_MASK])
258*61046927SAndroid Build Coastguard Worker
259*61046927SAndroid Build Coastguard Workerop("extr",
260*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x2E | (0x1 << 26), 0x7F | L | (0x3 << 26), 8, _),
261*61046927SAndroid Build Coastguard Worker      srcs = 3, imms = [BFI_MASK])
262*61046927SAndroid Build Coastguard Worker
263*61046927SAndroid Build Coastguard Workerop("asr",
264*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x2E | L | (0x1 << 26), 0x7F | L | (0x3 << 26), 8, _),
265*61046927SAndroid Build Coastguard Worker      srcs = 2)
266*61046927SAndroid Build Coastguard Worker
267*61046927SAndroid Build Coastguard Workerdef subgroup_op(name, opc):
268*61046927SAndroid Build Coastguard Worker    exact      = 0b01101111 | L | (opc << 29)
269*61046927SAndroid Build Coastguard Worker    exact_mask = 0b11111111 | L | (0x3 << 29)
270*61046927SAndroid Build Coastguard Worker
271*61046927SAndroid Build Coastguard Worker    op(name, encoding_32 = (exact, exact_mask, 6, _), srcs = 1, imms = [SIMD_OP])
272*61046927SAndroid Build Coastguard Worker
273*61046927SAndroid Build Coastguard Workersubgroup_op("quad_reduce", 0x0)
274*61046927SAndroid Build Coastguard Workersubgroup_op("simd_reduce", 0x1)
275*61046927SAndroid Build Coastguard Workersubgroup_op("quad_prefix", 0x2)
276*61046927SAndroid Build Coastguard Workersubgroup_op("simd_prefix", 0x3)
277*61046927SAndroid Build Coastguard Worker
278*61046927SAndroid Build Coastguard Workerfor window, w_bit in [('quad_', 0), ('', 1)]:
279*61046927SAndroid Build Coastguard Worker    for s, shuffle in enumerate(['', '_xor', '_up', '_down']):
280*61046927SAndroid Build Coastguard Worker        op(f"{window}shuffle{shuffle}",
281*61046927SAndroid Build Coastguard Worker            encoding_32 = (0b01101111 | (w_bit << 26) | (s << 38),
282*61046927SAndroid Build Coastguard Worker                           0xFF | L | (1 << 47) | (3 << 38) | (3 << 26), 6, _),
283*61046927SAndroid Build Coastguard Worker            srcs = 2)
284*61046927SAndroid Build Coastguard Worker
285*61046927SAndroid Build Coastguard Worker    # Pseudo-instruction ballotting a boolean
286*61046927SAndroid Build Coastguard Worker    op(f"{window}ballot", _, srcs = 1)
287*61046927SAndroid Build Coastguard Worker
288*61046927SAndroid Build Coastguard Worker    for T, T_bit, cond in [('f', 0, FCOND), ('i', 1, ICOND)]:
289*61046927SAndroid Build Coastguard Worker        op(f"{T}cmp_{window}ballot",
290*61046927SAndroid Build Coastguard Worker           encoding_32 = (0b0100010 | (T_bit << 4) | (w_bit << 48), 0, 8, _),
291*61046927SAndroid Build Coastguard Worker           srcs = 2, imms = [cond, INVERT_COND])
292*61046927SAndroid Build Coastguard Worker
293*61046927SAndroid Build Coastguard Workerop("icmpsel",
294*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x12, 0x7F, 8, 10),
295*61046927SAndroid Build Coastguard Worker      srcs = 4, imms = [ICOND])
296*61046927SAndroid Build Coastguard Worker
297*61046927SAndroid Build Coastguard Workerop("fcmpsel",
298*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x02, 0x7F, 8, 10),
299*61046927SAndroid Build Coastguard Worker      srcs = 4, imms = [FCOND])
300*61046927SAndroid Build Coastguard Worker
301*61046927SAndroid Build Coastguard Worker# Pseudo-instructions for compares returning 1/0
302*61046927SAndroid Build Coastguard Workerop("icmp", _, srcs = 2, imms = [ICOND, INVERT_COND])
303*61046927SAndroid Build Coastguard Workerop("fcmp", _, srcs = 2, imms = [FCOND, INVERT_COND])
304*61046927SAndroid Build Coastguard Worker
305*61046927SAndroid Build Coastguard Worker# sources are coordinates, LOD, texture bindless base (zero for texture state
306*61046927SAndroid Build Coastguard Worker# registers), texture, sampler, shadow/offset
307*61046927SAndroid Build Coastguard Worker# TODO: anything else?
308*61046927SAndroid Build Coastguard Workerop("texture_sample",
309*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x31, 0x7F, 8, 10), # XXX WRONG SIZE
310*61046927SAndroid Build Coastguard Worker      srcs = 6, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET, SHADOW,
311*61046927SAndroid Build Coastguard Worker                        QUERY_LOD, GATHER])
312*61046927SAndroid Build Coastguard Workerfor memory, can_reorder in [("texture", True), ("image", False)]:
313*61046927SAndroid Build Coastguard Worker    op(f"{memory}_load", encoding_32 = (0x71, 0x7F, 8, 10), # XXX WRONG SIZE
314*61046927SAndroid Build Coastguard Worker       srcs = 6, imms = [DIM, LOD_MODE, MASK, SCOREBOARD, OFFSET],
315*61046927SAndroid Build Coastguard Worker       can_reorder = can_reorder,
316*61046927SAndroid Build Coastguard Worker       schedule_class = "none" if can_reorder else "load")
317*61046927SAndroid Build Coastguard Worker
318*61046927SAndroid Build Coastguard Worker# sources are base, index
319*61046927SAndroid Build Coastguard Workerop("device_load",
320*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x05, 0x7F, 6, 8),
321*61046927SAndroid Build Coastguard Worker      srcs = 2, imms = [FORMAT, MASK, SHIFT, SCOREBOARD], can_reorder = False,
322*61046927SAndroid Build Coastguard Worker      schedule_class = "load")
323*61046927SAndroid Build Coastguard Worker
324*61046927SAndroid Build Coastguard Worker# sources are base (relative to workgroup memory), index
325*61046927SAndroid Build Coastguard Workerop("local_load",
326*61046927SAndroid Build Coastguard Worker      encoding_32 = (0b1101001, 0, 6, 8),
327*61046927SAndroid Build Coastguard Worker      srcs = 2, imms = [FORMAT, MASK], can_reorder = False,
328*61046927SAndroid Build Coastguard Worker      schedule_class = "load")
329*61046927SAndroid Build Coastguard Worker
330*61046927SAndroid Build Coastguard Worker# sources are value, base, index
331*61046927SAndroid Build Coastguard Worker# TODO: Consider permitting the short form
332*61046927SAndroid Build Coastguard Workerop("device_store",
333*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x45 | (1 << 47), 0, 8, _),
334*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 3, imms = [FORMAT, MASK, SHIFT, SCOREBOARD], can_eliminate = False,
335*61046927SAndroid Build Coastguard Worker      schedule_class = "store")
336*61046927SAndroid Build Coastguard Worker
337*61046927SAndroid Build Coastguard Worker# sources are value, base, index
338*61046927SAndroid Build Coastguard Workerop("local_store",
339*61046927SAndroid Build Coastguard Worker      encoding_32 = (0b0101001, 0, 6, 8),
340*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 3, imms = [FORMAT, MASK],
341*61046927SAndroid Build Coastguard Worker      can_eliminate=False, schedule_class = "store")
342*61046927SAndroid Build Coastguard Worker
343*61046927SAndroid Build Coastguard Worker# sources are value, index
344*61046927SAndroid Build Coastguard Worker# TODO: Consider permitting the short form
345*61046927SAndroid Build Coastguard Workerop("uniform_store",
346*61046927SAndroid Build Coastguard Worker      encoding_32 = ((0b111 << 27) | 0b1000101 | (1 << 47), 0, 8, _),
347*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 2, imms = [MASK], can_eliminate = False)
348*61046927SAndroid Build Coastguard Worker
349*61046927SAndroid Build Coastguard Worker# sources are value, base, index
350*61046927SAndroid Build Coastguard Workerop("atomic",
351*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x15 | (1 << 26) | (1 << 31) | (5 << 44), 0x3F | (1 << 26) | (1 << 31) | (5 << 44), 8, _),
352*61046927SAndroid Build Coastguard Worker      dests = 1, srcs = 3, imms = [ATOMIC_OPC, SCOREBOARD],
353*61046927SAndroid Build Coastguard Worker      can_eliminate = False, schedule_class = "atomic")
354*61046927SAndroid Build Coastguard Worker
355*61046927SAndroid Build Coastguard Worker# XXX: stop hardcoding the long form
356*61046927SAndroid Build Coastguard Workerop("local_atomic",
357*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x19 | (1 << 15) | (1 << 36) | (1 << 47), 0x3F | (1 << 36) | (1 << 47), 10, _),
358*61046927SAndroid Build Coastguard Worker      dests = 1, srcs = 3, imms = [ATOMIC_OPC], schedule_class = "atomic",
359*61046927SAndroid Build Coastguard Worker      can_eliminate = False)
360*61046927SAndroid Build Coastguard Worker
361*61046927SAndroid Build Coastguard Workerop("wait", (0x38, 0xFF, 2, _), dests = 0,
362*61046927SAndroid Build Coastguard Worker      can_eliminate = False, imms = [SCOREBOARD], schedule_class = "invalid")
363*61046927SAndroid Build Coastguard Worker
364*61046927SAndroid Build Coastguard Workerfor (suffix, schedule_class) in [("", "none"), ("_coverage", "coverage"), ("_barrier", "barrier")]:
365*61046927SAndroid Build Coastguard Worker    op(f"get_sr{suffix}", (0x72, 0x7F | L, 4, _), dests = 1, imms = [SR],
366*61046927SAndroid Build Coastguard Worker       schedule_class = schedule_class, can_reorder = schedule_class == "none")
367*61046927SAndroid Build Coastguard Worker
368*61046927SAndroid Build Coastguard Workerop("sample_mask", (0x7fc1, 0xffff, 6, _), dests = 0, srcs = 2,
369*61046927SAndroid Build Coastguard Worker    can_eliminate = False, schedule_class = "coverage")
370*61046927SAndroid Build Coastguard Worker
371*61046927SAndroid Build Coastguard Worker# Sources: sample mask, combined depth/stencil
372*61046927SAndroid Build Coastguard Workerop("zs_emit", (0x41, 0xFF | L, 4, _), dests = 0, srcs = 2,
373*61046927SAndroid Build Coastguard Worker              can_eliminate = False, imms = [ZS], schedule_class = "coverage")
374*61046927SAndroid Build Coastguard Worker
375*61046927SAndroid Build Coastguard Worker# Sources: sample mask, explicit coords (if present)
376*61046927SAndroid Build Coastguard Workerop("ld_tile", (0x49, 0x7F, 8, _), dests = 1, srcs = 2,
377*61046927SAndroid Build Coastguard Worker        imms = [FORMAT, MASK, PIXEL_OFFSET, EXPLICIT_COORDS], can_reorder = False,
378*61046927SAndroid Build Coastguard Worker        schedule_class = "coverage")
379*61046927SAndroid Build Coastguard Worker
380*61046927SAndroid Build Coastguard Worker# Sources: value, sample mask, explicit coords (if present)
381*61046927SAndroid Build Coastguard Workerop("st_tile", (0x09, 0x7F, 8, _), dests = 0, srcs = 3,
382*61046927SAndroid Build Coastguard Worker      can_eliminate = False, imms = [FORMAT, MASK, PIXEL_OFFSET, EXPLICIT_COORDS],
383*61046927SAndroid Build Coastguard Worker      schedule_class = "coverage")
384*61046927SAndroid Build Coastguard Worker
385*61046927SAndroid Build Coastguard Workerfor (name, exact) in [("any", 0xC000), ("none", 0xC020), ("none_after", 0xC020)]:
386*61046927SAndroid Build Coastguard Worker   op("jmp_exec_" + name, (exact, (1 << 16) - 1, 6, _), dests = 0, srcs = 0,
387*61046927SAndroid Build Coastguard Worker         can_eliminate = False, schedule_class = "invalid", imms = [TARGET])
388*61046927SAndroid Build Coastguard Worker
389*61046927SAndroid Build Coastguard Worker# TODO: model implicit r0l destinations
390*61046927SAndroid Build Coastguard Workerop("pop_exec", (0x52 | (0x3 << 9), ((1 << 48) - 1) ^ (0x3 << 7) ^ (0x3 << 11), 6, _),
391*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 0, can_eliminate = False, schedule_class = "invalid",
392*61046927SAndroid Build Coastguard Worker      imms = [NEST])
393*61046927SAndroid Build Coastguard Worker
394*61046927SAndroid Build Coastguard Workerfor is_float in [False, True]:
395*61046927SAndroid Build Coastguard Worker   mod_mask = 0 if is_float else (0x3 << 26) | (0x3 << 38)
396*61046927SAndroid Build Coastguard Worker
397*61046927SAndroid Build Coastguard Worker   for (cf, cf_op) in [("if", 0), ("else", 1), ("while", 2)]:
398*61046927SAndroid Build Coastguard Worker      name = "{}_{}cmp".format(cf, "f" if is_float else "i")
399*61046927SAndroid Build Coastguard Worker      exact = 0x42 | (0x0 if is_float else 0x10) | (cf_op << 9)
400*61046927SAndroid Build Coastguard Worker      mask = 0x7F | (0x3 << 9) | mod_mask | (0x3 << 44)
401*61046927SAndroid Build Coastguard Worker      imms = [NEST, FCOND if is_float else ICOND, INVERT_COND, TARGET]
402*61046927SAndroid Build Coastguard Worker
403*61046927SAndroid Build Coastguard Worker      op(name, (exact, mask, 6, _), dests = 0, srcs = 2, can_eliminate = False,
404*61046927SAndroid Build Coastguard Worker            imms = imms, is_float = is_float,
405*61046927SAndroid Build Coastguard Worker            schedule_class = "preload" if cf == "else" else "invalid")
406*61046927SAndroid Build Coastguard Worker
407*61046927SAndroid Build Coastguard Workerop("bitop", (0x7E, 0x7F, 6, _), srcs = 2, imms = [TRUTH_TABLE])
408*61046927SAndroid Build Coastguard Workerop("intl", (0x3E, 0x7F, 6, _), srcs = 2, imms = [])
409*61046927SAndroid Build Coastguard Workerop("convert", (0x3E | L, 0x7F | L | (0x3 << 38), 6, _), srcs = 2, imms = [ROUND])
410*61046927SAndroid Build Coastguard Worker
411*61046927SAndroid Build Coastguard Worker# Sources are the coeffient register and the sample index (if applicable)
412*61046927SAndroid Build Coastguard Workerop("iter", (0x21, 0xBF, 8, _), srcs = 2, imms = [CHANNELS, INTERPOLATION])
413*61046927SAndroid Build Coastguard Worker
414*61046927SAndroid Build Coastguard Worker# Sources are the coeffient register for the varying, the coefficient register
415*61046927SAndroid Build Coastguard Worker# for W, and the sample index (if applicable)
416*61046927SAndroid Build Coastguard Workerop("iterproj", (0x21, 0xBF, 8, _), srcs = 3, imms = [CHANNELS, INTERPOLATION])
417*61046927SAndroid Build Coastguard Worker
418*61046927SAndroid Build Coastguard Workerop("ldcf", (0xA1, 0xBF, 8, _), srcs = 1, imms = [CHANNELS])
419*61046927SAndroid Build Coastguard Workerop("st_vary", None, dests = 0, srcs = 2, can_eliminate = False)
420*61046927SAndroid Build Coastguard Workerop("no_varyings", (0x80000051, 0xFFFFFFFF, 4, _), dests = 0, can_eliminate = False)
421*61046927SAndroid Build Coastguard Workerop("stop", (0x88, 0xFFFF, 2, _), dests = 0, can_eliminate = False,
422*61046927SAndroid Build Coastguard Worker   schedule_class = "invalid")
423*61046927SAndroid Build Coastguard Workerop("trap", (0x08, 0xFFFF, 2, _), dests = 0, can_eliminate = False,
424*61046927SAndroid Build Coastguard Worker   schedule_class = "invalid")
425*61046927SAndroid Build Coastguard Worker
426*61046927SAndroid Build Coastguard Worker# These are modelled as total barriers since they can guard global memory
427*61046927SAndroid Build Coastguard Worker# access too, and even need to be properly ordered with loads.
428*61046927SAndroid Build Coastguard Workerop("wait_pix", (0x48, 0xFF, 4, _), dests = 0, imms = [WRITEOUT],
429*61046927SAndroid Build Coastguard Worker   can_eliminate = False, schedule_class = "barrier")
430*61046927SAndroid Build Coastguard Workerop("signal_pix", (0x58, 0xFF, 4, _), dests = 0, imms = [WRITEOUT],
431*61046927SAndroid Build Coastguard Worker   can_eliminate = False, schedule_class = "barrier")
432*61046927SAndroid Build Coastguard Worker
433*61046927SAndroid Build Coastguard Worker# Sources are the data vector, the coordinate vector, the LOD, the bindless
434*61046927SAndroid Build Coastguard Worker# table if present (zero for texture state registers), and texture index.
435*61046927SAndroid Build Coastguard Workerop("image_write", (0xF1 | (1 << 23) | (9 << 43), 0xFF, 6, 8), dests = 0, srcs = 5, imms
436*61046927SAndroid Build Coastguard Worker   = [DIM], can_eliminate = False, schedule_class = "store")
437*61046927SAndroid Build Coastguard Worker
438*61046927SAndroid Build Coastguard Worker# Sources are the image base, image index, the offset within shared memory, and
439*61046927SAndroid Build Coastguard Worker# the coordinates (or just the layer if implicit).
440*61046927SAndroid Build Coastguard Worker# TODO: Do we need the short encoding?
441*61046927SAndroid Build Coastguard Workerop("block_image_store", (0xB1, 0xFF, 10, _), dests = 0, srcs = 4,
442*61046927SAndroid Build Coastguard Worker   imms = [FORMAT, DIM, EXPLICIT_COORDS], can_eliminate = False, schedule_class = "store")
443*61046927SAndroid Build Coastguard Worker
444*61046927SAndroid Build Coastguard Worker# Barriers
445*61046927SAndroid Build Coastguard Workerop("threadgroup_barrier", (0x0068, 0xFFFF, 2, _), dests = 0, srcs = 0,
446*61046927SAndroid Build Coastguard Worker   can_eliminate = False, schedule_class = "barrier")
447*61046927SAndroid Build Coastguard Worker
448*61046927SAndroid Build Coastguard Workerdef memory_barrier(name, a, b, c):
449*61046927SAndroid Build Coastguard Worker    op(name, (0xF5 | (a << 10) | (b << 8) | (c << 12), 0xFFFF, 2, _), dests = 0, srcs = 0,
450*61046927SAndroid Build Coastguard Worker       can_eliminate = False, schedule_class = "barrier")
451*61046927SAndroid Build Coastguard Worker
452*61046927SAndroid Build Coastguard Workermemory_barrier("memory_barrier", 1, 2, 9)
453*61046927SAndroid Build Coastguard Worker
454*61046927SAndroid Build Coastguard Worker# TODO: Not clear what these individually are. Some might be cache flushes?
455*61046927SAndroid Build Coastguard Workermemory_barrier("image_barrier_1", 2, 2, 10)
456*61046927SAndroid Build Coastguard Workermemory_barrier("image_barrier_2", 3, 2, 10)
457*61046927SAndroid Build Coastguard Workermemory_barrier("image_barrier_3", 2, 1, 10)
458*61046927SAndroid Build Coastguard Workermemory_barrier("image_barrier_4", 3, 1, 10)
459*61046927SAndroid Build Coastguard Worker
460*61046927SAndroid Build Coastguard Workermemory_barrier("flush_memory_to_texture", 0, 0, 4)
461*61046927SAndroid Build Coastguard Worker
462*61046927SAndroid Build Coastguard Workermemory_barrier("memory_barrier_2", 2, 2, 9)
463*61046927SAndroid Build Coastguard Workermemory_barrier("memory_barrier_3", 2, 1, 9)
464*61046927SAndroid Build Coastguard Workermemory_barrier("unknown_barrier_1", 0, 3, 3)
465*61046927SAndroid Build Coastguard Workermemory_barrier("unknown_barrier_2", 0, 3, 0)
466*61046927SAndroid Build Coastguard Worker
467*61046927SAndroid Build Coastguard Workerop("doorbell", (0x60020 | 0x28 << 32, (1 << 48) - 1, 6, _), dests = 0,
468*61046927SAndroid Build Coastguard Worker      can_eliminate = False, can_reorder = False, imms = [IMM])
469*61046927SAndroid Build Coastguard Worker
470*61046927SAndroid Build Coastguard Workerop("stack_unmap", (0x00075, (1 << 24) - 1, 8, _), dests = 1, srcs = 0, can_eliminate = False, can_reorder = False, imms = [IMM])
471*61046927SAndroid Build Coastguard Workerop("stack_map",   (0x10075, (1 << 24) - 1, 8, _), dests = 0, srcs = 1, can_eliminate = False, can_reorder = False, imms = [IMM])
472*61046927SAndroid Build Coastguard Worker
473*61046927SAndroid Build Coastguard Workerop("stack_adjust",
474*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x10100b5, (1 << 26) - 1, 8, _),
475*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 0, can_eliminate = False, can_reorder = False,
476*61046927SAndroid Build Coastguard Worker      imms = [STACK_SIZE], schedule_class = "store")
477*61046927SAndroid Build Coastguard Worker
478*61046927SAndroid Build Coastguard Worker# source is offset
479*61046927SAndroid Build Coastguard Workerop("stack_load",
480*61046927SAndroid Build Coastguard Worker      encoding_32 = (0x35, (1 << 20) - 1, 6, 8),
481*61046927SAndroid Build Coastguard Worker      srcs = 1, imms = [FORMAT, MASK, SCOREBOARD], can_reorder = False,
482*61046927SAndroid Build Coastguard Worker      schedule_class = "load")
483*61046927SAndroid Build Coastguard Worker
484*61046927SAndroid Build Coastguard Worker# sources are value and offset
485*61046927SAndroid Build Coastguard Workerop("stack_store",
486*61046927SAndroid Build Coastguard Worker      encoding_32 = (0xb5, (1 << 20) - 1, 6, 8),
487*61046927SAndroid Build Coastguard Worker      dests = 0, srcs = 2, imms = [FORMAT, MASK, SCOREBOARD],
488*61046927SAndroid Build Coastguard Worker      can_eliminate=False, schedule_class = "store")
489*61046927SAndroid Build Coastguard Worker
490*61046927SAndroid Build Coastguard Worker# Convenient aliases.
491*61046927SAndroid Build Coastguard Workerop("mov", _, srcs = 1)
492*61046927SAndroid Build Coastguard Workerop("not", _, srcs = 1)
493*61046927SAndroid Build Coastguard Worker
494*61046927SAndroid Build Coastguard Workerop("collect", _, srcs = VARIABLE)
495*61046927SAndroid Build Coastguard Workerop("split", _, srcs = 1, dests = VARIABLE)
496*61046927SAndroid Build Coastguard Workerop("phi", _, srcs = VARIABLE, schedule_class = "preload")
497*61046927SAndroid Build Coastguard Worker
498*61046927SAndroid Build Coastguard Workerop("unit_test", _, dests = 0, srcs = 1, can_eliminate = False)
499*61046927SAndroid Build Coastguard Worker
500*61046927SAndroid Build Coastguard Worker# Like mov, but takes a register and can only appear at the start. Guaranteed
501*61046927SAndroid Build Coastguard Worker# to be coalesced during RA, rather than lowered to a real move.
502*61046927SAndroid Build Coastguard Workerop("preload", _, srcs = 1, schedule_class = "preload")
503*61046927SAndroid Build Coastguard Worker
504*61046927SAndroid Build Coastguard Worker# Opposite of preload. Exports a scalar value to a particular register at the
505*61046927SAndroid Build Coastguard Worker# end of the shader part. Must only appear after the logical end of the exit
506*61046927SAndroid Build Coastguard Worker# block, this avoids special casing the source's liveness. Logically all exports
507*61046927SAndroid Build Coastguard Worker# happen in parallel at the end of the shader part.
508*61046927SAndroid Build Coastguard Workerop("export", _, dests = 0, srcs = 1, imms = [IMM], can_eliminate = False,
509*61046927SAndroid Build Coastguard Worker   schedule_class = "invalid")
510*61046927SAndroid Build Coastguard Worker
511*61046927SAndroid Build Coastguard Worker# Pseudo-instructions to set the nesting counter. Lowers to r0l writes after RA.
512*61046927SAndroid Build Coastguard Workerop("begin_cf", _, dests = 0, can_eliminate = False)
513*61046927SAndroid Build Coastguard Workerop("break", _, dests = 0, imms = [NEST, TARGET], can_eliminate = False,
514*61046927SAndroid Build Coastguard Worker   schedule_class = "invalid")
515*61046927SAndroid Build Coastguard Worker
516*61046927SAndroid Build Coastguard Workerfor (name, is_float) in [("break_if_icmp", False), ("break_if_fcmp", True)]:
517*61046927SAndroid Build Coastguard Worker    op(name, _, dests = 0, srcs = 2,
518*61046927SAndroid Build Coastguard Worker       imms = [NEST, INVERT_COND, FCOND if is_float else ICOND, TARGET],
519*61046927SAndroid Build Coastguard Worker       can_eliminate = False, schedule_class = "invalid")
520