xref: /aosp_15_r20/external/mesa3d/src/panfrost/compiler/valhall/test/test-lower-constants.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 static inline void
add_imm(bi_context * ctx)31 add_imm(bi_context *ctx)
32 {
33    bi_foreach_instr_global(ctx, I) {
34       va_lower_constants(ctx, I);
35    }
36 }
37 
38 #define CASE(instr, expected) INSTRUCTION_CASE(instr, expected, add_imm)
39 
40 class LowerConstants : public testing::Test {
41  protected:
LowerConstants()42    LowerConstants()
43    {
44       mem_ctx = ralloc_context(NULL);
45    }
46 
~LowerConstants()47    ~LowerConstants()
48    {
49       ralloc_free(mem_ctx);
50    }
51 
52    void *mem_ctx;
53 };
54 
TEST_F(LowerConstants,Float32)55 TEST_F(LowerConstants, Float32)
56 {
57    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(0.0)),
58         bi_fadd_f32_to(b, bi_register(0), bi_register(0), va_lut(0)));
59 
60    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(1.0)),
61         bi_fadd_f32_to(b, bi_register(0), bi_register(0), va_lut(16)));
62 
63    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(0.1)),
64         bi_fadd_f32_to(b, bi_register(0), bi_register(0), va_lut(17)));
65 }
66 
TEST_F(LowerConstants,WidenFloat16)67 TEST_F(LowerConstants, WidenFloat16)
68 {
69    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(0.5)),
70         bi_fadd_f32_to(b, bi_register(0), bi_register(0),
71                        bi_half(va_lut(26), 1)));
72 
73    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(255.0)),
74         bi_fadd_f32_to(b, bi_register(0), bi_register(0),
75                        bi_half(va_lut(23), 0)));
76 
77    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(256.0)),
78         bi_fadd_f32_to(b, bi_register(0), bi_register(0),
79                        bi_half(va_lut(23), 1)));
80 
81    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(8.0)),
82         bi_fadd_f32_to(b, bi_register(0), bi_register(0),
83                        bi_half(va_lut(30), 1)));
84 }
85 
TEST_F(LowerConstants,ReplicateFloat16)86 TEST_F(LowerConstants, ReplicateFloat16)
87 {
88    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_imm_f16(255.0)),
89         bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
90                          bi_half(va_lut(23), 0)));
91 
92    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_imm_f16(4.0)),
93         bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
94                          bi_half(va_lut(29), 1)));
95 }
96 
TEST_F(LowerConstants,NegateFloat32)97 TEST_F(LowerConstants, NegateFloat32)
98 {
99    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(-1.0)),
100         bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_neg(va_lut(16))));
101 
102    CASE(bi_fadd_f32_to(b, bi_register(0), bi_register(0), bi_imm_f32(-255.0)),
103         bi_fadd_f32_to(b, bi_register(0), bi_register(0),
104                        bi_neg(bi_half(va_lut(23), 0))));
105 }
106 
TEST_F(LowerConstants,NegateReplicateFloat16)107 TEST_F(LowerConstants, NegateReplicateFloat16)
108 {
109    CASE(bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_imm_f16(-255.0)),
110         bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
111                          bi_neg(bi_half(va_lut(23), 0))));
112 }
113 
TEST_F(LowerConstants,NegateVec2Float16)114 TEST_F(LowerConstants, NegateVec2Float16)
115 {
116    CASE(
117       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
118                        bi_imm_u32(0xBC008000)),
119       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_neg(va_lut(27))));
120 }
121 
TEST_F(LowerConstants,Int8InInt32)122 TEST_F(LowerConstants, Int8InInt32)
123 {
124    CASE(bi_lshift_or_i32(b, bi_register(0), bi_imm_u32(0), bi_imm_u8(6)),
125         bi_lshift_or_i32(b, bi_register(0), va_lut(0), bi_byte(va_lut(9), 2)));
126 
127    CASE(bi_lshift_or_i32(b, bi_register(0), bi_imm_u32(0), bi_imm_u8(-2)),
128         bi_lshift_or_i32(b, bi_register(0), va_lut(0), bi_byte(va_lut(3), 0)));
129 }
130 
TEST_F(LowerConstants,ZeroExtendForUnsigned)131 TEST_F(LowerConstants, ZeroExtendForUnsigned)
132 {
133    CASE(bi_icmp_and_u32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0xFF),
134                            bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
135         bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
136                            bi_byte(va_lut(1), 0), bi_register(0), BI_CMPF_LT,
137                            BI_RESULT_TYPE_I1));
138 
139    CASE(
140       bi_icmp_and_u32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0xFFFF),
141                          bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
142       bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
143                          bi_half(va_lut(1), 0), bi_register(0), BI_CMPF_LT,
144                          BI_RESULT_TYPE_I1));
145 }
146 
TEST_F(LowerConstants,SignExtendPositiveForSigned)147 TEST_F(LowerConstants, SignExtendPositiveForSigned)
148 {
149    CASE(bi_icmp_and_s32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0x7F),
150                            bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
151         bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
152                            bi_byte(va_lut(2), 3), bi_register(0), BI_CMPF_LT,
153                            BI_RESULT_TYPE_I1));
154 
155    CASE(
156       bi_icmp_and_s32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0x7FFF),
157                          bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
158       bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
159                          bi_half(va_lut(2), 1), bi_register(0), BI_CMPF_LT,
160                          BI_RESULT_TYPE_I1));
161 }
162 
TEST_F(LowerConstants,SignExtendNegativeForSigned)163 TEST_F(LowerConstants, SignExtendNegativeForSigned)
164 {
165    CASE(bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
166                            bi_imm_u32(0xFFFFFFF8), bi_register(0), BI_CMPF_LT,
167                            BI_RESULT_TYPE_I1),
168         bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
169                            bi_byte(va_lut(23), 0), bi_register(0), BI_CMPF_LT,
170                            BI_RESULT_TYPE_I1));
171 
172    CASE(bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
173                            bi_imm_u32(0xFFFFFAFC), bi_register(0), BI_CMPF_LT,
174                            BI_RESULT_TYPE_I1),
175         bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
176                            bi_half(va_lut(3), 1), bi_register(0), BI_CMPF_LT,
177                            BI_RESULT_TYPE_I1));
178 }
179 
TEST_F(LowerConstants,DontZeroExtendForSigned)180 TEST_F(LowerConstants, DontZeroExtendForSigned)
181 {
182    CASE(bi_icmp_and_s32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0xFF),
183                            bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
184         bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
185                            bi_iadd_imm_i32(b, va_lut(0), 0xFF), bi_register(0),
186                            BI_CMPF_LT, BI_RESULT_TYPE_I1));
187 
188    CASE(
189       bi_icmp_and_s32_to(b, bi_register(0), bi_register(0), bi_imm_u32(0xFFFF),
190                          bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1),
191       bi_icmp_and_s32_to(b, bi_register(0), bi_register(0),
192                          bi_iadd_imm_i32(b, va_lut(0), 0xFFFF), bi_register(0),
193                          BI_CMPF_LT, BI_RESULT_TYPE_I1));
194 }
195 
TEST_F(LowerConstants,DontZeroExtendNegative)196 TEST_F(LowerConstants, DontZeroExtendNegative)
197 {
198    CASE(bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
199                            bi_imm_u32(0xFFFFFFF8), bi_register(0), BI_CMPF_LT,
200                            BI_RESULT_TYPE_I1),
201         bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
202                            bi_iadd_imm_i32(b, va_lut(0), 0xFFFFFFF8),
203                            bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1));
204 
205    CASE(bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
206                            bi_imm_u32(0xFFFFFAFC), bi_register(0), BI_CMPF_LT,
207                            BI_RESULT_TYPE_I1),
208         bi_icmp_and_u32_to(b, bi_register(0), bi_register(0),
209                            bi_iadd_imm_i32(b, va_lut(0), 0xFFFFFAFC),
210                            bi_register(0), BI_CMPF_LT, BI_RESULT_TYPE_I1));
211 }
212 
TEST_F(LowerConstants,HandleTrickyNegativesFP16)213 TEST_F(LowerConstants, HandleTrickyNegativesFP16)
214 {
215    CASE(
216       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_imm_f16(-57216.0)),
217       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
218                        bi_half(va_lut(3), 1)));
219 
220    CASE(
221       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0), bi_imm_f16(57216.0)),
222       bi_fadd_v2f16_to(b, bi_register(0), bi_register(0),
223                        bi_neg(bi_half(va_lut(3), 1))));
224 }
225 
TEST_F(LowerConstants,MaintainMkvecRestrictedSwizzles)226 TEST_F(LowerConstants, MaintainMkvecRestrictedSwizzles)
227 {
228    CASE(bi_mkvec_v2i8_to(b, bi_register(0), bi_register(0), bi_imm_u8(0),
229                          bi_imm_u32(0)),
230         bi_mkvec_v2i8_to(b, bi_register(0), bi_register(0),
231                          bi_byte(va_lut(0), 0), va_lut(0)));
232 
233    CASE(bi_mkvec_v2i8_to(b, bi_register(0), bi_register(0), bi_imm_u8(14),
234                          bi_imm_u32(0)),
235         bi_mkvec_v2i8_to(b, bi_register(0), bi_register(0),
236                          bi_byte(va_lut(11), 2), va_lut(0)));
237 }
238