Alexei Starovoitov via llvm-dev
2016-Jun-16 05:41 UTC
[llvm-dev] [iovisor-dev] [PATCH, BPF 5/5] BPF: Add 32-bit and pattern
On Wed, Jun 15, 2016 at 2:37 PM, Richard Henderson via iovisor-dev <iovisor-dev at lists.iovisor.org> wrote:> We can represent a 64-bit AND with unsigned immediate > with a 32-bit AND opcode. > > Signed-off-by: Richard Henderson <rth at twiddle.net> > --- > lib/Target/BPF/BPFInstrInfo.td | 15 +++++++++++++++ > 1 file changed, 15 insertions(+) > > diff --git a/lib/Target/BPF/BPFInstrInfo.td b/lib/Target/BPF/BPFInstrInfo.td > index 33481b9..62c2dd8 100644 > --- a/lib/Target/BPF/BPFInstrInfo.td > +++ b/lib/Target/BPF/BPFInstrInfo.td > @@ -273,6 +273,21 @@ let isReMaterializable = 1, isAsCheapAsAMove = 1 in { > } // isMoveImm > } > > +let Constraints = "$dst = $srcd", isAsCheapAsAMove = 1, isCommutable = 1 in { > + def AND_ru > + : F_COF<4 /* BPF_ALU */, 0x5 /* BPF_AND */, 0 /* BPF_K */, > + (outs GPR:$dst), (ins GPR:$srcd, i64imm:$imm), > + "andwi\t$dst, $imm", > + [(set GPR:$dst, (and GPR:$srcd, i64immZExt32:$imm))]> {nice! Do you have further optimizations that take advantage of 32-bit subregisters and zero extension? Should it be added in more generic way instead of pattern match?
Richard Henderson via llvm-dev
2016-Jun-16 17:42 UTC
[llvm-dev] [iovisor-dev] [PATCH, BPF 5/5] BPF: Add 32-bit and pattern
On 06/15/2016 10:41 PM, Alexei Starovoitov wrote:> Do you have further optimizations that take advantage of 32-bit > subregisters and zero extension? > Should it be added in more generic way instead of pattern match?This is the last of the operations that can be implemented with just 64-bit operands. A full and proper implementation of 32-bit operations takes quite a bit more effort. I started on that one evening last week before realizing quite how much, and had to put it aside for now. More important is probably to get signed division working instead of emitting an error. I expect it ought to be similar to how Select is expanded, with multiple blocks: if (a < 0) a2 = -a a3 = phi(a, a2) if (b < 0) b2 = -b b3 = phi(b, b2) r = a3 / b3 if ((a ^ b) < 0) r2 = -r r3 = phi(r, r2) r~