From 31d18ff44244d1fe3ae913a5a1957d82059cb328 Mon Sep 17 00:00:00 2001 From: David Faust <david.faust@oracle.com> Date: Thu, 27 Jul 2023 10:56:29 -0700 Subject: [PATCH] bpf: correct pseudo-C template for add3 and sub3 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. 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 2ffc4ebd17e9..66436397bb78 100644 --- a/gcc/config/bpf/bpf.md +++ b/gcc/config/bpf/bpf.md @@ -131,7 +131,7 @@ (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 @@ (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 000000000000..0444a9bc68a1 --- /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 000000000000..751db2477c0c --- /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} } } */ + -- GitLab