xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/valhall/valhall.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (C) 2021 Collabora Ltd.
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * Permission is hereby granted, free of charge, to any person obtaining a
5*61046927SAndroid Build Coastguard Worker  * copy of this software and associated documentation files (the "Software"),
6*61046927SAndroid Build Coastguard Worker  * to deal in the Software without restriction, including without limitation
7*61046927SAndroid Build Coastguard Worker  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8*61046927SAndroid Build Coastguard Worker  * and/or sell copies of the Software, and to permit persons to whom the
9*61046927SAndroid Build Coastguard Worker  * Software is furnished to do so, subject to the following conditions:
10*61046927SAndroid Build Coastguard Worker  *
11*61046927SAndroid Build Coastguard Worker  * The above copyright notice and this permission notice (including the next
12*61046927SAndroid Build Coastguard Worker  * paragraph) shall be included in all copies or substantial portions of the
13*61046927SAndroid Build Coastguard Worker  * Software.
14*61046927SAndroid Build Coastguard Worker  *
15*61046927SAndroid Build Coastguard Worker  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16*61046927SAndroid Build Coastguard Worker  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17*61046927SAndroid Build Coastguard Worker  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18*61046927SAndroid Build Coastguard Worker  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19*61046927SAndroid Build Coastguard Worker  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20*61046927SAndroid Build Coastguard Worker  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21*61046927SAndroid Build Coastguard Worker  * SOFTWARE.
22*61046927SAndroid Build Coastguard Worker  *
23*61046927SAndroid Build Coastguard Worker  * Authors (Collabora):
24*61046927SAndroid Build Coastguard Worker  *      Alyssa Rosenzweig <[email protected]>
25*61046927SAndroid Build Coastguard Worker  */
26*61046927SAndroid Build Coastguard Worker 
27*61046927SAndroid Build Coastguard Worker #ifndef __VALHALL_H
28*61046927SAndroid Build Coastguard Worker #define __VALHALL_H
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker #include <stdint.h>
31*61046927SAndroid Build Coastguard Worker #include "bi_opcodes.h"
32*61046927SAndroid Build Coastguard Worker #include "valhall_enums.h"
33*61046927SAndroid Build Coastguard Worker 
34*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
35*61046927SAndroid Build Coastguard Worker extern "C" {
36*61046927SAndroid Build Coastguard Worker #endif
37*61046927SAndroid Build Coastguard Worker 
38*61046927SAndroid Build Coastguard Worker #define VA_NUM_GENERAL_SLOTS 3
39*61046927SAndroid Build Coastguard Worker 
40*61046927SAndroid Build Coastguard Worker extern const uint32_t valhall_immediates[32];
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker enum va_size {
43*61046927SAndroid Build Coastguard Worker    VA_SIZE_8 = 0,
44*61046927SAndroid Build Coastguard Worker    VA_SIZE_16 = 1,
45*61046927SAndroid Build Coastguard Worker    VA_SIZE_32 = 2,
46*61046927SAndroid Build Coastguard Worker    VA_SIZE_64 = 3,
47*61046927SAndroid Build Coastguard Worker };
48*61046927SAndroid Build Coastguard Worker 
49*61046927SAndroid Build Coastguard Worker enum va_unit {
50*61046927SAndroid Build Coastguard Worker    /** Fused floating-point multiply-add */
51*61046927SAndroid Build Coastguard Worker    VA_UNIT_FMA = 0,
52*61046927SAndroid Build Coastguard Worker 
53*61046927SAndroid Build Coastguard Worker    /** Type conversion and basic arithmetic */
54*61046927SAndroid Build Coastguard Worker    VA_UNIT_CVT = 1,
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    /** Special function unit */
57*61046927SAndroid Build Coastguard Worker    VA_UNIT_SFU = 2,
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker    /** Varying */
60*61046927SAndroid Build Coastguard Worker    VA_UNIT_V = 3,
61*61046927SAndroid Build Coastguard Worker 
62*61046927SAndroid Build Coastguard Worker    /** General load/store */
63*61046927SAndroid Build Coastguard Worker    VA_UNIT_LS = 4,
64*61046927SAndroid Build Coastguard Worker 
65*61046927SAndroid Build Coastguard Worker    /** Texture */
66*61046927SAndroid Build Coastguard Worker    VA_UNIT_T = 5,
67*61046927SAndroid Build Coastguard Worker 
68*61046927SAndroid Build Coastguard Worker    /** Fused varying and texture */
69*61046927SAndroid Build Coastguard Worker    VA_UNIT_VT = 6,
70*61046927SAndroid Build Coastguard Worker 
71*61046927SAndroid Build Coastguard Worker    /** Produces a message for a unit not otherwise specified */
72*61046927SAndroid Build Coastguard Worker    VA_UNIT_NONE = 7
73*61046927SAndroid Build Coastguard Worker };
74*61046927SAndroid Build Coastguard Worker 
75*61046927SAndroid Build Coastguard Worker struct va_src_info {
76*61046927SAndroid Build Coastguard Worker    bool absneg       : 1;
77*61046927SAndroid Build Coastguard Worker    bool swizzle      : 1;
78*61046927SAndroid Build Coastguard Worker    bool notted       : 1;
79*61046927SAndroid Build Coastguard Worker    bool lane         : 1;
80*61046927SAndroid Build Coastguard Worker    bool lanes        : 1;
81*61046927SAndroid Build Coastguard Worker    bool halfswizzle  : 1;
82*61046927SAndroid Build Coastguard Worker    bool widen        : 1;
83*61046927SAndroid Build Coastguard Worker    bool combine      : 1;
84*61046927SAndroid Build Coastguard Worker    enum va_size size : 2;
85*61046927SAndroid Build Coastguard Worker } __attribute__((packed));
86*61046927SAndroid Build Coastguard Worker 
87*61046927SAndroid Build Coastguard Worker struct va_opcode_info {
88*61046927SAndroid Build Coastguard Worker    uint64_t exact;
89*61046927SAndroid Build Coastguard Worker    struct va_src_info srcs[4];
90*61046927SAndroid Build Coastguard Worker    uint8_t type_size         : 8;
91*61046927SAndroid Build Coastguard Worker    enum va_unit unit         : 3;
92*61046927SAndroid Build Coastguard Worker    unsigned nr_srcs          : 3;
93*61046927SAndroid Build Coastguard Worker    unsigned nr_staging_srcs  : 2;
94*61046927SAndroid Build Coastguard Worker    unsigned nr_staging_dests : 2;
95*61046927SAndroid Build Coastguard Worker    bool has_dest             : 1;
96*61046927SAndroid Build Coastguard Worker    bool is_signed            : 1;
97*61046927SAndroid Build Coastguard Worker    bool clamp                : 1;
98*61046927SAndroid Build Coastguard Worker    bool saturate             : 1;
99*61046927SAndroid Build Coastguard Worker    bool rhadd                : 1;
100*61046927SAndroid Build Coastguard Worker    bool round_mode           : 1;
101*61046927SAndroid Build Coastguard Worker    bool condition            : 1;
102*61046927SAndroid Build Coastguard Worker    bool result_type          : 1;
103*61046927SAndroid Build Coastguard Worker    bool vecsize              : 1;
104*61046927SAndroid Build Coastguard Worker    bool register_format      : 1;
105*61046927SAndroid Build Coastguard Worker    bool slot                 : 1;
106*61046927SAndroid Build Coastguard Worker    bool sr_count             : 1;
107*61046927SAndroid Build Coastguard Worker    bool sr_write_count       : 1;
108*61046927SAndroid Build Coastguard Worker    unsigned sr_control       : 2;
109*61046927SAndroid Build Coastguard Worker };
110*61046927SAndroid Build Coastguard Worker 
111*61046927SAndroid Build Coastguard Worker extern const struct va_opcode_info valhall_opcodes[BI_NUM_OPCODES];
112*61046927SAndroid Build Coastguard Worker 
113*61046927SAndroid Build Coastguard Worker /* Bifrost specifies the source of bitwise operations as (A, B, shift), but
114*61046927SAndroid Build Coastguard Worker  * Valhall specifies (A, shift, B). We follow Bifrost conventions in the
115*61046927SAndroid Build Coastguard Worker  * compiler, so normalize.
116*61046927SAndroid Build Coastguard Worker  *
117*61046927SAndroid Build Coastguard Worker  * Bifrost specifies BLEND as staging + (coverage, blend descriptor), but
118*61046927SAndroid Build Coastguard Worker  * Valhall specifies staging + (blend descriptor, coverage). Given we put
119*61046927SAndroid Build Coastguard Worker  * staging sources first, this works out to the same swap as bitwise ops.
120*61046927SAndroid Build Coastguard Worker  */
121*61046927SAndroid Build Coastguard Worker 
122*61046927SAndroid Build Coastguard Worker static inline bool
va_swap_12(enum bi_opcode op)123*61046927SAndroid Build Coastguard Worker va_swap_12(enum bi_opcode op)
124*61046927SAndroid Build Coastguard Worker {
125*61046927SAndroid Build Coastguard Worker    switch (op) {
126*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_BLEND:
127*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_AND_I32:
128*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_AND_V2I16:
129*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_AND_V4I8:
130*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_OR_I32:
131*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_OR_V2I16:
132*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_OR_V4I8:
133*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_XOR_I32:
134*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_XOR_V2I16:
135*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_LSHIFT_XOR_V4I8:
136*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_AND_I32:
137*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_AND_V2I16:
138*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_AND_V4I8:
139*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_OR_I32:
140*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_OR_V2I16:
141*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_OR_V4I8:
142*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_XOR_I32:
143*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_XOR_V2I16:
144*61046927SAndroid Build Coastguard Worker    case BI_OPCODE_RSHIFT_XOR_V4I8:
145*61046927SAndroid Build Coastguard Worker       return true;
146*61046927SAndroid Build Coastguard Worker    default:
147*61046927SAndroid Build Coastguard Worker       return false;
148*61046927SAndroid Build Coastguard Worker    }
149*61046927SAndroid Build Coastguard Worker }
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker static inline struct va_src_info
va_src_info(enum bi_opcode op,unsigned src)152*61046927SAndroid Build Coastguard Worker va_src_info(enum bi_opcode op, unsigned src)
153*61046927SAndroid Build Coastguard Worker {
154*61046927SAndroid Build Coastguard Worker    unsigned idx = (va_swap_12(op) && (src == 1 || src == 2)) ? (3 - src) : src;
155*61046927SAndroid Build Coastguard Worker    return valhall_opcodes[op].srcs[idx];
156*61046927SAndroid Build Coastguard Worker }
157*61046927SAndroid Build Coastguard Worker 
158*61046927SAndroid Build Coastguard Worker static inline bool
va_flow_is_wait_or_none(enum va_flow flow)159*61046927SAndroid Build Coastguard Worker va_flow_is_wait_or_none(enum va_flow flow)
160*61046927SAndroid Build Coastguard Worker {
161*61046927SAndroid Build Coastguard Worker    return (flow <= VA_FLOW_WAIT);
162*61046927SAndroid Build Coastguard Worker }
163*61046927SAndroid Build Coastguard Worker 
164*61046927SAndroid Build Coastguard Worker static inline bool
va_is_valid_const_table(unsigned table)165*61046927SAndroid Build Coastguard Worker va_is_valid_const_table(unsigned table)
166*61046927SAndroid Build Coastguard Worker {
167*61046927SAndroid Build Coastguard Worker    return (table >= 0 && table <= 11) || (table >= 60 && table <= 63);
168*61046927SAndroid Build Coastguard Worker }
169*61046927SAndroid Build Coastguard Worker 
170*61046927SAndroid Build Coastguard Worker static inline uint32_t
va_res_fold_table_idx(uint32_t table)171*61046927SAndroid Build Coastguard Worker va_res_fold_table_idx(uint32_t table)
172*61046927SAndroid Build Coastguard Worker {
173*61046927SAndroid Build Coastguard Worker    switch (table) {
174*61046927SAndroid Build Coastguard Worker    case 0 ... 11:
175*61046927SAndroid Build Coastguard Worker       return table;
176*61046927SAndroid Build Coastguard Worker    case 60 ... 63:
177*61046927SAndroid Build Coastguard Worker       return table + 12 - 60;
178*61046927SAndroid Build Coastguard Worker    default:
179*61046927SAndroid Build Coastguard Worker       assert(!"Can't pack table");
180*61046927SAndroid Build Coastguard Worker       return 0;
181*61046927SAndroid Build Coastguard Worker    }
182*61046927SAndroid Build Coastguard Worker }
183*61046927SAndroid Build Coastguard Worker 
184*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus
185*61046927SAndroid Build Coastguard Worker } /* extern C */
186*61046927SAndroid Build Coastguard Worker #endif
187*61046927SAndroid Build Coastguard Worker 
188*61046927SAndroid Build Coastguard Worker #endif
189