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