xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/agx_opcodes.h.py (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Workertemplate = """/*
2*61046927SAndroid Build Coastguard Worker * Copyright 2021 Alyssa Rosenzweig
3*61046927SAndroid Build Coastguard Worker * SPDX-License-Identifier: MIT
4*61046927SAndroid Build Coastguard Worker */
5*61046927SAndroid Build Coastguard Worker
6*61046927SAndroid Build Coastguard Worker#ifndef _AGX_OPCODES_
7*61046927SAndroid Build Coastguard Worker#define _AGX_OPCODES_
8*61046927SAndroid Build Coastguard Worker
9*61046927SAndroid Build Coastguard Worker#include <stdbool.h>
10*61046927SAndroid Build Coastguard Worker#include <stdint.h>
11*61046927SAndroid Build Coastguard Worker#include "util/macros.h"
12*61046927SAndroid Build Coastguard Worker
13*61046927SAndroid Build Coastguard Workerenum agx_schedule_class {
14*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_INVALID,
15*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_NONE,
16*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_LOAD,
17*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_STORE,
18*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_ATOMIC,
19*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_COVERAGE,
20*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_PRELOAD,
21*61046927SAndroid Build Coastguard Worker   AGX_SCHEDULE_CLASS_BARRIER,
22*61046927SAndroid Build Coastguard Worker};
23*61046927SAndroid Build Coastguard Worker
24*61046927SAndroid Build Coastguard Worker/* Listing of opcodes */
25*61046927SAndroid Build Coastguard Worker
26*61046927SAndroid Build Coastguard Workerenum agx_opcode {
27*61046927SAndroid Build Coastguard Worker% for op in opcodes:
28*61046927SAndroid Build Coastguard Worker   AGX_OPCODE_${op.upper()},
29*61046927SAndroid Build Coastguard Worker% endfor
30*61046927SAndroid Build Coastguard Worker   AGX_NUM_OPCODES
31*61046927SAndroid Build Coastguard Worker};
32*61046927SAndroid Build Coastguard Worker
33*61046927SAndroid Build Coastguard Worker% for name in enums:
34*61046927SAndroid Build Coastguard Workerenum agx_${name} {
35*61046927SAndroid Build Coastguard Worker% for k, v in enums[name].items():
36*61046927SAndroid Build Coastguard Worker   AGX_${name.upper()}_${v.replace('.', '_').upper()} = ${k},
37*61046927SAndroid Build Coastguard Worker% endfor
38*61046927SAndroid Build Coastguard Worker};
39*61046927SAndroid Build Coastguard Worker
40*61046927SAndroid Build Coastguard Workerstatic inline const char *
41*61046927SAndroid Build Coastguard Workeragx_${name}_as_str(enum agx_${name} x)
42*61046927SAndroid Build Coastguard Worker{
43*61046927SAndroid Build Coastguard Worker    switch (x) {
44*61046927SAndroid Build Coastguard Worker% for k, v in enums[name].items():
45*61046927SAndroid Build Coastguard Worker    case AGX_${name.upper()}_${v.replace('.', '_').upper()}: return "${v}";
46*61046927SAndroid Build Coastguard Worker% endfor
47*61046927SAndroid Build Coastguard Worker    default: unreachable("Nonexhaustive enum");
48*61046927SAndroid Build Coastguard Worker    }
49*61046927SAndroid Build Coastguard Worker}
50*61046927SAndroid Build Coastguard Worker
51*61046927SAndroid Build Coastguard Worker% endfor
52*61046927SAndroid Build Coastguard Worker
53*61046927SAndroid Build Coastguard Worker/* Runtime accessible info on each defined opcode */
54*61046927SAndroid Build Coastguard Worker
55*61046927SAndroid Build Coastguard Worker<% assert(len(immediates) < 32); %>
56*61046927SAndroid Build Coastguard Worker
57*61046927SAndroid Build Coastguard Workerenum agx_immediate {
58*61046927SAndroid Build Coastguard Worker% for i, imm in enumerate(immediates):
59*61046927SAndroid Build Coastguard Worker   AGX_IMMEDIATE_${imm.upper()} = (1 << ${i}),
60*61046927SAndroid Build Coastguard Worker% endfor
61*61046927SAndroid Build Coastguard Worker};
62*61046927SAndroid Build Coastguard Worker
63*61046927SAndroid Build Coastguard Workerstruct agx_encoding {
64*61046927SAndroid Build Coastguard Worker   uint64_t exact;
65*61046927SAndroid Build Coastguard Worker   unsigned length_short : 4;
66*61046927SAndroid Build Coastguard Worker   bool extensible : 1;
67*61046927SAndroid Build Coastguard Worker};
68*61046927SAndroid Build Coastguard Worker
69*61046927SAndroid Build Coastguard Workerstruct agx_opcode_info {
70*61046927SAndroid Build Coastguard Worker   const char *name;
71*61046927SAndroid Build Coastguard Worker   unsigned nr_srcs;
72*61046927SAndroid Build Coastguard Worker   unsigned nr_dests;
73*61046927SAndroid Build Coastguard Worker   enum agx_immediate immediates;
74*61046927SAndroid Build Coastguard Worker   struct agx_encoding encoding;
75*61046927SAndroid Build Coastguard Worker   struct agx_encoding encoding_16;
76*61046927SAndroid Build Coastguard Worker   enum agx_schedule_class schedule_class;
77*61046927SAndroid Build Coastguard Worker   bool is_float : 1;
78*61046927SAndroid Build Coastguard Worker   bool can_eliminate : 1;
79*61046927SAndroid Build Coastguard Worker   bool can_reorder : 1;
80*61046927SAndroid Build Coastguard Worker};
81*61046927SAndroid Build Coastguard Worker
82*61046927SAndroid Build Coastguard Workerextern const struct agx_opcode_info agx_opcodes_info[AGX_NUM_OPCODES];
83*61046927SAndroid Build Coastguard Worker
84*61046927SAndroid Build Coastguard Worker#endif
85*61046927SAndroid Build Coastguard Worker"""
86*61046927SAndroid Build Coastguard Worker
87*61046927SAndroid Build Coastguard Workerfrom mako.template import Template
88*61046927SAndroid Build Coastguard Workerfrom agx_opcodes import opcodes, immediates, enums
89*61046927SAndroid Build Coastguard Worker
90*61046927SAndroid Build Coastguard Workerprint(Template(template).render(opcodes=opcodes, immediates=immediates,
91*61046927SAndroid Build Coastguard Worker         enums=enums))
92