xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/valhall/valhall.c.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker#encoding=utf-8
2*61046927SAndroid Build Coastguard Worker
3*61046927SAndroid Build Coastguard Worker# Copyright (C) 2021 Collabora, Ltd.
4*61046927SAndroid Build Coastguard Worker#
5*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
6*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
7*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
8*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
9*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
10*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions:
11*61046927SAndroid Build Coastguard Worker#
12*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next
13*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the
14*61046927SAndroid Build Coastguard Worker# Software.
15*61046927SAndroid Build Coastguard Worker#
16*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
22*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE.
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Workerimport sys
25*61046927SAndroid Build Coastguard Workerfrom valhall import valhall_parse_isa
26*61046927SAndroid Build Coastguard Workerfrom mako.template import Template
27*61046927SAndroid Build Coastguard Workerfrom mako import exceptions
28*61046927SAndroid Build Coastguard Worker
29*61046927SAndroid Build Coastguard Worker(instructions, immediates, enums, typesize, safe_name) = valhall_parse_isa()
30*61046927SAndroid Build Coastguard Worker
31*61046927SAndroid Build Coastguard WorkerSKIP = set([
32*61046927SAndroid Build Coastguard Worker        # Extra conversions
33*61046927SAndroid Build Coastguard Worker        "S8_TO_S16",
34*61046927SAndroid Build Coastguard Worker        "S8_TO_F16",
35*61046927SAndroid Build Coastguard Worker        "U8_TO_U16",
36*61046927SAndroid Build Coastguard Worker        "U8_TO_F16",
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker        # Saturating multiplies
39*61046927SAndroid Build Coastguard Worker        "IMUL.s32",
40*61046927SAndroid Build Coastguard Worker        "IMUL.v2s16",
41*61046927SAndroid Build Coastguard Worker        "IMUL.v4s8",
42*61046927SAndroid Build Coastguard Worker
43*61046927SAndroid Build Coastguard Worker        # 64-bit support
44*61046927SAndroid Build Coastguard Worker        "IADD.u64",
45*61046927SAndroid Build Coastguard Worker        "IADD.s64",
46*61046927SAndroid Build Coastguard Worker        "ISUB.u64",
47*61046927SAndroid Build Coastguard Worker        "ISUB.s64",
48*61046927SAndroid Build Coastguard Worker        "IMULD.u64",
49*61046927SAndroid Build Coastguard Worker        "SHADDX.u64",
50*61046927SAndroid Build Coastguard Worker        "SHADDX.s64",
51*61046927SAndroid Build Coastguard Worker        "IMULD.u64",
52*61046927SAndroid Build Coastguard Worker        "CLPER.s64",
53*61046927SAndroid Build Coastguard Worker        "CLPER.u64",
54*61046927SAndroid Build Coastguard Worker        "LSHIFT_AND.i64",
55*61046927SAndroid Build Coastguard Worker        "RSHIFT_AND.i64",
56*61046927SAndroid Build Coastguard Worker        "LSHIFT_OR.i64",
57*61046927SAndroid Build Coastguard Worker        "RSHIFT_OR.i64",
58*61046927SAndroid Build Coastguard Worker        "LSHIFT_XOR.i64",
59*61046927SAndroid Build Coastguard Worker        "RSHIFT_XOR.i64",
60*61046927SAndroid Build Coastguard Worker        "ATOM.i64",
61*61046927SAndroid Build Coastguard Worker        "ATOM_RETURN.i64",
62*61046927SAndroid Build Coastguard Worker        "ATOM1_RETURN.i64",
63*61046927SAndroid Build Coastguard Worker
64*61046927SAndroid Build Coastguard Worker        # CLPER widens
65*61046927SAndroid Build Coastguard Worker        "CLPER.s32",
66*61046927SAndroid Build Coastguard Worker        "CLPER.v2s16",
67*61046927SAndroid Build Coastguard Worker        "CLPER.v4s8",
68*61046927SAndroid Build Coastguard Worker        "CLPER.v2u16",
69*61046927SAndroid Build Coastguard Worker        "CLPER.v4u8",
70*61046927SAndroid Build Coastguard Worker
71*61046927SAndroid Build Coastguard Worker        # VAR_TEX
72*61046927SAndroid Build Coastguard Worker        "VAR_TEX_SINGLE",
73*61046927SAndroid Build Coastguard Worker        "VAR_TEX_GATHER",
74*61046927SAndroid Build Coastguard Worker        "VAR_TEX_GRADIENT",
75*61046927SAndroid Build Coastguard Worker        "VAR_TEX_DUAL",
76*61046927SAndroid Build Coastguard Worker        "VAR_TEX_BUF_SINGLE",
77*61046927SAndroid Build Coastguard Worker        "VAR_TEX_BUF_GATHER",
78*61046927SAndroid Build Coastguard Worker        "VAR_TEX_BUF_GRADIENT",
79*61046927SAndroid Build Coastguard Worker        "VAR_TEX_BUF_DUAL",
80*61046927SAndroid Build Coastguard Worker
81*61046927SAndroid Build Coastguard Worker        # Special cased
82*61046927SAndroid Build Coastguard Worker        "FMA_RSCALE_N.f32",
83*61046927SAndroid Build Coastguard Worker        "FMA_RSCALE_LEFT.f32",
84*61046927SAndroid Build Coastguard Worker        "FMA_RSCALE_SCALE16.f32",
85*61046927SAndroid Build Coastguard Worker
86*61046927SAndroid Build Coastguard Worker        # Deprecated instruction
87*61046927SAndroid Build Coastguard Worker        "NOT_OLD.i32",
88*61046927SAndroid Build Coastguard Worker        "NOT_OLD.i64",
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Worker        # TODO
91*61046927SAndroid Build Coastguard Worker        "IDP.v4s8",
92*61046927SAndroid Build Coastguard Worker        "IDP.v4u8",
93*61046927SAndroid Build Coastguard Worker        "FATAN_ASSIST.f32",
94*61046927SAndroid Build Coastguard Worker        "SEG_ADD.u64",
95*61046927SAndroid Build Coastguard Worker        "TEX_DUAL",
96*61046927SAndroid Build Coastguard Worker    ])
97*61046927SAndroid Build Coastguard Worker
98*61046927SAndroid Build Coastguard Workertemplate = """
99*61046927SAndroid Build Coastguard Worker#include "valhall.h"
100*61046927SAndroid Build Coastguard Worker#include "bi_opcodes.h"
101*61046927SAndroid Build Coastguard Worker
102*61046927SAndroid Build Coastguard Workerconst uint32_t valhall_immediates[32] = {
103*61046927SAndroid Build Coastguard Worker% for imm in immediates:
104*61046927SAndroid Build Coastguard Worker    ${hex(imm)},
105*61046927SAndroid Build Coastguard Worker% endfor
106*61046927SAndroid Build Coastguard Worker};
107*61046927SAndroid Build Coastguard Worker
108*61046927SAndroid Build Coastguard Worker<%
109*61046927SAndroid Build Coastguard Workerdef ibool(x):
110*61046927SAndroid Build Coastguard Worker    return '1' if x else '0'
111*61046927SAndroid Build Coastguard Worker
112*61046927SAndroid Build Coastguard Workerdef hasmod(x, mod):
113*61046927SAndroid Build Coastguard Worker    return ibool(any([x.name == mod for x in op.modifiers]))
114*61046927SAndroid Build Coastguard Worker
115*61046927SAndroid Build Coastguard Worker%>
116*61046927SAndroid Build Coastguard Workerconst struct va_opcode_info
117*61046927SAndroid Build Coastguard Workervalhall_opcodes[BI_NUM_OPCODES] = {
118*61046927SAndroid Build Coastguard Worker% for op in instructions:
119*61046927SAndroid Build Coastguard Worker% if op.name not in skip:
120*61046927SAndroid Build Coastguard Worker<%
121*61046927SAndroid Build Coastguard Worker    name = op.name
122*61046927SAndroid Build Coastguard Worker    if name == 'BRANCHZ':
123*61046927SAndroid Build Coastguard Worker        name = 'BRANCHZ.i16'
124*61046927SAndroid Build Coastguard Worker
125*61046927SAndroid Build Coastguard Worker    sr_control = 0
126*61046927SAndroid Build Coastguard Worker
127*61046927SAndroid Build Coastguard Worker    if len(op.staging) > 0:
128*61046927SAndroid Build Coastguard Worker        sr_control = op.staging[0].encoded_flags >> 6
129*61046927SAndroid Build Coastguard Worker%>
130*61046927SAndroid Build Coastguard Worker    [BI_OPCODE_${name.replace('.', '_').upper()}] = {
131*61046927SAndroid Build Coastguard Worker        .exact = ${hex(exact(op))}ULL,
132*61046927SAndroid Build Coastguard Worker        .srcs = {
133*61046927SAndroid Build Coastguard Worker% for src in ([sr for sr in op.staging if sr.read] + op.srcs):
134*61046927SAndroid Build Coastguard Worker            {
135*61046927SAndroid Build Coastguard Worker                .absneg = ${ibool(src.absneg)},
136*61046927SAndroid Build Coastguard Worker                .swizzle = ${ibool(src.swizzle)},
137*61046927SAndroid Build Coastguard Worker                .notted = ${ibool(src.notted)},
138*61046927SAndroid Build Coastguard Worker                .widen = ${ibool(src.widen)},
139*61046927SAndroid Build Coastguard Worker                .lanes = ${ibool(src.lanes)},
140*61046927SAndroid Build Coastguard Worker                .halfswizzle = ${ibool(src.halfswizzle)},
141*61046927SAndroid Build Coastguard Worker                .lane = ${ibool(src.lane)},
142*61046927SAndroid Build Coastguard Worker                .combine = ${ibool(src.combine)},
143*61046927SAndroid Build Coastguard Worker% if src.size in [8, 16, 32, 64]:
144*61046927SAndroid Build Coastguard Worker                .size = VA_SIZE_${src.size},
145*61046927SAndroid Build Coastguard Worker% endif
146*61046927SAndroid Build Coastguard Worker            },
147*61046927SAndroid Build Coastguard Worker% endfor
148*61046927SAndroid Build Coastguard Worker        },
149*61046927SAndroid Build Coastguard Worker        .type_size = ${typesize(op.name)},
150*61046927SAndroid Build Coastguard Worker        .has_dest = ${ibool(len(op.dests) > 0)},
151*61046927SAndroid Build Coastguard Worker        .is_signed = ${ibool(op.is_signed)},
152*61046927SAndroid Build Coastguard Worker        .unit = VA_UNIT_${op.unit},
153*61046927SAndroid Build Coastguard Worker        .nr_srcs = ${len(op.srcs)},
154*61046927SAndroid Build Coastguard Worker        .nr_staging_srcs = ${sum([sr.read for sr in op.staging])},
155*61046927SAndroid Build Coastguard Worker        .nr_staging_dests = ${sum([sr.write for sr in op.staging])},
156*61046927SAndroid Build Coastguard Worker        .clamp = ${hasmod(x, 'clamp')},
157*61046927SAndroid Build Coastguard Worker        .saturate = ${hasmod(x, 'saturate')},
158*61046927SAndroid Build Coastguard Worker        .rhadd = ${hasmod(x, 'rhadd')},
159*61046927SAndroid Build Coastguard Worker        .round_mode = ${hasmod(x, 'round_mode')},
160*61046927SAndroid Build Coastguard Worker        .condition = ${hasmod(x, 'condition')},
161*61046927SAndroid Build Coastguard Worker        .result_type = ${hasmod(x, 'result_type')},
162*61046927SAndroid Build Coastguard Worker        .vecsize = ${hasmod(x, 'vector_size')},
163*61046927SAndroid Build Coastguard Worker        .register_format = ${hasmod(x, 'register_format')},
164*61046927SAndroid Build Coastguard Worker        .slot = ${hasmod(x, 'slot')},
165*61046927SAndroid Build Coastguard Worker        .sr_count = ${hasmod(x, 'staging_register_count')},
166*61046927SAndroid Build Coastguard Worker        .sr_write_count = ${hasmod(x, 'staging_register_write_count')},
167*61046927SAndroid Build Coastguard Worker        .sr_control = ${sr_control},
168*61046927SAndroid Build Coastguard Worker    },
169*61046927SAndroid Build Coastguard Worker% endif
170*61046927SAndroid Build Coastguard Worker% endfor
171*61046927SAndroid Build Coastguard Worker};
172*61046927SAndroid Build Coastguard Worker"""
173*61046927SAndroid Build Coastguard Worker
174*61046927SAndroid Build Coastguard Worker# Exact value to be ORed in to every opcode
175*61046927SAndroid Build Coastguard Workerdef exact_op(op):
176*61046927SAndroid Build Coastguard Worker    return (op.opcode << 48) | (op.opcode2 << op.secondary_shift)
177*61046927SAndroid Build Coastguard Worker
178*61046927SAndroid Build Coastguard Workertry:
179*61046927SAndroid Build Coastguard Worker    print(Template(template).render(immediates = immediates, instructions = instructions, skip = SKIP, exact = exact_op, typesize = typesize))
180*61046927SAndroid Build Coastguard Workerexcept:
181*61046927SAndroid Build Coastguard Worker    print(exceptions.text_error_template().render())
182