aboutsummaryrefslogtreecommitdiff
path: root/gcc/sort.cc
diff options
context:
space:
mode:
authorAlexander Monakov <amonakov@ispras.ru>2018-09-03 19:51:24 +0300
committerAlexander Monakov <amonakov@gcc.gnu.org>2018-09-03 19:51:24 +0300
commita6405b11a6456fe63e16945f32e1ddc2035ecdf0 (patch)
tree5757fd55f33239602823d6e5a3826392f65fb9c5 /gcc/sort.cc
parent71acd8b9d9d8c9437bfffa51f1b56f93cfbc20e9 (diff)
downloadgcc-a6405b11a6456fe63e16945f32e1ddc2035ecdf0.zip
gcc-a6405b11a6456fe63e16945f32e1ddc2035ecdf0.tar.gz
gcc-a6405b11a6456fe63e16945f32e1ddc2035ecdf0.tar.bz2
introduce gcc_stablesort
* sort.cc (struct sort_ctx): New field 'nlim'. Use it... (mergesort): ... here as maximum count for using netsort. (gcc_qsort): Set nlim to 3 if stable sort is requested. (gcc_stablesort): New. * system.h (gcc_stablesort): Declare. From-SVN: r264066
Diffstat (limited to 'gcc/sort.cc')
-rw-r--r--gcc/sort.cc15
1 files changed, 13 insertions, 2 deletions
diff --git a/gcc/sort.cc b/gcc/sort.cc
index 9f8ee12..b3be1ea 100644
--- a/gcc/sort.cc
+++ b/gcc/sort.cc
@@ -55,6 +55,7 @@ struct sort_ctx
char *out; // output buffer
size_t n; // number of elements
size_t size; // element size
+ size_t nlim; // limit for network sort
};
/* Helper for netsort. Permute, possibly in-place, 2 or 3 elements,
@@ -178,7 +179,7 @@ do { \
static void
mergesort (char *in, sort_ctx *c, size_t n, char *out, char *tmp)
{
- if (likely (n <= 5))
+ if (likely (n <= c->nlim))
{
c->out = out;
c->n = n;
@@ -221,8 +222,12 @@ gcc_qsort (void *vbase, size_t n, size_t size, cmp_fn *cmp)
{
if (n < 2)
return;
+ size_t nlim = 5;
+ bool stable = (ssize_t) size < 0;
+ if (stable)
+ nlim = 3, size = ~size;
char *base = (char *)vbase;
- sort_ctx c = {cmp, base, n, size};
+ sort_ctx c = {cmp, base, n, size, nlim};
long long scratch[32];
size_t bufsz = (n / 2) * size;
void *buf = bufsz <= sizeof scratch ? scratch : xmalloc (bufsz);
@@ -233,3 +238,9 @@ gcc_qsort (void *vbase, size_t n, size_t size, cmp_fn *cmp)
qsort_chk (vbase, n, size, cmp);
#endif
}
+
+void
+gcc_stablesort (void *vbase, size_t n, size_t size, cmp_fn *cmp)
+{
+ gcc_qsort (vbase, n, ~size, cmp);
+}