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