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~