.file "partition.c" # commented by Lin Jensen, but compiler's code unchanged .text .globl partition .type partition,@function partition: pushl %ebp movl %esp, %ebp pushl %ebx # 8 12 16 20 #void partition (int a[], int left, int right, int pivotindex, # /* OUT */ int* iloc, int* jloc) # 24 28 subl $16, %esp # space for 4 local vars movl 20(%ebp), %eax # eax = pivotindex leal 0(,%eax,4), %edx # funny way of mult by 4 movl 8(%ebp), %eax # address of array movl (%eax,%edx), %eax # eax = pivot (value) movl %eax, -8(%ebp) movl 12(%ebp), %eax # i = left movl %eax, -12(%ebp) movl 16(%ebp), %eax # j = right movl %eax, -16(%ebp) .L5: # for (;i < right; i++) movl -12(%ebp), %eax cmpl 16(%ebp), %eax jl .L8 jmp .L6 .L8: movl -12(%ebp), %eax leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax # a[i] cmpl -8(%ebp), %eax # if (a[i] > pivot) jle .L7 jmp .L6 .L7: leal -12(%ebp), %eax # i++ incl (%eax) jmp .L5 .L6: # down nop .L10: movl -16(%ebp), %eax cmpl 12(%ebp), %eax jg .L13 jmp .L11 .L13: movl -16(%ebp), %eax leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax # a[j] cmpl -8(%ebp), %eax # if (a[j] < pivot) jge .L12 jmp .L11 .L12: leal -16(%ebp), %eax decl (%eax) jmp .L10 .L11: # if (i >= j) movl -12(%ebp), %eax cmpl -16(%ebp), %eax jl .L15 # break out of while loop jmp .L3 .L15: movl -12(%ebp), %eax # exchange i leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax movl %eax, -20(%ebp) movl -12(%ebp), %eax leal 0(,%eax,4), %ebx movl 8(%ebp), %ecx movl -16(%ebp), %eax # j leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax movl %eax, (%ecx,%ebx) movl -16(%ebp), %eax leal 0(,%eax,4), %ecx movl 8(%ebp), %edx movl -20(%ebp), %eax # temp movl %eax, (%edx,%ecx) jmp .L5 # end while(1) loop .L3: movl 20(%ebp), %eax # final exchanges of pivot cmpl -16(%ebp), %eax jge .L16 movl 20(%ebp), %eax leal 0(,%eax,4), %ebx movl 8(%ebp), %ecx movl -16(%ebp), %eax leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax movl %eax, (%ecx,%ebx) movl -16(%ebp), %eax leal 0(,%eax,4), %ecx movl 8(%ebp), %edx movl -8(%ebp), %eax movl %eax, (%edx,%ecx) leal -16(%ebp), %eax decl (%eax) .L16: movl 20(%ebp), %eax cmpl -12(%ebp), %eax jle .L17 movl 20(%ebp), %eax leal 0(,%eax,4), %ebx movl 8(%ebp), %ecx movl -12(%ebp), %eax leal 0(,%eax,4), %edx movl 8(%ebp), %eax movl (%eax,%edx), %eax movl %eax, (%ecx,%ebx) movl -12(%ebp), %eax leal 0(,%eax,4), %ecx movl 8(%ebp), %edx movl -8(%ebp), %eax movl %eax, (%edx,%ecx) leal -12(%ebp), %eax incl (%eax) .L17: # return OUT args for part. range movl 24(%ebp), %edx # *iloc = i; movl -12(%ebp), %eax movl %eax, (%edx) movl 28(%ebp), %edx # *jloc = j; movl -16(%ebp), %eax movl %eax, (%edx) addl $16, %esp popl %ebx leave # restore ebp, presumably ret .Lfe1: .size partition,.Lfe1-partition .ident "GCC: (GNU) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)"