On 08/13/2014 05:29 AM, Kyrill Tkachov wrote:
> Is the attached patch ok? It just moves the section as you suggested. I did a
> build of the Linux kernel with and without this patch to make sure no code-gen
> was accidentally affected.
Looks good.
> We'd need to store a mapping from constant to RTXes and everytime we have a
> "cache hit" we'd have to tweak them to make sure the registers involved are
> correct. I had a quick play with this but ended up with LRA ICEs :(
You mis-understand how I meant to memoize. Have a look at how we cache
expansions for multiply in synth_mult: we don't record registers or rtx's, but
we do record the operation and arguments.
So you could consider building a trie, indexed by a hash.
struct imm_algorithm
{
HOST_WIDE_INT op1;
imm_algorithm *prev;
enum operation {
// op1 is accepted by aarch64_mov_operand.
// prev should be null.
mov,
// op1 is to be inserted at the given position
// to the value constructed by prev.
movk_48, movk_32, movk_16, movk_0,
// op1 is an arithmetic immediate to be applied
// to the value constructed by prev
add, sub,
// op1 is a logical immediate to be applied to
// the value constructed by prev
and, ior,
} code;
};
r~