Extract the hardcoded values for the minimum PC-relative displacements
into named constants and document them.
gcc/ChangeLog:
* config/aarch64/aarch64.md (BRANCH_LEN_P_128MiB): New constant.
(BRANCH_LEN_N_128MiB): likewise.
(BRANCH_LEN_P_1MiB): likewise.
(BRANCH_LEN_N_1MiB): likewise.
(BRANCH_LEN_P_32KiB): likewise.
(BRANCH_LEN_N_32KiB): likewise.
(BRANCH_LEN_P_1KiB): likewise.
(BRANCH_LEN_N_1KiB): likewise.
---
gcc/config/aarch64/aarch64.md | 68 ++++++++++++++++++++++++++---------
1 file changed, 52 insertions(+), 16 deletions(-)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 23775ec58ca..ca5bd96a754 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -696,7 +696,27 @@ (define_insn "jump"
[(set_attr "type" "branch")]
)
+;; Maximum PC-relative positive/negative displacements for various branching
+;; instructions.
+(define_constants
+ [
+ ;; +/- 128MiB. Used by B, BL.
+ (BRANCH_LEN_P_128Mib 134217724)
+ (BRANCH_LEN_N_128Mib -134217728)
+
+ ;; +/- 1MiB. Used by B.<cond>, CBZ, CBNZ.
+ (BRANCH_LEN_P_1Mib 1048572)
+ (BRANCH_LEN_N_1Mib -1048576)
+ ;; +/- 32KiB. Used by TBZ, TBNZ.
+ (BRANCH_LEN_P_32Kib 32764)
+ (BRANCH_LEN_N_32Kib -32768)
+
+ ;; +/- 1KiB. Used by CBB<cond>, CBH<cond>, CB<cond>.
+ (BRANCH_LEN_P_1Kib 1020)
+ (BRANCH_LEN_N_1Kib -1024)
+ ]
+)
;; -------------------------------------------------------------------
;; Conditional jumps
@@ -760,13 +780,17 @@ (define_insn "aarch64_bcond"
}
[(set_attr "type" "branch")
(set (attr "length")
- (if_then_else (and (ge (minus (match_dup 2) (pc)) (const_int -1048576))
- (lt (minus (match_dup 2) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
- (if_then_else (and (ge (minus (match_dup 2) (pc)) (const_int -1048576))
- (lt (minus (match_dup 2) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 0)
(const_int 1)))]
)
@@ -823,13 +847,17 @@ (define_insn "aarch64_cb<optab><mode>1"
}
[(set_attr "type" "branch")
(set (attr "length")
- (if_then_else (and (ge (minus (match_dup 1) (pc)) (const_int -1048576))
- (lt (minus (match_dup 1) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
- (if_then_else (and (ge (minus (match_dup 2) (pc)) (const_int -1048576))
- (lt (minus (match_dup 2) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 0)
(const_int 1)))]
)
@@ -864,13 +892,17 @@ (define_insn "*cb<optab><mode>1"
}
[(set_attr "type" "branch")
(set (attr "length")
- (if_then_else (and (ge (minus (match_dup 1) (pc)) (const_int -32768))
- (lt (minus (match_dup 1) (pc)) (const_int 32764)))
+ (if_then_else (and (ge (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_N_32Kib))
+ (lt (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_P_32Kib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
- (if_then_else (and (ge (minus (match_dup 1) (pc)) (const_int -1048576))
- (lt (minus (match_dup 1) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 1) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 0)
(const_int 1)))]
)
@@ -925,13 +957,17 @@ (define_insn "@aarch64_tb<optab><ALLI:mode><GPI:mode>"
}
[(set_attr "type" "branch")
(set (attr "length")
- (if_then_else (and (ge (minus (match_dup 2) (pc)) (const_int -32768))
- (lt (minus (match_dup 2) (pc)) (const_int 32764)))
+ (if_then_else (and (ge (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_N_32Kib))
+ (lt (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_P_32Kib)))
(const_int 4)
(const_int 8)))
(set (attr "far_branch")
- (if_then_else (and (ge (minus (match_dup 2) (pc)) (const_int -1048576))
- (lt (minus (match_dup 2) (pc)) (const_int 1048572)))
+ (if_then_else (and (ge (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_N_1Mib))
+ (lt (minus (match_dup 2) (pc))
+ (const_int BRANCH_LEN_P_1Mib)))
(const_int 0)
(const_int 1)))]
--
2.45.2