nir/builder: Emit better code for iadd/imul_imm
Because we already know the immediate right-hand parameter, we can potentially save the optimizer a bit of work. Reviewed-by: Karol Herbst <kherbst@redhat.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Caio Marcelo de Oliveira Filho <caio.oliveira@intel.com>
This commit is contained in:

committed by
Jason Ekstrand

parent
ebbb6b8eaa
commit
cd4c1458ba
@@ -25,6 +25,7 @@
|
|||||||
#define NIR_BUILDER_H
|
#define NIR_BUILDER_H
|
||||||
|
|
||||||
#include "nir_control_flow.h"
|
#include "nir_control_flow.h"
|
||||||
|
#include "util/bitscan.h"
|
||||||
#include "util/half_float.h"
|
#include "util/half_float.h"
|
||||||
|
|
||||||
struct exec_list;
|
struct exec_list;
|
||||||
@@ -601,13 +602,33 @@ nir_u2u(nir_builder *build, nir_ssa_def *x, unsigned dest_bit_size)
|
|||||||
static inline nir_ssa_def *
|
static inline nir_ssa_def *
|
||||||
nir_iadd_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
|
nir_iadd_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
|
||||||
{
|
{
|
||||||
return nir_iadd(build, x, nir_imm_intN_t(build, y, x->bit_size));
|
assert(x->bit_size <= 64);
|
||||||
|
if (x->bit_size < 64)
|
||||||
|
y &= (1ull << x->bit_size) - 1;
|
||||||
|
|
||||||
|
if (y == 0) {
|
||||||
|
return x;
|
||||||
|
} else {
|
||||||
|
return nir_iadd(build, x, nir_imm_intN_t(build, y, x->bit_size));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline nir_ssa_def *
|
static inline nir_ssa_def *
|
||||||
nir_imul_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
|
nir_imul_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
|
||||||
{
|
{
|
||||||
return nir_imul(build, x, nir_imm_intN_t(build, y, x->bit_size));
|
assert(x->bit_size <= 64);
|
||||||
|
if (x->bit_size < 64)
|
||||||
|
y &= (1ull << x->bit_size) - 1;
|
||||||
|
|
||||||
|
if (y == 0) {
|
||||||
|
return nir_imm_intN_t(build, 0, x->bit_size);
|
||||||
|
} else if (y == 1) {
|
||||||
|
return x;
|
||||||
|
} else if (util_is_power_of_two_or_zero64(y)) {
|
||||||
|
return nir_ishl(build, x, nir_imm_int(build, ffsll(y) - 1));
|
||||||
|
} else {
|
||||||
|
return nir_imul(build, x, nir_imm_intN_t(build, y, x->bit_size));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline nir_ssa_def *
|
static inline nir_ssa_def *
|
||||||
|
@@ -79,9 +79,7 @@ vtn_access_link_as_ssa(struct vtn_builder *b, struct vtn_access_link link,
|
|||||||
nir_ssa_def *ssa = vtn_ssa_value(b, link.id)->def;
|
nir_ssa_def *ssa = vtn_ssa_value(b, link.id)->def;
|
||||||
if (ssa->bit_size != bit_size)
|
if (ssa->bit_size != bit_size)
|
||||||
ssa = nir_i2i(&b->nb, ssa, bit_size);
|
ssa = nir_i2i(&b->nb, ssa, bit_size);
|
||||||
if (stride != 1)
|
return nir_imul_imm(&b->nb, ssa, stride);
|
||||||
ssa = nir_imul_imm(&b->nb, ssa, stride);
|
|
||||||
return ssa;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user