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