pco, pygen: add support for unpck and conversions

Signed-off-by: Simon Perretta <simon.perretta@imgtec.com>
Acked-by: Frank Binns <frank.binns@imgtec.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/33998>
This commit is contained in:
Simon Perretta
2024-11-30 11:47:12 +00:00
committed by Marge Bot
parent 8c379b0c3e
commit c2787d1d12
4 changed files with 75 additions and 1 deletions
+10 -1
View File
@@ -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'])),
+34
View File
@@ -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'),
+1
View File
@@ -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]])
+30
View File
@@ -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,