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