From: Jose E. Marchesi Date: Wed, 26 Jul 2023 10:07:30 +0000 (+0200) Subject: bpf: fix generation of neg and neg32 BPF instructions X-Git-Tag: basepoints/gcc-15~7354 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=590a8287bf2e7c6b179cfa9a39b4b9a7ae5624a5;p=thirdparty%2Fgcc.git bpf: fix generation of neg and neg32 BPF instructions This patch fixes GCC to generate correct neg and neg32 instructions, which do not take a source register operand. A couple of new tests are added. Tested in bpf-unknown-none. gcc/ChangeLog 2023-07-26 Jose E. Marchesi * config/bpf/bpf.md: Fix neg{SI,DI}2 insn. gcc/testsuite/ChangeLog 2023-07-26 Jose E. Marchesi * gcc.target/bpf/neg-1.c: New test. * gcc.target/bpf/neg-pseudoc-1.c: Likewise. --- diff --git a/gcc/config/bpf/bpf.md b/gcc/config/bpf/bpf.md index 579a8213b095..1b5e1900d4fa 100644 --- a/gcc/config/bpf/bpf.md +++ b/gcc/config/bpf/bpf.md @@ -142,9 +142,9 @@ ;;; Negation (define_insn "neg2" [(set (match_operand:AM 0 "register_operand" "=r,r") - (neg:AM (match_operand:AM 1 "reg_or_imm_operand" " r,I")))] + (neg:AM (match_operand:AM 1 "reg_or_imm_operand" " 0,I")))] "" - "{neg\t%0,%1|%w0 = -%w1}" + "{neg\t%0|%w0 = -%w1}" [(set_attr "type" "")]) ;;; Multiplication diff --git a/gcc/testsuite/gcc.target/bpf/neg-1.c b/gcc/testsuite/gcc.target/bpf/neg-1.c new file mode 100644 index 000000000000..9ffb956859d0 --- /dev/null +++ b/gcc/testsuite/gcc.target/bpf/neg-1.c @@ -0,0 +1,14 @@ +/* Check negr and negr32 instructions. */ + +/* { dg-do compile } */ +/* { dg-options "-malu32" } */ + +long foo (long a, long b, int x, int y) +{ + a = -b; + x = -y; + return a + x; +} + +/* { dg-final { scan-assembler "neg\t%r.\n" } } */ +/* { dg-final { scan-assembler "neg32\t%r.\n" } } */ diff --git a/gcc/testsuite/gcc.target/bpf/neg-pseudoc-1.c b/gcc/testsuite/gcc.target/bpf/neg-pseudoc-1.c new file mode 100644 index 000000000000..a4fb687f04a2 --- /dev/null +++ b/gcc/testsuite/gcc.target/bpf/neg-pseudoc-1.c @@ -0,0 +1,14 @@ +/* Check negr and negr32 instructions (pseudoc asm dialect.) */ + +/* { dg-do compile } */ +/* { dg-options "-malu32 -masm=pseudoc" } */ + +long foo (long a, long b, int x, int y) +{ + a = -b; + x = -y; + return a + x; +} + +/* { dg-final { scan-assembler {\t(r.) = -\1\n} } } */ +/* { dg-final { scan-assembler {\t(w.) = -\1\n} } } */