From: Daniel Engel <gnu@danielengel.com>
To: Richard Earnshaw <Richard.Earnshaw@foss.arm.com>,
gcc-patches@gcc.gnu.org
Cc: Daniel Engel <gnu@danielengel.com>,
Christophe Lyon <christophe.lyon@linaro.org>
Subject: [PATCH v7 05/34] Add the __HAVE_FEATURE_IT and IT() macros
Date: Mon, 31 Oct 2022 08:45:00 -0700 [thread overview]
Message-ID: <20221031154529.3627576-6-gnu@danielengel.com> (raw)
In-Reply-To: <20221031154529.3627576-1-gnu@danielengel.com>
These macros complement and extend the existing do_it() macro.
Together, they streamline the process of optimizing short branchless
contitional sequences to support ARM, Thumb-2, and Thumb-1.
The inherent architecture limitations of Thumb-1 means that writing
assembly code is somewhat more tedious. And, while such code will run
unmodified in an ARM or Thumb-2 enfironment, it will lack one of the
key performance optimizations available there.
Initially, the first idea might be to split the an instruction sequence
with #ifdef(s): one path for Thumb-1 and the other for ARM/Thumb-2.
This could suffice if conditional execution optimizations were rare.
However, #ifdef(s) break flow of an algorithm and shift focus to the
architectural differences instead of the similarities. On functions
with a high percentage of conditional execution, it starts to become
attractive to split everything into distinct architecture-specific
function objects -- even when the underlying algorithm is identical.
Additionally, duplicated code and comments (whether an individual
operand, a line, or a larger block) become a future maintenance
liability if the two versions aren't kept in sync.
See code comments for limitations and expecated usage.
gcc/libgcc/ChangeLog:
2022-10-09 Daniel Engel <gnu@danielengel.com>
(__HAVE_FEATURE_IT, IT): New macros.
---
libgcc/config/arm/lib1funcs.S | 68 +++++++++++++++++++++++++++++++++++
1 file changed, 68 insertions(+)
diff --git a/libgcc/config/arm/lib1funcs.S b/libgcc/config/arm/lib1funcs.S
index f2f82f9d509..7a941ee9fc8 100644
--- a/libgcc/config/arm/lib1funcs.S
+++ b/libgcc/config/arm/lib1funcs.S
@@ -230,6 +230,7 @@ LSYM(Lend_fde):
ARM and Thumb-2. However this is only supported by recent gas, so define
a set of macros to allow ARM code on older assemblers. */
#if defined(__thumb2__)
+#define __HAVE_FEATURE_IT
.macro do_it cond, suffix=""
it\suffix \cond
.endm
@@ -245,6 +246,9 @@ LSYM(Lend_fde):
\name \dest, \src1, \tmp
.endm
#else
+#if !defined(__thumb__)
+#define __HAVE_FEATURE_IT
+#endif
.macro do_it cond, suffix=""
.endm
.macro shift1 op, arg0, arg1, arg2
@@ -259,6 +263,70 @@ LSYM(Lend_fde):
#define COND(op1, op2, cond) op1 ## op2 ## cond
+
+/* The IT() macro streamlines the construction of short branchless contitional
+ sequences that support ARM, Thumb-2, and Thumb-1. It is intended as an
+ extension to the .do_it macro defined above. Code not written with the
+ intent to support Thumb-1 need not use IT().
+
+ IT()'s main advantage is the minimization of syntax differences. Unified
+ functions can support Thumb-1 without imposiing an undue performance
+ penalty on ARM and Thumb-2. Writing code without duplicate instructions
+ and operands keeps the high level function flow clearer and should reduce
+ the incidence of maintenance bugs.
+
+ Where conditional execution is supported by ARM and Thumb-2, the specified
+ instruction compiles with the conditional suffix 'c'.
+
+ Where Thumb-1 and v6m do not support IT, the given instruction compiles
+ with the standard unified syntax suffix "s", and a preceding branch
+ instruction is required to implement conditional behavior.
+
+ (Aside: The Thumb-1 "s"-suffix pattern is somewhat simplistic, since it
+ does not support 'cmp' or 'tst' with a non-"s" suffix. It also appends
+ "s" to 'mov' and 'add' with high register operands which are otherwise
+ legal on v6m. Use of IT() will result in a compiler error for all of
+ these exceptional cases, and a full #ifdef code split will be required.
+ However, it is unlikely that code written with Thumb-1 compatibility
+ in mind will use such patterns, so IT() still promises a good value.)
+
+ Typical if/then/else usage is:
+
+ #ifdef __HAVE_FEATURE_IT
+ // ARM and Thumb-2 'true' condition.
+ do_it c, tee
+ #else
+ // Thumb-1 'false' condition. This must be opposite the
+ // sense of the ARM and Thumb-2 condition, since the
+ // branch is taken to skip the 'true' instruction block.
+ b!c else_label
+ #endif
+
+ // Conditional 'true' execution for all compile modes.
+ IT(ins1,c) op1, op2
+ IT(ins2,c) op1, op2
+
+ #ifndef __HAVE_FEATURE_IT
+ // Thumb-1 branch to skip the 'else' instruction block.
+ // Omitted for if/then usage.
+ b end_label
+ #endif
+
+ else_label:
+ // Conditional 'false' execution for all compile modes.
+ // Omitted for if/then usage.
+ IT(ins3,!c) op1, op2
+ IT(ins4,!c) op1, op2
+
+ end_label:
+ // Unconditional execution resumes here.
+ */
+#ifdef __HAVE_FEATURE_IT
+ #define IT(ins,c) ins##c
+#else
+ #define IT(ins,c) ins##s
+#endif
+
#ifdef __ARM_EABI__
.macro ARM_LDIV0 name signed
cmp r0, #0
--
2.34.1
next prev parent reply other threads:[~2022-10-31 15:46 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-31 15:44 [PATCH v7 00/34] libgcc: Thumb-1 Floating-Point Assembly for Cortex M0 Daniel Engel
2022-10-31 15:44 ` [PATCH v7 01/34] Add and restructure function declaration macros Daniel Engel
2022-10-31 15:44 ` [PATCH v7 02/34] Rename THUMB_FUNC_START to THUMB_FUNC_ENTRY Daniel Engel
2022-10-31 15:44 ` [PATCH v7 03/34] Fix syntax warnings on conditional instructions Daniel Engel
2022-10-31 15:44 ` [PATCH v7 04/34] Reorganize LIB1ASMFUNCS object wrapper macros Daniel Engel
2022-10-31 15:45 ` Daniel Engel [this message]
2022-10-31 15:45 ` [PATCH v7 06/34] Refactor 'clz' functions into a new file Daniel Engel
2022-10-31 15:45 ` [PATCH v7 07/34] Refactor 'ctz' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 08/34] Refactor 64-bit shift " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 09/34] Import 'clz' functions from the CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 10/34] Import 'ctz' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 11/34] Import 64-bit shift " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 12/34] Import 'clrsb' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 13/34] Import 'ffs' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 14/34] Import 'parity' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 15/34] Import 'popcnt' " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 16/34] Refactor Thumb-1 64-bit comparison into a new file Daniel Engel
2022-10-31 15:45 ` [PATCH v7 17/34] Import 64-bit comparison from CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 18/34] Merge Thumb-2 optimizations for 64-bit comparison Daniel Engel
2022-10-31 15:45 ` [PATCH v7 19/34] Import 32-bit division from the CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 20/34] Refactor Thumb-1 64-bit division into a new file Daniel Engel
2022-10-31 15:45 ` [PATCH v7 21/34] Import 64-bit division from the CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 22/34] Import integer multiplication " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 23/34] Refactor Thumb-1 float comparison into a new file Daniel Engel
2022-10-31 15:45 ` [PATCH v7 24/34] Import float comparison from the CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 25/34] Refactor Thumb-1 float subtraction into a new file Daniel Engel
2022-10-31 15:45 ` [PATCH v7 26/34] Import float addition and subtraction from the CM0 library Daniel Engel
2022-10-31 15:45 ` [PATCH v7 27/34] Import float multiplication " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 28/34] Import float division " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 29/34] Import integer-to-float conversion " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 30/34] Import float-to-integer " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 31/34] Import float<->double " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 32/34] Import float<->__fp16 " Daniel Engel
2022-10-31 15:45 ` [PATCH v7 33/34] Drop single-precision Thumb-1 soft-float functions Daniel Engel
2022-10-31 15:45 ` [PATCH v7 34/34] Add -mpure-code support to the CM0 functions Daniel Engel
2022-11-15 15:27 ` [PING] Re: [PATCH v7 00/34] libgcc: Thumb-1 Floating-Point Assembly for Cortex M0 Daniel Engel
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=20221031154529.3627576-6-gnu@danielengel.com \
--to=gnu@danielengel.com \
--cc=Richard.Earnshaw@foss.arm.com \
--cc=christophe.lyon@linaro.org \
--cc=gcc-patches@gcc.gnu.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).