#include "insn-attr.h"
#include "tree-pass.h"
#include "print-rtl.h"
+#include <math.h>
/* This file should be included last. */
#include "target-def.h"
{
HOST_WIDE_INT imm = INT_MAX;
rtx x = NULL_RTX;
- int shift;
+ int shift, sqr;
gcc_assert (REG_P (dst));
x = gen_lshrsi3 (dst, dst, GEN_INT (32 - shift));
}
-
shift = ctz_hwi (srcval);
if ((!x || (TARGET_DENSITY && ! IN_RANGE (imm, -32, 95)))
&& xtensa_simm12b (srcval >> shift))
x = gen_addsi3 (dst, dst, GEN_INT (imm1));
}
+ sqr = (int) floorf (sqrtf (srcval));
+ if (TARGET_MUL32 && optimize_size
+ && !x && IN_RANGE (srcval, 0, (2047 * 2047)) && sqr * sqr == srcval)
+ {
+ imm = sqr;
+ x = gen_mulsi3 (dst, dst, dst);
+ }
+
if (!x)
return 0;