xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/bi_opcodes.h.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker# Copyright (C) 2020 Collabora, Ltd.
2*61046927SAndroid Build Coastguard Worker#
3*61046927SAndroid Build Coastguard Worker# Permission is hereby granted, free of charge, to any person obtaining a
4*61046927SAndroid Build Coastguard Worker# copy of this software and associated documentation files (the "Software"),
5*61046927SAndroid Build Coastguard Worker# to deal in the Software without restriction, including without limitation
6*61046927SAndroid Build Coastguard Worker# the rights to use, copy, modify, merge, publish, distribute, sublicense,
7*61046927SAndroid Build Coastguard Worker# and/or sell copies of the Software, and to permit persons to whom the
8*61046927SAndroid Build Coastguard Worker# Software is furnished to do so, subject to the following conditions:
9*61046927SAndroid Build Coastguard Worker#
10*61046927SAndroid Build Coastguard Worker# The above copyright notice and this permission notice (including the next
11*61046927SAndroid Build Coastguard Worker# paragraph) shall be included in all copies or substantial portions of the
12*61046927SAndroid Build Coastguard Worker# Software.
13*61046927SAndroid Build Coastguard Worker#
14*61046927SAndroid Build Coastguard Worker# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15*61046927SAndroid Build Coastguard Worker# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16*61046927SAndroid Build Coastguard Worker# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
17*61046927SAndroid Build Coastguard Worker# THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18*61046927SAndroid Build Coastguard Worker# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
19*61046927SAndroid Build Coastguard Worker# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
20*61046927SAndroid Build Coastguard Worker# IN THE SOFTWARE.
21*61046927SAndroid Build Coastguard Worker
22*61046927SAndroid Build Coastguard WorkerTEMPLATE = """
23*61046927SAndroid Build Coastguard Worker#ifndef _BI_OPCODES_H_
24*61046927SAndroid Build Coastguard Worker#define _BI_OPCODES_H_
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Worker#include "bifrost.h"
27*61046927SAndroid Build Coastguard Worker
28*61046927SAndroid Build Coastguard Worker% for mod in sorted(modifiers):
29*61046927SAndroid Build Coastguard Worker% if len(modifiers[mod]) > 2: # otherwise just boolean
30*61046927SAndroid Build Coastguard Workerenum bi_${mod.lower()} {
31*61046927SAndroid Build Coastguard Worker% for i, state in enumerate(modifiers[mod]):
32*61046927SAndroid Build Coastguard Worker% if state != "reserved":
33*61046927SAndroid Build Coastguard Worker    BI_${mod.upper()}_${state.upper()} = ${i},
34*61046927SAndroid Build Coastguard Worker% endif
35*61046927SAndroid Build Coastguard Worker% endfor
36*61046927SAndroid Build Coastguard Worker};
37*61046927SAndroid Build Coastguard Worker
38*61046927SAndroid Build Coastguard Worker% endif
39*61046927SAndroid Build Coastguard Worker% endfor
40*61046927SAndroid Build Coastguard Workerenum bi_opcode {
41*61046927SAndroid Build Coastguard Worker% for opcode in sorted(mnemonics):
42*61046927SAndroid Build Coastguard Worker    BI_OPCODE_${opcode.replace('.', '_').upper()},
43*61046927SAndroid Build Coastguard Worker% endfor
44*61046927SAndroid Build Coastguard Worker    BI_NUM_OPCODES
45*61046927SAndroid Build Coastguard Worker};
46*61046927SAndroid Build Coastguard Worker
47*61046927SAndroid Build Coastguard Worker/* Number of staging registers accessed, note this fits into 3-bits */
48*61046927SAndroid Build Coastguard Worker
49*61046927SAndroid Build Coastguard Workerenum bi_sr_count {
50*61046927SAndroid Build Coastguard Worker    /* fixed counts */
51*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_0 = 0,
52*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_1 = 1,
53*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_2 = 2,
54*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_3 = 3,
55*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_4 = 4,
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Worker    /* derived from register_format and vecsize */
58*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_FORMAT = 5,
59*61046927SAndroid Build Coastguard Worker
60*61046927SAndroid Build Coastguard Worker    /* equal to vecsize alone */
61*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_VECSIZE = 6,
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Worker    /* specified directly as the sr_count immediate */
64*61046927SAndroid Build Coastguard Worker    BI_SR_COUNT_SR_COUNT = 7
65*61046927SAndroid Build Coastguard Worker};
66*61046927SAndroid Build Coastguard Worker
67*61046927SAndroid Build Coastguard Workerenum bi_size {
68*61046927SAndroid Build Coastguard Worker   BI_SIZE_8 = 0,
69*61046927SAndroid Build Coastguard Worker   BI_SIZE_16,
70*61046927SAndroid Build Coastguard Worker   BI_SIZE_24,
71*61046927SAndroid Build Coastguard Worker   BI_SIZE_32,
72*61046927SAndroid Build Coastguard Worker   BI_SIZE_48,
73*61046927SAndroid Build Coastguard Worker   BI_SIZE_64,
74*61046927SAndroid Build Coastguard Worker   BI_SIZE_96,
75*61046927SAndroid Build Coastguard Worker   BI_SIZE_128,
76*61046927SAndroid Build Coastguard Worker};
77*61046927SAndroid Build Coastguard Worker
78*61046927SAndroid Build Coastguard Worker/* Description of an opcode in the IR */
79*61046927SAndroid Build Coastguard Workerstruct bi_op_props {
80*61046927SAndroid Build Coastguard Worker        const char *name;
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Worker        enum bifrost_message_type message : 4;
83*61046927SAndroid Build Coastguard Worker        enum bi_size size : 3;
84*61046927SAndroid Build Coastguard Worker        enum bi_sr_count sr_count : 3;
85*61046927SAndroid Build Coastguard Worker        bool sr_read : 1;
86*61046927SAndroid Build Coastguard Worker        bool sr_write : 1;
87*61046927SAndroid Build Coastguard Worker        bool last : 1;
88*61046927SAndroid Build Coastguard Worker        bool branch : 1;
89*61046927SAndroid Build Coastguard Worker        bool table : 1;
90*61046927SAndroid Build Coastguard Worker        bool fma : 1;
91*61046927SAndroid Build Coastguard Worker        bool add : 1;
92*61046927SAndroid Build Coastguard Worker
93*61046927SAndroid Build Coastguard Worker        /* Supported propagable modifiers */
94*61046927SAndroid Build Coastguard Worker        bool clamp : 1;
95*61046927SAndroid Build Coastguard Worker        bool not_result : 1;
96*61046927SAndroid Build Coastguard Worker        unsigned abs : 3;
97*61046927SAndroid Build Coastguard Worker        unsigned neg : 3;
98*61046927SAndroid Build Coastguard Worker        bool not_mod : 1;
99*61046927SAndroid Build Coastguard Worker};
100*61046927SAndroid Build Coastguard Worker
101*61046927SAndroid Build Coastguard Worker/* Generated in bi_opcodes.c.py */
102*61046927SAndroid Build Coastguard Workerextern struct bi_op_props bi_opcode_props[BI_NUM_OPCODES];
103*61046927SAndroid Build Coastguard Worker
104*61046927SAndroid Build Coastguard Worker#endif
105*61046927SAndroid Build Coastguard Worker"""
106*61046927SAndroid Build Coastguard Worker
107*61046927SAndroid Build Coastguard Workerimport sys
108*61046927SAndroid Build Coastguard Workerfrom bifrost_isa import *
109*61046927SAndroid Build Coastguard Workerfrom mako.template import Template
110*61046927SAndroid Build Coastguard Worker
111*61046927SAndroid Build Coastguard Workerinstructions = {}
112*61046927SAndroid Build Coastguard Workerfor arg in sys.argv[1:]:
113*61046927SAndroid Build Coastguard Worker    new_instructions = parse_instructions(arg, include_pseudo = True)
114*61046927SAndroid Build Coastguard Worker    instructions.update(new_instructions)
115*61046927SAndroid Build Coastguard Worker
116*61046927SAndroid Build Coastguard Workerir_instructions = partition_mnemonics(instructions)
117*61046927SAndroid Build Coastguard Workermodifier_lists = order_modifiers(ir_instructions)
118*61046927SAndroid Build Coastguard Worker
119*61046927SAndroid Build Coastguard Worker# Generate sorted list of mnemonics without regard to unit
120*61046927SAndroid Build Coastguard Workermnemonics = set(x[1:] for x in instructions.keys())
121*61046927SAndroid Build Coastguard Worker
122*61046927SAndroid Build Coastguard Workerprint(Template(COPYRIGHT + TEMPLATE).render(mnemonics = mnemonics, modifiers = modifier_lists))
123