> The pseudo-C output templates for these instructions were incorrectly > using operand 1 rather than operand 2 on the RHS, which led to some > very incorrect assembly generation with -masm=pseudoc. > > Tested on bpf-unknown-none. > OK?
OK. Thanks for spotting and fixing this! > > gcc/ > > * config/bpf/bpf.md (add<AM:mode>3): Use %w2 instead of %w1 > in pseudo-C dialect output template. > (sub<AM:mode>3): Likewise. > > gcc/testsuite/ > > * gcc.target/bpf/alu-2.c: New test. > * gcc.target/bpf/alu-pseudoc-2.c: Likewise. > --- > gcc/config/bpf/bpf.md | 4 ++-- > gcc/testsuite/gcc.target/bpf/alu-2.c | 12 ++++++++++++ > gcc/testsuite/gcc.target/bpf/alu-pseudoc-2.c | 13 +++++++++++++ > 3 files changed, 27 insertions(+), 2 deletions(-) > create mode 100644 gcc/testsuite/gcc.target/bpf/alu-2.c > create mode 100644 gcc/testsuite/gcc.target/bpf/alu-pseudoc-2.c > > diff --git a/gcc/config/bpf/bpf.md b/gcc/config/bpf/bpf.md > index 2ffc4ebd17e..66436397bb7 100644 > --- a/gcc/config/bpf/bpf.md > +++ b/gcc/config/bpf/bpf.md > @@ -131,7 +131,7 @@ (define_insn "add<AM:mode>3" > (plus:AM (match_operand:AM 1 "register_operand" " 0,0") > (match_operand:AM 2 "reg_or_imm_operand" " r,I")))] > "1" > - "{add<msuffix>\t%0,%2|%w0 += %w1}" > + "{add<msuffix>\t%0,%2|%w0 += %w2}" > [(set_attr "type" "<mtype>")]) > > ;;; Subtraction > @@ -144,7 +144,7 @@ (define_insn "sub<AM:mode>3" > (minus:AM (match_operand:AM 1 "register_operand" " 0") > (match_operand:AM 2 "register_operand" " r")))] > "" > - "{sub<msuffix>\t%0,%2|%w0 -= %w1}" > + "{sub<msuffix>\t%0,%2|%w0 -= %w2}" > [(set_attr "type" "<mtype>")]) > > ;;; Negation > diff --git a/gcc/testsuite/gcc.target/bpf/alu-2.c > b/gcc/testsuite/gcc.target/bpf/alu-2.c > new file mode 100644 > index 00000000000..0444a9bc68a > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/alu-2.c > @@ -0,0 +1,12 @@ > +/* Check add and sub instructions. */ > +/* { dg-do compile } */ > +/* { dg-options "" } */ > + > +long foo (long x, long y) > +{ > + return y - x + 4; > +} > + > +/* { dg-final { scan-assembler-not {sub\t(%r.),\1\n} } } */ > +/* { dg-final { scan-assembler {sub\t(\%r.),(\%r.)\n} } } */ > +/* { dg-final { scan-assembler {add\t(\%r.),4\n} } } */ > diff --git a/gcc/testsuite/gcc.target/bpf/alu-pseudoc-2.c > b/gcc/testsuite/gcc.target/bpf/alu-pseudoc-2.c > new file mode 100644 > index 00000000000..751db2477c0 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/bpf/alu-pseudoc-2.c > @@ -0,0 +1,13 @@ > +/* Check add and sub instructions (pseudoc asm dialect). */ > +/* { dg-do compile } */ > +/* { dg-options "-masm=pseudoc" } */ > + > +long foo (long x, long y) > +{ > + return y - x + 4; > +} > + > +/* { dg-final { scan-assembler-not {\t(r.) -= \1\n} } } */ > +/* { dg-final { scan-assembler {\t(r.) -= (r.)\n} } } */ > +/* { dg-final { scan-assembler {\t(r.) \+= 4\n} } } */ > +