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>
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user