2 * Copyright © 2016 Intel Corporation
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:
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
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
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
24 #include <gtest/gtest.h>
26 #include "util/ralloc.h"
39 static const struct gen_info
{
61 class validation_test
: public ::testing::TestWithParam
<struct gen_info
> {
66 virtual ~validation_test();
68 struct brw_codegen
*p
;
69 struct gen_device_info devinfo
;
72 validation_test::validation_test()
74 p
= rzalloc(NULL
, struct brw_codegen
);
75 memset(&devinfo
, 0, sizeof(devinfo
));
78 validation_test::~validation_test()
83 void validation_test::SetUp()
85 struct gen_info info
= GetParam();
87 devinfo
.gen
= info
.gen
;
88 devinfo
.is_g4x
= info
.subgen
== IS_G45
;
89 devinfo
.is_baytrail
= info
.subgen
== IS_BYT
;
90 devinfo
.is_haswell
= info
.subgen
== IS_HSW
;
91 devinfo
.is_cherryview
= info
.subgen
== IS_CHV
;
92 devinfo
.is_broxton
= info
.subgen
== IS_BXT
;
93 devinfo
.is_kabylake
= info
.subgen
== IS_KBL
;
94 devinfo
.is_geminilake
= info
.subgen
== IS_GLK
;
95 devinfo
.is_coffeelake
= info
.subgen
== IS_CFL
;
97 brw_init_codegen(&devinfo
, p
, p
);
101 template <class ParamType
>
103 operator()(const ::testing::TestParamInfo
<ParamType
>& info
) const {
104 return info
.param
.name
;
108 INSTANTIATE_TEST_CASE_P(eu_assembly
, validation_test
,
109 ::testing::ValuesIn(gens
),
113 validate(struct brw_codegen
*p
)
115 const bool print
= getenv("TEST_DEBUG");
116 struct annotation_info annotation
;
117 memset(&annotation
, 0, sizeof(annotation
));
120 annotation
.mem_ctx
= ralloc_context(NULL
);
121 annotation
.ann_count
= 1;
122 annotation
.ann_size
= 2;
123 annotation
.ann
= rzalloc_array(annotation
.mem_ctx
, struct annotation
,
124 annotation
.ann_size
);
125 annotation
.ann
[annotation
.ann_count
].offset
= p
->next_insn_offset
;
128 bool ret
= brw_validate_instructions(p
->devinfo
, p
->store
, 0,
129 p
->next_insn_offset
, &annotation
);
132 dump_assembly(p
->store
, annotation
.ann_count
, annotation
.ann
, p
->devinfo
);
133 ralloc_free(annotation
.mem_ctx
);
139 #define last_inst (&p->store[p->nr_insn - 1])
140 #define g0 brw_vec8_grf(0, 0)
141 #define null brw_null_reg()
142 #define zero brw_imm_f(0.0f)
145 clear_instructions(struct brw_codegen
*p
)
147 p
->next_insn_offset
= 0;
151 TEST_P(validation_test
, sanity
)
153 brw_ADD(p
, g0
, g0
, g0
);
155 EXPECT_TRUE(validate(p
));
158 TEST_P(validation_test
, src0_null_reg
)
160 brw_MOV(p
, g0
, null
);
162 EXPECT_FALSE(validate(p
));
165 TEST_P(validation_test
, src1_null_reg
)
167 brw_ADD(p
, g0
, g0
, null
);
169 EXPECT_FALSE(validate(p
));
172 TEST_P(validation_test
, math_src0_null_reg
)
174 if (devinfo
.gen
>= 6) {
175 gen6_math(p
, g0
, BRW_MATH_FUNCTION_SIN
, null
, null
);
177 gen4_math(p
, g0
, BRW_MATH_FUNCTION_SIN
, 0, null
, BRW_MATH_PRECISION_FULL
);
180 EXPECT_FALSE(validate(p
));
183 TEST_P(validation_test
, math_src1_null_reg
)
185 if (devinfo
.gen
>= 6) {
186 gen6_math(p
, g0
, BRW_MATH_FUNCTION_POW
, g0
, null
);
187 EXPECT_FALSE(validate(p
));
189 /* Math instructions on Gen4/5 are actually SEND messages with payloads.
190 * src1 is an immediate message descriptor set by gen4_math.
195 TEST_P(validation_test
, opcode46
)
197 /* opcode 46 is "push" on Gen 4 and 5
202 brw_next_insn(p
, 46);
204 if (devinfo
.gen
== 7) {
205 EXPECT_FALSE(validate(p
));
207 EXPECT_TRUE(validate(p
));
211 /* When the Execution Data Type is wider than the destination data type, the
212 * destination must [...] specify a HorzStride equal to the ratio in sizes of
213 * the two data types.
215 TEST_P(validation_test
, dest_stride_must_be_equal_to_the_ratio_of_exec_size_to_dest_size
)
217 brw_ADD(p
, g0
, g0
, g0
);
218 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
219 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
220 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
222 EXPECT_FALSE(validate(p
));
224 clear_instructions(p
);
226 brw_ADD(p
, g0
, g0
, g0
);
227 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
228 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
229 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
230 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
232 EXPECT_TRUE(validate(p
));
235 /* When the Execution Data Type is wider than the destination data type, the
236 * destination must be aligned as required by the wider execution data type
239 TEST_P(validation_test
, dst_subreg_must_be_aligned_to_exec_type_size
)
241 brw_ADD(p
, g0
, g0
, g0
);
242 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 2);
243 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
244 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
245 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
246 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
248 EXPECT_FALSE(validate(p
));
250 clear_instructions(p
);
252 brw_ADD(p
, g0
, g0
, g0
);
253 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_4
);
254 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 8);
255 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
256 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
257 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
258 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
259 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
260 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
261 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
262 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
263 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
264 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
266 EXPECT_TRUE(validate(p
));
269 /* ExecSize must be greater than or equal to Width. */
270 TEST_P(validation_test
, exec_size_less_than_width
)
272 brw_ADD(p
, g0
, g0
, g0
);
273 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_16
);
275 EXPECT_FALSE(validate(p
));
277 clear_instructions(p
);
279 brw_ADD(p
, g0
, g0
, g0
);
280 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_16
);
282 EXPECT_FALSE(validate(p
));
285 /* If ExecSize = Width and HorzStride ≠ 0,
286 * VertStride must be set to Width * HorzStride.
288 TEST_P(validation_test
, vertical_stride_is_width_by_horizontal_stride
)
290 brw_ADD(p
, g0
, g0
, g0
);
291 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
293 EXPECT_FALSE(validate(p
));
295 clear_instructions(p
);
297 brw_ADD(p
, g0
, g0
, g0
);
298 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
300 EXPECT_FALSE(validate(p
));
303 /* If Width = 1, HorzStride must be 0 regardless of the values
304 * of ExecSize and VertStride.
306 TEST_P(validation_test
, horizontal_stride_must_be_0_if_width_is_1
)
308 brw_ADD(p
, g0
, g0
, g0
);
309 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
310 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
311 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
313 EXPECT_FALSE(validate(p
));
315 clear_instructions(p
);
317 brw_ADD(p
, g0
, g0
, g0
);
318 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
319 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
320 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
322 EXPECT_FALSE(validate(p
));
325 /* If ExecSize = Width = 1, both VertStride and HorzStride must be 0. */
326 TEST_P(validation_test
, scalar_region_must_be_0_1_0
)
328 struct brw_reg g0_0
= brw_vec1_grf(0, 0);
330 brw_ADD(p
, g0
, g0
, g0_0
);
331 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_1
);
332 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_1
);
333 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
334 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
336 EXPECT_FALSE(validate(p
));
338 clear_instructions(p
);
340 brw_ADD(p
, g0
, g0_0
, g0
);
341 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_1
);
342 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_1
);
343 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
344 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
346 EXPECT_FALSE(validate(p
));
349 /* If VertStride = HorzStride = 0, Width must be 1 regardless of the value
352 TEST_P(validation_test
, zero_stride_implies_0_1_0
)
354 brw_ADD(p
, g0
, g0
, g0
);
355 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
356 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_2
);
357 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
359 EXPECT_FALSE(validate(p
));
361 clear_instructions(p
);
363 brw_ADD(p
, g0
, g0
, g0
);
364 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
365 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_2
);
366 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
368 EXPECT_FALSE(validate(p
));
371 /* Dst.HorzStride must not be 0. */
372 TEST_P(validation_test
, dst_horizontal_stride_0
)
374 brw_ADD(p
, g0
, g0
, g0
);
375 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
377 EXPECT_FALSE(validate(p
));
379 clear_instructions(p
);
381 brw_set_default_access_mode(p
, BRW_ALIGN_16
);
383 brw_ADD(p
, g0
, g0
, g0
);
384 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
386 EXPECT_FALSE(validate(p
));
389 /* VertStride must be used to cross BRW_GENERAL_REGISTER_FILE register boundaries. This rule implies
390 * that elements within a 'Width' cannot cross BRW_GENERAL_REGISTER_FILE boundaries.
392 TEST_P(validation_test
, must_not_cross_grf_boundary_in_a_width
)
394 brw_ADD(p
, g0
, g0
, g0
);
395 brw_inst_set_src0_da1_subreg_nr(&devinfo
, last_inst
, 4);
397 EXPECT_FALSE(validate(p
));
399 clear_instructions(p
);
401 brw_ADD(p
, g0
, g0
, g0
);
402 brw_inst_set_src1_da1_subreg_nr(&devinfo
, last_inst
, 4);
404 EXPECT_FALSE(validate(p
));
406 clear_instructions(p
);
408 brw_ADD(p
, g0
, g0
, g0
);
409 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
410 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
411 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
413 EXPECT_FALSE(validate(p
));
415 clear_instructions(p
);
417 brw_ADD(p
, g0
, g0
, g0
);
418 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
419 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
420 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
422 EXPECT_FALSE(validate(p
));
425 /* Destination Horizontal must be 1 in Align16 */
426 TEST_P(validation_test
, dst_hstride_on_align16_must_be_1
)
428 brw_set_default_access_mode(p
, BRW_ALIGN_16
);
430 brw_ADD(p
, g0
, g0
, g0
);
431 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
433 EXPECT_FALSE(validate(p
));
435 clear_instructions(p
);
437 brw_ADD(p
, g0
, g0
, g0
);
438 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
440 EXPECT_TRUE(validate(p
));
443 /* VertStride must be 0 or 4 in Align16 */
444 TEST_P(validation_test
, vstride_on_align16_must_be_0_or_4
)
447 enum brw_vertical_stride vstride
;
448 bool expected_result
;
450 { BRW_VERTICAL_STRIDE_0
, true },
451 { BRW_VERTICAL_STRIDE_1
, false },
452 { BRW_VERTICAL_STRIDE_2
, devinfo
.is_haswell
|| devinfo
.gen
>= 8 },
453 { BRW_VERTICAL_STRIDE_4
, true },
454 { BRW_VERTICAL_STRIDE_8
, false },
455 { BRW_VERTICAL_STRIDE_16
, false },
456 { BRW_VERTICAL_STRIDE_32
, false },
457 { BRW_VERTICAL_STRIDE_ONE_DIMENSIONAL
, false },
460 brw_set_default_access_mode(p
, BRW_ALIGN_16
);
462 for (unsigned i
= 0; i
< sizeof(vstride
) / sizeof(vstride
[0]); i
++) {
463 brw_ADD(p
, g0
, g0
, g0
);
464 brw_inst_set_src0_vstride(&devinfo
, last_inst
, vstride
[i
].vstride
);
466 EXPECT_EQ(vstride
[i
].expected_result
, validate(p
));
468 clear_instructions(p
);
471 for (unsigned i
= 0; i
< sizeof(vstride
) / sizeof(vstride
[0]); i
++) {
472 brw_ADD(p
, g0
, g0
, g0
);
473 brw_inst_set_src1_vstride(&devinfo
, last_inst
, vstride
[i
].vstride
);
475 EXPECT_EQ(vstride
[i
].expected_result
, validate(p
));
477 clear_instructions(p
);
481 /* In Direct Addressing mode, a source cannot span more than 2 adjacent BRW_GENERAL_REGISTER_FILE
484 TEST_P(validation_test
, source_cannot_span_more_than_2_registers
)
486 brw_ADD(p
, g0
, g0
, g0
);
487 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_32
);
488 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
489 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
490 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
491 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
492 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_8
);
493 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
495 EXPECT_FALSE(validate(p
));
497 clear_instructions(p
);
499 brw_ADD(p
, g0
, g0
, g0
);
500 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
501 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
502 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
503 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
504 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
505 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_8
);
506 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
507 brw_inst_set_src1_da1_subreg_nr(&devinfo
, last_inst
, 2);
509 EXPECT_TRUE(validate(p
));
511 clear_instructions(p
);
513 brw_ADD(p
, g0
, g0
, g0
);
514 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
516 EXPECT_TRUE(validate(p
));
519 /* A destination cannot span more than 2 adjacent BRW_GENERAL_REGISTER_FILE registers. */
520 TEST_P(validation_test
, destination_cannot_span_more_than_2_registers
)
522 brw_ADD(p
, g0
, g0
, g0
);
523 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_32
);
524 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
525 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
526 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
527 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
529 EXPECT_FALSE(validate(p
));
531 clear_instructions(p
);
533 brw_ADD(p
, g0
, g0
, g0
);
534 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_8
);
535 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 6);
536 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_4
);
537 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
538 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
539 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
540 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
541 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
542 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
543 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
544 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
545 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
547 EXPECT_TRUE(validate(p
));
550 TEST_P(validation_test
, src_region_spans_two_regs_dst_region_spans_one
)
552 /* Writes to dest are to the lower OWord */
553 brw_ADD(p
, g0
, g0
, g0
);
554 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
555 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
556 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
557 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
558 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
559 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
561 EXPECT_TRUE(validate(p
));
563 clear_instructions(p
);
565 /* Writes to dest are to the upper OWord */
566 brw_ADD(p
, g0
, g0
, g0
);
567 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 16);
568 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
569 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
570 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
571 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
572 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
573 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
575 EXPECT_TRUE(validate(p
));
577 clear_instructions(p
);
579 /* Writes to dest are evenly split between OWords */
580 brw_ADD(p
, g0
, g0
, g0
);
581 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
582 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
583 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
584 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
585 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
586 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_8
);
587 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
589 EXPECT_TRUE(validate(p
));
591 clear_instructions(p
);
593 /* Writes to dest are uneven between OWords */
594 brw_ADD(p
, g0
, g0
, g0
);
595 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_4
);
596 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 10);
597 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
598 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
599 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
600 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
601 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
602 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
603 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_16
);
604 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_2
);
605 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
607 if (devinfo
.gen
>= 9) {
608 EXPECT_TRUE(validate(p
));
610 EXPECT_FALSE(validate(p
));
614 TEST_P(validation_test
, dst_elements_must_be_evenly_split_between_registers
)
616 brw_ADD(p
, g0
, g0
, g0
);
617 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 4);
619 if (devinfo
.gen
>= 9) {
620 EXPECT_TRUE(validate(p
));
622 EXPECT_FALSE(validate(p
));
625 clear_instructions(p
);
627 brw_ADD(p
, g0
, g0
, g0
);
628 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
630 EXPECT_TRUE(validate(p
));
632 clear_instructions(p
);
634 if (devinfo
.gen
>= 6) {
635 gen6_math(p
, g0
, BRW_MATH_FUNCTION_SIN
, g0
, null
);
637 EXPECT_TRUE(validate(p
));
639 clear_instructions(p
);
641 gen6_math(p
, g0
, BRW_MATH_FUNCTION_SIN
, g0
, null
);
642 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 4);
644 EXPECT_FALSE(validate(p
));
648 TEST_P(validation_test
, two_src_two_dst_source_offsets_must_be_same
)
650 brw_ADD(p
, g0
, g0
, g0
);
651 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_4
);
652 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_4
);
653 brw_inst_set_src0_da1_subreg_nr(&devinfo
, last_inst
, 16);
654 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_2
);
655 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
656 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
657 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
658 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
659 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
661 if (devinfo
.gen
<= 7) {
662 EXPECT_FALSE(validate(p
));
664 EXPECT_TRUE(validate(p
));
667 clear_instructions(p
);
669 brw_ADD(p
, g0
, g0
, g0
);
670 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_4
);
671 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_4
);
672 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
673 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
674 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
675 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_8
);
676 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_2
);
677 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
679 EXPECT_TRUE(validate(p
));
683 TEST_P(validation_test
, two_src_two_dst_each_dst_must_be_derived_from_one_src
)
685 // mov (16) r10.0<2>:w r12.4<4;4,1>:w
688 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
689 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
690 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
691 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
692 brw_inst_set_src0_da1_subreg_nr(&devinfo
, last_inst
, 8);
693 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
694 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
695 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_4
);
697 EXPECT_FALSE(validate(p
));
699 clear_instructions(p
);
702 brw_ADD(p
, g0
, g0
, g0
);
703 brw_inst_set_src1_da1_subreg_nr(&devinfo
, last_inst
, 16);
704 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_4
);
705 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_4
);
706 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_1
);
708 EXPECT_FALSE(validate(p
));
713 TEST_P(validation_test
, one_src_two_dst
)
715 struct brw_reg g0_0
= brw_vec1_grf(0, 0);
717 brw_ADD(p
, g0
, g0_0
, g0_0
);
718 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
720 EXPECT_TRUE(validate(p
));
722 clear_instructions(p
);
724 brw_ADD(p
, g0
, g0
, g0
);
725 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
726 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_D
);
727 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
728 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
730 EXPECT_TRUE(validate(p
));
732 clear_instructions(p
);
734 brw_ADD(p
, g0
, g0
, g0
);
735 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
736 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
737 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
738 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
739 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
740 brw_inst_set_src1_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
741 brw_inst_set_src1_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
742 brw_inst_set_src1_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
744 if (devinfo
.gen
>= 8) {
745 EXPECT_TRUE(validate(p
));
747 EXPECT_FALSE(validate(p
));
750 clear_instructions(p
);
752 brw_ADD(p
, g0
, g0
, g0
);
753 brw_inst_set_exec_size(&devinfo
, last_inst
, BRW_EXECUTE_16
);
754 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
755 brw_inst_set_dst_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
756 brw_inst_set_src0_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
757 brw_inst_set_src0_vstride(&devinfo
, last_inst
, BRW_VERTICAL_STRIDE_0
);
758 brw_inst_set_src0_width(&devinfo
, last_inst
, BRW_WIDTH_1
);
759 brw_inst_set_src0_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_0
);
760 brw_inst_set_src1_file_type(&devinfo
, last_inst
, BRW_GENERAL_REGISTER_FILE
, BRW_REGISTER_TYPE_W
);
762 if (devinfo
.gen
>= 8) {
763 EXPECT_TRUE(validate(p
));
765 EXPECT_FALSE(validate(p
));
769 TEST_P(validation_test
, packed_byte_destination
)
771 static const struct {
772 enum brw_reg_type dst_type
;
773 enum brw_reg_type src_type
;
775 bool expected_result
;
777 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UB
, 0, 0, 0, true },
778 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_B
, 0, 0, 0, true },
779 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_B
, 0, 0, 0, true },
780 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_UB
, 0, 0, 0, true },
782 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UB
, 1, 0, 0, false },
783 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_B
, 1, 0, 0, false },
784 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_B
, 1, 0, 0, false },
785 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_UB
, 1, 0, 0, false },
787 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UB
, 0, 1, 0, false },
788 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_B
, 0, 1, 0, false },
789 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_B
, 0, 1, 0, false },
790 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_UB
, 0, 1, 0, false },
792 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UB
, 0, 0, 1, false },
793 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_B
, 0, 0, 1, false },
794 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_B
, 0, 0, 1, false },
795 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_UB
, 0, 0, 1, false },
797 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UW
, 0, 0, 0, false },
798 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_W
, 0, 0, 0, false },
799 { BRW_REGISTER_TYPE_UB
, BRW_REGISTER_TYPE_UD
, 0, 0, 0, false },
800 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_D
, 0, 0, 0, false },
803 for (unsigned i
= 0; i
< sizeof(move
) / sizeof(move
[0]); i
++) {
804 brw_MOV(p
, retype(g0
, move
[i
].dst_type
), retype(g0
, move
[i
].src_type
));
805 brw_inst_set_src0_negate(&devinfo
, last_inst
, move
[i
].neg
);
806 brw_inst_set_src0_abs(&devinfo
, last_inst
, move
[i
].abs
);
807 brw_inst_set_saturate(&devinfo
, last_inst
, move
[i
].sat
);
809 EXPECT_EQ(move
[i
].expected_result
, validate(p
));
811 clear_instructions(p
);
814 brw_SEL(p
, retype(g0
, BRW_REGISTER_TYPE_UB
),
815 retype(g0
, BRW_REGISTER_TYPE_UB
),
816 retype(g0
, BRW_REGISTER_TYPE_UB
));
817 brw_inst_set_pred_control(&devinfo
, last_inst
, BRW_PREDICATE_NORMAL
);
819 EXPECT_FALSE(validate(p
));
821 clear_instructions(p
);
823 brw_SEL(p
, retype(g0
, BRW_REGISTER_TYPE_B
),
824 retype(g0
, BRW_REGISTER_TYPE_B
),
825 retype(g0
, BRW_REGISTER_TYPE_B
));
826 brw_inst_set_pred_control(&devinfo
, last_inst
, BRW_PREDICATE_NORMAL
);
828 EXPECT_FALSE(validate(p
));
831 TEST_P(validation_test
, byte_destination_relaxed_alignment
)
833 brw_SEL(p
, retype(g0
, BRW_REGISTER_TYPE_B
),
834 retype(g0
, BRW_REGISTER_TYPE_W
),
835 retype(g0
, BRW_REGISTER_TYPE_W
));
836 brw_inst_set_pred_control(&devinfo
, last_inst
, BRW_PREDICATE_NORMAL
);
837 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
839 EXPECT_TRUE(validate(p
));
841 clear_instructions(p
);
843 brw_SEL(p
, retype(g0
, BRW_REGISTER_TYPE_B
),
844 retype(g0
, BRW_REGISTER_TYPE_W
),
845 retype(g0
, BRW_REGISTER_TYPE_W
));
846 brw_inst_set_pred_control(&devinfo
, last_inst
, BRW_PREDICATE_NORMAL
);
847 brw_inst_set_dst_hstride(&devinfo
, last_inst
, BRW_HORIZONTAL_STRIDE_2
);
848 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, 1);
850 if (devinfo
.gen
> 4 || devinfo
.is_g4x
) {
851 EXPECT_TRUE(validate(p
));
853 EXPECT_FALSE(validate(p
));
857 TEST_P(validation_test
, vector_immediate_destination_alignment
)
859 static const struct {
860 enum brw_reg_type dst_type
;
861 enum brw_reg_type src_type
;
864 bool expected_result
;
866 { BRW_REGISTER_TYPE_F
, BRW_REGISTER_TYPE_VF
, 0, BRW_EXECUTE_4
, true },
867 { BRW_REGISTER_TYPE_F
, BRW_REGISTER_TYPE_VF
, 16, BRW_EXECUTE_4
, true },
868 { BRW_REGISTER_TYPE_F
, BRW_REGISTER_TYPE_VF
, 1, BRW_EXECUTE_4
, false },
870 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, 0, BRW_EXECUTE_8
, true },
871 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, 16, BRW_EXECUTE_8
, true },
872 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, 1, BRW_EXECUTE_8
, false },
874 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, 0, BRW_EXECUTE_8
, true },
875 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, 16, BRW_EXECUTE_8
, true },
876 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, 1, BRW_EXECUTE_8
, false },
879 for (unsigned i
= 0; i
< sizeof(move
) / sizeof(move
[0]); i
++) {
880 /* UV type is Gen6+ */
881 if (devinfo
.gen
< 6 &&
882 move
[i
].src_type
== BRW_REGISTER_TYPE_UV
)
885 brw_MOV(p
, retype(g0
, move
[i
].dst_type
), retype(zero
, move
[i
].src_type
));
886 brw_inst_set_dst_da1_subreg_nr(&devinfo
, last_inst
, move
[i
].subnr
);
887 brw_inst_set_exec_size(&devinfo
, last_inst
, move
[i
].exec_size
);
889 EXPECT_EQ(move
[i
].expected_result
, validate(p
));
891 clear_instructions(p
);
895 TEST_P(validation_test
, vector_immediate_destination_stride
)
897 static const struct {
898 enum brw_reg_type dst_type
;
899 enum brw_reg_type src_type
;
901 bool expected_result
;
903 { BRW_REGISTER_TYPE_F
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_1
, true },
904 { BRW_REGISTER_TYPE_F
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_2
, false },
905 { BRW_REGISTER_TYPE_D
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_1
, true },
906 { BRW_REGISTER_TYPE_D
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_2
, false },
907 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_2
, true },
908 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_VF
, BRW_HORIZONTAL_STRIDE_4
, true },
910 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, BRW_HORIZONTAL_STRIDE_1
, true },
911 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, BRW_HORIZONTAL_STRIDE_2
, false },
912 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_V
, BRW_HORIZONTAL_STRIDE_4
, false },
913 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_V
, BRW_HORIZONTAL_STRIDE_2
, true },
915 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, BRW_HORIZONTAL_STRIDE_1
, true },
916 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, BRW_HORIZONTAL_STRIDE_2
, false },
917 { BRW_REGISTER_TYPE_W
, BRW_REGISTER_TYPE_UV
, BRW_HORIZONTAL_STRIDE_4
, false },
918 { BRW_REGISTER_TYPE_B
, BRW_REGISTER_TYPE_UV
, BRW_HORIZONTAL_STRIDE_2
, true },
921 for (unsigned i
= 0; i
< sizeof(move
) / sizeof(move
[0]); i
++) {
922 /* UV type is Gen6+ */
923 if (devinfo
.gen
< 6 &&
924 move
[i
].src_type
== BRW_REGISTER_TYPE_UV
)
927 brw_MOV(p
, retype(g0
, move
[i
].dst_type
), retype(zero
, move
[i
].src_type
));
928 brw_inst_set_dst_hstride(&devinfo
, last_inst
, move
[i
].stride
);
930 EXPECT_EQ(move
[i
].expected_result
, validate(p
));
932 clear_instructions(p
);