• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "va_compiler.h"
25 #include "bi_test.h"
26 #include "bi_builder.h"
27 
28 #include <gtest/gtest.h>
29 
30 #define CASE(instr, expected) do { \
31    uint64_t _value = va_pack_instr(instr); \
32    if (_value != expected) { \
33       fprintf(stderr, "Got %" PRIx64 ", expected %" PRIx64 "\n", _value, (uint64_t) expected); \
34       bi_print_instr(instr, stderr); \
35       fprintf(stderr, "\n"); \
36       ADD_FAILURE(); \
37    } \
38 } while(0)
39 
40 class ValhallPacking : public testing::Test {
41 protected:
ValhallPacking()42    ValhallPacking() {
43       mem_ctx = ralloc_context(NULL);
44       b = bit_builder(mem_ctx);
45 
46       zero = bi_fau((enum bir_fau) (BIR_FAU_IMMEDIATE | 0), false);
47       one = bi_fau((enum bir_fau) (BIR_FAU_IMMEDIATE | 8), false);
48       n4567 = bi_fau((enum bir_fau) (BIR_FAU_IMMEDIATE | 4), true);
49    }
50 
~ValhallPacking()51    ~ValhallPacking() {
52       ralloc_free(mem_ctx);
53    }
54 
55    void *mem_ctx;
56    bi_builder *b;
57    bi_index zero, one, n4567;
58 };
59 
TEST_F(ValhallPacking,Moves)60 TEST_F(ValhallPacking, Moves) {
61    CASE(bi_mov_i32_to(b, bi_register(1), bi_register(2)),
62          0x0091c10000000002ULL);
63    CASE(bi_mov_i32_to(b, bi_register(1), bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 5), false)),
64          0x0091c1000000008aULL);
65 }
66 
TEST_F(ValhallPacking,Fadd)67 TEST_F(ValhallPacking, Fadd) {
68    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_register(2)),
69          0x00a4c00000000201ULL);
70    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_abs(bi_register(2))),
71          0x00a4c02000000201ULL);
72    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1), bi_neg(bi_register(2))),
73          0x00a4c01000000201ULL);
74 
75    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_swz_16(bi_register(1), false, false),
76                          bi_swz_16(bi_register(0), true, true)),
77          0x00a5c0000c000001ULL);
78 
79    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(1), bi_register(0)),
80          0x00a5c00028000001ULL);
81 
82    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(1),
83                          bi_swz_16(bi_register(0), true, false)),
84          0x00a5c00024000001ULL);
85 
86    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_discard(bi_abs(bi_register(0))),
87                          bi_neg(zero)),
88          0x00a5c0902800c040ULL);
89 
90    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
91                        zero),
92          0x00a4c0000000c001ULL);
93 
94    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
95                        bi_neg(zero)),
96          0x00a4c0100000c001ULL);
97 
98    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
99                        bi_half(bi_register(0), true)),
100          0x00a4c00008000001ULL);
101 
102    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(1),
103                        bi_half(bi_register(0), false)),
104          0x00a4c00004000001ULL);
105 }
106 
TEST_F(ValhallPacking,Clper)107 TEST_F(ValhallPacking, Clper) {
108    CASE(bi_clper_i32_to(b, bi_register(0), bi_register(0), bi_byte(n4567, 0),
109                         BI_INACTIVE_RESULT_F1, BI_LANE_OP_NONE, BI_SUBGROUP_SUBGROUP16),
110          0x00a0c030128fc900);
111 }
112 
TEST_F(ValhallPacking,Clamps)113 TEST_F(ValhallPacking, Clamps) {
114    bi_instr *I = bi_fadd_f32_to(b, bi_register(0), bi_register(1),
115                                 bi_neg(bi_abs(bi_register(2))));
116    CASE(I, 0x00a4c03000000201ULL);
117 
118    I->clamp = BI_CLAMP_CLAMP_M1_1;
119    CASE(I, 0x00a4c03200000201ULL);
120 }
121 
TEST_F(ValhallPacking,Misc)122 TEST_F(ValhallPacking, Misc) {
123    CASE(bi_fma_f32_to(b, bi_register(1), bi_discard(bi_register(1)),
124                          bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 4), false),
125                          bi_neg(zero)),
126          0x00b2c10400c08841ULL);
127 
128    CASE(bi_fround_f32_to(b, bi_register(2), bi_discard(bi_neg(bi_register(2))),
129                          BI_ROUND_RTN),
130          0x0090c240800d0042ULL);
131 
132    CASE(bi_fround_v2f16_to(b, bi_half(bi_register(0), false), bi_register(0),
133                          BI_ROUND_RTN),
134          0x00904000a00f0000ULL);
135 
136    CASE(bi_fround_v2f16_to(b, bi_half(bi_register(0), false),
137                            bi_swz_16(bi_register(1), true, false), BI_ROUND_RTN),
138          0x00904000900f0001ULL);
139 }
140 
TEST_F(ValhallPacking,FaddImm)141 TEST_F(ValhallPacking, FaddImm) {
142    CASE(bi_fadd_imm_f32_to(b, bi_register(2), bi_discard(bi_register(2)), 0x4847C6C0),
143          0x0114C24847C6C042ULL);
144 
145    CASE(bi_fadd_imm_v2f16_to(b, bi_register(2), bi_discard(bi_register(2)), 0x70AC6784),
146          0x0115C270AC678442ULL);
147 }
148 
TEST_F(ValhallPacking,Comparions)149 TEST_F(ValhallPacking, Comparions) {
150    bi_instr *I =
151       bi_icmp_v2s16_to(b, bi_register(2),
152             bi_discard(bi_swz_16(bi_register(3), true, false)),
153             bi_discard(bi_swz_16(bi_register(2), true, false)),
154             BI_CMPF_GT,
155             BI_RESULT_TYPE_M1);
156    I->src[2] = zero; // TODO: model in the IR
157 
158    CASE(I, 0x00f9c21184c04243);
159 
160    I->op = BI_OPCODE_FCMP_V2F16;
161    I->src[1] = bi_discard(bi_swz_16(bi_register(2), false, false));
162    CASE(I, 0x00f5c20190c04243);
163 }
164 
TEST_F(ValhallPacking,Conversions)165 TEST_F(ValhallPacking, Conversions) {
166    CASE(bi_v2s16_to_v2f16_to(b, bi_register(2), bi_discard(bi_register(2))),
167          0x0090c22000070042);
168 }
169 
TEST_F(ValhallPacking,BranchzI16)170 TEST_F(ValhallPacking, BranchzI16) {
171    bi_instr *I = bi_branchz_i16(b, bi_half(bi_register(2), false), bi_null(), BI_CMPF_EQ);
172    I->branch_offset = 1;
173    CASE(I, 0x001fc03000000102);
174 }
175 
TEST_F(ValhallPacking,BranchzI16Backwards)176 TEST_F(ValhallPacking, BranchzI16Backwards) {
177    bi_instr *I = bi_branchz_i16(b, zero, bi_null(), BI_CMPF_EQ);
178    I->branch_offset = -8;
179    CASE(I, 0x001fc017fffff8c0);
180 }
181 
TEST_F(ValhallPacking,Blend)182 TEST_F(ValhallPacking, Blend) {
183    CASE(bi_blend_to(b, bi_null(), bi_register(0), bi_register(60),
184                        bi_fau(BIR_FAU_BLEND_0, false),
185                        bi_fau(BIR_FAU_BLEND_0, true),
186                        bi_null(), BI_REGISTER_FORMAT_F16, 2, 0),
187         0x007f4004333c00f0);
188 }
189 
TEST_F(ValhallPacking,Mux)190 TEST_F(ValhallPacking, Mux) {
191    CASE(bi_mux_i32_to(b, bi_register(0), bi_discard(bi_register(0)),
192                       bi_discard(bi_register(4)),
193                       bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 0), false), BI_MUX_BIT),
194         0x00b8c00300804440ull);
195 }
196 
TEST_F(ValhallPacking,AtestFP16)197 TEST_F(ValhallPacking, AtestFP16) {
198    bi_instr *I = bi_atest_to(b, bi_register(60), bi_register(60),
199          bi_half(bi_register(1), true));
200    I->src[2] = bi_fau(BIR_FAU_ATEST_PARAM, false);
201 
202    CASE(I, 0x007dbc0208ea013c);
203 }
204 
TEST_F(ValhallPacking,AtestFP32)205 TEST_F(ValhallPacking, AtestFP32) {
206    bi_instr *I = bi_atest_to(b, bi_register(60), bi_register(60), one);
207    I->src[2] = bi_fau(BIR_FAU_ATEST_PARAM, false);
208    CASE(I, 0x007dbc0200ead03c);
209 }
210 
TEST_F(ValhallPacking,Transcendentals)211 TEST_F(ValhallPacking, Transcendentals) {
212    CASE(bi_frexpm_f32_to(b, bi_register(1), bi_register(0), false, true),
213         0x0099c10001000000);
214 
215    CASE(bi_frexpe_f32_to(b, bi_register(0), bi_discard(bi_register(0)), false, true),
216         0x0099c00001020040);
217 
218    CASE(bi_frsq_f32_to(b, bi_register(2), bi_register(1)),
219         0x009cc20000020001);
220 
221    CASE(bi_fma_rscale_f32_to(b, bi_register(0), bi_discard(bi_register(1)), bi_discard(bi_register(2)), bi_neg(zero), bi_discard(bi_register(0)), BI_SPECIAL_LEFT),
222         0x0162c00440c04241);
223 }
224 
TEST_F(ValhallPacking,Csel)225 TEST_F(ValhallPacking, Csel) {
226    CASE(bi_csel_u32_to(b, bi_register(1), bi_discard(bi_register(2)),
227                        bi_discard(bi_register(3)),
228                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), false),
229                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), true),
230                        BI_CMPF_EQ),
231         0x0150c10085844342);
232 
233    CASE(bi_csel_u32_to(b, bi_register(1), bi_discard(bi_register(2)),
234                        bi_discard(bi_register(3)),
235                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), false),
236                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), true),
237                        BI_CMPF_LT),
238         0x0150c10485844342);
239 
240    CASE(bi_csel_s32_to(b, bi_register(1), bi_discard(bi_register(2)),
241                        bi_discard(bi_register(3)),
242                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), false),
243                        bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 2), true),
244                        BI_CMPF_LT),
245         0x0158c10485844342);
246 }
247 
TEST_F(ValhallPacking,LdAttrImm)248 TEST_F(ValhallPacking, LdAttrImm) {
249    bi_instr *I = bi_ld_attr_imm_to(b, bi_register(0),
250                                    bi_discard(bi_register(60)),
251                                    bi_discard(bi_register(61)),
252                                    BI_REGISTER_FORMAT_F16, BI_VECSIZE_V4, 1);
253    I->table = 1;
254 
255    CASE(I, 0x0066800433117d7c);
256 }
257 
TEST_F(ValhallPacking,LdVarBufImmF16)258 TEST_F(ValhallPacking, LdVarBufImmF16) {
259    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(2), bi_register(61),
260                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_CENTER,
261                                  BI_SOURCE_FORMAT_F16,
262                                  BI_UPDATE_RETRIEVE, BI_VECSIZE_V4, 0),
263         0x005d82143300003d);
264 
265    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(0), bi_register(61),
266                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_SAMPLE,
267                                  BI_SOURCE_FORMAT_F16,
268                                  BI_UPDATE_STORE, BI_VECSIZE_V4, 0),
269          0x005d80843300003d);
270 
271    CASE(bi_ld_var_buf_imm_f16_to(b, bi_register(0), bi_register(61),
272                                  BI_REGISTER_FORMAT_F16, BI_SAMPLE_CENTROID,
273                                  BI_SOURCE_FORMAT_F16,
274                                  BI_UPDATE_STORE, BI_VECSIZE_V4, 8),
275          0x005d80443308003d);
276 }
277 
TEST_F(ValhallPacking,LeaBufImm)278 TEST_F(ValhallPacking, LeaBufImm) {
279    CASE(bi_lea_buf_imm_to(b, bi_register(4), bi_discard(bi_register(59))),
280         0x005e840400000d7b);
281 }
282 
TEST_F(ValhallPacking,StoreSegment)283 TEST_F(ValhallPacking, StoreSegment) {
284    CASE(bi_store_i96(b, bi_register(0), bi_discard(bi_register(4)),
285                         bi_discard(bi_register(5)), BI_SEG_VARY, 0),
286         0x0061400632000044);
287 }
288 
TEST_F(ValhallPacking,Convert16To32)289 TEST_F(ValhallPacking, Convert16To32) {
290    CASE(bi_u16_to_u32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), false, false))),
291          0x0090c20000140077);
292 
293    CASE(bi_u16_to_u32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), true, false))),
294          0x0090c20010140077);
295 
296    CASE(bi_u16_to_f32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), false, false))),
297          0x0090c20000150077);
298 
299    CASE(bi_u16_to_f32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), true, false))),
300          0x0090c20010150077);
301 
302    CASE(bi_s16_to_s32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), false, false))),
303          0x0090c20000040077);
304 
305    CASE(bi_s16_to_s32_to(b, bi_register(2), bi_discard(bi_swz_16(bi_register(55), true, false))),
306          0x0090c20010040077);
307 }
308 
TEST_F(ValhallPacking,Swizzle8)309 TEST_F(ValhallPacking, Swizzle8) {
310    bi_instr *I = bi_icmp_v4u8_to(b, bi_register(1), bi_byte(bi_register(0), 0),
311                                  zero, BI_CMPF_NE, BI_RESULT_TYPE_I1);
312    I->src[2] = zero; // TODO: model in the IR
313 
314    CASE(I, 0x00f2c14300c0c000);
315 }
316 
TEST_F(ValhallPacking,FauPage1)317 TEST_F(ValhallPacking, FauPage1) {
318    CASE(bi_mov_i32_to(b, bi_register(1), bi_fau((enum bir_fau) (BIR_FAU_UNIFORM | 32), false)),
319          0x0291c10000000080ULL);
320 }
321 
TEST_F(ValhallPacking,LdTileV3F16)322 TEST_F(ValhallPacking, LdTileV3F16) {
323    CASE(bi_ld_tile_to(b, bi_register(4), bi_discard(bi_register(0)),
324                          bi_register(60), bi_register(3),
325                          BI_REGISTER_FORMAT_F16, BI_VECSIZE_V3),
326         0x0078840423033c40);
327 }
328