On 08/07/2014 02:57 AM, Kyrill Tkachov wrote:
> + if (one_match > zero_match)
> + {
> + /* Set either first three quarters or all but the third. */
> + mask = 0xffffll << (16 - first_not_ffff_match);
> + emit_insn (gen_rtx_SET (VOIDmode, dest,
> + GEN_INT (val | mask | 0xffffffff00000000ull)));
> +
> + /* Now insert other two quarters. */
> + for (i = first_not_ffff_match + 16, mask <<= (first_not_ffff_match <<
> 1);
> + i < 64; i += 16, mask <<= 16)
> {
> if ((val & mask) != mask)
> + emit_insn (gen_insv_immdi (dest, GEN_INT (i),
> + GEN_INT ((val >> i) & 0xffff)));
> }
> + return;
> }
>
> if (zero_match == 2)
You should not place this three instruction sequence before the two instruction
sequences that follow. I.e. place this just before simple_sequence.
I do wonder if we should be memo-izing these computations so that we only have
to do the complex search for a sequence only once for each constant...
r~