aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@libertysurf.fr>2006-02-09 13:22:09 +0100
committerEric Botcazou <ebotcazou@gcc.gnu.org>2006-02-09 12:22:09 +0000
commite10fbf96398ce612c334754e0614c998e3ec3335 (patch)
tree12ac07d059bcf7fac72d3afa6eaa963996ebe2c8
parentdae7ec874f5e46fccf259c87fd756a0e10375e63 (diff)
downloadgcc-e10fbf96398ce612c334754e0614c998e3ec3335.zip
gcc-e10fbf96398ce612c334754e0614c998e3ec3335.tar.gz
gcc-e10fbf96398ce612c334754e0614c998e3ec3335.tar.bz2
sparc.c (tls_call_delay): Fix oversight.
* config/sparc/sparc.c (tls_call_delay): Fix oversight. From-SVN: r110790
-rw-r--r--gcc/ChangeLog4
-rw-r--r--gcc/config/sparc/sparc.c30
2 files changed, 23 insertions, 11 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 83b801f..2e64fe3 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,7 @@
+2006-02-09 Eric Botcazou <ebotcazou@libertysurf.fr>
+
+ * config/sparc/sparc.c (tls_call_delay): Fix oversight.
+
2006-02-08 Jason Merrill <jason@redhat.com>
PR c++/25979
diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c
index 2002641..b5781ac 100644
--- a/gcc/config/sparc/sparc.c
+++ b/gcc/config/sparc/sparc.c
@@ -2416,26 +2416,34 @@ empty_delay_slot (rtx insn)
int
tls_call_delay (rtx trial)
{
- rtx pat, unspec;
+ rtx pat;
/* Binutils allows
- call __tls_get_addr, %tgd_call (foo)
- add %l7, %o0, %o0, %tgd_add (foo)
+ call __tls_get_addr, %tgd_call (foo)
+ add %l7, %o0, %o0, %tgd_add (foo)
while Sun as/ld does not. */
if (TARGET_GNU_TLS || !TARGET_TLS)
return 1;
pat = PATTERN (trial);
- if (GET_CODE (pat) != SET || GET_CODE (SET_DEST (pat)) != PLUS)
- return 1;
- unspec = XEXP (SET_DEST (pat), 1);
- if (GET_CODE (unspec) != UNSPEC
- || (XINT (unspec, 1) != UNSPEC_TLSGD
- && XINT (unspec, 1) != UNSPEC_TLSLDM))
- return 1;
+ /* We must reject tgd_add{32|64}, i.e.
+ (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSGD)))
+ and tldm_add{32|64}, i.e.
+ (set (reg) (plus (reg) (unspec [(reg) (symbol_ref)] UNSPEC_TLSLDM)))
+ for Sun as/ld. */
+ if (GET_CODE (pat) == SET
+ && GET_CODE (SET_SRC (pat)) == PLUS)
+ {
+ rtx unspec = XEXP (SET_SRC (pat), 1);
- return 0;
+ if (GET_CODE (unspec) == UNSPEC
+ && (XINT (unspec, 1) == UNSPEC_TLSGD
+ || XINT (unspec, 1) == UNSPEC_TLSLDM))
+ return 0;
+ }
+
+ return 1;
}
/* Return nonzero if TRIAL, an insn, can be combined with a 'restore'