https://gcc.gnu.org/g:b33e9eb8d404475a45a53afa3e3cc0ff742d75ec

commit r14-11631-gb33e9eb8d404475a45a53afa3e3cc0ff742d75ec
Author: Richard Sandiford <richard.sandif...@arm.com>
Date:   Wed Apr 16 13:20:26 2025 +0100

    Add force_lowpart_subreg
    
    optabs had a local function called lowpart_subreg_maybe_copy
    that is very similar to the lowpart version of force_subreg.
    This patch adds a force_lowpart_subreg wrapper around
    force_subreg.
    
    The only difference between the old and new functions is that
    the old one asserted success while the new one doesn't.
    It's common not to assert elsewhere when taking subregs;
    normally a null result is enough.
    
    Later patches will make more use of the new function.
    
    gcc/
            * explow.h (force_lowpart_subreg): Declare.
            * explow.cc (force_lowpart_subreg): New function.
    
    (cherry picked from commit 5f40d1c0cc6ce91ef28d326b8707b3f05e6f239c)

Diff:
---
 gcc/explow.cc | 14 ++++++++++++++
 gcc/explow.h  |  1 +
 2 files changed, 15 insertions(+)

diff --git a/gcc/explow.cc b/gcc/explow.cc
index bd93c8780649..2a91cf76ea62 100644
--- a/gcc/explow.cc
+++ b/gcc/explow.cc
@@ -764,6 +764,20 @@ force_subreg (machine_mode outermode, rtx op,
   return res;
 }
 
+/* Try to return an rvalue expression for the OUTERMODE lowpart of OP,
+   which has mode INNERMODE.  Allow OP to be forced into a new register
+   if necessary.
+
+   Return null on failure.  */
+
+rtx
+force_lowpart_subreg (machine_mode outermode, rtx op,
+                     machine_mode innermode)
+{
+  auto byte = subreg_lowpart_offset (outermode, innermode);
+  return force_subreg (outermode, op, innermode, byte);
+}
+
 /* If X is a memory ref, copy its contents to a new temp reg and return
    that reg.  Otherwise, return X.  */
 
diff --git a/gcc/explow.h b/gcc/explow.h
index cbd1fcb7eb34..dd654649b068 100644
--- a/gcc/explow.h
+++ b/gcc/explow.h
@@ -43,6 +43,7 @@ extern rtx copy_to_suggested_reg (rtx, rtx, machine_mode);
 extern rtx force_reg (machine_mode, rtx);
 
 extern rtx force_subreg (machine_mode, rtx, machine_mode, poly_uint64);
+extern rtx force_lowpart_subreg (machine_mode, rtx, machine_mode);
 
 /* Return given rtx, copied into a new temp reg if it was in memory.  */
 extern rtx force_not_mem (rtx);

Reply via email to