git: 980746e5cb26 - main - fbt: simplify arm64 function-prologue parsing

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Sat, 03 Jun 2023 17:05:18 UTC
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=980746e5cb264a70ad3dcbbf38ba919ad3436aa1

commit 980746e5cb264a70ad3dcbbf38ba919ad3436aa1
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2023-06-03 17:04:33 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2023-06-03 17:04:33 +0000

    fbt: simplify arm64 function-prologue parsing
    
    Reviewed by:    markj
    Approved by:    markj (mentor)
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D40364
---
 sys/cddl/dev/fbt/aarch64/fbt_isa.c | 42 +++++++++++++++-----------------------
 1 file changed, 16 insertions(+), 26 deletions(-)

diff --git a/sys/cddl/dev/fbt/aarch64/fbt_isa.c b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
index cc4ea42715c8..4b32d42ca0b4 100644
--- a/sys/cddl/dev/fbt/aarch64/fbt_isa.c
+++ b/sys/cddl/dev/fbt/aarch64/fbt_isa.c
@@ -130,35 +130,25 @@ fbt_provide_module_function(linker_file_t lf, int symindx,
 	 */
 	if (*instr == NOP_INSTR)
 		found = true;
-	if (!found) {
-		for (; instr < limit; instr++) {
+	for (; !found && instr < limit; instr++) {
+		/*
+		 * Functions start with "stp xt1, xt2, [xn, <const>]!" or
+		 * "sub sp, sp, <const>".
+		 *
+		 * Sometimes the compiler will have a sub instruction that is
+		 * not of the above type so don't stop if we see one.
+		 */
+		if ((*instr & LDP_STP_MASK) == STP_64) {
 			/*
-			 * Some functions start with
-			 * "stp xt1, xt2, [xn, <const>]!"
+			 * Assume any other store of this type means we are
+			 * past the function prologue.
 			 */
-			if ((*instr & LDP_STP_MASK) == STP_64) {
-				/*
-				 * Assume any other store of this type means we
-				 * are past the function prolog.
-				 */
-				if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
-					found = true;
-				break;
-			}
-
-			/*
-			 * Some functions start with a "sub sp, sp, <const>"
-			 * Sometimes the compiler will have a sub instruction
-			 * that is not of the above type so don't stop if we
-			 * see one.
-			 */
-			if ((*instr & SUB_MASK) == SUB_INSTR &&
-			    ((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
-			    ((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31) {
+			if (((*instr >> ADDR_SHIFT) & ADDR_MASK) == 31)
 				found = true;
-				break;
-			}
-		}
+		} else if ((*instr & SUB_MASK) == SUB_INSTR &&
+		    ((*instr >> SUB_RD_SHIFT) & SUB_R_MASK) == 31 &&
+		    ((*instr >> SUB_RN_SHIFT) & SUB_R_MASK) == 31)
+			found = true;
 	}
 
 	if (!found)