| # Copyright © 2024 Imagination Technologies Ltd. |
| # SPDX-License-Identifier: MIT |
| |
| from pco_pygen_common import * |
| |
| OP_TYPE = enum_type('op_type', [ |
| 'pseudo', |
| 'hw', |
| 'hw_direct', |
| ]) |
| |
| MOD_TYPE = enum_type('mod_type', [ |
| 'bool', |
| 'uint', |
| 'enum', |
| ]) |
| |
| REF_TYPE = enum_type('ref_type', [ |
| ('null', '_'), |
| ('ssa', '%'), |
| ('reg', ''), |
| ('idx_reg', ''), |
| ('imm', ''), |
| ('io', ''), |
| ('pred', ''), |
| ('drc', 'drc'), |
| ]) |
| |
| FUNC_TYPE = enum_type('func_type', [ |
| 'callable', |
| 'preamble', |
| 'entrypoint', |
| 'phase_change', |
| ]) |
| |
| DTYPE = enum_type('dtype', [ |
| ('any', ''), |
| ('unsigned', 'u'), |
| ('signed', 'i'), |
| ('float', 'f'), |
| ]) |
| |
| BITS = enum_type('bits', [ |
| ('1', '1'), |
| ('8', '8'), |
| ('16', '16'), |
| ('32', '32'), |
| ('64', '64'), |
| ]) |
| |
| REG_CLASS = enum_type('reg_class', [ |
| ('virt', '$'), |
| ('temp', 'r'), |
| ('vtxin', 'vi'), |
| ('coeff', 'cf'), |
| ('shared', 'sh'), |
| ('index', 'idx'), |
| ('spec', 'sr'), |
| ('intern', 'i'), |
| ('const', 'sc'), |
| ('pixout', 'po'), |
| ('global', 'g'), |
| ('slot', 'sl'), |
| ]) |
| |
| IO = enum_type('io', [ |
| ('s0', 's0'), |
| ('s1', 's1'), |
| ('s2', 's2'), |
| |
| ('s3', 's3'), |
| ('s4', 's4'), |
| ('s5', 's5'), |
| |
| ('w0', 'w0'), |
| ('w1', 'w1'), |
| |
| ('is0', 'is0'), |
| ('is1', 'is1'), |
| ('is2', 'is2'), |
| ('is3', 'is3'), |
| ('is4', 'is4'), |
| ('is5', 'is5'), |
| |
| ('ft0', 'ft0'), |
| ('ft0h', 'ft0h'), |
| ('ft1', 'ft1'), |
| ('ft2', 'ft2'), |
| ('fte', 'fte'), |
| |
| ('ft1_invert', '~ft1'), |
| ('ft3', 'ft3'), |
| ('ft4', 'ft4'), |
| ('ft5', 'ft5'), |
| |
| ('ftt', 'ftt'), |
| |
| ('cout', 'cout'), |
| ]) |
| |
| PRED = enum_type('pred', [ |
| ('pe', 'pe'), |
| ('p0', 'p0'), |
| |
| ('always', 'if(1)'), |
| ('p0_true', 'if(p0)'), |
| ('never', 'if(0)'), |
| ('p0_false', 'if(!p0)'), |
| ]) |
| |
| DRC = enum_type('drc', [ |
| ('0', '0'), |
| ('1', '1'), |
| ('pending', '?'), |
| ]) |
| |
| # Ref mods. |
| RM_ONEMINUS = ref_mod('oneminus', BaseType.bool) |
| RM_CLAMP = ref_mod('clamp', BaseType.bool) |
| RM_ABS = ref_mod('abs', BaseType.bool) |
| RM_NEG = ref_mod('neg', BaseType.bool) |
| RM_FLR = ref_mod('flr', BaseType.bool) |
| |
| RM_ELEM = ref_mod_enum('elem', [ |
| 'e0', |
| 'e1', |
| 'e2', |
| 'e3', |
| ], is_bitset=True) |
| |
| # Op mods. |
| OM_EXEC_CND = op_mod_enum('exec_cnd', [ |
| ('e1_zx', ''), |
| ('e1_z1', 'if(p0)'), |
| ('ex_zx', '(ignorepe)'), |
| ('e1_z0', 'if(!p0)'), |
| ], print_early=True, unset=True) |
| OM_RPT = op_mod('rpt', BaseType.uint, print_early=True, nzdefault=1, unset=True) |
| OM_SAT = op_mod('sat', BaseType.bool) |
| OM_LP = op_mod('lp', BaseType.bool) |
| OM_SCALE = op_mod('scale', BaseType.bool) |
| OM_ROUNDZERO = op_mod('roundzero', BaseType.bool) |
| OM_S = op_mod('s', BaseType.bool) |
| OM_TST_OP_MAIN = op_mod_enum('tst_op_main', [ |
| ('zero', 'z'), |
| ('gzero', 'gz'), |
| ('gezero', 'gez'), |
| ('carry', 'c'), |
| ('equal', 'e'), |
| ('greater', 'g'), |
| ('gequal', 'ge'), |
| ('notequal', 'ne'), |
| ('less', 'l'), |
| ('lequal', 'le'), |
| ]) |
| OM_TST_OP_BITWISE = op_mod_enum('tst_op_bitwise', [ |
| ('zero', 'z'), |
| ('nonzero', 'nz'), |
| ]) |
| OM_SIGNPOS = op_mod_enum('signpos', [ |
| 'twb', |
| 'pwb', |
| 'mtb', |
| 'ftb', |
| ]) |
| OM_DIM = op_mod('dim', BaseType.uint) |
| OM_PROJ = op_mod('proj', BaseType.bool) |
| OM_FCNORM = op_mod('fcnorm', BaseType.bool) |
| OM_NNCOORDS = op_mod('nncoords', BaseType.bool) |
| OM_LOD_MODE = op_mod_enum('lod_mode', [ |
| ('normal', ''), |
| ('bias', '.bias'), |
| ('replace', '.replace'), |
| ('gradient', '.gradient'), |
| ]) |
| OM_PPLOD = op_mod('pplod', BaseType.bool) |
| OM_TAO = op_mod('tao', BaseType.bool) |
| OM_SOO = op_mod('soo', BaseType.bool) |
| OM_SNO = op_mod('sno', BaseType.bool) |
| OM_WRT = op_mod('wrt', BaseType.bool) |
| OM_SB_MODE = op_mod_enum('sb_mode', [ |
| ('none', ''), |
| ('data', '.data'), |
| ('info', '.info'), |
| ('both', '.both'), |
| ]) |
| OM_ARRAY = op_mod('array', BaseType.bool) |
| OM_INTEGER = op_mod('integer', BaseType.bool) |
| OM_SCHEDSWAP = op_mod('schedswap', BaseType.bool) |
| OM_F16 = op_mod('f16', BaseType.bool) |
| OM_TILED = op_mod('tiled', BaseType.bool) |
| OM_FREEP = op_mod('freep', BaseType.bool) |
| OM_SM = op_mod('sm', BaseType.bool) |
| OM_SAVMSK_MODE = op_mod_enum('savmsk_mode', [ |
| 'vm', |
| 'icm', |
| 'icmoc', |
| 'icmi', |
| 'caxy', |
| ]) |
| OM_ATOM_OP = op_mod_enum('atom_op', [ |
| 'add', |
| 'sub', |
| 'xchg', |
| 'umin', |
| 'imin', |
| 'umax', |
| 'imax', |
| 'and', |
| 'or', |
| 'xor', |
| ]) |
| OM_MCU_CACHE_MODE_LD = op_mod_enum('mcu_cache_mode_ld', [ |
| ('normal', ''), |
| ('bypass', '.bypass'), |
| ('force_line_fill', '.forcelinefill'), |
| ]) |
| OM_MCU_CACHE_MODE_ST = op_mod_enum('mcu_cache_mode_st', [ |
| ('write_through', '.writethrough'), |
| ('write_back', '.writeback'), |
| ('lazy_write_back', '.lazywriteback'), |
| ]) |
| OM_BRANCH_CND = op_mod_enum('branch_cnd', [ |
| ('exec_cond', ''), |
| ('allinst', '.allinst'), |
| ('anyinst', '.anyinst'), |
| ]) |
| OM_LINK = op_mod('link', BaseType.bool) |
| OM_PCK_FMT = op_mod_enum('pck_fmt', [ |
| 'u8888', |
| 's8888', |
| 'o8888', |
| 'u1616', |
| 's1616', |
| 'o1616', |
| 'u32', |
| 's32', |
| 'u1010102', |
| 's1010102', |
| 'u111110', |
| 's111110', |
| 'f111110', |
| 'f16f16', |
| 'f32', |
| 'cov', |
| 'u565u565', |
| 'd24s8', |
| 's8d24', |
| 'f32_mask', |
| '2f10f10f10', |
| 's8888ogl', |
| 's1616ogl', |
| 'zero', |
| 'one', |
| ]) |
| OM_PHASE2END = op_mod('phase2end', BaseType.bool) |
| OM_ITR_MODE = op_mod_enum('itr_mode', [ |
| 'pixel', |
| 'sample', |
| 'centroid', |
| ]) |
| OM_SCHED = op_mod_enum('sched', [ |
| 'none', |
| 'swap', |
| 'wdf', |
| ]) |
| OM_ATOM = op_mod('atom', BaseType.bool, unset=True) |
| OM_OLCHK = op_mod('olchk', BaseType.bool, unset=True) |
| OM_END = op_mod('end', BaseType.bool, unset=True) |
| |
| # Ops. |
| |
| OM_ALU = [OM_OLCHK, OM_EXEC_CND, OM_END, OM_ATOM, OM_RPT] |
| OM_ALU_RPT1 = [OM_OLCHK, OM_EXEC_CND, OM_END, OM_ATOM] |
| |
| ## Main. |
| O_FADD = hw_op('fadd', OM_ALU + [OM_SAT], 1, 2, [], [[RM_ABS, RM_NEG, RM_FLR], [RM_ABS]]) |
| O_FMUL = hw_op('fmul', OM_ALU + [OM_SAT], 1, 2, [], [[RM_ABS, RM_NEG, RM_FLR], [RM_ABS]]) |
| O_FMAD = hw_op('fmad', OM_ALU + [OM_SAT, OM_LP], 1, 3, [], [[RM_ABS, RM_NEG], [RM_ABS, RM_NEG], [RM_ABS, RM_NEG, RM_FLR]]) |
| O_MBYP = hw_op('mbyp', OM_ALU, 1, 1, [], [[RM_ABS, RM_NEG]]) |
| O_PCK = hw_op('pck', OM_ALU + [OM_PCK_FMT, OM_ROUNDZERO, OM_SCALE], 1, 1) |
| |
| # TODO |
| # O_PCK_ELEM = pseudo_op('pck.elem', OM_ALU_RPT1 + [OM_PCK_FMT, OM_ROUNDZERO, OM_SCALE], 1, 2) |
| |
| ## Backend. |
| O_UVSW_WRITE = hw_op('uvsw.write', [OM_EXEC_CND, OM_RPT], 0, 2) |
| O_UVSW_EMIT = hw_op('uvsw.emit', [OM_EXEC_CND]) |
| O_UVSW_ENDTASK = hw_op('uvsw.endtask', [OM_END]) |
| O_UVSW_EMIT_ENDTASK = hw_op('uvsw.emit.endtask', [OM_END]) |
| O_UVSW_WRITE_EMIT_ENDTASK = hw_op('uvsw.write.emit.endtask', [OM_END], 0, 2) |
| |
| O_FITR = hw_op('fitr', OM_ALU + [OM_ITR_MODE, OM_SAT], 1, 3) |
| O_FITRP = hw_op('fitrp', OM_ALU + [OM_ITR_MODE, OM_SAT], 1, 4) |
| |
| ## Bitwise. |
| O_MOVI32 = hw_op('movi32', OM_ALU, 1, 1) |
| |
| O_BBYP0BM_IMM32 = hw_direct_op('bbyp0bm', [], 2, 2) |
| |
| ## Control. |
| O_WOP = hw_op('wop') |
| O_WDF = hw_op('wdf', [], 0, 1) |
| O_NOP = hw_op('nop', [OM_EXEC_CND, OM_END]) |
| |
| # TODO NEXT: gate usage of OM_F16! |
| O_DITR = hw_op('ditr', [OM_EXEC_CND, OM_ITR_MODE, OM_SAT, OM_SCHED, OM_F16], 1, 3) |
| O_DITRP = hw_op('ditrp', [OM_EXEC_CND, OM_ITR_MODE, OM_SAT, OM_SCHED, OM_F16], 1, 4) |
| O_DITRP_WRITE = hw_op('ditrp.write', [OM_EXEC_CND, OM_ITR_MODE, OM_SAT, OM_SCHED, OM_F16], 1, 4) |
| O_DITRP_READ = hw_op('ditrp.read', [OM_EXEC_CND, OM_ITR_MODE, OM_SAT, OM_SCHED, OM_F16], 1, 3) |
| |
| # Pseudo-ops (unmapped). |
| O_NEG = pseudo_op('neg', OM_ALU, 1, 1) |
| O_ABS = pseudo_op('abs', OM_ALU, 1, 1) |
| O_FLR = pseudo_op('flr', OM_ALU, 1, 1) |
| O_MOV = pseudo_op('mov', OM_ALU, 1, 1) |
| O_VEC = pseudo_op('vec', [], 1, VARIABLE, [], [[RM_ABS, RM_NEG]]) |
| O_COMP = pseudo_op('comp', [], 1, 2) |