2 * Copyright © 2015 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>
27 #include "program/program.h"
31 class saturate_propagation_test
: public ::testing::Test
{
35 struct brw_compiler
*compiler
;
36 struct brw_device_info
*devinfo
;
37 struct gl_context
*ctx
;
38 struct brw_wm_prog_data
*prog_data
;
39 struct gl_shader_program
*shader_prog
;
40 struct brw_fragment_program
*fp
;
44 class saturate_propagation_fs_visitor
: public fs_visitor
47 saturate_propagation_fs_visitor(struct brw_compiler
*compiler
,
48 struct brw_wm_prog_data
*prog_data
,
50 : fs_visitor(compiler
, NULL
, NULL
, NULL
,
51 &prog_data
->base
, (struct gl_program
*) NULL
,
56 void saturate_propagation_test::SetUp()
58 ctx
= (struct gl_context
*)calloc(1, sizeof(*ctx
));
59 compiler
= (struct brw_compiler
*)calloc(1, sizeof(*compiler
));
60 devinfo
= (struct brw_device_info
*)calloc(1, sizeof(*devinfo
));
61 compiler
->devinfo
= devinfo
;
63 fp
= ralloc(NULL
, struct brw_fragment_program
);
64 prog_data
= ralloc(NULL
, struct brw_wm_prog_data
);
65 nir_shader
*shader
= nir_shader_create(NULL
, MESA_SHADER_FRAGMENT
, NULL
);
67 v
= new saturate_propagation_fs_visitor(compiler
, prog_data
, shader
);
69 _mesa_init_gl_program(&fp
->program
.Base
, GL_FRAGMENT_SHADER
, 0);
75 instruction(bblock_t
*block
, int num
)
77 fs_inst
*inst
= (fs_inst
*)block
->start();
78 for (int i
= 0; i
< num
; i
++) {
79 inst
= (fs_inst
*)inst
->next
;
85 saturate_propagation(fs_visitor
*v
)
87 const bool print
= false;
90 fprintf(stderr
, "= Before =\n");
94 bool ret
= v
->opt_saturate_propagation();
97 fprintf(stderr
, "\n= After =\n");
104 TEST_F(saturate_propagation_test
, basic
)
106 const fs_builder
&bld
= v
->bld
;
107 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
108 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
109 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
110 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
111 bld
.ADD(dst0
, src0
, src1
);
112 set_saturate(true, bld
.MOV(dst1
, dst0
));
116 * 0: add(8) dst0 src0 src1
117 * 1: mov.sat(8) dst1 dst0
120 * 0: add.sat(8) dst0 src0 src1
121 * 1: mov(8) dst1 dst0
125 bblock_t
*block0
= v
->cfg
->blocks
[0];
127 EXPECT_EQ(0, block0
->start_ip
);
128 EXPECT_EQ(1, block0
->end_ip
);
130 EXPECT_TRUE(saturate_propagation(v
));
131 EXPECT_EQ(0, block0
->start_ip
);
132 EXPECT_EQ(1, block0
->end_ip
);
133 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
134 EXPECT_TRUE(instruction(block0
, 0)->saturate
);
135 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
136 EXPECT_FALSE(instruction(block0
, 1)->saturate
);
139 TEST_F(saturate_propagation_test
, other_non_saturated_use
)
141 const fs_builder
&bld
= v
->bld
;
142 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
143 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
144 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
145 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
146 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
147 bld
.ADD(dst0
, src0
, src1
);
148 set_saturate(true, bld
.MOV(dst1
, dst0
));
149 bld
.ADD(dst2
, dst0
, src0
);
153 * 0: add(8) dst0 src0 src1
154 * 1: mov.sat(8) dst1 dst0
155 * 2: add(8) dst2 dst0 src0
162 bblock_t
*block0
= v
->cfg
->blocks
[0];
164 EXPECT_EQ(0, block0
->start_ip
);
165 EXPECT_EQ(2, block0
->end_ip
);
167 EXPECT_FALSE(saturate_propagation(v
));
168 EXPECT_EQ(0, block0
->start_ip
);
169 EXPECT_EQ(2, block0
->end_ip
);
170 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
171 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
172 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
173 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
174 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 2)->opcode
);
177 TEST_F(saturate_propagation_test
, predicated_instruction
)
179 const fs_builder
&bld
= v
->bld
;
180 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
181 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
182 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
183 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
184 bld
.ADD(dst0
, src0
, src1
)
185 ->predicate
= BRW_PREDICATE_NORMAL
;
186 set_saturate(true, bld
.MOV(dst1
, dst0
));
190 * 0: (+f0) add(8) dst0 src0 src1
191 * 1: mov.sat(8) dst1 dst0
198 bblock_t
*block0
= v
->cfg
->blocks
[0];
200 EXPECT_EQ(0, block0
->start_ip
);
201 EXPECT_EQ(1, block0
->end_ip
);
203 EXPECT_FALSE(saturate_propagation(v
));
204 EXPECT_EQ(0, block0
->start_ip
);
205 EXPECT_EQ(1, block0
->end_ip
);
206 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
207 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
208 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
209 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
212 TEST_F(saturate_propagation_test
, neg_mov_sat
)
214 const fs_builder
&bld
= v
->bld
;
215 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
216 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
217 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
218 bld
.RNDU(dst0
, src0
);
220 set_saturate(true, bld
.MOV(dst1
, dst0
));
224 * 0: rndu(8) dst0 src0
225 * 1: mov.sat(8) dst1 -dst0
232 bblock_t
*block0
= v
->cfg
->blocks
[0];
234 EXPECT_EQ(0, block0
->start_ip
);
235 EXPECT_EQ(1, block0
->end_ip
);
237 EXPECT_FALSE(saturate_propagation(v
));
238 EXPECT_EQ(0, block0
->start_ip
);
239 EXPECT_EQ(1, block0
->end_ip
);
240 EXPECT_EQ(BRW_OPCODE_RNDU
, instruction(block0
, 0)->opcode
);
241 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
242 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
243 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
246 TEST_F(saturate_propagation_test
, add_neg_mov_sat
)
248 const fs_builder
&bld
= v
->bld
;
249 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
250 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
251 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
252 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
253 bld
.ADD(dst0
, src0
, src1
);
255 set_saturate(true, bld
.MOV(dst1
, dst0
));
259 * 0: add(8) dst0 src0 src1
260 * 1: mov.sat(8) dst1 -dst0
263 * 0: add.sat(8) dst0 -src0 -src1
264 * 1: mov(8) dst1 dst0
268 bblock_t
*block0
= v
->cfg
->blocks
[0];
270 EXPECT_EQ(0, block0
->start_ip
);
271 EXPECT_EQ(1, block0
->end_ip
);
273 EXPECT_TRUE(saturate_propagation(v
));
274 EXPECT_EQ(0, block0
->start_ip
);
275 EXPECT_EQ(1, block0
->end_ip
);
276 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
277 EXPECT_TRUE(instruction(block0
, 0)->saturate
);
278 EXPECT_TRUE(instruction(block0
, 0)->src
[0].negate
);
279 EXPECT_TRUE(instruction(block0
, 0)->src
[1].negate
);
280 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
281 EXPECT_FALSE(instruction(block0
, 1)->saturate
);
284 TEST_F(saturate_propagation_test
, mul_neg_mov_sat
)
286 const fs_builder
&bld
= v
->bld
;
287 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
288 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
289 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
290 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
291 bld
.MUL(dst0
, src0
, src1
);
293 set_saturate(true, bld
.MOV(dst1
, dst0
));
297 * 0: mul(8) dst0 src0 src1
298 * 1: mov.sat(8) dst1 -dst0
301 * 0: mul.sat(8) dst0 src0 -src1
302 * 1: mov(8) dst1 dst0
306 bblock_t
*block0
= v
->cfg
->blocks
[0];
308 EXPECT_EQ(0, block0
->start_ip
);
309 EXPECT_EQ(1, block0
->end_ip
);
311 EXPECT_TRUE(saturate_propagation(v
));
312 EXPECT_EQ(0, block0
->start_ip
);
313 EXPECT_EQ(1, block0
->end_ip
);
314 EXPECT_EQ(BRW_OPCODE_MUL
, instruction(block0
, 0)->opcode
);
315 EXPECT_TRUE(instruction(block0
, 0)->saturate
);
316 EXPECT_TRUE(instruction(block0
, 0)->src
[0].negate
);
317 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
318 EXPECT_FALSE(instruction(block0
, 1)->saturate
);
319 EXPECT_FALSE(instruction(block0
, 1)->src
[0].negate
);
322 TEST_F(saturate_propagation_test
, mul_mov_sat_neg_mov_sat
)
324 const fs_builder
&bld
= v
->bld
;
325 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
326 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
327 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
328 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
329 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
330 bld
.MUL(dst0
, src0
, src1
);
331 set_saturate(true, bld
.MOV(dst1
, dst0
));
333 set_saturate(true, bld
.MOV(dst2
, dst0
));
337 * 0: mul(8) dst0 src0 src1
338 * 1: mov.sat(8) dst1 dst0
339 * 2: mov.sat(8) dst2 -dst0
346 bblock_t
*block0
= v
->cfg
->blocks
[0];
348 EXPECT_EQ(0, block0
->start_ip
);
349 EXPECT_EQ(2, block0
->end_ip
);
351 EXPECT_FALSE(saturate_propagation(v
));
352 EXPECT_EQ(0, block0
->start_ip
);
353 EXPECT_EQ(2, block0
->end_ip
);
354 EXPECT_EQ(BRW_OPCODE_MUL
, instruction(block0
, 0)->opcode
);
355 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
356 EXPECT_FALSE(instruction(block0
, 0)->src
[1].negate
);
357 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
358 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
359 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 2)->opcode
);
360 EXPECT_TRUE(instruction(block0
, 2)->src
[0].negate
);
361 EXPECT_TRUE(instruction(block0
, 2)->saturate
);
364 TEST_F(saturate_propagation_test
, mul_neg_mov_sat_neg_mov_sat
)
366 const fs_builder
&bld
= v
->bld
;
367 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
368 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
369 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
370 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
371 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
372 bld
.MUL(dst0
, src0
, src1
);
374 set_saturate(true, bld
.MOV(dst1
, dst0
));
375 set_saturate(true, bld
.MOV(dst2
, dst0
));
379 * 0: mul(8) dst0 src0 src1
380 * 1: mov.sat(8) dst1 -dst0
381 * 2: mov.sat(8) dst2 -dst0
388 bblock_t
*block0
= v
->cfg
->blocks
[0];
390 EXPECT_EQ(0, block0
->start_ip
);
391 EXPECT_EQ(2, block0
->end_ip
);
393 EXPECT_FALSE(saturate_propagation(v
));
394 EXPECT_EQ(0, block0
->start_ip
);
395 EXPECT_EQ(2, block0
->end_ip
);
396 EXPECT_EQ(BRW_OPCODE_MUL
, instruction(block0
, 0)->opcode
);
397 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
398 EXPECT_FALSE(instruction(block0
, 0)->src
[1].negate
);
399 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
400 EXPECT_TRUE(instruction(block0
, 1)->src
[0].negate
);
401 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
402 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 2)->opcode
);
403 EXPECT_TRUE(instruction(block0
, 2)->src
[0].negate
);
404 EXPECT_TRUE(instruction(block0
, 2)->saturate
);
407 TEST_F(saturate_propagation_test
, abs_mov_sat
)
409 const fs_builder
&bld
= v
->bld
;
410 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
411 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
412 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
413 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
414 bld
.ADD(dst0
, src0
, src1
);
416 set_saturate(true, bld
.MOV(dst1
, dst0
));
420 * 0: add(8) dst0 src0 src1
421 * 1: mov.sat(8) dst1 (abs)dst0
428 bblock_t
*block0
= v
->cfg
->blocks
[0];
430 EXPECT_EQ(0, block0
->start_ip
);
431 EXPECT_EQ(1, block0
->end_ip
);
433 EXPECT_FALSE(saturate_propagation(v
));
434 EXPECT_EQ(0, block0
->start_ip
);
435 EXPECT_EQ(1, block0
->end_ip
);
436 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
437 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
438 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
439 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
442 TEST_F(saturate_propagation_test
, producer_saturates
)
444 const fs_builder
&bld
= v
->bld
;
445 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
446 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
447 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
448 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
449 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
450 set_saturate(true, bld
.ADD(dst0
, src0
, src1
));
451 set_saturate(true, bld
.MOV(dst1
, dst0
));
456 * 0: add.sat(8) dst0 src0 src1
457 * 1: mov.sat(8) dst1 dst0
458 * 2: mov(8) dst2 dst0
461 * 0: add.sat(8) dst0 src0 src1
462 * 1: mov(8) dst1 dst0
463 * 2: mov(8) dst2 dst0
467 bblock_t
*block0
= v
->cfg
->blocks
[0];
469 EXPECT_EQ(0, block0
->start_ip
);
470 EXPECT_EQ(2, block0
->end_ip
);
472 EXPECT_TRUE(saturate_propagation(v
));
473 EXPECT_EQ(0, block0
->start_ip
);
474 EXPECT_EQ(2, block0
->end_ip
);
475 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
476 EXPECT_TRUE(instruction(block0
, 0)->saturate
);
477 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
478 EXPECT_FALSE(instruction(block0
, 1)->saturate
);
481 TEST_F(saturate_propagation_test
, intervening_saturating_copy
)
483 const fs_builder
&bld
= v
->bld
;
484 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
485 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
486 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
487 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
488 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
489 bld
.ADD(dst0
, src0
, src1
);
490 set_saturate(true, bld
.MOV(dst1
, dst0
));
491 set_saturate(true, bld
.MOV(dst2
, dst0
));
495 * 0: add(8) dst0 src0 src1
496 * 1: mov.sat(8) dst1 dst0
497 * 2: mov.sat(8) dst2 dst0
500 * 0: add.sat(8) dst0 src0 src1
501 * 1: mov(8) dst1 dst0
502 * 2: mov(8) dst2 dst0
506 bblock_t
*block0
= v
->cfg
->blocks
[0];
508 EXPECT_EQ(0, block0
->start_ip
);
509 EXPECT_EQ(2, block0
->end_ip
);
511 EXPECT_TRUE(saturate_propagation(v
));
512 EXPECT_EQ(0, block0
->start_ip
);
513 EXPECT_EQ(2, block0
->end_ip
);
514 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
515 EXPECT_TRUE(instruction(block0
, 0)->saturate
);
516 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
517 EXPECT_FALSE(instruction(block0
, 1)->saturate
);
518 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 2)->opcode
);
519 EXPECT_FALSE(instruction(block0
, 2)->saturate
);
522 TEST_F(saturate_propagation_test
, intervening_dest_write
)
524 const fs_builder
&bld
= v
->bld
;
525 fs_reg dst0
= v
->vgrf(glsl_type::vec4_type
);
526 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
527 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
528 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
529 fs_reg src2
= v
->vgrf(glsl_type::vec2_type
);
530 bld
.ADD(offset(dst0
, bld
, 2), src0
, src1
);
531 bld
.emit(SHADER_OPCODE_TEX
, dst0
, src2
)
533 set_saturate(true, bld
.MOV(dst1
, offset(dst0
, bld
, 2)));
537 * 0: add(8) dst0+2 src0 src1
538 * 1: tex(8) rlen 4 dst0+0 src2
539 * 2: mov.sat(8) dst1 dst0+2
546 bblock_t
*block0
= v
->cfg
->blocks
[0];
548 EXPECT_EQ(0, block0
->start_ip
);
549 EXPECT_EQ(2, block0
->end_ip
);
551 EXPECT_FALSE(saturate_propagation(v
));
552 EXPECT_EQ(0, block0
->start_ip
);
553 EXPECT_EQ(2, block0
->end_ip
);
554 EXPECT_EQ(BRW_OPCODE_ADD
, instruction(block0
, 0)->opcode
);
555 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
556 EXPECT_EQ(SHADER_OPCODE_TEX
, instruction(block0
, 1)->opcode
);
557 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
558 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 2)->opcode
);
559 EXPECT_TRUE(instruction(block0
, 2)->saturate
);
562 TEST_F(saturate_propagation_test
, mul_neg_mov_sat_mov_sat
)
564 const fs_builder
&bld
= v
->bld
;
565 fs_reg dst0
= v
->vgrf(glsl_type::float_type
);
566 fs_reg dst1
= v
->vgrf(glsl_type::float_type
);
567 fs_reg dst2
= v
->vgrf(glsl_type::float_type
);
568 fs_reg src0
= v
->vgrf(glsl_type::float_type
);
569 fs_reg src1
= v
->vgrf(glsl_type::float_type
);
570 bld
.MUL(dst0
, src0
, src1
);
572 set_saturate(true, bld
.MOV(dst1
, dst0
));
574 set_saturate(true, bld
.MOV(dst2
, dst0
));
578 * 0: mul(8) dst0 src0 src1
579 * 1: mov.sat(8) dst1 -dst0
580 * 2: mov.sat(8) dst2 dst0
587 bblock_t
*block0
= v
->cfg
->blocks
[0];
589 EXPECT_EQ(0, block0
->start_ip
);
590 EXPECT_EQ(2, block0
->end_ip
);
592 EXPECT_FALSE(saturate_propagation(v
));
593 EXPECT_EQ(0, block0
->start_ip
);
594 EXPECT_EQ(2, block0
->end_ip
);
595 EXPECT_EQ(BRW_OPCODE_MUL
, instruction(block0
, 0)->opcode
);
596 EXPECT_FALSE(instruction(block0
, 0)->saturate
);
597 EXPECT_FALSE(instruction(block0
, 0)->src
[1].negate
);
598 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 1)->opcode
);
599 EXPECT_TRUE(instruction(block0
, 1)->saturate
);
600 EXPECT_TRUE(instruction(block0
, 1)->src
[0].negate
);
601 EXPECT_EQ(BRW_OPCODE_MOV
, instruction(block0
, 2)->opcode
);
602 EXPECT_TRUE(instruction(block0
, 2)->saturate
);