aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/ia64/predicates.md
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/config/ia64/predicates.md')
-rw-r--r--gcc/config/ia64/predicates.md26
1 files changed, 26 insertions, 0 deletions
diff --git a/gcc/config/ia64/predicates.md b/gcc/config/ia64/predicates.md
index 2aa7a780e02..2e148f2ebfa 100644
--- a/gcc/config/ia64/predicates.md
+++ b/gcc/config/ia64/predicates.md
@@ -97,6 +97,32 @@
}
})
+;; True if OP refers to a local symbol [+any offset].
+;; To be encoded as:
+;; movl % = @gprel(symbol+offset)
+;; add % = %, gp
+(define_predicate "local_symbolic_operand64"
+ (match_code "symbol_ref,const")
+{
+ switch (GET_CODE (op))
+ {
+ case CONST:
+ op = XEXP (op, 0);
+ if (GET_CODE (op) != PLUS
+ || GET_CODE (XEXP (op, 0)) != SYMBOL_REF
+ || GET_CODE (XEXP (op, 1)) != CONST_INT)
+ return false;
+ op = XEXP (op, 0);
+ /* FALLTHRU */
+
+ case SYMBOL_REF:
+ return SYMBOL_REF_LOCAL_P (op);
+
+ default:
+ gcc_unreachable ();
+ }
+})
+
;; True if OP refers to a symbol in the small address area.
(define_predicate "small_addr_symbolic_operand"
(match_code "symbol_ref,const")