From c2787d1d12bcb8e106fd8306884fd764c23ef061 Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Sat, 30 Nov 2024 11:47:12 +0000 Subject: [PATCH] pco, pygen: add support for unpck and conversions Signed-off-by: Simon Perretta Acked-by: Frank Binns Part-of: --- src/imagination/pco/pco_isa.py | 11 +++++++++- src/imagination/pco/pco_map.py | 34 +++++++++++++++++++++++++++++ src/imagination/pco/pco_ops.py | 1 + src/imagination/pco/pco_trans_nir.c | 30 +++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 1 deletion(-) diff --git a/src/imagination/pco/pco_isa.py b/src/imagination/pco/pco_isa.py index a44e501bce5..0355aa8b2e9 100644 --- a/src/imagination/pco/pco_isa.py +++ b/src/imagination/pco/pco_isa.py @@ -968,6 +968,15 @@ elems=[ ('exp', 0b1), ]) +F_UPCK_ELEM = field_enum_type( +name='upck_elem', num_bits=2, +elems=[ + ('e0', 0b00), + ('e1', 0b01), + ('e2', 0b10), + ('e3', 0b11), +]) + F_PCK_FORMAT = field_enum_type( name='pck_format', num_bits=5, elems=[ @@ -1221,7 +1230,7 @@ fields=[ ('s0abs_sngl', (F_BOOL, ['s0abs_sngl'])), ## PCK/UPCK - ('upck_elem', (F_UINT2, ['upck_elem'])), + ('upck_elem', (F_UPCK_ELEM, ['upck_elem'])), ('scale_rtz', (F_BOOL, ['scale_rtz'])), ('prog', (F_BOOL, ['prog'])), diff --git a/src/imagination/pco/pco_map.py b/src/imagination/pco/pco_map.py index b6164140a6c..88ca75491ed 100644 --- a/src/imagination/pco/pco_map.py +++ b/src/imagination/pco/pco_map.py @@ -192,6 +192,13 @@ enum_map(OM_TST_TYPE_MAIN.t, F_TST_TYPE, [ ('s32', 's32'), ]) +enum_map(RM_ELEM.t, F_UPCK_ELEM, [ + ('e0', 'e0'), + ('e1', 'e1'), + ('e2', 'e2'), + ('e3', 'e3'), +], pass_zero=0) + enum_map(RM_ELEM.t, F_MASKW0, [ ('e0', 'e0'), ('e1', 'e1'), @@ -639,6 +646,16 @@ encode_map(O_PCK, ] ) +encode_map(O_UNPCK, + encodings=[ + (I_UPCK, [ + ('elem', (RM_ELEM, 'src[0]')), + ('scale_rtz', {'or': [OM_SCALE, OM_ROUNDZERO]}), + ('pck_format', OM_PCK_FMT) + ]) + ] +) + encode_map(O_TST, encodings=[ (I_TST_EXT, [ @@ -944,6 +961,23 @@ group_map(O_PCK, dests=[('w[0]', ('2_pck', 'dest[0]'), 'ft2')] ) +group_map(O_UNPCK, + hdr=(I_IGRP_HDR_MAIN, [ + ('oporg', 'p0'), + ('olchk', OM_OLCHK), + ('w1p', False), + ('w0p', True), + ('cc', OM_EXEC_CND), + ('end', OM_END), + ('atom', OM_ATOM), + ('rpt', OM_RPT) + ]), + enc_ops=[('0', O_UNPCK)], + srcs=[('s[0]', ('0', 'src[0]'), 's0')], + iss=[('is[4]', 'ft0')], + dests=[('w[0]', ('0', 'dest[0]'), 'ft0')] +) + group_map(O_ADD64_32, hdr=(I_IGRP_HDR_MAIN, [ ('oporg', 'p0'), diff --git a/src/imagination/pco/pco_ops.py b/src/imagination/pco/pco_ops.py index 72e8d667b0b..bdf8dc21115 100644 --- a/src/imagination/pco/pco_ops.py +++ b/src/imagination/pco/pco_ops.py @@ -290,6 +290,7 @@ O_FRCP = hw_op('frcp', OM_ALU, 1, 1, [], [[RM_ABS, RM_NEG]]) 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) O_ADD64_32 = hw_op('add64_32', OM_ALU + [OM_S], 2, 4, [], [[RM_ABS, RM_NEG], [], [RM_ABS, RM_NEG]]) +O_UNPCK = hw_op('unpck', OM_ALU + [OM_PCK_FMT, OM_ROUNDZERO, OM_SCALE], 1, 1, [], [[RM_ELEM]]) O_TST = hw_direct_op('tst', [OM_TST_OP_MAIN, OM_PHASE2END, OM_TST_TYPE_MAIN], 2, 2, [], [[RM_ELEM], [RM_ELEM]]) O_MOVC = hw_direct_op('movc', [OM_PHASE2END], 2, 5, [[RM_ELEM]]) diff --git a/src/imagination/pco/pco_trans_nir.c b/src/imagination/pco/pco_trans_nir.c index a78752ae142..5a3c65275a4 100644 --- a/src/imagination/pco/pco_trans_nir.c +++ b/src/imagination/pco/pco_trans_nir.c @@ -696,6 +696,36 @@ static pco_instr *trans_alu(trans_ctx *tctx, nir_alu_instr *alu) instr = trans_scmp(tctx, alu->op, dest, src[0], src[1]); break; + case nir_op_f2i32: + instr = pco_pck(&tctx->b, + dest, + src[0], + .pck_fmt = PCO_PCK_FMT_S32, + .roundzero = true); + break; + + case nir_op_f2u32: + instr = pco_pck(&tctx->b, + dest, + src[0], + .pck_fmt = PCO_PCK_FMT_U32, + .roundzero = true); + break; + + case nir_op_i2f32: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .pck_fmt = PCO_PCK_FMT_S32); + break; + + case nir_op_u2f32: + instr = pco_unpck(&tctx->b, + dest, + pco_ref_elem(src[0], 0), + .pck_fmt = PCO_PCK_FMT_U32); + break; + case nir_op_pack_unorm_4x8: instr = pco_pck(&tctx->b, dest,