diff options
| author | 2025-09-15 11:08:58 +0200 | |
|---|---|---|
| committer | 2025-09-15 11:43:11 +0200 | |
| commit | bdf9776b0b127b53a34be07f8adc0541df78654e (patch) | |
| tree | 4b1f44c96aba086fafdd68f9efb9b3a8f54e4e8b /regalloc.c | |
| parent | 7b1849402f33938aed8065ac9f4fab2ee8f22966 (diff) | |
regalloc: hand-roll qsort (bikeshedding...)
Diffstat (limited to 'regalloc.c')
| -rw-r--r-- | regalloc.c | 40 |
1 files changed, 31 insertions, 9 deletions
@@ -730,13 +730,6 @@ buildintervals(struct rega *ra) } } -static int -cmppinterval(void *a, void *b) -{ - struct interval **la = a, **lb = b; - return (int)itrange(*la, 0).from - (int)itrange(*lb, 0).from; -} - static bool itcontainspos(const struct interval *it, int pos) { @@ -748,6 +741,36 @@ itcontainspos(const struct interval *it, int pos) return 0; } +/* quicksort */ +static void +sortintervals(struct interval **xs, int lo, int hi) +{ + assert(lo >= 0 && hi >= 0); + while (lo < hi) { + /* partition */ + int i = lo - 1, p = hi + 1, + pivot = itrange(xs[lo], 0).from; + for (;;) { + struct interval *tmp; + do ++i; while (itrange(xs[i], 0).from < pivot); + do --p; while (itrange(xs[p], 0).from > pivot); + if (i >= p) break; + /* swap */ + tmp = xs[i]; + xs[i] = xs[p]; + xs[p] = tmp; + } + /* recur */ + if (p + 1 >= hi) { + hi = p; + } else { + if (lo < p) + sortintervals(xs, lo, p); + lo = p + 1; + } + } +} + static void linearscan(struct rega *ra) { @@ -758,7 +781,6 @@ linearscan(struct rega *ra) /* sort intervals */ { - extern void qsort(void *p, size_t n, size_t size, int (*)(void *, void *)); extern int ninstr; unhandled = xcalloc(sizeof *unhandled * intervals->count); @@ -771,7 +793,7 @@ linearscan(struct rega *ra) free(unhandled); return; } - qsort(unhandled, nunhandled, sizeof *unhandled, cmppinterval); + sortintervals(unhandled, 0, nunhandled-1); } /* LINEAR SCAN */ |