From 8ef6decbc1f3a5965fff70289e2bdccae3f9aa3c Mon Sep 17 00:00:00 2001 From: Alan Modra Date: Tue, 15 Oct 2019 23:04:14 +1030 Subject: [PATCH] qsort: tc-xtensa.c tidy Not much to see here, just reduce the number of calls to S_GET_VALUE and symbol_symbolS in the comparison functions. * config/tc-xtensa.c (xg_order_trampoline_chain_entry): Don't call S_GET_VALUE multiple times for a symbol. Rearrange code so it is obvious what is the primary sort key. (xg_order_trampoline_chain): Similarly. --- gas/ChangeLog | 7 ++++++ gas/config/tc-xtensa.c | 48 +++++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/gas/ChangeLog b/gas/ChangeLog index 33cc6ffc9af..ac2e3d75aa2 100644 --- a/gas/ChangeLog +++ b/gas/ChangeLog @@ -1,3 +1,10 @@ +2019-10-16 Alan Modra + + * config/tc-xtensa.c (xg_order_trampoline_chain_entry): Don't + call S_GET_VALUE multiple times for a symbol. Rearrange code + so it is obvious what is the primary sort key. + (xg_order_trampoline_chain): Similarly. + 2019-10-15 Alan Modra * config/tc-nds32.c (nds32_set_section_relocs): Use relocs and n diff --git a/gas/config/tc-xtensa.c b/gas/config/tc-xtensa.c index c68128e2897..60f9563585a 100644 --- a/gas/config/tc-xtensa.c +++ b/gas/config/tc-xtensa.c @@ -7584,14 +7584,17 @@ static int xg_order_trampoline_chain_entry (const void *a, const void *b) const struct trampoline_chain_entry *pa = a; const struct trampoline_chain_entry *pb = b; - if (pa->sym == pb->sym || - S_GET_VALUE (pa->sym) == S_GET_VALUE (pb->sym)) - if (pa->offset == pb->offset) - return 0; - else - return pa->offset < pb->offset ? -1 : 1; - else - return S_GET_VALUE (pa->sym) < S_GET_VALUE (pb->sym) ? -1 : 1; + if (pa->sym != pb->sym) + { + valueT aval = S_GET_VALUE (pa->sym); + valueT bval = S_GET_VALUE (pb->sym); + + if (aval != bval) + return aval < bval ? -1 : 1; + } + if (pa->offset != pb->offset) + return pa->offset < pb->offset ? -1 : 1; + return 0; } static void xg_sort_trampoline_chain (struct trampoline_chain *tc) @@ -7674,23 +7677,24 @@ static int xg_order_trampoline_chain (const void *a, const void *b) const struct trampoline_chain_entry *pb = &_pb->target; symbolS *s1 = pa->sym; symbolS *s2 = pb->sym; - symbolS *tmp; - tmp = symbol_symbolS (s1); - if (tmp) - s1 = tmp; + if (s1 != s2) + { + symbolS *tmp = symbol_symbolS (s1); + if (tmp) + s1 = tmp; - tmp = symbol_symbolS (s2); - if (tmp) - s2 = tmp; + tmp = symbol_symbolS (s2); + if (tmp) + s2 = tmp; - if (s1 == s2) - if (pa->offset == pb->offset) - return 0; - else - return pa->offset < pb->offset ? -1 : 1; - else - return s1 < s2 ? -1 : 1; + if (s1 != s2) + return s1 < s2 ? -1 : 1; + } + + if (pa->offset != pb->offset) + return pa->offset < pb->offset ? -1 : 1; + return 0; } static struct trampoline_chain * -- 2.30.2