summaryrefslogtreecommitdiffstats
path: root/src/glsl/ir.cpp
diff options
context:
space:
mode:
authorKenneth Graunke <kenneth@whitecape.org>2014-04-06 18:34:59 -0700
committerKenneth Graunke <kenneth@whitecape.org>2014-04-08 00:01:53 -0700
commit7540be22d16bce68163a6478fa2d7a5aa1d9844d (patch)
tree7fef4ad7c96b68bf1acd7451514151cf905f5f83 /src/glsl/ir.cpp
parentbd69f65f90ecfa45e43a72504d277cb39f00e1c1 (diff)
downloadexternal_mesa3d-7540be22d16bce68163a6478fa2d7a5aa1d9844d.zip
external_mesa3d-7540be22d16bce68163a6478fa2d7a5aa1d9844d.tar.gz
external_mesa3d-7540be22d16bce68163a6478fa2d7a5aa1d9844d.tar.bz2
glsl: Make is_16bit_constant from i965 an ir_constant method.
The i965 MUL instruction doesn't natively support 32-bit by 32-bit integer multiplication; additional instructions (MACH/MOV) are required. However, we can avoid those if we know one of the operands can be represented in 16 bits or less. The vector backend's is_16bit_constant static helper function checks for this. We want to be able to use it in the scalar backend as well, which means moving the function to a more generally-usable location. Since it isn't i965 specific, I decided to make it an ir_constant method, in case it ends up being useful to other people as well. v2: Rename from is_16bit_integer_constant to is_uint16_constant, as suggested by Ilia Mirkin. Update comments to clarify that it does apply to both int and uint types, as long as the value is non-negative and fits in 16-bits. Signed-off-by: Kenneth Graunke <kenneth@whitecape.org> Reviewed-by: Ian Romanick <ian.d.romanick@intel.com> Reviewed-by: Matt Turner <mattst88@gmail.com>
Diffstat (limited to 'src/glsl/ir.cpp')
-rw-r--r--src/glsl/ir.cpp9
1 files changed, 9 insertions, 0 deletions
diff --git a/src/glsl/ir.cpp b/src/glsl/ir.cpp
index a41eddf..1a18b47 100644
--- a/src/glsl/ir.cpp
+++ b/src/glsl/ir.cpp
@@ -1223,6 +1223,15 @@ ir_constant::is_basis() const
return ones == 1;
}
+bool
+ir_constant::is_uint16_constant() const
+{
+ if (!type->is_integer())
+ return false;
+
+ return value.u[0] < (1 << 16);
+}
+
ir_loop::ir_loop()
{
this->ir_type = ir_type_loop;