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