xref: /aosp_15_r20/external/mesa3d/src/asahi/compiler/test/test-lower-spill.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1*61046927SAndroid Build Coastguard Worker /*
2*61046927SAndroid Build Coastguard Worker  * Copyright 2023 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 #include "agx_builder.h"
7*61046927SAndroid Build Coastguard Worker #include "agx_compile.h"
8*61046927SAndroid Build Coastguard Worker #include "agx_compiler.h"
9*61046927SAndroid Build Coastguard Worker #include "agx_test.h"
10*61046927SAndroid Build Coastguard Worker 
11*61046927SAndroid Build Coastguard Worker #include "util/macros.h"
12*61046927SAndroid Build Coastguard Worker #include <gtest/gtest.h>
13*61046927SAndroid Build Coastguard Worker 
14*61046927SAndroid Build Coastguard Worker #define CASE(instr, expected)                                                  \
15*61046927SAndroid Build Coastguard Worker    do {                                                                        \
16*61046927SAndroid Build Coastguard Worker       agx_builder *A = agx_test_builder(mem_ctx);                              \
17*61046927SAndroid Build Coastguard Worker       agx_builder *B = agx_test_builder(mem_ctx);                              \
18*61046927SAndroid Build Coastguard Worker       {                                                                        \
19*61046927SAndroid Build Coastguard Worker          agx_builder *b = A;                                                   \
20*61046927SAndroid Build Coastguard Worker          instr;                                                                \
21*61046927SAndroid Build Coastguard Worker       }                                                                        \
22*61046927SAndroid Build Coastguard Worker       {                                                                        \
23*61046927SAndroid Build Coastguard Worker          agx_builder *b = B;                                                   \
24*61046927SAndroid Build Coastguard Worker          expected;                                                             \
25*61046927SAndroid Build Coastguard Worker       }                                                                        \
26*61046927SAndroid Build Coastguard Worker       agx_lower_spill(A->shader);                                              \
27*61046927SAndroid Build Coastguard Worker       ASSERT_SHADER_EQUAL(A->shader, B->shader);                               \
28*61046927SAndroid Build Coastguard Worker    } while (0)
29*61046927SAndroid Build Coastguard Worker 
30*61046927SAndroid Build Coastguard Worker class LowerSpill : public testing::Test {
31*61046927SAndroid Build Coastguard Worker  protected:
LowerSpill()32*61046927SAndroid Build Coastguard Worker    LowerSpill()
33*61046927SAndroid Build Coastguard Worker    {
34*61046927SAndroid Build Coastguard Worker       mem_ctx = ralloc_context(NULL);
35*61046927SAndroid Build Coastguard Worker 
36*61046927SAndroid Build Coastguard Worker       wx = agx_register(0, AGX_SIZE_32);
37*61046927SAndroid Build Coastguard Worker       hy = agx_register(2, AGX_SIZE_16);
38*61046927SAndroid Build Coastguard Worker 
39*61046927SAndroid Build Coastguard Worker       mw4 = agx_memory_register(0, AGX_SIZE_32);
40*61046927SAndroid Build Coastguard Worker       mh4 = agx_memory_register(0, AGX_SIZE_16);
41*61046927SAndroid Build Coastguard Worker       mw4.channels_m1 = 4 - 1;
42*61046927SAndroid Build Coastguard Worker       mh4.channels_m1 = 4 - 1;
43*61046927SAndroid Build Coastguard Worker 
44*61046927SAndroid Build Coastguard Worker       wx4 = wx;
45*61046927SAndroid Build Coastguard Worker       wx4.channels_m1 = 4 - 1;
46*61046927SAndroid Build Coastguard Worker 
47*61046927SAndroid Build Coastguard Worker       hy4 = hy;
48*61046927SAndroid Build Coastguard Worker       hy4.channels_m1 = 4 - 1;
49*61046927SAndroid Build Coastguard Worker    }
50*61046927SAndroid Build Coastguard Worker 
~LowerSpill()51*61046927SAndroid Build Coastguard Worker    ~LowerSpill()
52*61046927SAndroid Build Coastguard Worker    {
53*61046927SAndroid Build Coastguard Worker       ralloc_free(mem_ctx);
54*61046927SAndroid Build Coastguard Worker    }
55*61046927SAndroid Build Coastguard Worker 
56*61046927SAndroid Build Coastguard Worker    void *mem_ctx;
57*61046927SAndroid Build Coastguard Worker    agx_index wx, hy, wx4, hy4;
58*61046927SAndroid Build Coastguard Worker    agx_index mw4, mh4;
59*61046927SAndroid Build Coastguard Worker 
60*61046927SAndroid Build Coastguard Worker    unsigned scalar = BITFIELD_MASK(1);
61*61046927SAndroid Build Coastguard Worker    unsigned vec4 = BITFIELD_MASK(4);
62*61046927SAndroid Build Coastguard Worker 
63*61046927SAndroid Build Coastguard Worker    enum agx_format i16 = AGX_FORMAT_I16;
64*61046927SAndroid Build Coastguard Worker    enum agx_format i32 = AGX_FORMAT_I32;
65*61046927SAndroid Build Coastguard Worker };
66*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,ScalarSpills)67*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, ScalarSpills)
68*61046927SAndroid Build Coastguard Worker {
69*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, agx_memory_register(11, AGX_SIZE_16), hy),
70*61046927SAndroid Build Coastguard Worker         agx_stack_store(b, hy, agx_immediate(22), i16, scalar));
71*61046927SAndroid Build Coastguard Worker 
72*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, agx_memory_register(18, AGX_SIZE_32), wx),
73*61046927SAndroid Build Coastguard Worker         agx_stack_store(b, wx, agx_immediate(36), i32, scalar));
74*61046927SAndroid Build Coastguard Worker }
75*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,ScalarFills)76*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, ScalarFills)
77*61046927SAndroid Build Coastguard Worker {
78*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, hy, agx_memory_register(11, AGX_SIZE_16)),
79*61046927SAndroid Build Coastguard Worker         agx_stack_load_to(b, hy, agx_immediate(22), i16, scalar));
80*61046927SAndroid Build Coastguard Worker 
81*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, wx, agx_memory_register(18, AGX_SIZE_32)),
82*61046927SAndroid Build Coastguard Worker         agx_stack_load_to(b, wx, agx_immediate(36), i32, scalar));
83*61046927SAndroid Build Coastguard Worker }
84*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,VectorSpills)85*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, VectorSpills)
86*61046927SAndroid Build Coastguard Worker {
87*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, mh4, hy4),
88*61046927SAndroid Build Coastguard Worker         agx_stack_store(b, hy4, agx_immediate(0), i16, vec4));
89*61046927SAndroid Build Coastguard Worker 
90*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, mw4, wx4),
91*61046927SAndroid Build Coastguard Worker         agx_stack_store(b, wx4, agx_immediate(0), i32, vec4));
92*61046927SAndroid Build Coastguard Worker }
93*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,VectorFills)94*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, VectorFills)
95*61046927SAndroid Build Coastguard Worker {
96*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, hy4, mh4),
97*61046927SAndroid Build Coastguard Worker         agx_stack_load_to(b, hy4, agx_immediate(0), i16, vec4));
98*61046927SAndroid Build Coastguard Worker 
99*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, wx4, mw4),
100*61046927SAndroid Build Coastguard Worker         agx_stack_load_to(b, wx4, agx_immediate(0), i32, vec4));
101*61046927SAndroid Build Coastguard Worker }
102*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,ScalarSpill64)103*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, ScalarSpill64)
104*61046927SAndroid Build Coastguard Worker {
105*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, agx_memory_register(16, AGX_SIZE_64),
106*61046927SAndroid Build Coastguard Worker                    agx_register(8, AGX_SIZE_64)),
107*61046927SAndroid Build Coastguard Worker         agx_stack_store(b, agx_register(8, AGX_SIZE_64), agx_immediate(32), i32,
108*61046927SAndroid Build Coastguard Worker                         BITFIELD_MASK(2)));
109*61046927SAndroid Build Coastguard Worker }
110*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,ScalarFill64)111*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, ScalarFill64)
112*61046927SAndroid Build Coastguard Worker {
113*61046927SAndroid Build Coastguard Worker    CASE(agx_mov_to(b, agx_register(16, AGX_SIZE_64),
114*61046927SAndroid Build Coastguard Worker                    agx_memory_register(8, AGX_SIZE_64)),
115*61046927SAndroid Build Coastguard Worker         agx_stack_load_to(b, agx_register(16, AGX_SIZE_64), agx_immediate(16),
116*61046927SAndroid Build Coastguard Worker                           i32, BITFIELD_MASK(2)));
117*61046927SAndroid Build Coastguard Worker }
118*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,Vec6Spill)119*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, Vec6Spill)
120*61046927SAndroid Build Coastguard Worker {
121*61046927SAndroid Build Coastguard Worker    CASE(
122*61046927SAndroid Build Coastguard Worker       {
123*61046927SAndroid Build Coastguard Worker          agx_index mvec6 = agx_memory_register(16, AGX_SIZE_32);
124*61046927SAndroid Build Coastguard Worker          agx_index vec6 = agx_register(8, AGX_SIZE_32);
125*61046927SAndroid Build Coastguard Worker          vec6.channels_m1 = 6 - 1;
126*61046927SAndroid Build Coastguard Worker          mvec6.channels_m1 = 6 - 1;
127*61046927SAndroid Build Coastguard Worker 
128*61046927SAndroid Build Coastguard Worker          agx_mov_to(b, mvec6, vec6);
129*61046927SAndroid Build Coastguard Worker       },
130*61046927SAndroid Build Coastguard Worker       {
131*61046927SAndroid Build Coastguard Worker          agx_index vec4 = agx_register(8, AGX_SIZE_32);
132*61046927SAndroid Build Coastguard Worker          agx_index vec2 = agx_register(8 + (4 * 2), AGX_SIZE_32);
133*61046927SAndroid Build Coastguard Worker          vec4.channels_m1 = 4 - 1;
134*61046927SAndroid Build Coastguard Worker          vec2.channels_m1 = 2 - 1;
135*61046927SAndroid Build Coastguard Worker 
136*61046927SAndroid Build Coastguard Worker          agx_stack_store(b, vec4, agx_immediate(32), i32, BITFIELD_MASK(4));
137*61046927SAndroid Build Coastguard Worker          agx_stack_store(b, vec2, agx_immediate(32 + 4 * 4), i32,
138*61046927SAndroid Build Coastguard Worker                          BITFIELD_MASK(2));
139*61046927SAndroid Build Coastguard Worker       });
140*61046927SAndroid Build Coastguard Worker }
141*61046927SAndroid Build Coastguard Worker 
TEST_F(LowerSpill,Vec6Fill)142*61046927SAndroid Build Coastguard Worker TEST_F(LowerSpill, Vec6Fill)
143*61046927SAndroid Build Coastguard Worker {
144*61046927SAndroid Build Coastguard Worker    CASE(
145*61046927SAndroid Build Coastguard Worker       {
146*61046927SAndroid Build Coastguard Worker          agx_index mvec6 = agx_memory_register(16, AGX_SIZE_32);
147*61046927SAndroid Build Coastguard Worker          agx_index vec6 = agx_register(8, AGX_SIZE_32);
148*61046927SAndroid Build Coastguard Worker          vec6.channels_m1 = 6 - 1;
149*61046927SAndroid Build Coastguard Worker          mvec6.channels_m1 = 6 - 1;
150*61046927SAndroid Build Coastguard Worker 
151*61046927SAndroid Build Coastguard Worker          agx_mov_to(b, vec6, mvec6);
152*61046927SAndroid Build Coastguard Worker       },
153*61046927SAndroid Build Coastguard Worker       {
154*61046927SAndroid Build Coastguard Worker          agx_index vec4 = agx_register(8, AGX_SIZE_32);
155*61046927SAndroid Build Coastguard Worker          agx_index vec2 = agx_register(8 + (4 * 2), AGX_SIZE_32);
156*61046927SAndroid Build Coastguard Worker          vec4.channels_m1 = 4 - 1;
157*61046927SAndroid Build Coastguard Worker          vec2.channels_m1 = 2 - 1;
158*61046927SAndroid Build Coastguard Worker 
159*61046927SAndroid Build Coastguard Worker          agx_stack_load_to(b, vec4, agx_immediate(32), i32, BITFIELD_MASK(4));
160*61046927SAndroid Build Coastguard Worker          agx_stack_load_to(b, vec2, agx_immediate(32 + 4 * 4), i32,
161*61046927SAndroid Build Coastguard Worker                            BITFIELD_MASK(2));
162*61046927SAndroid Build Coastguard Worker       });
163*61046927SAndroid Build Coastguard Worker }
164