68 lines
2.1 KiB
Diff
68 lines
2.1 KiB
Diff
From b33e9eb8d404475a45a53afa3e3cc0ff742d75ec Mon Sep 17 00:00:00 2001
|
|
From: Richard Sandiford <richard.sandiford@arm.com>
|
|
Date: Wed, 16 Apr 2025 13:20:26 +0100
|
|
Subject: [PATCH] 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)
|
|
---
|
|
gcc/explow.cc | 14 ++++++++++++++
|
|
gcc/explow.h | 1 +
|
|
2 files changed, 15 insertions(+)
|
|
|
|
diff --git a/gcc/explow.cc b/gcc/explow.cc
|
|
index bd93c878064..2a91cf76ea6 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 cbd1fcb7eb3..dd654649b06 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);
|
|
--
|
|
2.50.1
|
|
|