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