xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/valhall/test/test-packing.cpp (revision 6104692788411f58d303aa86923a9ff6ecaded22)
1 /*
2  * Copyright (C) 2021 Collabora, Ltd.
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20  * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21  * SOFTWARE.
22  */
23 
24 #include "bi_builder.h"
25 #include "bi_test.h"
26 #include "va_compiler.h"
27 
28 #include <gtest/gtest.h>
29 
30 #define CASE(instr, expected)                                                  \
31    do {                                                                        \
32       uint64_t _value = va_pack_instr(instr);                                  \
33       if (_value != expected) {                                                \
34          fprintf(stderr, "Got %" PRIx64 ", expected %" PRIx64 "\n", _value,    \
35                  (uint64_t)expected);                                          \
36          bi_print_instr(instr, stderr);                                        \
37          fprintf(stderr, "\n");                                                \
38          ADD_FAILURE();                                                        \
39       }                                                                        \
40    } while (0)
41 
42 class ValhallPacking : public testing::Test {
43  protected:
ValhallPacking()44    ValhallPacking()
45    {
46       mem_ctx = ralloc_context(NULL);
47       b = bit_builder(mem_ctx);
48 
49       zero = bi_fau((enum bir_fau)(BIR_FAU_IMMEDIATE | 0), false);
50       one = bi_fau((enum bir_fau)(BIR_FAU_IMMEDIATE | 8), false);
51       n4567 = bi_fau((enum bir_fau)(BIR_FAU_IMMEDIATE | 4), true);
52    }
53 
~ValhallPacking()54    ~ValhallPacking()
55    {
56       ralloc_free(mem_ctx);
57    }
58 
59    void *mem_ctx;
60    bi_builder *b;
61    bi_index zero, one, n4567;
62 };
63 
TEST_F(ValhallPacking,Moves)64 TEST_F(ValhallPacking, Moves)
65 {
66    CASE(bi_mov_i32_to(b, bi_register(1), bi_register(2)),
67         0x0091c10000000002ULL);
68    CASE(bi_mov_i32_to(b, bi_register(1),
69                       bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 5), false)),
70         0x0091c1000000008aULL);
71 }
72 
TEST_F(ValhallPacking,Fadd)73 TEST_F(ValhallPacking, Fadd)
74 {
75    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_register(2)),
76         0x00a4c00000000201ULL);
77    CASE(
78       bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_abs(bi_register(2))),
79       0x00a4c02000000201ULL);
80    CASE(
81       bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_neg(bi_register(2))),
82       0x00a4c01000000201ULL);
83 
84    CASE(bi_fadd_v2f16_to(b, bi_register(0),
85                          bi_swz_16(bi_register(1), false, false),
86                          bi_swz_16(bi_register(0), true, true)),
87         0x00a5c0000c000001ULL);
88 
89    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(1), bi_register(0)),
90         0x00a5c00028000001ULL);
91 
92    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(1),
93                          bi_swz_16(bi_register(0), true, false)),
94         0x00a5c00024000001ULL);
95 
96    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_discard(bi_abs(bi_register(0))),
97                          bi_neg(zero)),
98         0x00a5c0902800c040ULL);
99 
100    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), zero),
101         0x00a4c0000000c001ULL);
102 
103    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_neg(zero)),
104         0x00a4c0100000c001ULL);
105 
106    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
107                        bi_half(bi_register(0), true)),
108         0x00a4c00008000001ULL);
109 
110    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
111                        bi_half(bi_register(0), false)),
112         0x00a4c00004000001ULL);
113 }
114 
TEST_F(ValhallPacking,Clper)115 TEST_F(ValhallPacking, Clper)
116 {
117    CASE(bi_clper_i32_to(b, bi_register(0), bi_register(0), bi_byte(n4567, 0),
118                         BI_INACTIVE_RESULT_F1, BI_LANE_OP_NONE,
119                         BI_SUBGROUP_SUBGROUP16),
120         0x00a0c030128fc900);
121 }
122 
TEST_F(ValhallPacking,Clamps)123 TEST_F(ValhallPacking, Clamps)
124 {
125    bi_instr *I = bi_fadd_f32_to(b, bi_register(0), bi_register(1),
126                                 bi_neg(bi_abs(bi_register(2))));
127    CASE(I, 0x00a4c03000000201ULL);
128 
129    I->clamp = BI_CLAMP_CLAMP_M1_1;
130    CASE(I, 0x00a4c03200000201ULL);
131 }
132 
TEST_F(ValhallPacking,Misc)133 TEST_F(ValhallPacking, Misc)
134 {
135    CASE(bi_fma_f32_to(b, bi_register(1), bi_discard(bi_register(1)),
136                       bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 4), false),
137                       bi_neg(zero)),
138         0x00b2c10400c08841ULL);
139 
140    CASE(bi_fround_f32_to(b, bi_register(2), bi_discard(bi_neg(bi_register(2))),
141                          BI_ROUND_RTN),
142         0x0090c240800d0042ULL);
143 
144    CASE(bi_fround_v2f16_to(b, bi_half(bi_register(0), false), bi_register(0),
145                            BI_ROUND_RTN),
146         0x00904000a00f0000ULL);
147 
148    CASE(
149       bi_fround_v2f16_to(b, bi_half(bi_register(0), false),
150                          bi_swz_16(bi_register(1), true, false), BI_ROUND_RTN),
151       0x00904000900f0001ULL);
152 }
153 
TEST_F(ValhallPacking,FaddImm)154 TEST_F(ValhallPacking, FaddImm)
155 {
156    CASE(bi_fadd_imm_f32_to(b, bi_register(2), bi_discard(bi_register(2)),
157                            0x4847C6C0),
158         0x0114C24847C6C042ULL);
159 
160    CASE(bi_fadd_imm_v2f16_to(b, bi_register(2), bi_discard(bi_register(2)),
161                              0x70AC6784),
162         0x0115C270AC678442ULL);
163 }
164 
TEST_F(ValhallPacking,Comparions)165 TEST_F(ValhallPacking, Comparions)
166 {
167    CASE(bi_icmp_or_v2s16_to(b, bi_register(2),
168                             bi_discard(bi_swz_16(bi_register(3), true, false)),
169                             bi_discard(bi_swz_16(bi_register(2), true, false)),
170                             zero, BI_CMPF_GT, BI_RESULT_TYPE_M1),
171         0x00f9c21184c04243);
172 
173    CASE(bi_fcmp_or_v2f16_to(b, bi_register(2),
174                             bi_discard(bi_swz_16(bi_register(3), true, false)),
175                             bi_discard(bi_swz_16(bi_register(2), false, false)),
176                             zero, BI_CMPF_GT, BI_RESULT_TYPE_M1),
177         0x00f5c20190c04243);
178 }
179 
TEST_F(ValhallPacking,Conversions)180 TEST_F(ValhallPacking, Conversions)
181 {
182    CASE(bi_v2s16_to_v2f16_to(b, bi_register(2), bi_discard(bi_register(2))),
183         0x0090c22000070042);
184 }
185 
TEST_F(ValhallPacking,BranchzI16)186 TEST_F(ValhallPacking, BranchzI16)
187 {
188    bi_instr *I =
189       bi_branchz_i16(b, bi_half(bi_register(2), false), bi_null(), BI_CMPF_EQ);
190    I->branch_offset = 1;
191    CASE(I, 0x001fc03000000102);
192 }
193 
TEST_F(ValhallPacking,BranchzI16Backwards)194 TEST_F(ValhallPacking, BranchzI16Backwards)
195 {
196    bi_instr *I = bi_branchz_i16(b, zero, bi_null(), BI_CMPF_EQ);
197    I->branch_offset = -8;
198    CASE(I, 0x001fc017fffff8c0);
199 }
200 
TEST_F(ValhallPacking,Blend)201 TEST_F(ValhallPacking, Blend)
202 {
203    CASE(
204       bi_blend_to(b, bi_null(), bi_register(0), bi_register(60),
205                   bi_fau(BIR_FAU_BLEND_0, false), bi_fau(BIR_FAU_BLEND_0, true),
206                   bi_null(), BI_REGISTER_FORMAT_F16, 2, 0),
207       0x007f4004333c00f0);
208 }
209 
TEST_F(ValhallPacking,Mux)210 TEST_F(ValhallPacking, Mux)
211 {
212    CASE(bi_mux_i32_to(b, bi_register(0), bi_discard(bi_register(0)),
213                       bi_discard(bi_register(4)),
214                       bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 0), false),
215                       BI_MUX_BIT),
216         0x00b8c00300804440ull);
217 }
218 
TEST_F(ValhallPacking,AtestFP16)219 TEST_F(ValhallPacking, AtestFP16)
220 {
221    CASE(bi_atest_to(b, bi_register(60), bi_register(60),
222                     bi_half(bi_register(1), true),
223                     bi_fau(BIR_FAU_ATEST_PARAM, false)),
224         0x007dbc0208ea013c);
225 }
226 
TEST_F(ValhallPacking,AtestFP32)227 TEST_F(ValhallPacking, AtestFP32)
228 {
229    CASE(bi_atest_to(b, bi_register(60), bi_register(60), one,
230                     bi_fau(BIR_FAU_ATEST_PARAM, false)),
231         0x007dbc0200ead03c);
232 }
233 
TEST_F(ValhallPacking,Transcendentals)234 TEST_F(ValhallPacking, Transcendentals)
235 {
236    CASE(bi_frexpm_f32_to(b, bi_register(1), bi_register(0), false, true),
237         0x0099c10001000000);
238 
239    CASE(bi_frexpe_f32_to(b, bi_register(0), bi_discard(bi_register(0)), false,
240                          true),
241         0x0099c00001020040);
242 
243    CASE(bi_frsq_f32_to(b, bi_register(2), bi_register(1)), 0x009cc20000020001);
244 
245    CASE(bi_fma_rscale_f32_to(b, bi_register(0), bi_discard(bi_register(1)),
246                              bi_discard(bi_register(2)), bi_neg(zero),
247                              bi_discard(bi_register(0)), BI_SPECIAL_LEFT),
248         0x0162c00440c04241);
249 }
250 
TEST_F(ValhallPacking,Csel)251 TEST_F(ValhallPacking, Csel)
252 {
253    CASE(bi_csel_u32_to(b, bi_register(1), bi_discard(bi_register(2)),
254                        bi_discard(bi_register(3)),
255                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), false),
256                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), true),
257                        BI_CMPF_EQ),
258         0x0150c10085844342);
259 
260    CASE(bi_csel_u32_to(b, bi_register(1), bi_discard(bi_register(2)),
261                        bi_discard(bi_register(3)),
262                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), false),
263                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), true),
264                        BI_CMPF_LT),
265         0x0150c10485844342);
266 
267    CASE(bi_csel_s32_to(b, bi_register(1), bi_discard(bi_register(2)),
268                        bi_discard(bi_register(3)),
269                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), false),
270                        bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 2), true),
271                        BI_CMPF_LT),
272         0x0158c10485844342);
273 }
274 
TEST_F(ValhallPacking,LdAttrImm)275 TEST_F(ValhallPacking, LdAttrImm)
276 {
277    bi_instr *I = bi_ld_attr_imm_to(
278       b, bi_register(0), bi_discard(bi_register(60)),
279       bi_discard(bi_register(61)), BI_REGISTER_FORMAT_F16, BI_VECSIZE_V4, 1);
280    I->table = 1;
281 
282    CASE(I, 0x0066800433117d7c);
283 }
284 
TEST_F(ValhallPacking,LdVarBufImmF16)285 TEST_F(ValhallPacking, LdVarBufImmF16)
286 {
287    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(2), bi_register(61),
288                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_CENTER,
289                                  BI_SOURCE_FORMAT_F16, BI_UPDATE_RETRIEVE,
290                                  BI_VECSIZE_V4, 0),
291         0x005d82143300003d);
292 
293    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(0), bi_register(61),
294                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_SAMPLE,
295                                  BI_SOURCE_FORMAT_F16, BI_UPDATE_STORE,
296                                  BI_VECSIZE_V4, 0),
297         0x005d80843300003d);
298 
299    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(0), bi_register(61),
300                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_CENTROID,
301                                  BI_SOURCE_FORMAT_F16, BI_UPDATE_STORE,
302                                  BI_VECSIZE_V4, 8),
303         0x005d80443308003d);
304 }
305 
TEST_F(ValhallPacking,LeaBufImm)306 TEST_F(ValhallPacking, LeaBufImm)
307 {
308    CASE(bi_lea_buf_imm_to(b, bi_register(4), bi_discard(bi_register(59))),
309         0x005e840400000d7b);
310 }
311 
TEST_F(ValhallPacking,StoreSegment)312 TEST_F(ValhallPacking, StoreSegment)
313 {
314    CASE(bi_store_i96(b, bi_register(0), bi_discard(bi_register(4)),
315                      bi_discard(bi_register(5)), BI_SEG_VARY, 0),
316         0x0061400632000044);
317 }
318 
TEST_F(ValhallPacking,Convert16To32)319 TEST_F(ValhallPacking, Convert16To32)
320 {
321    CASE(bi_u16_to_u32_to(b, bi_register(2),
322                          bi_discard(bi_swz_16(bi_register(55), false, false))),
323         0x0090c20000140077);
324 
325    CASE(bi_u16_to_u32_to(b, bi_register(2),
326                          bi_discard(bi_swz_16(bi_register(55), true, false))),
327         0x0090c20010140077);
328 
329    CASE(bi_u16_to_f32_to(b, bi_register(2),
330                          bi_discard(bi_swz_16(bi_register(55), false, false))),
331         0x0090c20000150077);
332 
333    CASE(bi_u16_to_f32_to(b, bi_register(2),
334                          bi_discard(bi_swz_16(bi_register(55), true, false))),
335         0x0090c20010150077);
336 
337    CASE(bi_s16_to_s32_to(b, bi_register(2),
338                          bi_discard(bi_swz_16(bi_register(55), false, false))),
339         0x0090c20000040077);
340 
341    CASE(bi_s16_to_s32_to(b, bi_register(2),
342                          bi_discard(bi_swz_16(bi_register(55), true, false))),
343         0x0090c20010040077);
344 }
345 
TEST_F(ValhallPacking,Swizzle8)346 TEST_F(ValhallPacking, Swizzle8)
347 {
348    CASE(bi_icmp_or_v4u8_to(b, bi_register(1), bi_byte(bi_register(0), 0), zero,
349                            zero, BI_CMPF_NE, BI_RESULT_TYPE_I1),
350         0x00f2c14300c0c000);
351 }
352 
TEST_F(ValhallPacking,FauPage1)353 TEST_F(ValhallPacking, FauPage1)
354 {
355    CASE(bi_mov_i32_to(b, bi_register(1),
356                       bi_fau((enum bir_fau)(BIR_FAU_UNIFORM | 32), false)),
357         0x0291c10000000080ULL);
358 }
359 
TEST_F(ValhallPacking,LdTileV3F16)360 TEST_F(ValhallPacking, LdTileV3F16)
361 {
362    CASE(bi_ld_tile_to(b, bi_register(4), bi_discard(bi_register(0)),
363                       bi_register(60), bi_register(3), BI_REGISTER_FORMAT_F16,
364                       BI_VECSIZE_V3),
365         0x0078840423033c40);
366 }
367 
TEST_F(ValhallPacking,Rhadd8)368 TEST_F(ValhallPacking, Rhadd8)
369 {
370    CASE(bi_hadd_v4s8_to(b, bi_register(0), bi_discard(bi_register(1)),
371                         bi_discard(bi_register(0)), BI_ROUND_RTP),
372         0x00aac000400b4041);
373 }
374