vc4: Optimize fmul(x, 0) and fmul(x, 1).

This was being generated frequently by matrix multiplies of 2 and
3-channel vertex attributes (which have the 0 or 1 loaded in the shader).
This commit is contained in:
Eric Anholt 2014-10-09 15:02:00 +02:00
parent 1cd8c1aab0
commit 0401f55fff

View file

@ -33,6 +33,7 @@
*/
#include "vc4_qir.h"
#include "util/u_math.h"
static bool debug;
@ -77,6 +78,16 @@ is_zero(struct vc4_compile *c, struct qinst **defs, struct qreg reg)
c->uniform_data[reg.index] == 0);
}
static bool
is_1f(struct vc4_compile *c, struct qinst **defs, struct qreg reg)
{
reg = follow_movs(defs, reg);
return (reg.file == QFILE_UNIF &&
c->uniform_contents[reg.index] == QUNIFORM_CONSTANT &&
c->uniform_data[reg.index] == fui(1.0));
}
static void
replace_with_mov(struct vc4_compile *c, struct qinst *inst, struct qreg arg)
{
@ -87,6 +98,30 @@ replace_with_mov(struct vc4_compile *c, struct qinst *inst, struct qreg arg)
dump_to(c, inst);
}
static bool
fmul_replace_zero(struct vc4_compile *c,
struct qinst **defs,
struct qinst *inst,
int arg)
{
if (!is_zero(c, defs, inst->src[arg]))
return false;
replace_with_mov(c, inst, inst->src[arg]);
return true;
}
static bool
fmul_replace_one(struct vc4_compile *c,
struct qinst **defs,
struct qinst *inst,
int arg)
{
if (!is_1f(c, defs, inst->src[arg]))
return false;
replace_with_mov(c, inst, inst->src[1 - arg]);
return true;
}
bool
qir_opt_algebraic(struct vc4_compile *c)
{
@ -177,6 +212,16 @@ qir_opt_algebraic(struct vc4_compile *c)
}
break;
case QOP_FMUL:
if (fmul_replace_zero(c, defs, inst, 0) ||
fmul_replace_zero(c, defs, inst, 1) ||
fmul_replace_one(c, defs, inst, 0) ||
fmul_replace_one(c, defs, inst, 1)) {
progress = true;
break;
}
break;
default:
break;
}