From e10fbf96398ce612c334754e0614c998e3ec3335 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Thu, 9 Feb 2006 13:22:09 +0100 Subject: [PATCH] sparc.c (tls_call_delay): Fix oversight. * config/sparc/sparc.c (tls_call_delay): Fix oversight. From-SVN: r110790 --- gcc/ChangeLog | 4 ++++ gcc/config/sparc/sparc.c | 30 +++++++++++++++++++----------- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 83b801fd6ba..2e64fe341bf 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +2006-02-09 Eric Botcazou + + * config/sparc/sparc.c (tls_call_delay): Fix oversight. + 2006-02-08 Jason Merrill PR c++/25979 diff --git a/gcc/config/sparc/sparc.c b/gcc/config/sparc/sparc.c index 20026413800..b5781ac65d7 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' -- 2.30.2