diff options
author | Eric Botcazou <ebotcazou@libertysurf.fr> | 2006-02-09 13:22:09 +0100 |
---|---|---|
committer | Eric Botcazou <ebotcazou@gcc.gnu.org> | 2006-02-09 12:22:09 +0000 |
commit | e10fbf96398ce612c334754e0614c998e3ec3335 (patch) | |
tree | 12ac07d059bcf7fac72d3afa6eaa963996ebe2c8 | |
parent | dae7ec874f5e46fccf259c87fd756a0e10375e63 (diff) | |
download | gcc-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/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/config/sparc/sparc.c | 30 |
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' |