11cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick/* 21cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * Copyright © 2010 Intel Corporation 31cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * 41cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * Permission is hereby granted, free of charge, to any person obtaining a 51cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * copy of this software and associated documentation files (the "Software"), 61cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * to deal in the Software without restriction, including without limitation 71cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense, 81cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * and/or sell copies of the Software, and to permit persons to whom the 91cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * Software is furnished to do so, subject to the following conditions: 101cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * 111cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * The above copyright notice and this permission notice (including the next 121cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * paragraph) shall be included in all copies or substantial portions of the 131cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * Software. 141cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * 151cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 161cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 171cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 181cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 191cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 201cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 211cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * DEALINGS IN THE SOFTWARE. 221cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick */ 231cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 241cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick/** 251cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * \file ir_constant_expression.cpp 261cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * Evaluate and process constant valued expressions 271cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * 281cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * In GLSL, constant valued expressions are used in several places. These 291cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * must be processed and evaluated very early in the compilation process. 301cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * 311cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * * Sizes of arrays 321cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * * Initializers for uniforms 331cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick * * Initializers for \c const variables 341cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick */ 351cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 3643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt#include <math.h> 37bfd7c9ac228c7ed8aec04c3b3aa33f40ee00b035Chia-I Wu#include "main/core.h" /* for MAX2, MIN2, CLAMP */ 381cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick#include "ir.h" 391cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick#include "ir_visitor.h" 40a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt#include "glsl_types.h" 416e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert#include "program/hash_table.h" 421cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 43dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt/* Using C99 rounding functions for roundToEven() implementation is 44dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt * difficult, because round(), rint, and nearbyint() are affected by 45dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt * fesetenv(), which the application may have done for its own 46dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt * purposes. Mesa's IROUND macro is close to what we want, but it 47dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt * rounds away from 0 on n + 0.5. 48dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt */ 49dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholtstatic int 50dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholtround_to_even(float val) 51dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt{ 52dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt int rounded = IROUND(val); 53dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt 54dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt if (val - floor(val) == 0.5) { 55dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt if (rounded % 2 != 0) 56dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt rounded += val > 0 ? -1 : 1; 57dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt } 58dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt 59dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt return rounded; 60dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt} 61dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt 62ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunkestatic float 63ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunkedot(ir_constant *op0, ir_constant *op1) 64ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke{ 65ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke assert(op0->type->is_float() && op1->type->is_float()); 66ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke 67ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke float result = 0; 68ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke for (unsigned c = 0; c < op0->type->components(); c++) 69ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke result += op0->value.f[c] * op1->value.f[c]; 70ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke 71ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke return result; 72ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke} 73ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke 74abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert/* This method is the only one supported by gcc. Unions in particular 75abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert * are iffy, and read-through-converted-pointer is killed by strict 76abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert * aliasing. OTOH, the compiler sees through the memcpy, so the 77abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert * resulting asm is reasonable. 78abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert */ 79abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibertstatic float 80abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibertbitcast_u2f(unsigned int u) 81abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert{ 82abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(sizeof(float) == sizeof(unsigned int)); 83abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert float f; 84abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert memcpy(&f, &u, sizeof(f)); 85abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert return f; 86abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert} 87abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert 88abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibertstatic unsigned int 89abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibertbitcast_f2u(float f) 90abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert{ 91abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(sizeof(float) == sizeof(unsigned int)); 92abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert unsigned int u; 93abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert memcpy(&u, &f, sizeof(f)); 94abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert return u; 95abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert} 96abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert 971cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanickir_constant * 986e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_rvalue::constant_expression_value(struct hash_table *variable_context) 99807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke{ 100807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke assert(this->type->is_error()); 101807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke return NULL; 102807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke} 103807e967c615dc80a264af5a89af7649f95481744Kenneth Graunke 104807e967c615dc80a264af5a89af7649f95481744Kenneth Graunkeir_constant * 1056e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_expression::constant_expression_value(struct hash_table *variable_context) 1061cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick{ 107b62c1c4595551c4936323135224a5ea686ba972aChad Versace if (this->type->is_error()) 108b62c1c4595551c4936323135224a5ea686ba972aChad Versace return NULL; 109b62c1c4595551c4936323135224a5ea686ba972aChad Versace 110fc92e87b9757eda01caf0bb3e2c31b1dbbd73aa0Ian Romanick ir_constant *op[Elements(this->operands)] = { NULL, }; 1114daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick ir_constant_data data; 112d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt 113c63a1db81f56cc2021fe1fb2411c327f720b0e09Kenneth Graunke memset(&data, 0, sizeof(data)); 114c63a1db81f56cc2021fe1fb2411c327f720b0e09Kenneth Graunke 11598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned operand = 0; operand < this->get_num_operands(); operand++) { 1166e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert op[operand] = this->operands[operand]->constant_expression_value(variable_context); 117d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt if (!op[operand]) 118fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 119160d092507c1ca341b7c5c88e5ba94b4cf5fb7d0Eric Anholt } 120a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt 1216fc983b9bb5555e2906d2680bc3cbd11c43b63f6Kenneth Graunke if (op[1] != NULL) 122344f94bb006188931b09939aafc7cc96609c4f5aEric Anholt assert(op[0]->type->base_type == op[1]->type->base_type || 123344f94bb006188931b09939aafc7cc96609c4f5aEric Anholt this->operation == ir_binop_lshift || 124344f94bb006188931b09939aafc7cc96609c4f5aEric Anholt this->operation == ir_binop_rshift); 1256fc983b9bb5555e2906d2680bc3cbd11c43b63f6Kenneth Graunke 126e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke bool op0_scalar = op[0]->type->is_scalar(); 127e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke bool op1_scalar = op[1] != NULL && op[1]->type->is_scalar(); 128e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke 129e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke /* When iterating over a vector or matrix's components, we want to increase 130e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke * the loop counter. However, for scalars, we want to stay at 0. 131e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke */ 132acf88f2769c15c9185abe5bd76a885218f431e58Kenneth Graunke unsigned c0_inc = op0_scalar ? 0 : 1; 133acf88f2769c15c9185abe5bd76a885218f431e58Kenneth Graunke unsigned c1_inc = op1_scalar ? 0 : 1; 134570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt unsigned components; 135570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt if (op1_scalar || !op[1]) { 136570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt components = op[0]->type->components(); 137570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt } else { 138570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt components = op[1]->type->components(); 139570dc0d4004bf09d257b3e4c8664d3c26a8af510Eric Anholt } 140e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke 141d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(this); 1429a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke 1439a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke /* Handle array operations here, rather than below. */ 1449a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke if (op[0]->type->is_array()) { 1459a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke assert(op[1] != NULL && op[1]->type->is_array()); 1469a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke switch (this->operation) { 1474dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri case ir_binop_all_equal: 1489a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke return new(ctx) ir_constant(op[0]->has_value(op[1])); 1494dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri case ir_binop_any_nequal: 1509a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke return new(ctx) ir_constant(!op[0]->has_value(op[1])); 1519a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke default: 1529a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke break; 1539a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke } 1549a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke return NULL; 1559a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke } 1569a6d40fbfb679f01412c1fcc9d767c20a22246d8Kenneth Graunke 15798f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->operation) { 15890a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace case ir_unop_bit_not: 15990a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace switch (op[0]->type->base_type) { 16090a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace case GLSL_TYPE_INT: 16190a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace for (unsigned c = 0; c < components; c++) 16290a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace data.i[c] = ~ op[0]->value.i[c]; 16390a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace break; 16490a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace case GLSL_TYPE_UINT: 16590a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace for (unsigned c = 0; c < components; c++) 16690a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace data.u[c] = ~ op[0]->value.u[c]; 16790a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace break; 16890a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace default: 16990a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace assert(0); 17090a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace } 17190a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace break; 17290a8b792c04679fc745e5a68ead9f7c37b8d07c4Chad Versace 173528bb853599f514611e8e49adc758662219dacf7Eric Anholt case ir_unop_logic_not: 174f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 17598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) 1764daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.b[c] = !op[0]->value.b[c]; 177528bb853599f514611e8e49adc758662219dacf7Eric Anholt break; 178af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt 179af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt case ir_unop_f2i: 180af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 18198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 18288f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.i[c] = (int) op[0]->value.f[c]; 183af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt } 184af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt break; 185613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry case ir_unop_f2u: 186613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 187613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry for (unsigned c = 0; c < op[0]->type->components(); c++) { 188613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry data.i[c] = (unsigned) op[0]->value.f[c]; 189613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry } 190613a8170ae53091d516f602d091a6bbcd169e92fPaul Berry break; 191af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt case ir_unop_i2f: 19246d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_INT); 19398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 19488f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.f[c] = (float) op[0]->value.i[c]; 19546d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke } 19646d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke break; 19746d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke case ir_unop_u2f: 19846d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_UINT); 19946d6b8d1ba09d9d6844ce99a30416283004f77c6Kenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 20088f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.f[c] = (float) op[0]->value.u[c]; 201af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt } 202af18641f0a9f717fdeab8d3e94c1df93b48c4d30Eric Anholt break; 2037dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick case ir_unop_b2f: 2047dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 20598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 20688f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.f[c] = op[0]->value.b[c] ? 1.0F : 0.0F; 2077dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick } 2087dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick break; 2097dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick case ir_unop_f2b: 2107dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 21198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 21288f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.b[c] = op[0]->value.f[c] != 0.0F ? true : false; 2137dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick } 2147dc2b71a89ac24f2d84f7db6bd8a4d499694cac5Ian Romanick break; 21539d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick case ir_unop_b2i: 21639d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 21798f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 2184daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.u[c] = op[0]->value.b[c] ? 1 : 0; 21939d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick } 22039d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick break; 22139d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick case ir_unop_i2b: 22239d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick assert(op[0]->type->is_integer()); 22398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 22488f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.b[c] = op[0]->value.u[c] ? true : false; 22539d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick } 22639d6dd3537ce436806dbb5e7f6fa7c5477babb8eIan Romanick break; 22720ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain case ir_unop_u2i: 22820ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain assert(op[0]->type->base_type == GLSL_TYPE_UINT); 22920ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain for (unsigned c = 0; c < op[0]->type->components(); c++) { 23020ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain data.i[c] = op[0]->value.u[c]; 23120ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain } 23220ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain break; 23320ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain case ir_unop_i2u: 23420ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain assert(op[0]->type->base_type == GLSL_TYPE_INT); 23520ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain for (unsigned c = 0; c < op[0]->type->components(); c++) { 23620ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain data.u[c] = op[0]->value.i[c]; 23720ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain } 23820ef96c7ff3f17fbf97e0452a37553249b2b005cBryan Cain break; 239abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert case ir_unop_bitcast_i2f: 240abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(op[0]->type->base_type == GLSL_TYPE_INT); 241abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert for (unsigned c = 0; c < op[0]->type->components(); c++) { 242abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert data.f[c] = bitcast_u2f(op[0]->value.i[c]); 243abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert } 244abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert break; 245abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert case ir_unop_bitcast_f2i: 246abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 247abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert for (unsigned c = 0; c < op[0]->type->components(); c++) { 248abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert data.i[c] = bitcast_f2u(op[0]->value.f[c]); 249abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert } 250abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert break; 251abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert case ir_unop_bitcast_u2f: 252abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(op[0]->type->base_type == GLSL_TYPE_UINT); 253abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert for (unsigned c = 0; c < op[0]->type->components(); c++) { 254abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert data.f[c] = bitcast_u2f(op[0]->value.u[c]); 255abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert } 256abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert break; 257abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert case ir_unop_bitcast_f2u: 258abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 259abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert for (unsigned c = 0; c < op[0]->type->components(); c++) { 260abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert data.u[c] = bitcast_f2u(op[0]->value.f[c]); 261abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert } 262abe976755318fa9dd88a5c48289623ab7c12ce02Olivier Galibert break; 2635e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt case ir_unop_any: 2645e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt assert(op[0]->type->is_boolean()); 2655e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt data.b[0] = false; 2665e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt for (unsigned c = 0; c < op[0]->type->components(); c++) { 2675e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt if (op[0]->value.b[c]) 2685e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt data.b[0] = true; 2695e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt } 2705e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt break; 2715e9ac94cc44ef4f97063d7b696411b2a4be16f36Eric Anholt 272323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke case ir_unop_trunc: 273323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 27498f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 275323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke data.f[c] = truncf(op[0]->value.f[c]); 276323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke } 277323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke break; 278323d909ab21c9f378903e2027fcfef5ba9e890f9Kenneth Graunke 279dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt case ir_unop_round_even: 280dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 281dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt for (unsigned c = 0; c < op[0]->type->components(); c++) { 282dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt data.f[c] = round_to_even(op[0]->value.f[c]); 283dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt } 284dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt break; 285dc637b66b25f341783efb53acc70e1bafbcba576Eric Anholt 286c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke case ir_unop_ceil: 287c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 28898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 289c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke data.f[c] = ceilf(op[0]->value.f[c]); 290c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke } 291c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke break; 292c1ee30a14590d73217f7dbd35e6a1839435cc5b4Kenneth Graunke 293074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke case ir_unop_floor: 294074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 29598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 296074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke data.f[c] = floorf(op[0]->value.f[c]); 297074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke } 298074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke break; 299074720477ce9de3b4dafceffd7406bcebae1a3b9Kenneth Graunke 300d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt case ir_unop_fract: 30198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 30298f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->type->base_type) { 303d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt case GLSL_TYPE_UINT: 304d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt data.u[c] = 0; 305d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt break; 306d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt case GLSL_TYPE_INT: 307d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt data.i[c] = 0; 308d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt break; 309d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt case GLSL_TYPE_FLOAT: 310d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt data.f[c] = op[0]->value.f[c] - floor(op[0]->value.f[c]); 311d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt break; 312d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt default: 313d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt assert(0); 314d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt } 315d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt } 316d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt break; 317d925c9173009e9e5d48df30b30aaef22753183aaEric Anholt 318908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke case ir_unop_sin: 319f2616e56de8a48360cae8f269727b58490555f4dIan Romanick case ir_unop_sin_reduced: 320908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 32198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 322908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke data.f[c] = sinf(op[0]->value.f[c]); 323908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke } 324908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke break; 325908afd16d1f6b5283a2535e388b6dcb77e6504d2Kenneth Graunke 3263fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke case ir_unop_cos: 327f2616e56de8a48360cae8f269727b58490555f4dIan Romanick case ir_unop_cos_reduced: 3283fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 32998f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 3303fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke data.f[c] = cosf(op[0]->value.f[c]); 3313fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke } 3323fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke break; 3333fab376bef8c5f407d4011b89a17ea4fd414f213Kenneth Graunke 33443ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_neg: 33598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 33698f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->type->base_type) { 33743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_UINT: 33888f482a8391b17587fa2af07f6f40dc1f7394fa7Brian Paul data.u[c] = -((int) op[0]->value.u[c]); 33943ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 34043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_INT: 3414daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.i[c] = -op[0]->value.i[c]; 34243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 34343ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_FLOAT: 3444daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = -op[0]->value.f[c]; 34543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 34643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt default: 34743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(0); 34843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 34943ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 35043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 35143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 35243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_abs: 35398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 35498f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->type->base_type) { 35543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_UINT: 3564daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.u[c] = op[0]->value.u[c]; 35743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 35843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_INT: 3594daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.i[c] = op[0]->value.i[c]; 3604daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick if (data.i[c] < 0) 3614daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.i[c] = -data.i[c]; 36243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 36343ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_FLOAT: 3644daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = fabs(op[0]->value.f[c]); 36543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 36643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt default: 36743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(0); 36843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 36943ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 37043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 37143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 37214b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke case ir_unop_sign: 37398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 37498f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->type->base_type) { 37514b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke case GLSL_TYPE_UINT: 37614b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke data.u[c] = op[0]->value.i[c] > 0; 37714b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke break; 37814b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke case GLSL_TYPE_INT: 37914b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke data.i[c] = (op[0]->value.i[c] > 0) - (op[0]->value.i[c] < 0); 38014b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke break; 38114b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke case GLSL_TYPE_FLOAT: 38214b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke data.f[c] = float((op[0]->value.f[c] > 0)-(op[0]->value.f[c] < 0)); 38314b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke break; 38414b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke default: 38514b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke assert(0); 38614b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke } 38714b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke } 38814b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke break; 38914b7b2660c771aa090477c11f85da998ec3d2570Kenneth Graunke 39043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_rcp: 39143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 39298f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 39398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (this->type->base_type) { 39443ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_UINT: 395f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace if (op[0]->value.u[c] != 0.0) 396f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace data.u[c] = 1 / op[0]->value.u[c]; 39743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 39843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_INT: 399f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace if (op[0]->value.i[c] != 0.0) 400f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace data.i[c] = 1 / op[0]->value.i[c]; 40143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 40243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case GLSL_TYPE_FLOAT: 403f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace if (op[0]->value.f[c] != 0.0) 404f2e9981e43b26ca101b774ea6af1f00617098246Chad Versace data.f[c] = 1.0F / op[0]->value.f[c]; 40543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 40643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt default: 40743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(0); 40843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 40943ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 41043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 41143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 41243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_rsq: 41343ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 41498f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 41562c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.f[c] = 1.0F / sqrtf(op[0]->value.f[c]); 41643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 41743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 41843ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 41943ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_sqrt: 42043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 42198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 4224daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = sqrtf(op[0]->value.f[c]); 42343ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 42443ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 42543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 42643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_exp: 42743ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 42898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 4294daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = expf(op[0]->value.f[c]); 43043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 43143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 43243ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 433aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke case ir_unop_exp2: 434aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 43598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 436aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke data.f[c] = exp2f(op[0]->value.f[c]); 437aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke } 438aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke break; 439aca01edc8336fd14005a7ac853e7158f31a74940Kenneth Graunke 44043ad37aa885dc185679dabd605752fe2d782d542Eric Anholt case ir_unop_log: 44143ad37aa885dc185679dabd605752fe2d782d542Eric Anholt assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 44298f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 4434daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = logf(op[0]->value.f[c]); 44443ad37aa885dc185679dabd605752fe2d782d542Eric Anholt } 44543ad37aa885dc185679dabd605752fe2d782d542Eric Anholt break; 44643ad37aa885dc185679dabd605752fe2d782d542Eric Anholt 447cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke case ir_unop_log2: 448cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 44998f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 450cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke data.f[c] = log2f(op[0]->value.f[c]); 451cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke } 452cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke break; 453cb63929df4ce17e94e8ead0316a00d48b51944c9Kenneth Graunke 454d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke case ir_unop_dFdx: 455d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke case ir_unop_dFdy: 456d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 45798f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 4584daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.f[c] = 0.0; 459d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke } 460d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke break; 461d6a32d4b5450d76046428fd3f93a4feb0d14b5e6Kenneth Graunke 462891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke case ir_binop_pow: 463891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke assert(op[0]->type->base_type == GLSL_TYPE_FLOAT); 46498f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 465891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke data.f[c] = powf(op[0]->value.f[c], op[1]->value.f[c]); 466891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke } 467891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke break; 468891a0647e419c0cd2b67e43540936bf0ac94f840Kenneth Graunke 4693f4a0b8bb0cfa36cc6f9968c8aab03f1cb0678ffKenneth Graunke case ir_binop_dot: 470ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke data.f[0] = dot(op[0], op[1]); 4713f4a0b8bb0cfa36cc6f9968c8aab03f1cb0678ffKenneth Graunke break; 472ffcec135997545b4dc2b3393ccb02558083373a0Kenneth Graunke 47379fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case ir_binop_min: 47479fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 47579fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 47679fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke c < components; 47779fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 47879fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke 47998f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 48079fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_UINT: 481f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.u[c] = MIN2(op[0]->value.u[c0], op[1]->value.u[c1]); 48279fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 48379fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_INT: 484f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.i[c] = MIN2(op[0]->value.i[c0], op[1]->value.i[c1]); 48579fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 48679fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_FLOAT: 487f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.f[c] = MIN2(op[0]->value.f[c0], op[1]->value.f[c1]); 48879fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 48979fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke default: 49079fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke assert(0); 49179fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke } 49279fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke } 49379fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke 49479fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 49579fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case ir_binop_max: 49679fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 49779fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 49879fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke c < components; 49979fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 50079fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke 50198f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 50279fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_UINT: 503f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.u[c] = MAX2(op[0]->value.u[c0], op[1]->value.u[c1]); 50479fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 50579fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_INT: 506f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.i[c] = MAX2(op[0]->value.i[c0], op[1]->value.i[c1]); 50779fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 50879fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke case GLSL_TYPE_FLOAT: 509f914915d8e86f492cfcbbf834df601251bbba033Kenneth Graunke data.f[c] = MAX2(op[0]->value.f[c0], op[1]->value.f[c1]); 51079fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke break; 51179fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke default: 51279fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke assert(0); 51379fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke } 51479fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke } 5159be7f638130f46a9df2bfbcd4a03b36de9e4f3aaEric Anholt break; 51679fed377f4625da9ce6a0a32c1e7277a2e90e914Kenneth Graunke 517d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt case ir_binop_add: 518e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 519e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 520e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke c < components; 521e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 522e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke 52398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 524e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke case GLSL_TYPE_UINT: 525e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke data.u[c] = op[0]->value.u[c0] + op[1]->value.u[c1]; 526e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke break; 527e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke case GLSL_TYPE_INT: 528e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke data.i[c] = op[0]->value.i[c0] + op[1]->value.i[c1]; 529e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke break; 530e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke case GLSL_TYPE_FLOAT: 531e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke data.f[c] = op[0]->value.f[c0] + op[1]->value.f[c1]; 532e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke break; 533e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke default: 534e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke assert(0); 535d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt } 536e74dcd7924901e5cb3d0952f46e955e15d0b3207Kenneth Graunke } 537f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick 538d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt break; 539d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt case ir_binop_sub: 54097b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 54197b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 54297b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke c < components; 54397b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 54497b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke 54598f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 54697b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke case GLSL_TYPE_UINT: 54797b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke data.u[c] = op[0]->value.u[c0] - op[1]->value.u[c1]; 54897b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke break; 54997b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke case GLSL_TYPE_INT: 55097b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke data.i[c] = op[0]->value.i[c0] - op[1]->value.i[c1]; 55197b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke break; 55297b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke case GLSL_TYPE_FLOAT: 55397b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1]; 55497b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke break; 55597b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke default: 55697b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke assert(0); 557d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt } 55897b44f040abc9cbf257aba1b7fdaa11134dcc70bKenneth Graunke } 559f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick 560d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt break; 561a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt case ir_binop_mul: 562cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke /* Check for equal types, or unequal types involving scalars */ 56337b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke if ((op[0]->type == op[1]->type && !op[0]->type->is_matrix()) 56437b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke || op0_scalar || op1_scalar) { 56537b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 56637b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke c < components; 56737b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 56837b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke 56998f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 570d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt case GLSL_TYPE_UINT: 57137b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke data.u[c] = op[0]->value.u[c0] * op[1]->value.u[c1]; 572d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt break; 573d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt case GLSL_TYPE_INT: 57437b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke data.i[c] = op[0]->value.i[c0] * op[1]->value.i[c1]; 575d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt break; 576d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt case GLSL_TYPE_FLOAT: 57737b3f9d0edb55807f822c02292348e20a8369c43Kenneth Graunke data.f[c] = op[0]->value.f[c0] * op[1]->value.f[c1]; 578d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt break; 579d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt default: 580d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt assert(0); 581d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt } 582a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt } 583cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke } else { 584cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke assert(op[0]->type->is_matrix() || op[1]->type->is_matrix()); 585cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke 586cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke /* Multiply an N-by-M matrix with an M-by-P matrix. Since either 587cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * matrix can be a GLSL vector, either N or P can be 1. 588cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * 589cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * For vec*mat, the vector is treated as a row vector. This 590cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * means the vector is a 1-row x M-column matrix. 591cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * 592cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * For mat*vec, the vector is treated as a column vector. Since 593cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke * matrix_columns is 1 for vectors, this just works. 594cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke */ 595cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke const unsigned n = op[0]->type->is_vector() 596cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke ? 1 : op[0]->type->vector_elements; 597cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke const unsigned m = op[1]->type->vector_elements; 598cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke const unsigned p = op[1]->type->matrix_columns; 599cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke for (unsigned j = 0; j < p; j++) { 600cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke for (unsigned i = 0; i < n; i++) { 601cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke for (unsigned k = 0; k < m; k++) { 602cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke data.f[i+n*j] += op[0]->value.f[i+n*k]*op[1]->value.f[k+m*j]; 603cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke } 604cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke } 605cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke } 606cf80a4d177225345c2238d8e545f8ae02b41da71Kenneth Graunke } 607f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick 608a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt break; 609d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt case ir_binop_div: 610e7c1f058d18f62aa4871aec623f994d7b68cb8c1Chad Versace /* FINISHME: Emit warning when division-by-zero is detected. */ 611dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 612dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 613dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke c < components; 614dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 615dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke 61698f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 617dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke case GLSL_TYPE_UINT: 61862c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace if (op[1]->value.u[c1] == 0) { 61962c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.u[c] = 0; 62062c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } else { 62162c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.u[c] = op[0]->value.u[c0] / op[1]->value.u[c1]; 62262c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } 623dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke break; 624dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke case GLSL_TYPE_INT: 62562c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace if (op[1]->value.i[c1] == 0) { 62662c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.i[c] = 0; 62762c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } else { 62862c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.i[c] = op[0]->value.i[c0] / op[1]->value.i[c1]; 62962c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } 630dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke break; 631dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke case GLSL_TYPE_FLOAT: 632dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke data.f[c] = op[0]->value.f[c0] / op[1]->value.f[c1]; 633dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke break; 634dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke default: 635dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke assert(0); 636d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt } 637dad35eb8b0c7378588d9dca1c1091aaede83a83fKenneth Graunke } 638f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick 639d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt break; 640ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke case ir_binop_mod: 641e7c1f058d18f62aa4871aec623f994d7b68cb8c1Chad Versace /* FINISHME: Emit warning when division-by-zero is detected. */ 642ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke assert(op[0]->type == op[1]->type || op0_scalar || op1_scalar); 643ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke for (unsigned c = 0, c0 = 0, c1 = 0; 644ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke c < components; 645ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke c0 += c0_inc, c1 += c1_inc, c++) { 646ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke 64798f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke switch (op[0]->type->base_type) { 648ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke case GLSL_TYPE_UINT: 64962c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace if (op[1]->value.u[c1] == 0) { 65062c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.u[c] = 0; 65162c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } else { 65262c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.u[c] = op[0]->value.u[c0] % op[1]->value.u[c1]; 65362c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } 654ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke break; 655ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke case GLSL_TYPE_INT: 65662c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace if (op[1]->value.i[c1] == 0) { 65762c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.i[c] = 0; 65862c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } else { 65962c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace data.i[c] = op[0]->value.i[c0] % op[1]->value.i[c1]; 66062c8c773334c1b0cdd484997a4ccec8945713f8cChad Versace } 661ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke break; 662ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke case GLSL_TYPE_FLOAT: 663ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke /* We don't use fmod because it rounds toward zero; GLSL specifies 664ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke * the use of floor. 665ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke */ 6663e882ec84a2493da74c55d105010a37de521e593Kenneth Graunke data.f[c] = op[0]->value.f[c0] - op[1]->value.f[c1] 667ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke * floorf(op[0]->value.f[c0] / op[1]->value.f[c1]); 668ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke break; 669ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke default: 670ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke assert(0); 671ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke } 672ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke } 673ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke 674ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke break; 675ce5ae5f49d82b545ab204b9fdb9a8f939e0a6d78Kenneth Graunke 676a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt case ir_binop_logic_and: 677f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 67898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) 6794daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.b[c] = op[0]->value.b[c] && op[1]->value.b[c]; 680a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt break; 681d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt case ir_binop_logic_xor: 682f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 68398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) 6844daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.b[c] = op[0]->value.b[c] ^ op[1]->value.b[c]; 685d251b92f8d32b28a91085d5b1f557c1f4756a2f2Eric Anholt break; 686a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt case ir_binop_logic_or: 687f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick assert(op[0]->type->base_type == GLSL_TYPE_BOOL); 68898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) 6894daaab6040d2f2b6b366ec1007772e0793177ceeIan Romanick data.b[c] = op[0]->value.b[c] || op[1]->value.b[c]; 690a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt break; 69185171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt 69285171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt case ir_binop_less: 693e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(op[0]->type == op[1]->type); 694e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 695e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke switch (op[0]->type->base_type) { 696e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_UINT: 697f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.u[c] < op[1]->value.u[c]; 698e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 699e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_INT: 700f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.i[c] < op[1]->value.i[c]; 701e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 702e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_FLOAT: 703f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.f[c] < op[1]->value.f[c]; 704e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 705e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke default: 706e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(0); 707e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke } 70885171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt } 70985171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt break; 71085171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt case ir_binop_greater: 711e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(op[0]->type == op[1]->type); 712e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 713e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke switch (op[0]->type->base_type) { 714e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_UINT: 715e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke data.b[c] = op[0]->value.u[c] > op[1]->value.u[c]; 716e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 717e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_INT: 718e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke data.b[c] = op[0]->value.i[c] > op[1]->value.i[c]; 719e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 720e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_FLOAT: 721e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke data.b[c] = op[0]->value.f[c] > op[1]->value.f[c]; 722e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 723e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke default: 724e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(0); 725e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke } 72685171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt } 72785171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt break; 72885171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt case ir_binop_lequal: 729e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(op[0]->type == op[1]->type); 730e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 731e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke switch (op[0]->type->base_type) { 732e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_UINT: 733f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.u[c] <= op[1]->value.u[c]; 734e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 735e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_INT: 736f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.i[c] <= op[1]->value.i[c]; 737e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 738e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_FLOAT: 739f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.f[c] <= op[1]->value.f[c]; 740e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 741e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke default: 742e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(0); 743e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke } 74485171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt } 74585171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt break; 74685171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt case ir_binop_gequal: 747e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(op[0]->type == op[1]->type); 748e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke for (unsigned c = 0; c < op[0]->type->components(); c++) { 749e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke switch (op[0]->type->base_type) { 750e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_UINT: 751f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.u[c] >= op[1]->value.u[c]; 752e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 753e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_INT: 754f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.i[c] >= op[1]->value.i[c]; 755e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 756e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke case GLSL_TYPE_FLOAT: 757f72e9b2041e294c8ac2258ff3f2b923c39cbef83Kenneth Graunke data.b[c] = op[0]->value.f[c] >= op[1]->value.f[c]; 758e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke break; 759e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke default: 760e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke assert(0); 761e16c9d5d03a4606b37cbeb84358925913086d6ebKenneth Graunke } 76285171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt } 76385171c2dd8c7050511cb7708d75e574005262bf0Eric Anholt break; 764ec1949e8041b63f59aab63440ad9eeeddd226ce3Eric Anholt case ir_binop_equal: 7656ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke assert(op[0]->type == op[1]->type); 7666ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke for (unsigned c = 0; c < components; c++) { 7676ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke switch (op[0]->type->base_type) { 7686ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_UINT: 7696ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.u[c] == op[1]->value.u[c]; 7706ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 7716ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_INT: 7726ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.i[c] == op[1]->value.i[c]; 7736ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 7746ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_FLOAT: 7756ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.f[c] == op[1]->value.f[c]; 7766ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 777a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke case GLSL_TYPE_BOOL: 778a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke data.b[c] = op[0]->value.b[c] == op[1]->value.b[c]; 779a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke break; 7806ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke default: 7816ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke assert(0); 7826ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke } 7834dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri } 784ec1949e8041b63f59aab63440ad9eeeddd226ce3Eric Anholt break; 785ec1949e8041b63f59aab63440ad9eeeddd226ce3Eric Anholt case ir_binop_nequal: 786b726639e1be0614fb6bbb75a6f07c63eacc6d787Paul Berry assert(op[0]->type == op[1]->type); 7876ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke for (unsigned c = 0; c < components; c++) { 7886ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke switch (op[0]->type->base_type) { 7896ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_UINT: 7906ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.u[c] != op[1]->value.u[c]; 7916ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 7926ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_INT: 7936ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.i[c] != op[1]->value.i[c]; 7946ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 7956ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke case GLSL_TYPE_FLOAT: 7966ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke data.b[c] = op[0]->value.f[c] != op[1]->value.f[c]; 7976ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke break; 798a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke case GLSL_TYPE_BOOL: 799a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke data.b[c] = op[0]->value.b[c] != op[1]->value.b[c]; 800a17a78a212be10fe3a9a330f3861d771e92d9074Kenneth Graunke break; 8016ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke default: 8026ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke assert(0); 8036ea16b6c510ee7f0e68505838a99562f0852f8e4Kenneth Graunke } 8044dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri } 8054dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri break; 8064dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri case ir_binop_all_equal: 8074dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri data.b[0] = op[0]->has_value(op[1]); 8084dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri break; 8094dfb89904c0a3d2166e9a3fc0253a254680e91bcLuca Barbieri case ir_binop_any_nequal: 8103163f87463e6d0123c4f95bd76a658cb1e5d0843Kenneth Graunke data.b[0] = !op[0]->has_value(op[1]); 811ec1949e8041b63f59aab63440ad9eeeddd226ce3Eric Anholt break; 812ec1949e8041b63f59aab63440ad9eeeddd226ce3Eric Anholt 813adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace case ir_binop_lshift: 814adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace for (unsigned c = 0, c0 = 0, c1 = 0; 815adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace c < components; 816adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace c0 += c0_inc, c1 += c1_inc, c++) { 817adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 818adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace if (op[0]->type->base_type == GLSL_TYPE_INT && 819adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_INT) { 820adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.i[c] = op[0]->value.i[c0] << op[1]->value.i[c1]; 821adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 822adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_INT && 823adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_UINT) { 824adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.i[c] = op[0]->value.i[c0] << op[1]->value.u[c1]; 825adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 826adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_UINT && 827adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_INT) { 828adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.u[c] = op[0]->value.u[c0] << op[1]->value.i[c1]; 829adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 830adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_UINT && 831adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_UINT) { 832adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.u[c] = op[0]->value.u[c0] << op[1]->value.u[c1]; 833adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } 834adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } 835adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace break; 836adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 837adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace case ir_binop_rshift: 838adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace for (unsigned c = 0, c0 = 0, c1 = 0; 839adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace c < components; 840adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace c0 += c0_inc, c1 += c1_inc, c++) { 841adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 842adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace if (op[0]->type->base_type == GLSL_TYPE_INT && 843adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_INT) { 844adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.i[c] = op[0]->value.i[c0] >> op[1]->value.i[c1]; 845adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 846adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_INT && 847adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_UINT) { 848adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.i[c] = op[0]->value.i[c0] >> op[1]->value.u[c1]; 849adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 850adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_UINT && 851adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_INT) { 852adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.u[c] = op[0]->value.u[c0] >> op[1]->value.i[c1]; 853adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 854adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } else if (op[0]->type->base_type == GLSL_TYPE_UINT && 855adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace op[1]->type->base_type == GLSL_TYPE_UINT) { 856adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace data.u[c] = op[0]->value.u[c0] >> op[1]->value.u[c1]; 857adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } 858adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace } 859adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace break; 860adea8150a70f975c31c68f3e84ec3f8b0b448cf0Chad Versace 8614761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case ir_binop_bit_and: 8624761d0d22ba79fa34adf679007498287e9fedca2Chad Versace for (unsigned c = 0, c0 = 0, c1 = 0; 8634761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c < components; 8644761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c0 += c0_inc, c1 += c1_inc, c++) { 8654761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 8664761d0d22ba79fa34adf679007498287e9fedca2Chad Versace switch (op[0]->type->base_type) { 8674761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_INT: 8684761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.i[c] = op[0]->value.i[c0] & op[1]->value.i[c1]; 8694761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8704761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_UINT: 8714761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.u[c] = op[0]->value.u[c0] & op[1]->value.u[c1]; 8724761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8734761d0d22ba79fa34adf679007498287e9fedca2Chad Versace default: 8744761d0d22ba79fa34adf679007498287e9fedca2Chad Versace assert(0); 8754761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 8764761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 8774761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8784761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 8794761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case ir_binop_bit_or: 8804761d0d22ba79fa34adf679007498287e9fedca2Chad Versace for (unsigned c = 0, c0 = 0, c1 = 0; 8814761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c < components; 8824761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c0 += c0_inc, c1 += c1_inc, c++) { 8834761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 8844761d0d22ba79fa34adf679007498287e9fedca2Chad Versace switch (op[0]->type->base_type) { 8854761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_INT: 8864761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.i[c] = op[0]->value.i[c0] | op[1]->value.i[c1]; 8874761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8884761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_UINT: 8894761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.u[c] = op[0]->value.u[c0] | op[1]->value.u[c1]; 8904761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8914761d0d22ba79fa34adf679007498287e9fedca2Chad Versace default: 8924761d0d22ba79fa34adf679007498287e9fedca2Chad Versace assert(0); 8934761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 8944761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 8954761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 8964761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 8974761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case ir_binop_bit_xor: 8984761d0d22ba79fa34adf679007498287e9fedca2Chad Versace for (unsigned c = 0, c0 = 0, c1 = 0; 8994761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c < components; 9004761d0d22ba79fa34adf679007498287e9fedca2Chad Versace c0 += c0_inc, c1 += c1_inc, c++) { 9014761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 9024761d0d22ba79fa34adf679007498287e9fedca2Chad Versace switch (op[0]->type->base_type) { 9034761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_INT: 9044761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.i[c] = op[0]->value.i[c0] ^ op[1]->value.i[c1]; 9054761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 9064761d0d22ba79fa34adf679007498287e9fedca2Chad Versace case GLSL_TYPE_UINT: 9074761d0d22ba79fa34adf679007498287e9fedca2Chad Versace data.u[c] = op[0]->value.u[c0] ^ op[1]->value.u[c1]; 9084761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 9094761d0d22ba79fa34adf679007498287e9fedca2Chad Versace default: 9104761d0d22ba79fa34adf679007498287e9fedca2Chad Versace assert(0); 9114761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 9124761d0d22ba79fa34adf679007498287e9fedca2Chad Versace } 91311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick break; 91411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick 91511d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick case ir_quadop_vector: 91611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick for (unsigned c = 0; c < this->type->vector_elements; c++) { 91711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick switch (this->type->base_type) { 91811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick case GLSL_TYPE_INT: 91911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick data.i[c] = op[c]->value.i[0]; 92011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick break; 92111d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick case GLSL_TYPE_UINT: 92211d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick data.u[c] = op[c]->value.u[0]; 92311d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick break; 92411d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick case GLSL_TYPE_FLOAT: 92511d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick data.f[c] = op[c]->value.f[0]; 92611d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick break; 92711d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick default: 92811d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick assert(0); 92911d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick } 93011d6f1c69871d0b7edc28f639256460839fccd2dIan Romanick } 9314761d0d22ba79fa34adf679007498287e9fedca2Chad Versace break; 9324761d0d22ba79fa34adf679007498287e9fedca2Chad Versace 933a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt default: 934f8b88bea0fc45be02b7786efe46e941c2f6c8b5dIan Romanick /* FINISHME: Should handle all expression types. */ 935fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 936a576f9d84c35ecc8a797fea6e5e26e5320f7ac0cEric Anholt } 937d98da9738ee791edae5ee6650e7a3ac08b6c26caEric Anholt 93898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke return new(ctx) ir_constant(this->type, &data); 9391cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick} 9401cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 9411cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 942fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 9436e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_texture::constant_expression_value(struct hash_table *variable_context) 94426d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke{ 945fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke /* texture lookups aren't constant expressions */ 946fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 94726d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke} 94826d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 94926d74cd1d140786b8f4b1ccbaf500a16e68eec3cKenneth Graunke 950fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 9516e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_swizzle::constant_expression_value(struct hash_table *variable_context) 9521cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick{ 9536e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *v = this->val->constant_expression_value(variable_context); 954c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick 955c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick if (v != NULL) { 9562d0ef6bfee64b6889cbfb69762f167a6dfc20131Vinson Lee ir_constant_data data = { { 0 } }; 957c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick 958c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick const unsigned swiz_idx[4] = { 95998f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke this->mask.x, this->mask.y, this->mask.z, this->mask.w 960c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick }; 961c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick 96298f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke for (unsigned i = 0; i < this->mask.num_components; i++) { 963c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick switch (v->type->base_type) { 964c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick case GLSL_TYPE_UINT: 965c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick case GLSL_TYPE_INT: data.u[i] = v->value.u[swiz_idx[i]]; break; 966c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick case GLSL_TYPE_FLOAT: data.f[i] = v->value.f[swiz_idx[i]]; break; 967c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick case GLSL_TYPE_BOOL: data.b[i] = v->value.b[swiz_idx[i]]; break; 968c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick default: assert(!"Should not get here."); break; 969c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick } 970c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick } 971c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick 972d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(this); 97398f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke return new(ctx) ir_constant(this->type, &data); 974c2ba6190921be014fecaca0a5627ecc72fa7b2a1Ian Romanick } 975fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 9761cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick} 9771cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 9781cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 979a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertvoid 980a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertir_dereference_variable::constant_referenced(struct hash_table *variable_context, 981a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *&store, int &offset) const 982a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert{ 983a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (variable_context) { 984a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = (ir_constant *)hash_table_find(variable_context, var); 985a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 986a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } else { 987a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = NULL; 988a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 989a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 990a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert} 991a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 992fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 9936e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_dereference_variable::constant_expression_value(struct hash_table *variable_context) 9941cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick{ 99554f583a206a15b1a92c547333adfae29ced796efEric Anholt /* This may occur during compile and var->type is glsl_type::error_type */ 99654f583a206a15b1a92c547333adfae29ced796efEric Anholt if (!var) 99754f583a206a15b1a92c547333adfae29ced796efEric Anholt return NULL; 99854f583a206a15b1a92c547333adfae29ced796efEric Anholt 9996e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert /* Give priority to the context hashtable, if it exists */ 10006e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert if (variable_context) { 10016e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *value = (ir_constant *)hash_table_find(variable_context, var); 10026e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert if(value) 10036e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert return value; 10046e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert } 10056e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert 10065704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt /* The constant_value of a uniform variable is its initializer, 10075704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt * not the lifetime constant value of the uniform. 10085704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt */ 10095704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt if (var->mode == ir_var_uniform) 10105704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt return NULL; 10115704ed27dd2ebc88639cbd32ac971939ef3c267aEric Anholt 10128273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt if (!var->constant_value) 10138273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt return NULL; 10148273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt 1015d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke return var->constant_value->clone(ralloc_parent(var), NULL); 1016c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick} 1017c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1018c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1019a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertvoid 1020a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertir_dereference_array::constant_referenced(struct hash_table *variable_context, 1021a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *&store, int &offset) const 1022a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert{ 1023a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *index_c = array_index->constant_expression_value(variable_context); 1024a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1025a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (!index_c || !index_c->type->is_scalar() || !index_c->type->is_integer()) { 1026a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1027a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1028a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1029a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1030a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1031a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert int index = index_c->type->base_type == GLSL_TYPE_INT ? 1032a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert index_c->get_int_component(0) : 1033a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert index_c->get_uint_component(0); 1034a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1035a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *substore; 1036a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert int suboffset; 1037a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert const ir_dereference *deref = array->as_dereference(); 1038a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (!deref) { 1039a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1040a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1041a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1042a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1043a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1044a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert deref->constant_referenced(variable_context, substore, suboffset); 1045a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1046a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (!substore) { 1047a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1048a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1049a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1050a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1051a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1052a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert const glsl_type *vt = substore->type; 1053a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (vt->is_array()) { 1054a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = substore->get_array_element(index); 1055a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1056a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1057a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1058a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (vt->is_matrix()) { 1059a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = substore; 1060a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = index * vt->vector_elements; 1061a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1062a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1063a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (vt->is_vector()) { 1064a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = substore; 1065a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = suboffset + index; 1066a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1067a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1068a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1069a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1070a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1071a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert} 1072a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1073fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 10746e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_dereference_array::constant_expression_value(struct hash_table *variable_context) 1075c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick{ 10766e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *array = this->array->constant_expression_value(variable_context); 10776e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *idx = this->array_index->constant_expression_value(variable_context); 10789b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 10799b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick if ((array != NULL) && (idx != NULL)) { 1080d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke void *ctx = ralloc_parent(this); 10819b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick if (array->type->is_matrix()) { 10829b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick /* Array access of a matrix results in a vector. 10839b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick */ 10849b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick const unsigned column = idx->value.u[0]; 10859b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 10869b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick const glsl_type *const column_type = array->type->column_type(); 10879b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 10889b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick /* Offset in the constant matrix to the first element of the column 10899b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick * to be extracted. 10909b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick */ 10919b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick const unsigned mat_idx = column * column_type->vector_elements; 10929b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 1093720bdfbceb5b20bbbb4090cca7a1825ca5f89260Vinson Lee ir_constant_data data = { { 0 } }; 10949b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 10959b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick switch (column_type->base_type) { 10969b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick case GLSL_TYPE_UINT: 10979b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick case GLSL_TYPE_INT: 10989b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick for (unsigned i = 0; i < column_type->vector_elements; i++) 10999b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick data.u[i] = array->value.u[mat_idx + i]; 11009b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 11019b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick break; 11029b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 11039b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick case GLSL_TYPE_FLOAT: 11049b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick for (unsigned i = 0; i < column_type->vector_elements; i++) 11059b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick data.f[i] = array->value.f[mat_idx + i]; 11069b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 11079b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick break; 11089b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 11099b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick default: 11109b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick assert(!"Should not get here."); 11119b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick break; 11129b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick } 11139b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 1114fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return new(ctx) ir_constant(column_type, &data); 11159b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick } else if (array->type->is_vector()) { 11169b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick const unsigned component = idx->value.u[0]; 11179b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick 1118fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return new(ctx) ir_constant(array, component); 11199b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick } else { 1120a096fa747611472965cf0f953bfe2757fc80383cKenneth Graunke const unsigned index = idx->value.u[0]; 11218273bd46877e2ea2b8a02b87a11c68102d07e1f2Eric Anholt return array->get_array_element(index)->clone(ctx, NULL); 11229b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick } 11239b92af9ebc018eab63623812984a77f3aa834fe0Ian Romanick } 1124fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 1125c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick} 1126c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1127c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick 1128a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertvoid 1129a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibertir_dereference_record::constant_referenced(struct hash_table *variable_context, 1130a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *&store, int &offset) const 1131a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert{ 1132a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert ir_constant *substore; 1133a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert int suboffset; 1134a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert const ir_dereference *deref = record->as_dereference(); 1135a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (!deref) { 1136a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1137a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1138a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1139a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1140a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1141a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert deref->constant_referenced(variable_context, substore, suboffset); 1142a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1143a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert if (!substore) { 1144a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = 0; 1145a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1146a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert return; 1147a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert } 1148a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1149a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert store = substore->get_record_field(field); 1150a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert offset = 0; 1151a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert} 1152a270e86d382597d4d01ebcfa1693e21d778cbe6dOlivier Galibert 1153fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 11546e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_dereference_record::constant_expression_value(struct hash_table *variable_context) 1155c7b1046a9fa6da916f11fb9e43d61fd772470183Ian Romanick{ 115698f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke ir_constant *v = this->record->constant_expression_value(); 1157253dedeb6c3beb5192e76b5abafce58a302d9066Ian Romanick 115898f32a13bef1eef732304eb8e2781e08835ff69aKenneth Graunke return (v != NULL) ? v->get_record_field(this->field) : NULL; 11591cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick} 11601cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 11611cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick 1162fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 11636e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_assignment::constant_expression_value(struct hash_table *variable_context) 116416efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke{ 1165fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke /* FINISHME: Handle CEs involving assignment (return RHS) */ 1166fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return NULL; 116716efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke} 116816efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 116916efab1c4dee6e6a827ba5f1c482378159545ae5Kenneth Graunke 1170fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 11716e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_constant::constant_expression_value(struct hash_table *variable_context) 11721cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick{ 1173fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunke return this; 11741cf43a4331dfe62aaa834e5bc6319b43eac98445Ian Romanick} 1175fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 1176fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick 1177fb2ffd2846b48cb50128fb74df56f2ee63179832Kenneth Graunkeir_constant * 11786e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_call::constant_expression_value(struct hash_table *variable_context) 1179fad607a9be59056aecda50176b4d20a8b5319747Ian Romanick{ 11806e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert return this->callee->constant_expression_value(&this->actual_parameters, variable_context); 1181d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke} 1182d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke 1183d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke 1184363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibertbool ir_function_signature::constant_expression_evaluate_expression_list(const struct exec_list &body, 1185363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert struct hash_table *variable_context, 1186363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant **result) 1187363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert{ 1188363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert foreach_list(n, &body) { 1189363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_instruction *inst = (ir_instruction *)n; 1190363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert switch(inst->ir_type) { 1191363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1192363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* (declare () type symbol) */ 1193363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert case ir_type_variable: { 1194363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_variable *var = inst->as_variable(); 1195363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert hash_table_insert(variable_context, ir_constant::zero(this, var->type), var); 1196363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert break; 1197363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1198363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1199363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* (assign [condition] (write-mask) (ref) (value)) */ 1200363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert case ir_type_assignment: { 1201363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_assignment *asg = inst->as_assignment(); 1202363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (asg->condition) { 1203363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *cond = asg->condition->constant_expression_value(variable_context); 1204363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!cond) 1205363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1206363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!cond->get_bool_component(0)) 1207363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert break; 1208363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1209363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1210363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *store = NULL; 1211363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert int offset = 0; 1212363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert asg->lhs->constant_referenced(variable_context, store, offset); 1213363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1214363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!store) 1215363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1216363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1217363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *value = asg->rhs->constant_expression_value(variable_context); 1218363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1219363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!value) 1220363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1221363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1222363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert store->copy_masked_offset(value, offset, asg->write_mask); 1223363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert break; 1224363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1225363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1226363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* (return (expression)) */ 1227363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert case ir_type_return: 1228363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert assert (result); 1229363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert *result = inst->as_return()->value->constant_expression_value(variable_context); 1230363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return *result != NULL; 1231363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1232363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* (call name (ref) (params))*/ 1233363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert case ir_type_call: { 1234363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_call *call = inst->as_call(); 1235363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1236363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* Just say no to void functions in constant expressions. We 1237363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * don't need them at that point. 1238363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 1239363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1240363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!call->return_deref) 1241363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1242363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1243363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *store = NULL; 1244363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert int offset = 0; 1245363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert call->return_deref->constant_referenced(variable_context, store, offset); 1246363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1247363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!store) 1248363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1249363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1250363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *value = call->constant_expression_value(variable_context); 1251363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1252363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if(!value) 1253363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1254363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1255363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert store->copy_offset(value, offset); 1256363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert break; 1257363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1258363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1259363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* (if condition (then-instructions) (else-instructions)) */ 1260363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert case ir_type_if: { 1261363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_if *iif = inst->as_if(); 1262363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1263363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *cond = iif->condition->constant_expression_value(variable_context); 1264363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!cond || !cond->type->is_boolean()) 1265363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1266363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1267363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert exec_list &branch = cond->get_bool_component(0) ? iif->then_instructions : iif->else_instructions; 1268363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1269363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert *result = NULL; 1270363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (!constant_expression_evaluate_expression_list(branch, variable_context, result)) 1271363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1272363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1273363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* If there was a return in the branch chosen, drop out now. */ 1274363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (*result) 1275363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return true; 1276363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1277363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert break; 1278363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1279363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1280363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* Every other expression type, we drop out. */ 1281363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert default: 1282363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return false; 1283363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1284363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert } 1285363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1286363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* Reaching the end of the block is not an error condition */ 1287363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (result) 1288363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert *result = NULL; 1289363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1290363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return true; 1291363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert} 1292363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1293d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunkeir_constant * 12946e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibertir_function_signature::constant_expression_value(exec_list *actual_parameters, struct hash_table *variable_context) 1295d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke{ 1296d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke const glsl_type *type = this->return_type; 1297d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke if (type == glsl_type::void_type) 1298d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke return NULL; 1299d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke 1300bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke /* From the GLSL 1.20 spec, page 23: 1301bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke * "Function calls to user-defined functions (non-built-in functions) 1302bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke * cannot be used to form constant expressions." 1303bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke */ 1304d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke if (!this->is_builtin) 1305bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke return NULL; 1306bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1307363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* 1308363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * Of the builtin functions, only the texture lookups and the noise 1309363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * ones must not be used in constant expressions. They all include 1310363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * specific opcodes so they don't need to be special-cased at this 1311363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * point. 1312363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 1313363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1314363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* Initialize the table of dereferencable names with the function 1315363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * parameters. Verify their const-ness on the way. 1316363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * 1317363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * We expect the correctness of the number of parameters to have 1318363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * been checked earlier. 1319363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 1320363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert hash_table *deref_hash = hash_table_ctor(8, hash_table_pointer_hash, 1321363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert hash_table_pointer_compare); 1322363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert 1323363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* If "origin" is non-NULL, then the function body is there. So we 1324363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * have to use the variable objects from the object with the body, 1325363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * but the parameter instanciation on the current object. 1326363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 1327363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert const exec_node *parameter_info = origin ? origin->parameters.head : parameters.head; 1328bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1329d0fa0cb52cebdcd0ca483b9cd7af6be2f228b8dcKenneth Graunke foreach_list(n, actual_parameters) { 13306e4852a3a5f3cbe52c53d91d343a37861f207563Olivier Galibert ir_constant *constant = ((ir_rvalue *) n)->constant_expression_value(variable_context); 1331ea055e19c2757dfe97dd13c1deee2bfa177eae3fMarcin Slusarz if (constant == NULL) { 1332ea055e19c2757dfe97dd13c1deee2bfa177eae3fMarcin Slusarz hash_table_dtor(deref_hash); 1333ea055e19c2757dfe97dd13c1deee2bfa177eae3fMarcin Slusarz return NULL; 1334ea055e19c2757dfe97dd13c1deee2bfa177eae3fMarcin Slusarz } 1335ea055e19c2757dfe97dd13c1deee2bfa177eae3fMarcin Slusarz 1336bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1337363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_variable *var = (ir_variable *)parameter_info; 1338363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert hash_table_insert(deref_hash, constant, var); 1339bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1340363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert parameter_info = parameter_info->next; 1341bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke } 1342f8e31e00b1078dc28187a43a1ab8949e154e7533Ian Romanick 1343363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert ir_constant *result = NULL; 1344a4ca1cfb66160c4ea2325f503ff025a4adc35084Kenneth Graunke 1345363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert /* Now run the builtin function until something non-constant 1346363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert * happens or we get the result. 1347363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert */ 1348363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert if (constant_expression_evaluate_expression_list(origin ? origin->body : body, deref_hash, &result) && result) 1349363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert result = result->clone(ralloc_parent(this), NULL); 1350bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1351363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert hash_table_dtor(deref_hash); 1352bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke 1353363c14ae0cd2baa624d85e8c9db12cd1677190eaOlivier Galibert return result; 1354bafd89fa0f026cef12024382b154a41d90d00373Kenneth Graunke} 1355