From: Carl Love <cel@us.ibm.com>
To: Segher Boessenkool <segher@kernel.crashing.org>, gcc-patches@gcc.gnu.org
Cc: Peter Bergner <bergner@linux.ibm.com>
Subject: [PATCH v2] rs6000: Add buildin for mffscrn instructions
Date: Thu, 18 May 2023 14:12:51 -0700 [thread overview]
Message-ID: <b897a2be3bfc7ef730091f66f1102104aab1924b.camel@us.ibm.com> (raw)
In-Reply-To: <a1756a8e41b03138f8db58899799a4539812ecf1.camel@us.ibm.com>
GCC maintainers:
version 2. Fixed an issue with the test case. The dg-options line was
missing.
The following patch adds an overloaded builtin. There are two possible
arguments for the builtin. The builtin definitions are:
double __builtin_mffscrn (unsigned long int);
double __builtin_mffscrn (double);
The patch has been tested on Power 10 with no regressions.
Please let me know if the patch is acceptable for mainline. Thanks.
Carl
------------------------------------------------
rs6000: Add buildin for mffscrn instructions
This patch adds overloaded __builtin_mffscrn for the move From FPSCR
Control & Set R instruction with an immediate argument. It also adds the
builtin with a floating point register argument. A new runnable test is
added for the new builtin.
gcc/
* config/rs6000/rs6000-builtins.def (__builtin_mffscrni,
__builtin_mffscrnd): Add builtin definitions.
* config/rs6000/rs6000-overload.def (__builtin_mffscrn): Add
overloaded definition.
* doc/extend.texi: Add documentation for __builtin_mffscrn.
gcc/testsuite/
* gcc.target/powerpc/builtin-mffscrn.c: Add testcase for new
builtin.
---
gcc/config/rs6000/rs6000-builtins.def | 7 ++
gcc/config/rs6000/rs6000-overload.def | 5 +
gcc/doc/extend.texi | 8 ++
.../gcc.target/powerpc/builtin-mffscrn.c | 106 ++++++++++++++++++
4 files changed, 126 insertions(+)
create mode 100644 gcc/testsuite/gcc.target/powerpc/builtin-mffscrn.c
diff --git a/gcc/config/rs6000/rs6000-builtins.def b/gcc/config/rs6000/rs6000-builtins.def
index 92d9b46e1b9..67125473684 100644
--- a/gcc/config/rs6000/rs6000-builtins.def
+++ b/gcc/config/rs6000/rs6000-builtins.def
@@ -2875,6 +2875,13 @@
pure vsc __builtin_vsx_xl_len_r (void *, signed long);
XL_LEN_R xl_len_r {}
+; Immediate instruction only uses the least significant two bits of the
+; const int.
+ double __builtin_mffscrni (const int<2>);
+ MFFSCRNI rs6000_mffscrni {}
+
+ double __builtin_mffscrnd (double);
+ MFFSCRNF rs6000_mffscrn {}
; Builtins requiring hardware support for IEEE-128 floating-point.
[ieee128-hw]
diff --git a/gcc/config/rs6000/rs6000-overload.def b/gcc/config/rs6000/rs6000-overload.def
index c582490c084..adda2df69ea 100644
--- a/gcc/config/rs6000/rs6000-overload.def
+++ b/gcc/config/rs6000/rs6000-overload.def
@@ -78,6 +78,11 @@
; like after a required newline, but nowhere else. Lines beginning with
; a semicolon are also treated as blank lines.
+[MFFSCR, __builtin_mffscrn, __builtin_mffscrn]
+ double __builtin_mffscrn (const int<2>);
+ MFFSCRNI
+ double __builtin_mffscrn (double);
+ MFFSCRNF
[BCDADD, __builtin_bcdadd, __builtin_vec_bcdadd]
vsq __builtin_vec_bcdadd (vsq, vsq, const int);
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index ed8b9c8a87b..f16c046051a 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -18455,6 +18455,9 @@ int __builtin_dfp_dtstsfi_ov_td (unsigned int comparison, _Decimal128 value);
double __builtin_mffsl(void);
+double __builtin_mffscrn (unsigned long int);
+double __builtin_mffscrn (double);
+
@end smallexample
The @code{__builtin_byte_in_set} function requires a
64-bit environment supporting ISA 3.0 or later. This function returns
@@ -18511,6 +18514,11 @@ the FPSCR. The instruction is a lower latency version of the @code{mffs}
instruction. If the @code{mffsl} instruction is not available, then the
builtin uses the older @code{mffs} instruction to read the FPSCR.
+The @code{__builtin_mffscrn} returns the contents of the control bits in the
+FPSCR, bits 29:31 (DRN) and bits 56:63 (VE, OE, UE, ZE, XE, NI, RN). The
+contents of bits [62:63] of the unsigned long int or double argument are placed
+into bits [62:63] of the FPSCR (RN).
+
@node Basic PowerPC Built-in Functions Available on ISA 3.1
@subsubsection Basic PowerPC Built-in Functions Available on ISA 3.1
diff --git a/gcc/testsuite/gcc.target/powerpc/builtin-mffscrn.c b/gcc/testsuite/gcc.target/powerpc/builtin-mffscrn.c
new file mode 100644
index 00000000000..26c666a4091
--- /dev/null
+++ b/gcc/testsuite/gcc.target/powerpc/builtin-mffscrn.c
@@ -0,0 +1,106 @@
+/* { dg-do run } */
+/* { dg-require-effective-target p9vector_hw } */
+/* { dg-options "-mpower9-vector -mdejagnu-cpu=power9" } */
+
+#include <altivec.h>
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+
+#define MASK 0x3
+#define EXPECTED1 0x1
+#define EXPECTED2 0x2
+
+void abort (void);
+
+int
+main()
+{
+ unsigned long mask, result, expected;
+ double double_arg;
+
+ union convert_t {
+ double d;
+ unsigned long ul;
+ } val;
+
+ /* Test immediate version of __builtin_mffscrn. */
+ /* Read FPSCR and set RN bits in FPSCR[62:63]. */
+ val.d = __builtin_mffscrn (EXPECTED2);
+
+ /* Read FPSCR, bits [62:63] should have been set to 0x2 by previous builtin
+ call. */
+ val.d = __builtin_mffscrn (EXPECTED1);
+ /* The expected result is the argument for the previous call to
+ __builtin_mffscrn. */
+ expected = EXPECTED2;
+ result = MASK & val.ul;
+
+ if (EXPECTED2 != result)
+#ifdef DEBUG
+ printf("Result of mffscrn immediate doesn't match EXPECTED2. Result was 0x%lx\n",
+ result);
+#else
+ abort();
+#endif
+
+ /* Read FPSCR, bits [62:63] should have been set to 0x1 by previous builtin
+ call*/
+ val.d = __builtin_mffscrn (EXPECTED1);
+ expected = EXPECTED1;
+ result = MASK & val.ul;
+
+ if (EXPECTED1 != result)
+#ifdef DEBUG
+ printf("Result of mffscrn immediate doesn't match EXPECTED1. Result was 0x%lx\n",
+ result);
+#else
+ abort();
+#endif
+
+
+ /* Test double argument version of __builtin_mffscrn */
+ val.ul = EXPECTED2;
+ double_arg = val.d;
+
+ /* Read FPSCR and set RN bits in FPSCR[62:63]. */
+ val.d = __builtin_mffscrn (double_arg);
+
+ /* Read FPSCR, bits [62:63] should have been set to 0x2 by previous builtin
+ call. */
+
+ val.ul = EXPECTED1;
+ double_arg = val.d;
+
+ val.d = __builtin_mffscrn (double_arg);
+ /* The expected result is the argument for the previous call to
+ __builtin_mffscrn. */
+ expected = EXPECTED2;
+ result = MASK & val.ul;
+
+ if (EXPECTED2 != result)
+#ifdef DEBUG
+ printf("Result of mffscrn double arg doesn't match EXPECTED2. Result was 0x%lx\n",
+ result);
+#else
+ abort();
+#endif
+
+ /* Read FPSCR, bits [62:63] should have been set to 0x1 by previous builtin
+ call*/
+ val.ul = EXPECTED1;
+ double_arg = val.d;
+
+ val.d = __builtin_mffscrn (double_arg);
+ expected = EXPECTED1;
+ result = MASK & val.ul;
+
+ if (EXPECTED1 != result)
+#ifdef DEBUG
+ printf("Result of mffscrn double arg doesn't match EXPECTED1. Result was 0x%lx\n",
+ result);
+#else
+ abort();
+#endif
+}
--
2.37.2
next prev parent reply other threads:[~2023-05-18 21:12 UTC|newest]
Thread overview: 14+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-04-13 20:47 [PATCH] " Carl Love
2023-05-18 21:12 ` Carl Love [this message]
2023-05-22 6:36 ` [PATCH v2] " Kewen.Lin
2023-05-22 17:31 ` Carl Love
2023-05-23 5:24 ` Kewen.Lin
2023-05-23 22:30 ` Peter Bergner
2023-05-24 5:32 ` Kewen.Lin
2023-05-24 15:20 ` Carl Love
2023-05-24 16:32 ` Peter Bergner
2023-05-25 5:28 ` Kewen.Lin
2023-05-25 15:59 ` Carl Love
2023-05-31 9:11 ` Kewen.Lin
2023-05-31 15:36 ` Carl Love
2023-05-22 17:36 ` [PATCH v3] " Carl Love
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=b897a2be3bfc7ef730091f66f1102104aab1924b.camel@us.ibm.com \
--to=cel@us.ibm.com \
--cc=bergner@linux.ibm.com \
--cc=gcc-patches@gcc.gnu.org \
--cc=segher@kernel.crashing.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).