1bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner/*
2bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * Copyright © 2015 Intel Corporation
3bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner *
4bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * Permission is hereby granted, free of charge, to any person obtaining a
5bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * copy of this software and associated documentation files (the "Software"),
6bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * to deal in the Software without restriction, including without limitation
7bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * and/or sell copies of the Software, and to permit persons to whom the
9bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * Software is furnished to do so, subject to the following conditions:
10bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner *
11bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * The above copyright notice and this permission notice (including the next
12bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * paragraph) shall be included in all copies or substantial portions of the
13bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * Software.
14bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner *
15bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner * IN THE SOFTWARE.
22bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner */
23bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
24bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner#include <gtest/gtest.h>
25bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner#include "brw_fs.h"
26bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner#include "brw_cfg.h"
27bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner#include "program/program.h"
28bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
2976c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerezusing namespace brw;
3076c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez
31bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerclass saturate_propagation_test : public ::testing::Test {
32bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   virtual void SetUp();
33bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
34bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerpublic:
3540801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   struct brw_compiler *compiler;
36527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrand   struct gen_device_info *devinfo;
37bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   struct gl_context *ctx;
38bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   struct brw_wm_prog_data *prog_data;
39bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   struct gl_shader_program *shader_prog;
40bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_visitor *v;
41bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner};
42bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
43bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerclass saturate_propagation_fs_visitor : public fs_visitor
44bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
45bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerpublic:
4640801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   saturate_propagation_fs_visitor(struct brw_compiler *compiler,
47bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner                                   struct brw_wm_prog_data *prog_data,
48bf7b6fd3fd6d98305d64ee6224ca9f9e7ba48444Jason Ekstrand                                   nir_shader *shader)
49bf7b6fd3fd6d98305d64ee6224ca9f9e7ba48444Jason Ekstrand      : fs_visitor(compiler, NULL, NULL, NULL,
50bf7b6fd3fd6d98305d64ee6224ca9f9e7ba48444Jason Ekstrand                   &prog_data->base, (struct gl_program *) NULL,
51bf7b6fd3fd6d98305d64ee6224ca9f9e7ba48444Jason Ekstrand                   shader, 8, -1) {}
52bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner};
53bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
54bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
55bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnervoid saturate_propagation_test::SetUp()
56bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
5740801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   ctx = (struct gl_context *)calloc(1, sizeof(*ctx));
5840801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   compiler = (struct brw_compiler *)calloc(1, sizeof(*compiler));
59527f37199929932300acc1688d8160e1f3b1d753Jason Ekstrand   devinfo = (struct gen_device_info *)calloc(1, sizeof(*devinfo));
6040801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   compiler->devinfo = devinfo;
61bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
62bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   prog_data = ralloc(NULL, struct brw_wm_prog_data);
63e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri   nir_shader *shader =
64e1af20f18a86f52a9640faf2d4ff8a71b0a4fa9bTimothy Arceri      nir_shader_create(NULL, MESA_SHADER_FRAGMENT, NULL, NULL);
65bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
66bf7b6fd3fd6d98305d64ee6224ca9f9e7ba48444Jason Ekstrand   v = new saturate_propagation_fs_visitor(compiler, prog_data, shader);
67bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
6840801295d5a3d747661abb1e2ca64d44c0e3dc05Jason Ekstrand   devinfo->gen = 4;
69bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
70bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
71bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerstatic fs_inst *
72bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerinstruction(bblock_t *block, int num)
73bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
74bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_inst *inst = (fs_inst *)block->start();
75bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   for (int i = 0; i < num; i++) {
76bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      inst = (fs_inst *)inst->next;
77bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   }
78bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   return inst;
79bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
80bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
81bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnerstatic bool
82bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turnersaturate_propagation(fs_visitor *v)
83bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
84bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   const bool print = false;
85bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
86bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   if (print) {
87bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      fprintf(stderr, "= Before =\n");
88bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      v->cfg->dump(v);
89bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   }
90bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
91bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bool ret = v->opt_saturate_propagation();
92bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
93bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   if (print) {
94bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      fprintf(stderr, "\n= After =\n");
95bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      v->cfg->dump(v);
96bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   }
97bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
98bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   return ret;
99bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
100bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
101bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, basic)
102bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
10376c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
104bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
105bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
106bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
107bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
10876c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst0, src0, src1);
10976c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
110bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
111bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
112bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
113bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add(8)        dst0  src0  src1
114bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  dst0
115bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
116bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
117bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add.sat(8)    dst0  src0  src1
118bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov(8)        dst1  dst0
119bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
120bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
121bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
122bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
123bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
124bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
125bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
126bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
127bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(saturate_propagation(v));
128bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
129bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
130bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
131bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 0)->saturate);
132bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
133bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 1)->saturate);
134bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
135bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
136bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, other_non_saturated_use)
137bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
13876c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
139bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
140bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
141bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
142bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
143bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
14476c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst0, src0, src1);
14576c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
14676c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst2, dst0, src0);
147bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
148bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
149bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
150bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add(8)        dst0  src0  src1
151bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  dst0
152bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 2: add(8)        dst2  dst0  src0
153bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
154bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
155bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * (no changes)
156bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
157bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
158bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
159bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
160bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
161bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
162bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
163bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
164bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(saturate_propagation(v));
165bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
166bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
167bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
168bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
169bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
170bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
171bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 2)->opcode);
172bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
173bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
174bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, predicated_instruction)
175bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
17676c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
177bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
178bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
179bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
180bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
18176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst0, src0, src1)
182bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner      ->predicate = BRW_PREDICATE_NORMAL;
18376c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
184bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
185bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
186bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
187bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: (+f0) add(8)  dst0  src0  src1
188bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  dst0
189bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
190bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
191bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * (no changes)
192bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
193bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
194bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
195bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
196bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
197bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
198bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
199bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
200bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(saturate_propagation(v));
201bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
202bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
203bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
204bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
205bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
206bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
207bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
208bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
209bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, neg_mov_sat)
210bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
21176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
212bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
213bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
214bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
21565d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   bld.RNDU(dst0, src0);
216bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   dst0.negate = true;
21776c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
218bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
219bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
220bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
22165d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * 0: rndu(8)       dst0  src0
222bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  -dst0
223bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
224bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
225bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * (no changes)
226bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
227bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
228bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
229bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
230bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
231bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
232bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
233bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
234bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(saturate_propagation(v));
235bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
236bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
23765d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(BRW_OPCODE_RNDU, instruction(block0, 0)->opcode);
238bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
239bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
240bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
241bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
242bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
24365d3217cb03bc4be97c99300a5cc3f6190d06345Matt TurnerTEST_F(saturate_propagation_test, add_neg_mov_sat)
24465d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner{
24565d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   const fs_builder &bld = v->bld;
24665d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
24765d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
24865d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
24965d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
25065d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   bld.ADD(dst0, src0, src1);
25165d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   dst0.negate = true;
25265d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   set_saturate(true, bld.MOV(dst1, dst0));
25365d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner
25465d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   /* = Before =
25565d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    *
25665d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * 0: add(8)        dst0  src0  src1
25765d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * 1: mov.sat(8)    dst1  -dst0
25865d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    *
25965d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * = After =
26065d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * 0: add.sat(8)    dst0  -src0 -src1
26165d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    * 1: mov(8)        dst1  dst0
26265d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner    */
26365d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner
26465d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   v->calculate_cfg();
26565d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
26665d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner
26765d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(0, block0->start_ip);
26865d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(1, block0->end_ip);
26965d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner
27065d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_TRUE(saturate_propagation(v));
27165d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(0, block0->start_ip);
27265d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(1, block0->end_ip);
27365d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
27465d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_TRUE(instruction(block0, 0)->saturate);
27565d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_TRUE(instruction(block0, 0)->src[0].negate);
27665d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_TRUE(instruction(block0, 0)->src[1].negate);
27765d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
27865d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner   EXPECT_FALSE(instruction(block0, 1)->saturate);
27965d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner}
28065d3217cb03bc4be97c99300a5cc3f6190d06345Matt Turner
2817b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt TurnerTEST_F(saturate_propagation_test, mul_neg_mov_sat)
2827b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner{
2837b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   const fs_builder &bld = v->bld;
2847b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
2857b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
2867b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
2877b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
2887b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bld.MUL(dst0, src0, src1);
2897b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   dst0.negate = true;
2907b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   set_saturate(true, bld.MOV(dst1, dst0));
2917b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
2927b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   /* = Before =
2937b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
2947b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 0: mul(8)        dst0  src0  src1
2957b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 1: mov.sat(8)    dst1  -dst0
2967b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
2977b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * = After =
2987b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 0: mul.sat(8)    dst0  src0 -src1
2997b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 1: mov(8)        dst1  dst0
3007b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    */
3017b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3027b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   v->calculate_cfg();
3037b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
3047b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3057b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3067b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(1, block0->end_ip);
3077b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3087b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(saturate_propagation(v));
3097b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3107b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(1, block0->end_ip);
3117b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MUL, instruction(block0, 0)->opcode);
3127b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 0)->saturate);
3137b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 0)->src[0].negate);
3147b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
3157b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 1)->saturate);
3167b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 1)->src[0].negate);
3177b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner}
3187b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3197b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt TurnerTEST_F(saturate_propagation_test, mul_mov_sat_neg_mov_sat)
3207b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner{
3217b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   const fs_builder &bld = v->bld;
3227b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
3237b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
3247b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
3257b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
3267b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
3277b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bld.MUL(dst0, src0, src1);
3287b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   set_saturate(true, bld.MOV(dst1, dst0));
3297b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   dst0.negate = true;
3307b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   set_saturate(true, bld.MOV(dst2, dst0));
3317b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3327b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   /* = Before =
3337b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
3347b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 0: mul(8)        dst0  src0  src1
3357b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 1: mov.sat(8)    dst1  dst0
3367b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 2: mov.sat(8)    dst2  -dst0
3377b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
3387b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * = After =
3397b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * (no changes)
3407b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    */
3417b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3427b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   v->calculate_cfg();
3437b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
3447b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3457b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3467b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(2, block0->end_ip);
3477b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3487b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(saturate_propagation(v));
3497b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3507b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(2, block0->end_ip);
3517b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MUL, instruction(block0, 0)->opcode);
3527b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
3537b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 0)->src[1].negate);
3547b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
3557b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
3567b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 2)->opcode);
3577b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 2)->src[0].negate);
3587b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 2)->saturate);
3597b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner}
3607b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3617b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt TurnerTEST_F(saturate_propagation_test, mul_neg_mov_sat_neg_mov_sat)
3627b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner{
3637b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   const fs_builder &bld = v->bld;
3647b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
3657b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
3667b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
3677b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
3687b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
3697b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bld.MUL(dst0, src0, src1);
3707b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   dst0.negate = true;
3717b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   set_saturate(true, bld.MOV(dst1, dst0));
3727b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   set_saturate(true, bld.MOV(dst2, dst0));
3737b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3747b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   /* = Before =
3757b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
3767b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 0: mul(8)        dst0  src0  src1
3777b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 1: mov.sat(8)    dst1  -dst0
3787b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * 2: mov.sat(8)    dst2  -dst0
3797b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    *
3807b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * = After =
3817b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    * (no changes)
3827b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner    */
3837b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3847b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   v->calculate_cfg();
3857b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
3867b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3877b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3887b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(2, block0->end_ip);
3897b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
3907b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(saturate_propagation(v));
3917b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(0, block0->start_ip);
3927b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(2, block0->end_ip);
3937b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MUL, instruction(block0, 0)->opcode);
3947b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
3957b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_FALSE(instruction(block0, 0)->src[1].negate);
3967b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
3977b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 1)->src[0].negate);
3987b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
3997b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 2)->opcode);
4007b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 2)->src[0].negate);
4017b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner   EXPECT_TRUE(instruction(block0, 2)->saturate);
4027b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner}
4037b6113bc2d3493f5b7dcf00c51eb1e90a477d067Matt Turner
404bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, abs_mov_sat)
405bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
40676c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
407bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
408bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
409bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
410bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
41176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst0, src0, src1);
412bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   dst0.abs = true;
41376c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
414bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
415bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
416bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
417bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add(8)        dst0  src0  src1
418bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  (abs)dst0
419bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
420bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
421bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * (no changes)
422bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
423bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
424bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
425bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
426bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
427bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
428bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
429bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
430bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(saturate_propagation(v));
431bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
432bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(1, block0->end_ip);
433bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
434bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
435bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
436bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
437bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
438bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
439bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, producer_saturates)
440bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
44176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
442bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
443bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
444bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
445bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
446bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
44776c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.ADD(dst0, src0, src1));
44876c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
44976c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.MOV(dst2, dst0);
450bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
451bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
452bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
453bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add.sat(8)    dst0  src0  src1
454bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  dst0
455bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 2: mov(8)        dst2  dst0
456bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
457bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
458bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add.sat(8)    dst0  src0  src1
459bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov(8)        dst1  dst0
460bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 2: mov(8)        dst2  dst0
461bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
462bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
463bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
464bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
465bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
466bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
467bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
468bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
469bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(saturate_propagation(v));
470bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
471bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
472bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
473bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 0)->saturate);
474bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
475bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 1)->saturate);
476bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
477bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
478bf3389ec49a158e0b66db8e038d801eacabd20f1Matt TurnerTEST_F(saturate_propagation_test, intervening_saturating_copy)
479bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner{
48076c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
481bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
482bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
483bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
484bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
485bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
48676c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.ADD(dst0, src0, src1);
48776c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
48876c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst2, dst0));
489bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
490bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   /* = Before =
491bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
492bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add(8)    dst0  src0  src1
493bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov.sat(8)    dst1  dst0
494bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 2: mov.sat(8)    dst2  dst0
495bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    *
496bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * = After =
497bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 0: add.sat(8)    dst0  src0  src1
498bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 1: mov(8)        dst1  dst0
499bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    * 2: mov(8)        dst2  dst0
500bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner    */
501bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
502bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   v->calculate_cfg();
503bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
504bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
505bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
506bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
507bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner
508bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(saturate_propagation(v));
509bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(0, block0->start_ip);
510bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(2, block0->end_ip);
511bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
512bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_TRUE(instruction(block0, 0)->saturate);
513bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
514bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 1)->saturate);
515bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 2)->opcode);
516bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner   EXPECT_FALSE(instruction(block0, 2)->saturate);
517bf3389ec49a158e0b66db8e038d801eacabd20f1Matt Turner}
518871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner
519871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt TurnerTEST_F(saturate_propagation_test, intervening_dest_write)
520871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner{
52176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
522871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::vec4_type);
523871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
524871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
525871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
526871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   fs_reg src2 = v->vgrf(glsl_type::vec2_type);
527f7dcc1160331462a071c54ca1067f9e2f57b55beJason Ekstrand   bld.ADD(offset(dst0, bld, 2), src0, src1);
52876c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.emit(SHADER_OPCODE_TEX, dst0, src2)
52969570bbad876bb9da609c3b651aacda28cecc542Francisco Jerez      ->size_written = 4 * REG_SIZE;
530f7dcc1160331462a071c54ca1067f9e2f57b55beJason Ekstrand   set_saturate(true, bld.MOV(dst1, offset(dst0, bld, 2)));
531871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner
532871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   /* = Before =
533871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    *
534871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    * 0: add(8)        dst0+2  src0    src1
535871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    * 1: tex(8) rlen 4 dst0+0  src2
536871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    * 2: mov.sat(8)    dst1    dst0+2
537871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    *
538871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    * = After =
539871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    * (no changes)
540871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner    */
541871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner
542871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   v->calculate_cfg();
543871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
544871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner
545871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(0, block0->start_ip);
546871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(2, block0->end_ip);
547871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner
548871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_FALSE(saturate_propagation(v));
549871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(0, block0->start_ip);
550871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(2, block0->end_ip);
551871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(BRW_OPCODE_ADD, instruction(block0, 0)->opcode);
552871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
553871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(SHADER_OPCODE_TEX, instruction(block0, 1)->opcode);
554871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
555871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 2)->opcode);
556871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner   EXPECT_TRUE(instruction(block0, 2)->saturate);
557871ad3f08bc34e16fdd728e9a4821b9a83e509f0Matt Turner}
5587f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner
5597f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt TurnerTEST_F(saturate_propagation_test, mul_neg_mov_sat_mov_sat)
5607f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner{
56176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   const fs_builder &bld = v->bld;
5627f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   fs_reg dst0 = v->vgrf(glsl_type::float_type);
5637f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   fs_reg dst1 = v->vgrf(glsl_type::float_type);
5647f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   fs_reg dst2 = v->vgrf(glsl_type::float_type);
5657f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   fs_reg src0 = v->vgrf(glsl_type::float_type);
5667f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   fs_reg src1 = v->vgrf(glsl_type::float_type);
56776c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   bld.MUL(dst0, src0, src1);
5687f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   dst0.negate = true;
56976c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst1, dst0));
5707f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   dst0.negate = false;
57176c8142d0af45ab9907ebc9cfd2855fa753735b6Francisco Jerez   set_saturate(true, bld.MOV(dst2, dst0));
5727f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner
5737f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   /* = Before =
5747f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    *
5757f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    * 0: mul(8)        dst0  src0  src1
5767f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    * 1: mov.sat(8)    dst1  -dst0
5777f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    * 2: mov.sat(8)    dst2  dst0
5787f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    *
5797f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    * = After =
5807f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    * (no changes)
5817f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner    */
5827f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner
5837f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   v->calculate_cfg();
5847f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   bblock_t *block0 = v->cfg->blocks[0];
5857f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner
5867f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(0, block0->start_ip);
5877f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(2, block0->end_ip);
5887f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner
5897f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_FALSE(saturate_propagation(v));
5907f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(0, block0->start_ip);
5917f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(2, block0->end_ip);
5927f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(BRW_OPCODE_MUL, instruction(block0, 0)->opcode);
5937f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_FALSE(instruction(block0, 0)->saturate);
5947f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_FALSE(instruction(block0, 0)->src[1].negate);
5957f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 1)->opcode);
5967f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_TRUE(instruction(block0, 1)->saturate);
5977f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_TRUE(instruction(block0, 1)->src[0].negate);
5987f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_EQ(BRW_OPCODE_MOV, instruction(block0, 2)->opcode);
5997f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner   EXPECT_TRUE(instruction(block0, 2)->saturate);
6007f8dd91d166e49d7da98f90d6428dc2705fb96d0Matt Turner}
601