[gcc r17-2810] RISC-V: Add missing bit-field extraction tests

Ma Jin via Gcc-cvs <[email protected]> Thu, 30 Jul 2026 07:46:06 +0000 (GMT)
Newsgroups gmane.comp.gcc.cvs
Message-ID <[email protected]>
https://gcc.gnu.org/g:437be2f97377104a5cf839a9f9d3662155c02dfe

commit r17-2810-g437be2f97377104a5cf839a9f9d3662155c02dfe
Author: Jin Ma <[email protected]>
Date:   Wed Jul 29 16:00:56 2026 +0800

    RISC-V: Add missing bit-field extraction tests
    
    Add the tests omitted from the original change.
    
    Discussion:
    https://patchwork.sourceware.org/project/gcc/patch/[email protected]/
    
    gcc/testsuite/ChangeLog:
    
            * gcc.target/riscv/extract-sign-no-scratch.c: New test.
            * gcc.target/riscv/extract-zero-no-scratch.c: New test.

Diff:
---
 .../gcc.target/riscv/extract-sign-no-scratch.c     | 41 ++++++++++++++++++++++
 .../gcc.target/riscv/extract-zero-no-scratch.c     | 41 ++++++++++++++++++++++
 2 files changed, 82 insertions(+)

diff --git a/gcc/testsuite/gcc.target/riscv/extract-sign-no-scratch.c b/gcc/testsuite/gcc.target/riscv/extract-sign-no-scratch.c
new file mode 100644
index 000000000000..9fba99547b3a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/extract-sign-no-scratch.c
@@ -0,0 +1,41 @@
+/* { dg-do compile { target { ! riscv_abi_e } } } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -O2" } */
+/* { dg-skip-if "" { *-*-* } { "-Os" "-Oz" "-Og" "-flto" } } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/*
+** sign_ext_11_5:
+**	slli	([ast][0-9]+),[ast][0-9]+,48
+**	srai	\1,\1,53
+**	ret
+*/
+long
+sign_ext_11_5 (unsigned long x)
+{
+  return (long) (x << 48) >> 53;
+}
+
+/*
+** sign_ext_16_8:
+**	slli	([ast][0-9]+),[ast][0-9]+,40
+**	srai	\1,\1,48
+**	ret
+*/
+long
+sign_ext_16_8 (unsigned long x)
+{
+  return (long) (x << 40) >> 48;
+}
+
+/*
+** sign_ext_10_20:
+**	slli	([ast][0-9]+),[ast][0-9]+,34
+**	srai	\1,\1,54
+**	ret
+*/
+long
+sign_ext_10_20 (unsigned long x)
+{
+  return (long) (x << 34) >> 54;
+}
diff --git a/gcc/testsuite/gcc.target/riscv/extract-zero-no-scratch.c b/gcc/testsuite/gcc.target/riscv/extract-zero-no-scratch.c
new file mode 100644
index 000000000000..f68c9213760d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/riscv/extract-zero-no-scratch.c
@@ -0,0 +1,41 @@
+/* { dg-do compile { target { ! riscv_abi_e } } } */
+/* { dg-require-effective-target rv64 } */
+/* { dg-options "-march=rv64gc -mabi=lp64d -O2" } */
+/* { dg-skip-if "" { *-*-* } { "-Os" "-Oz" "-Og" "-flto" } } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+/*
+** zero_ext_20_8:
+**	slli	([ast][0-9]+),[ast][0-9]+,36
+**	srli	\1,\1,44
+**	ret
+*/
+unsigned long
+zero_ext_20_8 (unsigned long x)
+{
+  return (x >> 8) & 0xfffffUL;
+}
+
+/*
+** zero_ext_16_8:
+**	slli	([ast][0-9]+),[ast][0-9]+,40
+**	srli	\1,\1,48
+**	ret
+*/
+unsigned long
+zero_ext_16_8 (unsigned long x)
+{
+  return (x >> 8) & 0xffffUL;
+}
+
+/*
+** zero_ext_13_20:
+**	slli	([ast][0-9]+),[ast][0-9]+,31
+**	srli	\1,\1,51
+**	ret
+*/
+unsigned long
+zero_ext_13_20 (unsigned long x)
+{
+  return (x >> 20) & 0x1fffUL;
+}