• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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