/* a-wada/qsortlib/ccg/qsortu.s Jan. 19, 2000 */ /* Copyright (c) 2000 Akira Wada */ /** qsortu.s from qsorts.c compiled on LINUX by GCC 2.7.2.3 **/ /** with " -S -O " and optimized in Asm manually by A. Wada **/ .file "qsorts.c" .version "01.01" gcc2_compiled.: .text // #include // #include // void radixspi (void *, size_t, size_t); // static void swapc (char *, char *, size_t); // static void rotatec (char *, char *, char *, size_t); // #define MDT 16 // #define MDA 2 // #define MDM 2 // #define DGT 256 // #define DGV 16 // #define DGM 0 // #define DGS 2 // #define DGU 4 // #define RDMSMPL(x, s, e) if (x != (n = s + rl * ( \ // random () % ((unsigned) (e - (s)) / rl + 1)))) SWAP (x, n) // #define COMP(i, j) (*qcmp)(i, j) // #define SWAP(i, j) do { \ // if (al < 0) \ // t = *((int *) i), *((int *) i) = *((int *) j), \ // *((int *) j) = t; else \ // if (al > 0) swapc (i, j, rl); else { \ // a = (int *) i, b = (int *) j, e = (int *)(i + rl); \ // do t = *a, *(a++) = *b, *(b++) = t; \ // while (a < e);}} while (0) // #define ROTATE(i, j, k) do { \ // if (al < 0) \ // t = *((int *) i), *((int *) i) = *((int *) j), \ // *((int *) j) = *((int *) k), *((int *) k) = t; else \ // if (al > 0) rotatec (i, j, k, rl); else { \ // a = (int *) i, b = (int *) j, d = (int *) k, \ // e = (int *)(i + rl); \ // do t = *a, *(a++) = *b, *(b++) = *d, *(d++) = t; \ // while (a < e);}} while (0) // #define PUSH(x, y) *(p++) = x, *(p++) = y // #define EMPTY (s >= p) // #define POP(y, x) y = *(--p), x = *(--p) // typedef int (*ftp) (const void *, const void *); // typedef char * ptrtyp; // //*** Allocation of variables for qsortu.s (sys-stack) *** // .. %edi i, // .. %esi j, k, // .. %ebx m, // .. %ebp n, // .. %eax .. c, t, nsp, ..., // 336(%esp) qcmp // 332(%esp) rl // 328(%esp) rn // 324(%esp) av // 320(%esp) (return address to caller) // 316(%esp) save caller's %ebp // 312(%esp) save caller's %edi // 308(%esp) save caller's %esi // 304(%esp) save caller's %ebx // 48(%esp) s[64] // 44(%esp) itv // 40(%esp) thr // 36(%esp) psz // 32(%esp) dgn // 28(%esp) cst // 24(%esp) save j, m, c, ... // 20(%esp) p // 16(%esp) r // 12(%esp) l // 8(%esp) al // 4(%esp) qcmp // 0(%esp) rl // ... args for function call, etc //*** ... *** // void qsort (void *av, size_t rn, size_t rl, ftp qcmp) { // ptrtyp l, r, m, i, j, k, n; int psz, thr, cst, c, t; // int al, *a, *b, *d, *e, t, z = sizeof (int); // int dgn = 0, nsp, itv; // ptrtyp s[sizeof (size_t) * 8 * 2], *p = s; .align 4 .globl qsort .type qsort,@function qsort: // ;offs machine-code // if (qcmp == (ftp) 0) radixspi (av, rn, rl); cmpl $0,16(%esp) // qcmp :: 0 ;0000 837c241000 jne qs001 //<- != ;0005 7505 jmp radixspi //<= radixspi(av,rn,rl) ;0007 e928490000 // else qs001: movl 16(%esp),%edx // qcmp ;000c 8b542410 movl 12(%esp),%eax // rl ;0010 8b44240c pushl %ebp // ;0014 55 movl 12(%esp),%ecx // rn ;0015 8b4c240c pushl %edi // ;0019 57 movl 12(%esp),%edi // av -> l, i ;001a 8b7c240c pushl %esi // ;001e 56 pushl %ebx // ;001f 53 subl $304,%esp // reserve 304 ;0020 81ec30010000 movl $0,32(%esp) // 0 -> dgn ;0026 c744242000000000 leal 48(%esp),%ebx // s ;002e 8d5c2430 movl %ebx,20(%esp) // s -> p ;0032 895c2414 // if (rn > 1 && rl > 0) { cmpl $1,%ecx // rn :: 1 ;0036 83f901 jle qs109 //<- <= ;0039 0f8e70080000 testl %eax,%eax // rl :: 0 ;003f 85c0 jle qs109 //<- <= ;0041 0f8e68080000 movl %eax,(%esp) // rl ;0047 890424 movl %edx,4(%esp) // qcmp ;004a 89542404 // l = (char *) av, r = l + (rn - 1) * rl; movl %edi,12(%esp) // l ;004e 897c240c leal -1(%ecx),%eax // rn - 1 -> w ;0052 8d41ff imull (%esp),%eax // w *= rl ;0055 0faf0424 leal (%edi,%eax),%esi // l + w -> j ;0059 8d3407 movl %esi,16(%esp) // j -> r ;005c 89742410 // if ((al = ((int) l | rl) & (z - 1)) == 0 && rl == z) al = -1; movl %edi,%edx // l -> w ;0060 89fa orl (%esp),%edx // w |= rl ;0062 0b1424 andl $3,%edx // w &= (z - 1) -> al :: 0 ;0065 83e203 movl %edx,8(%esp) // al ;0068 89542408 jne qs011 //<- != ;006a 0f85fe000000 cmpl $4,(%esp) // rl :: z ;0072 833c2404 jne qs011 //<- != ;0076 0f85f4000000 movl $-1,8(%esp) // -1 -> al ;007c c7442408ffffffff jmp qs011 //<- ;0084 e9e7000000 qs002: movl (%ebx),%ecx // *m -> t ;0089 8b0b movl (%ebp),%eax // *n -> u ;008b 8b4500 movl %eax,(%ebx) // u -> *m ;008e 8903 movl %ecx,(%ebp) // t -> *n ;0090 894d00 // if ((i -= rl) - l < r - (j += rl)) { qs003: subl (%esp),%edi // i -= rl ;0093 2b3c24 movl %edi,%eax // i -> w ;0096 89f8 subl 12(%esp),%eax // w -= l ;0098 2b44240c addl (%esp),%esi // j += rl ;009c 033424 movl 16(%esp),%ecx // r -> v ;009f 8b4c2410 subl %esi,%ecx // v -= j ;00a3 29f1 cmpl %ecx,%eax // w :: v ;00a5 39c8 jge qs006 //<- >= ;00a7 7d51 // if (psz >= DGT && l + ((unsigned) psz / DGV) * rl > j) dgn++; cmpl $255,36(%esp) // psz :: DGT ;00a9 817c2424ff000000 jle qs004 //<- <= ;00b1 7e17 movl 36(%esp),%eax // psz -> w ;00b3 8b442424 shrl $4,%eax // w /= DGV ;00b7 c1e804 imull (%esp),%eax // w *= rl ;00ba 0faf0424 addl 12(%esp),%eax // w += l ;00be 0344240c cmpl %eax,%esi // j :: w ;00c2 39c6 jae qs004 //<- >= ;00c4 7304 incl 32(%esp) // dgn++ ;00c6 ff442420 // if (l >= i) l = j; else { qs004: cmpl %edi,12(%esp) // l :: i ;00ca 397c240c jb qs005 //<- < ;00ce 720c movl %esi,%edi // j -> l ;00d0 89f7 movl %edi,12(%esp) // l ;00d2 897c240c movl 16(%esp),%esi // r ;00d6 8b742410 jmp qs009 //<- ;00da eb6d // PUSH (j, r), r = i; continue;}} else { qs005: movl 16(%esp),%eax // r ;00dc 8b442410 movl 20(%esp),%ecx // p ;00e0 8b4c2414 movl %esi,(%ecx) // j -> *p ;00e4 8931 movl %eax,4(%ecx) // r -> *(p+1) ;00e6 894104 addl $8,20(%esp) // p += 2 ;00e9 8344241408 movl %edi,%esi // i -> r ;00ee 89fe movl %esi,16(%esp) // r ;00f0 89742410 movl 12(%esp),%edi // l ;00f4 8b7c240c jmp qs011 //<- ;00f8 eb76 // if (psz >= DGT && i + ((unsigned) psz / DGV) * rl > r) dgn++; qs006: cmpl $255,36(%esp) // psz :: DGT ;00fa 817c2424ff000000 jle qs007 //<- <= ;0102 7e17 movl 36(%esp),%eax // psz -> w ;0104 8b442424 shrl $4,%eax // w /= DGV ;0108 c1e804 imull (%esp),%eax // w *= rl ;010b 0faf0424 addl %edi,%eax // w += i ;010f 01f8 cmpl %eax,16(%esp) // r :: w ;0111 39442410 jae qs007 //<- >= ;0115 7304 incl 32(%esp) // dgn++ ;0117 ff442420 // if (j >= r) r = i; else { qs007: cmpl %esi,16(%esp) // r :: j ;011b 39742410 jbe qs008 //<- <= ;011f 761e // PUSH (l, i), l = j; continue;}} movl 12(%esp),%eax // l ;0121 8b44240c movl 20(%esp),%ecx // p ;0125 8b4c2414 movl %eax,(%ecx) // l -> *p ;0129 8901 movl %edi,4(%ecx) // i -> *(p+1) ;012b 897904 addl $8,20(%esp) // p += 2 ;012e 8344241408 movl %esi,%edi // j -> l ;0133 89f7 movl %edi,12(%esp) // l ;0135 897c240c movl 16(%esp),%esi // r ;0139 8b742410 jmp qs011 //<- ;013d eb31 qs008: movl %edi,%esi // i -> r ;013f 89fe movl %esi,16(%esp) // r ;0141 89742410 movl 12(%esp),%edi // l ;0145 8b7c240c // if (l < r) continue;} qs009: cmpl %esi,%edi // l :: r ;0149 39f7 jb qs011 //<- < ;014b 7223 // if (!EMPTY) POP (r, l); else break;}}} qs010: leal 48(%esp),%eax // s ;014d 8d442430 movl 20(%esp),%ecx // p ;0151 8b4c2414 cmpl %eax,%ecx // p :: s ;0155 39c1 jbe qs109 //<- <= ;0157 0f8652070000 movl -4(%ecx),%esi // *(p-1) -> r ;015d 8b71fc movl %esi,16(%esp) // r ;0160 89742410 movl -8(%ecx),%edi // *(p-2) -> l ;0164 8b79f8 movl %edi,12(%esp) // l ;0167 897c240c subl $8,20(%esp) // p -= 2 ;016b 836c241408 // for ( ; ; ) { // m = l + ((unsigned) (psz = (r - l) / rl) / 2) * rl, qs011: movl %esi,%eax // r -> w ;0170 89f0 subl %edi,%eax // w -= l ;0172 29f8 xorl %edx,%edx // 0 -> dx ;0174 31d2 divl (%esp) // w /= rl ;0176 f73424 movl %eax,36(%esp) // w -> psz ;0179 89442424 shrl $1,%eax // w /= 2 ;017d c1e801 imull (%esp),%eax // w *= rl ;0180 0faf0424 leal (%edi,%eax),%ebx // l + w -> m ;0184 8d1c07 // i = l, j = r, thr = MDT, psz -= (MDA), cst = 1; movl $16,40(%esp) // MDT -> thr ;0187 c744242810000000 subl $2,36(%esp) // psz -= (MDA) ;018f 836c242402 movl $1,28(%esp) // 1 -> cst ;0194 c744241c01000000 // if (!(psz > MDT && DGM < dgn && dgn <= DGS)) { cmpl $16,36(%esp) // psz :: MDT ;019c 837c242410 jle qs018 //<- <= (select median) ;01a1 7e47 cmpl $0,32(%esp) // dgn :: DGM ;01a3 837c242000 jg qs081 //<- > ;01a8 0f8fab040000 jmp qs018 //<- ;01ae eb3a qs012: movl (%ebx),%ecx // *m -> t ;01b0 8b0b movl (%ebp),%eax // *n -> u ;01b2 8b4500 movl %eax,(%ebx) // u -> *m ;01b5 8903 movl (%esi),%eax // *k -> u ;01b7 8b06 movl %eax,(%ebp) // u -> *n ;01b9 894500 qs013: movl %ecx,(%esi) // t -> *k ;01bc 890e qs014: movl 24(%esp),%esi // j ;01be 8b742418 // cst = 0;} qs015: movl $0,28(%esp) // 0 -> cst ;01c2 c744241c00000000 // i += rl, j -= rl; qs016: addl (%esp),%edi // i += rl ;01ca 033c24 subl (%esp),%esi // j -= rl ;01cd 2b3424 qs017: cmpl %edi,%esi // j :: i ;01d0 39fe jbe qs010 //<- <= ;01d2 0f8675ffffff // if (psz > thr) thr *= MDM; else break;}} movl 40(%esp),%edx // thr ;01d8 8b542428 cmpl %edx,36(%esp) // psz :: thr ;01dc 39542424 jle qs036 //<- <= ;01e0 0f8e5a010000 addl %edx,40(%esp) // thr *= MDM ;01e6 01542428 // for ( ; ; ) { // if (COMP (m, j) <= 0) { qs018: pushl %esi // j ;01ea 56 pushl %ebx // m ;01eb 53 call *12(%esp) //<= (*qcmp)(m,j)->c ;01ec ff54240c addl $8,%esp // ;01f0 83c408 testl %eax,%eax // c :: 0 ;01f3 85c0 jg qs021 //<- > ;01f5 7f3a // if (i < m && COMP (i, m) > 0) { cmpl %edi,%ebx // m :: i ;01f7 39fb jbe qs010 //<- <= ;01f9 0f864effffff pushl %ebx // m ;01ff 53 pushl %edi // i ;0200 57 call *12(%esp) //<= (*qcmp)(i,m)->c ;0201 ff54240c addl $8,%esp // ;0205 83c408 testl %eax,%eax // c :: 0 ;0208 85c0 jle qs016 //<- <= ;020a 7ebe // n = i, k = j; do movl %esi,24(%esp) // (SI j -> k) ;020c 89742418 movl %edi,%ebp // i -> n ;0210 89fd // if (COMP (n, k) > 0) n = k; qs019: pushl %esi // k ;0212 56 pushl %ebp // n ;0213 55 call *12(%esp) //<= (*qcmp)(n,k)->c ;0214 ff54240c addl $8,%esp // ;0218 83c408 testl %eax,%eax // c :: 0 ;021b 85c0 jle qs020 //<- <= ;021d 7e02 movl %esi,%ebp // k -> n ;021f 89f5 // while ((k += rl) <= r); qs020: addl (%esp),%esi // k += rl ;0221 033424 cmpl %esi,16(%esp) // r :: k ;0224 39742410 jae qs019 //<- >= ;0228 73e8 // if (n == i) SWAP (m, i); else ROTATE (m, n, i); cst = 0;}} movl %edi,%esi // i -> k ;022a 89fe jmp qs029 //<- ;022c e984000000 // else { // if (i >= m || COMP (i, m) > 0) qs021: cmpl %edi,%ebx // m :: i ;0231 39fb jbe qs022 //<- <= ;0233 760d pushl %ebx // m ;0235 53 pushl %edi // i ;0236 57 call *12(%esp) //<= (*qcmp)(i,m)->c ;0237 ff54240c addl $8,%esp // ;023b 83c408 testl %eax,%eax // c :: 0 ;023e 85c0 jle qs026 //<- <= ;0240 7e4f // SWAP (i, j); else { qs022: cmpl $0,8(%esp) // al :: 0 ;0242 837c240800 jl qs025 //<- < ;0247 7c3b jg qs024 //<- > ;0249 7f2a movl %edi,%edx // i -> e ;024b 89fa addl (%esp),%edx // e += rl ;024d 031424 qs023: movl (%edi),%ecx // *i -> t ;0250 8b0f movl (%esi),%eax // *j -> u ;0252 8b06 movl %eax,(%edi) // u -> *i ;0254 8907 addl $4,%edi // i += z ;0256 83c704 movl %ecx,(%esi) // t -> *j ;0259 890e addl $4,%esi // j += z ;025b 83c604 cmpl %edx,%edi // i :: e ;025e 39d7 jb qs023 //<- < ;0260 72ee subl (%esp),%esi // j -= rl ;0262 2b3424 subl (%esp),%esi // j -= rl ;0265 2b3424 movl $0,28(%esp) // 0 -> cst ;0268 c744241c00000000 jmp qs017 //<- ;0270 e95bffffff qs024: pushl %esi // j ;0275 56 pushl %edi // i ;0276 57 call swapc //<= swapc(i,j,rl) ;0277 e840060000 addl $8,%esp // ;027c 83c408 jmp qs015 //<- ;027f e93effffff qs025: movl (%edi),%ecx // *i -> t ;0284 8b0f movl (%esi),%eax // *j -> u ;0286 8b06 movl %eax,(%edi) // u -> *i ;0288 8907 movl %ecx,(%esi) // t -> *j ;028a 890e jmp qs015 //<- ;028c e931ffffff // n = j, k = l; do qs026: movl %esi,%ebp // j -> n ;0291 89f5 movl %esi,24(%esp) // (SI j -> k) ;0293 89742418 movl 12(%esp),%esi // l -> k ;0297 8b74240c // if (COMP (k, n) > 0) n = k; qs027: pushl %ebp // n ;029b 55 pushl %esi // k ;029c 56 call *12(%esp) //<= (*qcmp)(k,n)->c ;029d ff54240c addl $8,%esp // ;02a1 83c408 testl %eax,%eax // c :: 0 ;02a4 85c0 jle qs028 //<- <= ;02a6 7e02 movl %esi,%ebp // k -> n ;02a8 89f5 // while ((k += rl) <= i); qs028: addl (%esp),%esi // k += rl ;02aa 033424 cmpl %esi,%edi // i :: k ;02ad 39f7 jae qs027 //<- >= ;02af 73ea // if (n == j) SWAP (m, j); else ROTATE (m, n, j);} movl 24(%esp),%esi // j -> k ;02b1 8b742418 qs029: cmpl %ebp,%esi // k :: n ;02b5 39ee jne qs033 //<- != ;02b7 7542 cmpl $0,8(%esp) // al :: 0 ;02b9 837c240800 jl qs032 //<- < ;02be 7c30 jg qs031 //<- > ;02c0 7f1f movl %ebx,%edx // m -> e ;02c2 89da addl (%esp),%edx // e += rl ;02c4 031424 qs030: movl (%ebx),%ecx // *m -> t ;02c7 8b0b movl (%esi),%eax // *k -> u ;02c9 8b06 movl %eax,(%ebx) // u -> *m ;02cb 8903 addl $4,%ebx // m += z ;02cd 83c304 movl %ecx,(%esi) // t -> *k ;02d0 890e addl $4,%esi // k += z ;02d2 83c604 cmpl %edx,%ebx // m :: e ;02d5 39d3 jb qs030 //<- < ;02d7 72ee subl (%esp),%ebx // m -= rl ;02d9 2b1c24 jmp qs014 //<- ;02dc e9ddfeffff qs031: pushl %esi // k ;02e1 56 pushl %ebx // m ;02e2 53 call swapc //<= swapc(m,k,rl) ;02e3 e8d4050000 addl $8,%esp // ;02e8 83c408 jmp qs014 //<- ;02eb e9c05effff qs032: movl (%ebx),%ecx // *m -> t ;02f0 8b0b movl (%esi),%eax // *k -> u ;02f2 8b06 movl %eax,(%ebx) // u -> *m ;02f4 8903 jmp qs013 //<- ;02f6 e9c1feffff qs033: cmpl $0,8(%esp) // al :: 0 ;02fb 837c240800 jl qs012 //<- < ;0300 0f8caafeffff jg qs035 //<- > ;0306 7f28 movl %ebx,%edx // m -> e ;0308 89da addl (%esp),%edx // e += rl ;030a 031424 qs034: movl (%ebx),%ecx // *m -> t ;030d 8b0b movl (%ebp),%eax // *n -> u ;030f 8b4500 movl %eax,(%ebx) // u -> *m ;0312 8903 addl $4,%ebx // m += z ;0314 83c304 movl (%esi),%eax // *k -> u ;0317 8b06 movl %eax,(%ebp) // u -> *n ;0319 894500 addl $4,%ebp // n += z ;031c 83c504 movl %ecx,(%esi) // t -> *k ;031f 890e addl $4,%esi // k += z ;0321 83c604 cmpl %edx,%ebx // m :: e ;0324 39d3 jb qs034 //<- < ;0326 72e5 subl (%esp),%ebx // m -= rl ;0328 2b1c24 jmp qs014 //<- ;032b e9805effff qs035: pushl %esi // k ;0330 56 pushl %ebp // n ;0331 55 pushl %ebx // m ;0332 53 call rotatec //<= rotatec(m,n,k,rl);0333 e8ac050000 addl $12,%esp // ;0338 83c40c jmp qs014 //<- ;033b e9705effff // if (cst != 0) if (psz > MDT) { qs036: cmpl $0,28(%esp) // cst :: 0 ;0340 837c241c00 je qs038 //<- == ;0345 742d cmpl $16,36(%esp) // psz :: MDT ;0347 837c242410 jle qs038 //<- <= ;034c 7e26 // k = l; while (k < r && COMP (k, k + rl) <= 0) k += rl; movl 12(%esp),%ebp // l -> n ;034e 8b6c240c qs037: movl %ebp,%edx // n -> k ;0352 89ea cmpl %edx,16(%esp) // r :: k ;0354 39542410 jbe qs010 //<- <= ;0358 0f86effdffff addl (%esp),%ebp // n += rl ;035e 032c24 pushl %ebp // n ;0361 55 pushl %edx // k ;0362 52 call *12(%esp) //<= (*qcmp)(k,n)->c ;0363 ff54240c addl $8,%esp // ;0367 83c408 testl %eax,%eax // c :: 0 ;036a 85c0 jle qs037 //<- <= ;036c 7ee4 // if (k >= r) i = j; else if (k >= m) i = m;} cmpl %ebx,%ebp // n :: m ;036e 39dd jbe qs038 //<- <= ;0370 7602 movl %ebx,%edi // m -> i ;0372 89df // if (i < j) { // for (n = m; ; ) { qs038: movl %ebx,%ebp // m -> n ;0374 89dd jmp qs062 //<- ;0376 e980010000 // while ((n += rl) < j && (c = COMP (n, j)) == 0); qs039: movl (%esp),%eax // rl ;037b 8b0424 addl %eax,%ebp // n += rl ;037e 01c5 cmpl %esi,%ebp // n :: j ;0380 39f5 jae qs049 //<- >= ;0382 0f83c2000000 pushl %esi // j ;0388 56 pushl %ebp // n ;0389 55 call *12(%esp) //<= (*qcmp)(n,j)->c ;038a ff54240c addl $8,%esp // ;038e 83c408 testl %eax,%eax // c :: 0 ;0391 85c0 je qs039 //<- == ;0393 74e6 movl %eax,24(%esp) // c ;0395 89442418 // if (n < j) SWAP (n, j); else break; cmpl $0,8(%esp) // al :: 0 ;0399 837c240800 jl qs042 //<- < ;039e 7c2f jg qs041 //<- > ;03a0 7f21 movl %ebp,%edx // n -> e ;03a2 89ea addl (%esp),%edx // e += rl ;03a4 031424 qs040: movl (%ebp),%ecx // *n -> t ;03a7 8b4d00 movl (%esi),%eax // *j -> u ;03aa 8b06 movl %eax,(%ebp) // u -> *n ;03ac 894500 addl $4,%ebp // n += z ;03af 83c504 movl %ecx,(%esi) // t -> *j ;03b2 890e addl $4,%esi // j += z ;03b4 83c604 cmpl %edx,%ebp // n :: e ;03b7 39d5 jb qs040 //<- < ;03b9 72ec subl (%esp),%ebp // n -= rl ;03bb 2b2c24 subl (%esp),%esi // j -= rl ;03be 2b3424 jmp qs043 //<- ;03c1 eb16 qs041: pushl %esi // j ;03c3 56 pushl %ebp // n ;03c4 55 call swapc //<= swapc(n,j,rl) ;03c5 e8f2040000 addl $8,%esp // ;03ca 83c408 jmp qs043 //<- ;03cd eb0a qs042: movl (%ebp),%ecx // *n -> t ;03cf 8b4d00 movl (%esi),%eax // *j -> u ;03d2 8b06 movl %eax,(%ebp) // u -> *n ;03d4 894500 movl %ecx,(%esi) // t -> *j ;03d7 890e // if (c > 0) j -= rl; else break;}} qs043: cmpl $0,24(%esp) // c :: 0 ;03d9 837c241800 jg qs054 //<- > ;03de 0f8fb3000000 jmp qs056 //<- ;03e4 e9c8000000 // if (i < (m -= rl)) { qs044: subl (%esp),%esi // j -= rl ;03e9 2b3424 subl (%esp),%ebx // m -= rl ;03ec 2b1c24 cmpl %edi,%ebx // m :: i ;03ef 39fb jbe qs078 //<- <= ;03f1 0f8628020000 // ROTATE (i, m, n); n = j;} else { cmpl $0,8(%esp) // al :: 0 ;03f7 837c240800 jl qs047 //<- < ;03fc 7c37 jg qs046 //<- > ;03fe 7f28 movl %edi,%edx // i -> e ;0400 89fa addl (%esp),%edx // e += rl ;0402 031424 qs045: movl (%edi),%ecx // *i -> t ;0405 8b0f movl (%ebx),%eax // *m -> u ;0407 8b03 movl %eax,(%edi) // u -> *i ;0409 8907 addl $4,%edi // i += z ;040b 83c704 movl (%ebp),%eax // *n -> u ;040e 8b4500 movl %eax,(%ebx) // u -> *m ;0411 8903 addl $4,%ebx // m += z ;0413 83c304 movl %ecx,(%ebp) // t -> *n ;0416 894d00 addl $4,%ebp // n += z ;0419 83c504 cmpl %edx,%edi // i :: e ;041c 39d7 jb qs045 //<- < ;041e 72e5 subl (%esp),%edi // i -= rl ;0420 2b3c24 subl (%esp),%ebx // m -= rl ;0423 2b1c24 jmp qs048 //<- ;0426 eb1b qs046: pushl %ebp // n ;0428 55 pushl %ebx // m ;0429 53 pushl %edi // i ;042a 57 call rotatec //<= rotatec(i,m,n,rl);042b e8b4040000 addl $12,%esp // ;0430 83c40c jmp qs048 //<- ;0433 eb0e qs047: movl (%edi),%ecx // *i -> t ;0435 8b0f movl (%ebx),%eax // *m -> u ;0437 8b03 movl %eax,(%edi) // u -> *i ;0439 8907 movl (%ebp),%eax // *n -> u ;043b 8b4500 movl %eax,(%ebx) // u -> *m ;043e 8903 movl %ecx,(%ebp) // t -> *n ;0440 894d00 qs048: movl %esi,%ebp // j -> n ;0443 89f5 jmp qs062 //<- ;0445 e9b1000000 // if (n == j) { // if (i == m) break; qs049: cmpl %ebx,%edi // i :: m ;044a 39df je qs003 //<- == ;044c 0f8441fcffff // j -= rl; if (m == n) { cmpl %ebx,%ebp // n :: m ;0452 39dd jne qs044 //<- != ;0454 7593 // SWAP (i, n); m = n = i;} else cmpl $0,8(%esp) // al :: 0 ;0456 837c240800 jl qs052 //<- < ;045b 7c2c jg qs051 //<- > ;045d 7f1e movl %edi,%ebx // i -> e ;045f 89fb addl (%esp),%ebx // e += rl ;0461 031c24 qs050: movl (%edi),%ecx // *i -> t ;0464 8b0f movl (%ebp),%eax // *n -> u ;0466 8b4500 movl %eax,(%edi) // u -> *i ;0469 8907 addl $4,%edi // i += z ;046b 83c704 movl %ecx,(%ebp) // t -> *n ;046e 894d00 addl $4,%ebp // n += z ;0471 83c504 cmpl %ebx,%edi // i :: e ;0474 39df jb qs050 //<- < ;0476 72ec subl (%esp),%edi // i -= rl ;0478 2b3c24 jmp qs053 //<- ;047b eb16 qs051: pushl %ebp // n ;047d 55 pushl %edi // i ;047e 57 call swapc //<= swapc(i,n,rl) ;047f e838040000 addl $8,%esp // ;0484 83c408 jmp qs053 //<- ;0487 eb0a qs052: movl (%edi),%ecx // *i -> t ;0489 8b0f movl (%ebp),%eax // *n -> u ;048b 8b4500 movl %eax,(%edi) // u -> *i ;048e 8907 movl %ecx,(%ebp) // t -> *n ;0490 894d00 qs053: movl %edi,%ebp // i -> n ;0493 89fd movl %edi,%ebx // i -> m ;0495 89fb qs054: subl (%esp),%esi // j -= rl ;0497 2b3424 // while (n < j) { qs055: cmpl %esi,%ebp // n :: j ;049a 39f5 jae qs049 //<- >= ;049c 73ac // if ((c = COMP (n, j)) < 0) j -= rl; else pushl %esi // j ;049e 56 pushl %ebp // n ;049f 55 call *12(%esp) //<= (*qcmp)(n,j)->c ;04a0 ff54240c addl $8,%esp // ;04a4 83c408 testl %eax,%eax // c :: 0 ;04a7 85c0 jl qs054 //<- < ;04a9 7cec // if (c > 0) break; else { je qs039 //<- == ;04ab 0f84cafeffff // if (i == m) { qs056: cmpl %edi,%ebx // m :: i ;04b1 39fb je qs068 //<- == ;04b3 0f84bf000000 // SWAP (i, j); j -= rl, i += rl;}} cmpl $0,8(%esp) // al :: 0 ;04b9 837c240800 jl qs059 //<- < ;04be 7c2d jg qs058 //<- > ;04c0 7f1f movl %edi,%edx // i -> e ;04c2 89fa addl (%esp),%edx // e += rl ;04c4 031424 qs057: movl (%edi),%ecx // *i -> t ;04c7 8b0f movl (%esi),%eax // *j -> u ;04c9 8b06 movl %eax,(%edi) // u -> *i ;04cb 8907 addl $4,%edi // i += z ;04cd 83c704 movl %ecx,(%esi) // t -> *j ;04d0 890e addl $4,%esi // j += z ;04d2 83c604 cmpl %edx,%edi // i :: e ;04d5 39d7 jb qs057 //<- < ;04d7 72ee subl (%esp),%esi // j -= rl ;04d9 2b3424 subl (%esp),%esi // j -= rl ;04dc 2b3424 jmp qs062 //<- ;04df eb1a qs058: pushl %esi // j ;04e1 56 pushl %edi // i ;04e2 57 call swapc //<= swapc(i,j,rl) ;04e3 e8d4030000 addl $8,%esp // ;04e8 83c408 jmp qs060 //<- ;04eb eb08 qs059: movl (%edi),%ecx // *i -> t ;04ed 8b0f movl (%esi),%eax // *j -> u ;04ef 8b06 movl %eax,(%edi) // u -> *i ;04f1 8907 movl %ecx,(%esi) // t -> *j ;04f3 890e qs060: subl (%esp),%esi // j -= rl ;04f5 2b3424 qs061: addl (%esp),%edi // i += rl ;04f8 033c24 // while (i < m) { qs062: cmpl %ebx,%edi // i :: m ;04fb 39df jae qs055 //<- >= ;05fd 739b // if ((c = COMP (i, m)) < 0) i += rl; else pushl %ebx // m ;05fe 53 pushl %edi // i ;0500 57 call *12(%esp) //<= (*qcmp)(i,m)->c ;0501 ff54240c addl $8,%esp // ;0505 83c408 testl %eax,%eax // c :: 0 ;0508 85c0 jl qs061 //<- < ;050a 7cec // if (c > 0) break; else { jg qs055 //<- > ;050c 7f8c // while (i < (m -= rl) && (c = COMP (i, m)) == 0); qs063: subl (%esp),%ebx // m -= rl ;050e 2b1c24 cmpl %edi,%ebx // m :: i ;0511 39fb jbe qs055 //<- <= ;0513 7685 pushl %ebx // m ;0515 53 pushl %edi // i ;0516 57 call *12(%esp) //<= (*qcmp)(i,m)->c ;0517 ff54240c addl $8,%esp // ;051b 83c408 testl %eax,%eax // c :: 0 ;051e 85c0 je qs063 //<- == ;0520 74ec movl %eax,24(%esp) // c ;0522 89442418 // if (i < m) SWAP (i, m); else break; cmpl $0,8(%esp) // al :: 0 ;0526 837c240800 jl qs066 //<- < ;052b 7c37 jg qs065 //<- > ;052d 7f29 movl %edi,%edx // i -> e ;052f 89fa addl (%esp),%edx // e += rl ;0531 031424 qs064: movl (%edi),%ecx // *i -> t ;0534 8b0f movl (%ebx),%eax // *m -> u ;0536 8b03 movl %eax,(%edi) // u -> *i ;0538 8907 addl $4,%edi // i += z ;053a 83c704 movl %ecx,(%ebx) // t -> *m ;053d 890b addl $4,%ebx // m += z ;053f 83c304 cmpl %edx,%edi // i :: e ;0542 39d7 jb qs064 //<- < ;0544 72ee subl (%esp),%ebx // m -= rl ;0546 2b1c24 cmpl $0,24(%esp) // c :: 0 ;0549 837c241800 jg qs062 //<- > ;054e 7fab subl (%esp),%edi // i -= rl ;0550 2b3c24 jmp qs055 //<- ;0553 e942ffffff qs065: pushl %ebx // m ;0558 53 pushl %edi // i ;0559 57 call swapc //<= swapc(i,m,rl) ;055a e85d030000 addl $8,%esp // ;055f 83c408 jmp qs067 //<- ;0562 eb08 qs066: movl (%edi),%ecx // *i -> t ;0564 8b0f movl (%ebx),%eax // *m -> u ;0566 8b03 movl %eax,(%edi) // u -> *i ;0568 8907 movl %ecx,(%ebx) // t -> *m ;056a 890b // if (c > 0) i += rl; else break;}} qs067: cmpl $0,24(%esp) // c :: 0 ;056c 837c241800 jg qs061 //<- > ;0571 7f85 jmp qs055 //<- ;0573 e922ffffff // i += rl; if (m == n) { qs068: cmpl %ebx,%ebp // n :: m ;0578 39dd jne qs073 //<- != ;057a 7542 // SWAP (m, j); m = n = j;} else cmpl $0,8(%esp) // al :: 0 ;057c 837c240800 jl qs071 //<- < ;0581 7c2a jg qs070 //<- > ;0583 707c movl %ebx,%edx // m -> e ;0585 89da addl (%esp),%edx // e += rl ;0587 031424 qs069: movl (%ebx),%ecx // *m -> t ;058a 8b0b movl (%esi),%eax // *j -> u ;058c 8b06 movl %eax,(%ebx) // u -> *m ;058e 8903 addl $4,%ebx // m += z ;0590 83c304 movl %ecx,(%esi) // t -> *j ;0593 890e addl $4,%esi // j += z ;0595 83c604 cmpl %edx,%ebx // m :: e ;0598 39d3 jb qs069 //<- < ;059a 72ee subl (%esp),%esi // j -= rl ;059c 2b3424 jmp qs072 //<- ;059f eb14 qs070: pushl %esi // j ;05a1 56 pushl %ebx // m ;05a2 53 call swapc //<= swapc(m,j,rl) ;05a3 e814030000 addl $8,%esp // ;05a8 83c408 jmp qs072 //<- ;05ab eb08 qs071: movl (%ebx),%ecx // *m -> t ;05ad 8b0b movl (%esi),%eax // *j -> u ;05af 8b06 movl %eax,(%ebx) // u -> *m ;05b1 8903 movl %ecx,(%esi) // t -> *j ;05b3 890e qs072: movl %esi,%ebp // j -> n ;05b5 89f5 movl %esi,%ebx // j -> m ;05b7 89f3 jmp qs061 //<- ;05b9 e93affffff // if ((n += rl) < j) { qs073: movl (%esp),%eax // rl ;05be 8b0424 addl %eax,%edi // i += rl ;05c1 01c7 addl %eax,%ebp // n += rl ;05c3 01c5 cmpl %esi,%ebp // n :: j ;05c5 39f5 jae qs078 //<- >= ;05c7 7356 // ROTATE (n, m, j); m = i;} else { cmpl $0,8(%esp) // al :: 0 ;05c9 837c240800 jl qs076 //<- < ;05ce 7c3a jg qs075 //<- > ;05d0 7f2b movl %ebp,%edx // n -> e ;05d2 89ea addl (%esp),%edx // e += rl ;05d4 031424 qs074: movl (%ebp),%ecx // *n -> t ;05d7 8b4d00 movl (%ebx),%eax // *m -> u ;05da 8b03 movl %eax,(%ebp) // u -> *n ;05dc 894500 addl $4,%ebp // n += z ;05df 83c504 movl (%esi),%eax // *j -> u ;05e2 8b06 movl %eax,(%ebx) // u -> *m ;05e4 8903 addl $4,%ebx // m += z ;05e6 83c304 movl %ecx,(%esi) // t -> *j ;05e9 890e addl $4,%esi // j += z ;05eb 83c604 cmpl %edx,%ebp // n :: e ;05ee 39d5 jb qs074 //<- < ;05f0 72e5 subl (%esp),%ebp // n -= rl ;05f2 2b2c24 subl (%esp),%esi // j -= rl ;05f5 2b3424 jmp qs055 //<- ;05f8 e99dfeffff qs075: pushl %esi // j ;05fd 56 pushl %ebx // m ;05fe 53 pushl %ebp // n ;05ff 55 call rotatec //<= rotatec(n,m,j,rl);0600 e8df020000 addl $12,%esp // ;0605 83c40c jmp qs077 //<- ;0608 eb0e qs076: movl (%ebp),%ecx // *n -> t ;060a 8b4d00 movl (%ebx),%eax // *m -> u ;060d 8b03 movl %eax,(%ebp) // u -> *n ;060f 894500 movl (%esi),%eax // *j -> u ;0612 8b06 movl %eax,(%ebx) // u -> *m ;0614 8903 movl %ecx,(%esi) // t -> *j ;0616 890e qs077: movl %edi,%ebx // i -> m ;0618 89fb jmp qs055 //<- ;061a e97bfeffff // SWAP (i, n); break;}} else // SWAP (m, j); break;}} else { qs078: cmpl $0,8(%esp) // al :: 0 ;061f 837c240800 jl qs002 //<- < ;0624 0f8c5ffaffff jg qs080 //<- > ;062a 7f1e movl %ebx,%edx // m -> e ;062c 89da addl (%esp),%edx // e += rl ;062e 031424 qs079: movl (%ebx),%ecx // *m -> t ;0631 8b0b movl (%ebp),%eax // *n -> u ;0633 8b4500 movl %eax,(%ebx) // u -> *m ;0636 8903 addl $4,%ebx // m += z ;0638 83c304 movl %ecx,(%ebp) // t -> *n ;063b 894d00 addl $4,%ebp // n += z ;063e 83c504 cmpl %edx,%ebx // m :: e ;0641 39d3 jb qs079 //<- < ;0643 72ec jmp qs003 //<- ;0645 e949faffff qs080: pushl %ebp // n ;064a 55 pushl %ebx // m ;064b 53 call swapc //<= swapc(m,n,rl) ;064c e86b020000 addl $8,%esp // ;0651 83c408 jmp qs003 //<- ;0654 e93afaffff // if (psz > MDT && dgn > DGS) { qs081: cmpl $2,32(%esp) // dgn :: DGS ;0659 837c242002 jle qs036 //<- <= (no-median) ;065e 0f8edcfcffff // if (dgn <= DGU) { movl %ebx,24(%esp) // m ;0664 895c2418 cmpl $4,32(%esp) // dgn :: DGU ;0668 837c242004 jg qs092 //<- > (random samples) ;066d 0f8fd3000000 // nsp = 3; while (psz > thr) thr *= MDM, nsp += 2; movl $2,%ecx // 2 -> nsp ;0673 b902000000 movl 40(%esp),%edx // thr ;0678 8b542428 qs082: addl %edx,%edx // thr *= MDM ;067c 01d2 addl $2,%ecx // nsp += 2 ;067e 83c102 cmpl %edx,36(%esp) // psz :: thr ;0681 39542424 jg qs082 //<- > ;0685 7ff5 // itv = ((unsigned) psz / (nsp - 1)) * rl; k = l, n = r; movl 36(%esp),%eax // psz -> w ;0687 8b442424 xorl %edx,%edx // 0 -> dx ;068b 31d2 divl %ecx // w /= nsp ;068d f7f1 imull (%esp),%eax // w *= rl ;068f 0faf0424 movl %eax,44(%esp) // w -> itv ;0693 8944242c movl %edi,%ebx // i -> k ;0697 89fb movl %esi,%ebp // j -> n ;0699 89f5 // for (thr = MDT; psz > thr; thr *= MDM) { movl $16,%eax // MDT -> thr ;069b b810000000 jmp qs085 //<- ;06a0 eb10 qs083: movl (%ebp),%ecx // *n -> t ;06a2 8b4d00 movl (%esi),%eax // *j -> u ;06a5 8b06 movl %eax,(%ebp) // u -> *n ;06a7 894500 movl %ecx,(%esi) // t -> *j ;06aa 890e qs084: movl 40(%esp),%eax // thr ;06ac 8b442428 addl %eax,%eax // thr *= MDM ;06b0 01c0 qs085: cmpl %eax,36(%esp) // psz :: thr ;06b2 39442424 jle qs108 //<- <= ;06b6 0f8eda010000 movl %eax,40(%esp) // thr ;06bc 89442428 // i += rl, k += itv; SWAP (i, k); addl (%esp),%edi // i += rl ;06c0 033c24 addl 44(%esp),%ebx // k += itv ;06c3 035c242c cmpl $0,8(%esp) // al :: 0 ;06c7 837c240800 jl qs088 //<- < ;06cc 7c2d jg qs087 //<- > ;06ce 7f1f movl %edi,%edx // i -> e ;06d0 89fa addl (%esp),%edx // e += rl ;06d2 031424 qs086: movl (%edi),%ecx // *i -> t ;06d5 8b0f movl (%ebx),%eax // *k -> u ;06d7 8b03 movl %eax,(%edi) // u -> *i ;06d9 8907 addl $4,%edi // i += z ;06db 83c704 movl %ecx,(%ebx) // t -> *k ;06de 890b addl $4,%ebx // k += z ;06e0 83c304 cmpl %edx,%edi // i :: e ;06e3 39d7 jb qs086 //<- < ;06e5 72ee subl (%esp),%ebx // k -= rl ;06e7 2b1c24 subl (%esp),%edi // i -= rl ;06ea 2b3c24 jmp qs089 //<- ;06ed eb14 qs087: pushl %ebx // k ;06ef 53 pushl %edi // i ;06f0 57 call swapc //<= swapc(i,k,rl) ;06f1 e8c6010000 addl $8,%esp // ;06f6 83c408 jmp qs089 //<- ;06f9 eb08 qs088: movl (%edi),%ecx // *i -> t ;06fb 8b0f movl (%ebx),%eax // *k -> u ;06fd 8b03 movl %eax,(%edi) // u -> *i ;06ff 8907 movl %ecx,(%ebx) // t -> *k ;0701 890b // j -= rl, n -= itv; SWAP (n, j);}} qs089: subl (%esp),%esi // j -= rl ;0703 2b3424 subl 44(%esp),%ebp // n -= itv ;0706 2b6c242c cmpl $0,8(%esp) // al :: 0 ;070a 837c240800 jl qs083 //<- < ;070f 7c91 jg qs091 //<- > ;0711 7f24 movl %ebp,%edx // n -> e ;0713 89ea addl (%esp),%edx // e += rl ;0715 031424 qs090: movl (%ebp),%ecx // *n -> t ;0718 8b4d00 movl (%esi),%eax // *j -> u ;071b 8b06 movl %eax,(%ebp) // u -> *n ;071d 894500 addl $4,%ebp // n += z ;0720 83c504 movl %ecx,(%esi) // t -> *j ;0723 890e addl $4,%esi // j += z ;0725 83c604 cmpl %edx,%ebp // n :: e ;0728 39d5 jb qs090 //<- < ;072a 72ec subl (%esp),%ebp // n -= rl ;072c 2b2c24 subl (%esp),%esi // j -= rl ;072f 2b3424 jmp qs084 //<- ;0732 e975ffffff qs091: pushl %esi // j ;0737 56 pushl %ebp // n ;0738 55 call swapc //<= swapc(n,j,rl) ;0739 e87e010000 addl $8,%esp // ;073e 83c408 jmp qs084 //<- ;0741 e966ffffff // else { // if (dgn == DGU + 1) dgn++, srandom (time (0)); qs092: cmpl $5,32(%esp) // dgn :: DGU + 1 ;0746 837c242005 jne qs093 //<- != ;074b 7514 incl 32(%esp) // dgn++ ;074d ff442420 pushl $0 // 0 ;0751 6a00 call time //<= time(0) -> w ;0753 e8f014ffff pushl %eax // w ;0758 50 call srandom //<= srandom(w) ;0759 e89a490000 addl $8,%esp // ;075e 83c408 // for (thr = (unsigned) thr / MDM; psz > thr; thr *= MDM) { qs093: movl $8,%eax // thr /= MDM ;0761 b808000000 jmp qs096 //<- ;0766 eb11 qs094: movl (%esi),%ecx // *j -> t ;0768 8b0e movl (%edx),%eax // *n -> u ;076a 8b02 movl %eax,(%esi) // u -> *j ;076c 8906 movl %ecx,(%edx) // t -> *n ;076e 890a qs095: subl (%esp),%esi // j -= rl ;0770 2b3424 movl 40(%esp),%eax // thr ;0773 8b442428 addl %eax,%eax // thr *= MDM ;0777 01c0 qs096: cmpl %eax,36(%esp) // psz :: thr ;0779 39442424 jle qs104 //<- <= ;077d 0f8eba000000 movl %eax,40(%esp) // thr ;0783 89442428 // RDMSMPL (i, i, j); i += rl; movl %esi,%eax // j -> v ;0787 89f0 subl %edi,%eax // v -= i ;0789 29f8 xorl %edx,%edx // 0 -> dx ;078b 31d2 divl (%esp) // v /= rl ;078d f73424 leal 1(%eax),%ebx // v++ ;0790 8d5801 call random //<= random() -> w ;0793 e870490000 xorl %edx,%edx // 0 -> dx ;0798 31d2 divl %ebx // w /= v (w % v -> dx = n) ;079a f7f3 imull (%esp),%edx // n *= rl ;079c 0faf1424 addl %edi,%edx // n += i ;07a0 01fa cmpl %edx,%edi // i :: n ;07a2 39d7 je qs100 //<- == ;07a4 7436 cmpl $0,8(%esp) // al :: 0 ;07a6 837c240800 jl qs099 //<- < ;07ab 7c27 jg qs098 //<- > ;07ad 7f19 movl %edi,%ebp // i -> e ;07af 89fd addl (%esp),%ebp // e += rl ;07b1 032c24 qs097: movl (%edi),%ecx // *i -> t ;07b4 8b0f movl (%edx),%eax // *n -> u ;07b6 8b02 movl %eax,(%edi) // u -> *i ;07b8 8907 addl $4,%edi // i += z ;07ba 83c704 movl %ecx,(%edx) // t -> *n ;07bd 890a addl $4,%edx // n += z ;07bf 83c204 cmpl %ebp,%edi // i :: e ;07c2 39ef jb qs097 //<- < ;07c4 72ee jmp qs101 //<- ;07c6 eb17 qs098: pushl %edx // n ;07c8 52 pushl %edi // i ;07c9 57 call swapc //<= swapc(i,n,rl) ;07ca e8ed000000 addl $8,%esp // ;07cf 83c408 jmp qs100 //<- ;07d2 eb08 qs099: movl (%edi),%ecx // *i -> t ;07d4 8b0f movl (%edx),%eax // *n -> u ;07d6 8b02 movl %eax,(%edi) // u -> *i ;07d8 8907 movl %ecx,(%edx) // t -> *n ;07da 890a qs100: addl (%esp),%edi // i += rl ;07dc 033c24 // RDMSMPL (j, i, j); j -= rl;} qs101: movl %esi,%eax // j -> v ;07df 89f0 subl %edi,%eax // v -= i ;07e1 29f8 xorl %edx,%edx // 0 -> dx ;07e3 31d2 divl (%esp) // v /= rl ;07e5 f73424 leal 1(%eax),%ebx // v++ ;07e8 8d5801 call random //<= random() -> w ;07eb e818490000 xorl %edx,%edx // 0 -> dx ;07f0 31d2 divl %ebx // w /= v (w % v -> dx = n) ;07f2 f7f3 imull (%esp),%edx // n *= rl ;07f4 0faf1424 addl %edi,%edx // n += i ;07f8 01fa cmpl %edx,%esi // j :: n ;07fa 39d6 je qs095 //<- == ;07fc 0f846effffff cmpl $0,8(%esp) // al :: 0 ;0802 837c240800 jl qs094 //<- < ;0807 0f8c5bffffff jg qs103 //<- > ;080d 7f1f movl %esi,%ebp // j -> e ;080f 89f5 addl (%esp),%ebp // e += rl ;0811 032c24 qs102: movl (%esi),%ecx // *j -> t ;0814 8b0e movl (%edx),%eax // *n -> u ;0816 8b02 movl %eax,(%esi) // u -> *j ;0818 8906 addl $4,%esi // j += z ;081a 83c604 movl %ecx,(%edx) // t -> *n ;081d 890a addl $4,%edx // n += z ;081f 83c204 cmpl %ebp,%esi // j :: e ;0822 39ee jb qs102 //<- < ;0824 72ee subl (%esp),%esi // j -= rl ;0826 2b3424 jmp qs095 //<- ;0829 e942ffffff qs103: pushl %edx // n ;082e 52 pushl %esi // j ;082f 56 call swapc //<= swapc(j,n,rl) ;0830 e887000000 addl $8,%esp // ;0835 83c408 jmp qs095 //<- ;0838 e933ffffff // RDMSMPL (m, i, j);} qs104: movl %esi,%eax // j -> v ;083d 89f0 subl %edi,%eax // v -= i ;083f 29f8 xorl %edx,%edx // 0 -> dx ;0841 31d2 divl (%esp) // v /= rl ;0843 f73424 leal 1(%eax),%ebx // v++ ;0846 8d5801 call random //<= random() -> w ;0849 e8ba480000 xorl %edx,%edx // 0 -> dx ;084e 31d2 divl %ebx // w /= v (w % v -> dx = n) ;0850 f7f3 imull (%esp),%edx // n *= rl ;0852 0faf1424 addl %edi,%edx // n += i ;0856 01fa movl 24(%esp),%ebx // m ;0858 8b5c2418 cmpl %edx,%ebx // m :: n ;085c 39d3 je qs108 //<- == ;085e 7436 cmpl $0,8(%esp) // al :: 0 ;0860 837c240800 jl qs107 //<- < ;0865 7c27 jg qs106 //<- > ;0867 7f19 movl %ebx,%ebp // m -> e ;0869 89dd addl (%esp),%ebp // e += rl ;086b 032c24 qs105: movl (%ebx),%ecx // *m -> t ;086e 8b0b movl (%edx),%eax // *n -> u ;0870 8b02 movl %eax,(%ebx) // u -> *m ;0872 8903 addl $4,%ebx // m += z ;0874 83c304 movl %ecx,(%edx) // t -> *n ;0877 890a addl $4,%edx // n += z ;0879 83c204 cmpl %ebp,%ebx // m :: e ;087c 39eb jb qs105 //<- < ;087e 72ee jmp qs108 //<- ;0880 eb14 qs106: pushl %edx // n ;0882 52 pushl %ebx // m ;0883 53 call swapc //<= swapc(m,n,rl) ;0884 e833000000 addl $8,%esp // ;0889 83c408 jmp qs108 //<- ;088c eb08 qs107: movl (%ebx),%ecx // *m -> t ;088e 8b0b movl (%edx),%eax // *n -> u ;0890 8b02 movl %eax,(%ebx) // u -> *m ;0892 8903 movl %ecx,(%edx) // t -> *n ;0894 890a // i = l, j = r, thr = MDT;} qs108: movl 24(%esp),%ebx // m ;0896 8b5c2418 movl 12(%esp),%edi // l -> i ;089a 8b7c240c movl 16(%esp),%esi // r -> j ;089e 8b742410 movl $16,40(%esp) // MDT -> thr ;08a2 c744242810000000 jmp qs018 //<- ;08aa e93bf9ffff qs109: addl $304,%esp // free 304 ;08af 81c430010000 popl %ebx // ;08b5 5b popl %esi // ;08b6 5e popl %edi // ;08b7 5f popl %ebp // ;08b8 5d ret //<- exit ;08b9 c3 qs110: .size qsort,qs110-qsort // static void swapc (char *i, char *j, size_t rl) { .align 4 .type swapc,@function swapc: pushl %ebp // ;08bc 55 movl %esp,%ebp // SP -> BP ;08bd 89e5 pushl %esi // ;08bf 56 pushl %ebx // ;08c0 53 // char t, *e = i + rl; do movl 8(%ebp),%ecx // i ;08c1 8b4d08 movl 12(%ebp),%ebx // j ;08c4 8b5d0c movl %ecx,%esi // i -> e ;08c7 89ce addl 16(%ebp),%esi // e += rl ;08c9 037510 // t = *i, *(i++) = *j, *(j++) = t; while (i < e);} qs111: movb (%ecx),%dl // *i -> t ;08cc 8a11 movb (%ebx),%al // *j -> u ;08ce 8a03 movb %al,(%ecx) // u -> *i ;08d0 8801 incl %ecx // i++ ;08d2 41 movb %dl,(%ebx) // t -> *j ;08d3 8813 incl %ebx // j++ ;08d5 43 cmpl %esi,%ecx // i :: e ;08d6 39f1 jb qs111 //<- < ;08d8 72f2 leal -8(%ebp),%esp // ;08da 8d65f8 popl %ebx // ;08dd 5b popl %esi // ;08de 5e leave // restore ;08df c9 ret //<- exit ;08e0 c3 qs112: .size swapc,qs112-swapc // static void rotatec (char *i, char *j, char *k, size_t rl) { .align 4 .type rotatec,@function rotatec: pushl %ebp // ;08e4 55 movl %esp,%ebp // SP -> BP ;08e5 89e5 pushl %edi // ;08e7 57 pushl %esi // ;08e8 56 pushl %ebx // ;08e9 53 // char t, *e = i + rl; do movl 8(%ebp),%ecx // i ;08ea 8b4d08 movl 12(%ebp),%esi // j ;08ed 8b750c movl 16(%ebp),%ebx // k ;08f0 8b5d10 movl %ecx,%edi // i -> e ;08f3 89cf addl 20(%ebp),%edi // e += rl ;08f5 037d14 // t = *i, *(i++) = *j, *(j++) = *k, *(k++) = t; qs113: movb (%ecx),%al // *i -> t ;08f8 8a01 movb (%esi),%dl // *j -> u ;08fa 8a16 movb %dl,(%ecx) // u -> *i ;08fc 8811 incl %ecx // i++ ;08fe 41 movb (%ebx),%dl // *k -> t ;08ff 8a13 movb %dl,(%esi) // u -> *j ;0901 8816 incl %esi // j++ ;0903 46 movb %al,(%ebx) // t -> *k ;0904 8803 incl %ebx // k++ ;0906 43 // while (i < e);} cmpl %edi,%ecx // i :: e ;0907 39f9 jb qs113 //<- < ;0909 72ed leal -12(%ebp),%esp // ;090b 8d65f4 popl %ebx // ;090e 5b popl %esi // ;090f 5e popl %edi // ;0910 5f leave // restore ;0911 c9 ret //<- exit ;0912 c3 qs114: .size rotatec,qs114-rotatec .ident "GCC: (GNU) 2.7.2.3" /* a-wada/qsortlib/ccg/qsortu.s end */