bpf: use xBPF signed div, mod insns when available

The 'mod' and 'div' operators in eBPF are unsigned, with no signed
counterpart. xBPF adds two new ALU operations, sdiv and smod, for
signed division and modulus, respectively. Update bpf.md with
'define_insn' blocks for signed div and mod to use them when targetting
xBPF, and add new tests to ensure they are used appropriately.

2020-09-17  David Faust  <david.faust@oracle.com>

gcc/
	* config/bpf/bpf.md: Add defines for signed div and mod operators.

gcc/testsuite/
	* gcc.target/bpf/diag-sdiv.c: New test.
	* gcc.target/bpf/diag-smod.c: New test.
	* gcc.target/bpf/xbpf-sdiv-1.c: New test.
	* gcc.target/bpf/xbpf-smod-1.c: New test.
This commit is contained in:
David Faust 2020-09-22 20:31:35 +02:00 committed by Jose E. Marchesi
parent 30bf947649
commit 7c8ba5da80
5 changed files with 72 additions and 0 deletions

View File

@ -165,6 +165,16 @@
"div<msuffix>\t%0,%2"
[(set_attr "type" "<mtype>")])
;; However, xBPF does provide a signed division operator, sdiv.
(define_insn "div<AM:mode>3"
[(set (match_operand:AM 0 "register_operand" "=r,r")
(div:AM (match_operand:AM 1 "register_operand" " 0,0")
(match_operand:AM 2 "reg_or_imm_operand" "r,I")))]
"TARGET_XBPF"
"sdiv<msuffix>\t%0,%2"
[(set_attr "type" "<mtype>")])
;;; Modulus
;; Note that eBPF doesn't provide instructions for signed integer
@ -178,6 +188,16 @@
"mod<msuffix>\t%0,%2"
[(set_attr "type" "<mtype>")])
;; Again, xBPF provides a signed version, smod.
(define_insn "mod<AM:mode>3"
[(set (match_operand:AM 0 "register_operand" "=r,r")
(mod:AM (match_operand:AM 1 "register_operand" " 0,0")
(match_operand:AM 2 "reg_or_imm_operand" "r,I")))]
"TARGET_XBPF"
"smod<msuffix>\t%0,%2"
[(set_attr "type" "<mtype>")])
;;; Logical AND
(define_insn "and<AM:mode>3"
[(set (match_operand:AM 0 "register_operand" "=r,r")

View File

@ -0,0 +1,12 @@
/* Verify signed division does not produce 'sdiv' insn in eBPF. */
/* { dg-do compile } */
/* { dg-options "-O0" } */
void
foo ()
{
signed int x = 5;
signed int y = 2;
signed int z = x / y;
}
/* { dg-final { scan-assembler-not "sdiv(32)?\t%r" } } */

View File

@ -0,0 +1,12 @@
/* Verify signed modulo does not produce 'smod' insn in eBPF. */
/* { dg-do compile } */
/* { dg-options "-O0" } */
void
foo ()
{
signed int x = 5;
signed int y = 2;
signed int z = x % y;
}
/* { dg-final { scan-assembler-not "smod(32)?\t%r" } } */

View File

@ -0,0 +1,14 @@
/* Verify that sdiv instruction is used for xBPF. */
/* { dg-do compile } */
/* { dg-options "-O0 -mxbpf" } */
void
foo ()
{
signed int x = 5;
signed int y = 2;
signed int z = x / y;
signed int w = x / 3;
}
/* { dg-final { scan-assembler "sdiv(32)?\t%r" } } */

View File

@ -0,0 +1,14 @@
/* Verify that smod instruction is used for xBPF. */
/* { dg-do compile } */
/* { dg-options "-O0 -mxbpf" } */
void
foo ()
{
signed int x = 5;
signed int y = 2;
signed int z = x % y;
signed int w = x % 3;
}
/* { dg-final { scan-assembler "smod(32)?\t%r" } } */