On Thu, May 23, 2019 at 09:20:15PM +0100, Jiong Wang wrote: > > Alexei Starovoitov writes: > > <snip> > > > well, it made me realize that we're probably doing it wrong, > > since after calling check_reg_arg() we need to re-parse insn encoding. > > How about we change check_reg_arg()'s enum reg_arg_type instead? > > This is exactly what I had implemented in my initial internal version. it was long ago :) shrinkers purged it. > > The caller has much more context and no need to parse insn opcode again. > > And I had exactly the same thoughts, is_reg64 is duplicating what has been > done. > > The code evolved into the current shape mostly because I agreed if we > re-centre all checks inside check_reg_arg, then we don't need to touch > quite a few call sites of check_reg_arg, the change/patch looks simpler, > and I was thinking is_reg64 is a quick check, so the overhead is not big. > > > Something like: > > enum reg_arg_type { > > SRC_OP64, > > DST_OP64, > > DST_OP_NO_MARK, // probably no need to split this one ? > > SRC_OP32, > > DST_OP32, > > }; > > > > Yeah, no need to split DST_OP_NO_MARK, my split was > > enum reg_arg_type { > SRC_OP, > + SRC32_OP, > DST_OP, > + DST32_OP, > DST_OP_NO_MARK > } > > No renaming on existing SRC/DST_OP, they mean 64-bit, the changes are > smaller, looks better? > > But, we also need to know whether one patch-insn define sub-register, if it > is, we then conservatively mark it as needing zero extension. patch-insn > doesn't go through check_reg_arg analysis, so still need separate insn > parsing. Good point. Then let's stick with your last is_reg64(). Re-parsing is annoying, but looks like there is already use case for it and more can appear in the future.