blob: f39fa6a8b498a1932557a720d017d459fac7fefb [file] [log] [blame]
# 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)