xref: /aosp_15_r20/external/mesa3d/src/etnaviv/isa/asm.h (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright (c) 2012-2015 Etnaviv Project
3*61046927SAndroid Build Coastguard Worker  *
4*61046927SAndroid Build Coastguard Worker  * SPDX-License-Identifier: MIT
5*61046927SAndroid Build Coastguard Worker  *
6*61046927SAndroid Build Coastguard Worker  * Authors:
7*61046927SAndroid Build Coastguard Worker  *    Wladimir J. van der Laan <[email protected]>
8*61046927SAndroid Build Coastguard Worker  */
9*61046927SAndroid Build Coastguard Worker 
10*61046927SAndroid Build Coastguard Worker #pragma once
11*61046927SAndroid Build Coastguard Worker 
12*61046927SAndroid Build Coastguard Worker #include <stdbool.h>
13*61046927SAndroid Build Coastguard Worker #include <stdint.h>
14*61046927SAndroid Build Coastguard Worker 
15*61046927SAndroid Build Coastguard Worker #include "etnaviv/isa/enums.h"
16*61046927SAndroid Build Coastguard Worker 
17*61046927SAndroid Build Coastguard Worker /* Number of source operands per instruction */
18*61046927SAndroid Build Coastguard Worker #define ETNA_NUM_SRC (3)
19*61046927SAndroid Build Coastguard Worker 
20*61046927SAndroid Build Coastguard Worker #define SWIZ_X(x) (((x) & 0x03) << 0)
21*61046927SAndroid Build Coastguard Worker #define SWIZ_Y(y) (((y) & 0x03) << 2)
22*61046927SAndroid Build Coastguard Worker #define SWIZ_Z(z) (((z) & 0x03) << 4)
23*61046927SAndroid Build Coastguard Worker #define SWIZ_W(w) (((w) & 0x03) << 6)
24*61046927SAndroid Build Coastguard Worker 
25*61046927SAndroid Build Coastguard Worker /* clang-format off */
26*61046927SAndroid Build Coastguard Worker /* Broadcast swizzle to all four components */
27*61046927SAndroid Build Coastguard Worker #define INST_SWIZ_BROADCAST(x) \
28*61046927SAndroid Build Coastguard Worker         (SWIZ_X(x) | SWIZ_Y(x) | SWIZ_Z(x) | SWIZ_W(x))
29*61046927SAndroid Build Coastguard Worker /* Identity (NOP) swizzle */
30*61046927SAndroid Build Coastguard Worker #define INST_SWIZ_IDENTITY \
31*61046927SAndroid Build Coastguard Worker         (SWIZ_X(0) | SWIZ_Y(1) | SWIZ_Z(2) | SWIZ_W(3))
32*61046927SAndroid Build Coastguard Worker /* Fully specified swizzle */
33*61046927SAndroid Build Coastguard Worker #define INST_SWIZ(x, y, z, w) \
34*61046927SAndroid Build Coastguard Worker         (SWIZ_X(x) | SWIZ_Y(y) | SWIZ_Z(z) | SWIZ_W(w))
35*61046927SAndroid Build Coastguard Worker #define SWIZZLE(c0, c1, c2, c3) \
36*61046927SAndroid Build Coastguard Worker         INST_SWIZ(ISA_SWIZ_##c0, \
37*61046927SAndroid Build Coastguard Worker                   ISA_SWIZ_##c1, \
38*61046927SAndroid Build Coastguard Worker                   ISA_SWIZ_##c2, \
39*61046927SAndroid Build Coastguard Worker                   ISA_SWIZ_##c3)
40*61046927SAndroid Build Coastguard Worker /* clang-format on */
41*61046927SAndroid Build Coastguard Worker 
42*61046927SAndroid Build Coastguard Worker /*** operands ***/
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker /* destination operand */
45*61046927SAndroid Build Coastguard Worker struct etna_inst_dst {
46*61046927SAndroid Build Coastguard Worker    unsigned use                       : 1; /* 0: not in use, 1: in use */
47*61046927SAndroid Build Coastguard Worker    enum isa_reg_addressing_mode amode : 3;
48*61046927SAndroid Build Coastguard Worker    unsigned reg                       : 7; /* register number 0..127 */
49*61046927SAndroid Build Coastguard Worker    enum isa_wrmask write_mask         : 4;
50*61046927SAndroid Build Coastguard Worker };
51*61046927SAndroid Build Coastguard Worker 
52*61046927SAndroid Build Coastguard Worker /* texture operand */
53*61046927SAndroid Build Coastguard Worker struct etna_inst_tex {
54*61046927SAndroid Build Coastguard Worker    unsigned id                        : 5; /* sampler id */
55*61046927SAndroid Build Coastguard Worker    enum isa_reg_addressing_mode amode : 3;
56*61046927SAndroid Build Coastguard Worker    unsigned swiz                      : 8; /* INST_SWIZ */
57*61046927SAndroid Build Coastguard Worker };
58*61046927SAndroid Build Coastguard Worker 
59*61046927SAndroid Build Coastguard Worker /* source operand */
60*61046927SAndroid Build Coastguard Worker struct etna_inst_src {
61*61046927SAndroid Build Coastguard Worker    unsigned use              : 1; /* 0: not in use, 1: in use */
62*61046927SAndroid Build Coastguard Worker    enum isa_reg_group rgroup : 3;
63*61046927SAndroid Build Coastguard Worker    union {
64*61046927SAndroid Build Coastguard Worker       struct __attribute__((__packed__)) {
65*61046927SAndroid Build Coastguard Worker          unsigned reg                       : 9; /* register or uniform number 0..511 */
66*61046927SAndroid Build Coastguard Worker          unsigned swiz                      : 8; /* INST_SWIZ */
67*61046927SAndroid Build Coastguard Worker          unsigned neg                       : 1; /* negate (flip sign) if set */
68*61046927SAndroid Build Coastguard Worker          unsigned abs                       : 1; /* absolute (remove sign) if set */
69*61046927SAndroid Build Coastguard Worker          enum isa_reg_addressing_mode amode : 3;
70*61046927SAndroid Build Coastguard Worker       };
71*61046927SAndroid Build Coastguard Worker       struct __attribute__((__packed__)) {
72*61046927SAndroid Build Coastguard Worker          unsigned imm_val  : 20;
73*61046927SAndroid Build Coastguard Worker          unsigned imm_type : 2;
74*61046927SAndroid Build Coastguard Worker       };
75*61046927SAndroid Build Coastguard Worker    };
76*61046927SAndroid Build Coastguard Worker };
77*61046927SAndroid Build Coastguard Worker 
78*61046927SAndroid Build Coastguard Worker /*** instruction ***/
79*61046927SAndroid Build Coastguard Worker struct etna_inst {
80*61046927SAndroid Build Coastguard Worker    enum isa_opc opcode;
81*61046927SAndroid Build Coastguard Worker    enum isa_type type;
82*61046927SAndroid Build Coastguard Worker    enum isa_rounding rounding;
83*61046927SAndroid Build Coastguard Worker    enum isa_cond cond     : 5;
84*61046927SAndroid Build Coastguard Worker    unsigned sat           : 1; /* saturate result between 0..1 */
85*61046927SAndroid Build Coastguard Worker    enum isa_thread thread : 2; /* select low/high half mediump */
86*61046927SAndroid Build Coastguard Worker    unsigned dst_full      : 1; /* write to highp register */
87*61046927SAndroid Build Coastguard Worker    unsigned pmode         : 1;
88*61046927SAndroid Build Coastguard Worker    unsigned skphp         : 1;
89*61046927SAndroid Build Coastguard Worker    unsigned denorm        : 1;
90*61046927SAndroid Build Coastguard Worker    unsigned local         : 1;
91*61046927SAndroid Build Coastguard Worker    unsigned left_shift    : 3;
92*61046927SAndroid Build Coastguard Worker    struct etna_inst_dst dst;               /* destination operand */
93*61046927SAndroid Build Coastguard Worker    struct etna_inst_tex tex;               /* texture operand */
94*61046927SAndroid Build Coastguard Worker    struct etna_inst_src src[ETNA_NUM_SRC]; /* source operand */
95*61046927SAndroid Build Coastguard Worker    unsigned imm;                           /* takes place of src[2] for BRANCH/CALL */
96*61046927SAndroid Build Coastguard Worker };
97*61046927SAndroid Build Coastguard Worker 
98*61046927SAndroid Build Coastguard Worker struct etna_asm_result {
99*61046927SAndroid Build Coastguard Worker    struct etna_inst *instr;
100*61046927SAndroid Build Coastguard Worker    char *error;
101*61046927SAndroid Build Coastguard Worker    size_t num_instr;
102*61046927SAndroid Build Coastguard Worker    size_t capacity_instr;
103*61046927SAndroid Build Coastguard Worker    bool success;
104*61046927SAndroid Build Coastguard Worker };
105