diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index b3c5bce842a..d9b451be0b4 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -42,6 +42,8 @@ UNSPEC_COPYSIGN UNSPEC_LRINT UNSPEC_LROUND + UNSPEC_FMIN + UNSPEC_FMAX ;; Stack tie UNSPEC_TIE @@ -1216,6 +1218,26 @@ ;; ;; .................... +(define_insn "fmin3" + [(set (match_operand:ANYF 0 "register_operand" "=f") + (unspec:ANYF [(use (match_operand:ANYF 1 "register_operand" " f")) + (use (match_operand:ANYF 2 "register_operand" " f"))] + UNSPEC_FMIN))] + "TARGET_HARD_FLOAT && !HONOR_SNANS (mode)" + "fmin.\t%0,%1,%2" + [(set_attr "type" "fmove") + (set_attr "mode" "")]) + +(define_insn "fmax3" + [(set (match_operand:ANYF 0 "register_operand" "=f") + (unspec:ANYF [(use (match_operand:ANYF 1 "register_operand" " f")) + (use (match_operand:ANYF 2 "register_operand" " f"))] + UNSPEC_FMAX))] + "TARGET_HARD_FLOAT && !HONOR_SNANS (mode)" + "fmax.\t%0,%1,%2" + [(set_attr "type" "fmove") + (set_attr "mode" "")]) + (define_insn "smin3" [(set (match_operand:ANYF 0 "register_operand" "=f") (smin:ANYF (match_operand:ANYF 1 "register_operand" " f") diff --git a/gcc/testsuite/gcc.target/riscv/fmax-snan.c b/gcc/testsuite/gcc.target/riscv/fmax-snan.c new file mode 100644 index 00000000000..ba4823a18b3 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmax-snan.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fsignaling-nans -dp" } */ + +double +fmax (double x, double y) +{ + return __builtin_fmax (x, y); +} + +/* { dg-final { scan-assembler-not "\tfmax\\.d\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.d\t" } } */ +/* { dg-final { scan-assembler "\t(call|tail)\tfmax\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fmax.c b/gcc/testsuite/gcc.target/riscv/fmax.c new file mode 100644 index 00000000000..c71d35c9f9d --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmax.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fno-signaling-nans -dp" } */ + +double +fmax (double x, double y) +{ + return __builtin_fmax (x, y); +} + +/* { dg-final { scan-assembler-not "\ttail\tfmax\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfmax\\.d\t\[^\n\]* fmaxdf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fmaxf-snan.c b/gcc/testsuite/gcc.target/riscv/fmaxf-snan.c new file mode 100644 index 00000000000..faada3a5723 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmaxf-snan.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fsignaling-nans -dp" } */ + +float +fmaxf (float x, float y) +{ + return __builtin_fmaxf (x, y); +} + +/* { dg-final { scan-assembler-not "\tfmax\\.s\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.s\t" } } */ +/* { dg-final { scan-assembler "\t(call|tail)\tfmaxf\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fmaxf.c b/gcc/testsuite/gcc.target/riscv/fmaxf.c new file mode 100644 index 00000000000..f9980166887 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmaxf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fno-signaling-nans -dp" } */ + +float +fmaxf (float x, float y) +{ + return __builtin_fmaxf (x, y); +} + +/* { dg-final { scan-assembler-not "\ttail\tfmaxf\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfmax\\.s\t\[^\n\]* fmaxsf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fmin-snan.c b/gcc/testsuite/gcc.target/riscv/fmin-snan.c new file mode 100644 index 00000000000..b511380c2d1 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmin-snan.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fsignaling-nans -dp" } */ + +double +fmin (double x, double y) +{ + return __builtin_fmin (x, y); +} + +/* { dg-final { scan-assembler-not "\tfmin\\.d\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.d\t" } } */ +/* { dg-final { scan-assembler "\t(call|tail)\tfmin\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fmin.c b/gcc/testsuite/gcc.target/riscv/fmin.c new file mode 100644 index 00000000000..9634abd19af --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fmin.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fno-signaling-nans -dp" } */ + +double +fmin (double x, double y) +{ + return __builtin_fmin (x, y); +} + +/* { dg-final { scan-assembler-not "\ttail\tfmin\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfmin\\.d\t\[^\n\]* fmindf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fminf-snan.c b/gcc/testsuite/gcc.target/riscv/fminf-snan.c new file mode 100644 index 00000000000..39dd8fee278 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fminf-snan.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fsignaling-nans -dp" } */ + +float +fminf (float x, float y) +{ + return __builtin_fminf (x, y); +} + +/* { dg-final { scan-assembler-not "\tfmin\\.s\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.s\t" } } */ +/* { dg-final { scan-assembler "\t(call|tail)\tfminf\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/fminf.c b/gcc/testsuite/gcc.target/riscv/fminf.c new file mode 100644 index 00000000000..9a3687be309 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/fminf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-fno-finite-math-only -fsigned-zeros -fno-signaling-nans -dp" } */ + +float +fminf (float x, float y) +{ + return __builtin_fminf (x, y); +} + +/* { dg-final { scan-assembler-not "\ttail\tfminf\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfmin\\.s\t\[^\n\]* fminsf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smax-ieee.c b/gcc/testsuite/gcc.target/riscv/smax-ieee.c new file mode 100644 index 00000000000..3a98aeb45ad --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smax-ieee.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fsigned-zeros -dp" } */ + +double +smax (double x, double y) +{ + return x >= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\t(call|tail)\tfmax\t" } } */ +/* { dg-final { scan-assembler-not "\tfmax\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfge\\.d\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smax.c b/gcc/testsuite/gcc.target/riscv/smax.c new file mode 100644 index 00000000000..d806c632fae --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smax.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fno-signed-zeros -dp" } */ + +double +smax (double x, double y) +{ + return x >= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\ttail\tfmax\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfmax\\.d\t\[^\n\]* smaxdf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smaxf-ieee.c b/gcc/testsuite/gcc.target/riscv/smaxf-ieee.c new file mode 100644 index 00000000000..6cf23d789b6 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smaxf-ieee.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fsigned-zeros -dp" } */ + +float +smaxf (float x, float y) +{ + return x >= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\t(call|tail)\tfmaxf\t" } } */ +/* { dg-final { scan-assembler-not "\tfmax\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfge\\.s\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smaxf.c b/gcc/testsuite/gcc.target/riscv/smaxf.c new file mode 100644 index 00000000000..d6a7a7f84cf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smaxf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fno-signed-zeros -dp" } */ + +float +smaxf (float x, float y) +{ + return x >= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\ttail\tfmaxf\t" } } */ +/* { dg-final { scan-assembler-not "\tfge\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfmax\\.s\t\[^\n\]* smaxsf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smin-ieee.c b/gcc/testsuite/gcc.target/riscv/smin-ieee.c new file mode 100644 index 00000000000..c0a148c37cf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smin-ieee.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fsigned-zeros -dp" } */ + +double +smin (double x, double y) +{ + return x <= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\t(call|tail)\tfmin\t" } } */ +/* { dg-final { scan-assembler-not "\tfmin\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfle\\.d\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/smin.c b/gcc/testsuite/gcc.target/riscv/smin.c new file mode 100644 index 00000000000..e325e9a1c7c --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/smin.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fno-signed-zeros -dp" } */ + +double +smin (double x, double y) +{ + return x <= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\ttail\tfmin\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.d\t" } } */ +/* { dg-final { scan-assembler "\tfmin\\.d\t\[^\n\]* smindf3\n" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sminf-ieee.c b/gcc/testsuite/gcc.target/riscv/sminf-ieee.c new file mode 100644 index 00000000000..353e7a18704 --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/sminf-ieee.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fsigned-zeros -dp" } */ + +float +sminf (float x, float y) +{ + return x <= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\t(call|tail)\tfminf\t" } } */ +/* { dg-final { scan-assembler-not "\tfmin\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfle\\.s\t" } } */ diff --git a/gcc/testsuite/gcc.target/riscv/sminf.c b/gcc/testsuite/gcc.target/riscv/sminf.c new file mode 100644 index 00000000000..f0ba7b43bdf --- /dev/null +++ b/gcc/testsuite/gcc.target/riscv/sminf.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-ffinite-math-only -fno-signed-zeros -dp" } */ + +float +sminf (float x, float y) +{ + return x <= y ? x : y; +} + +/* { dg-final { scan-assembler-not "\ttail\tfminf\t" } } */ +/* { dg-final { scan-assembler-not "\tfle\\.s\t" } } */ +/* { dg-final { scan-assembler "\tfmin\\.s\t\[^\n\]* sminsf3\n" } } */