int search(int *a, int size, int find_v) { int lo = 0, hi = size; while (lo < hi) { int mid = (lo + hi) / 2; if (a[mid] < find_v) hi = mid; else if (a[mid] > find_v) lo = mid+1; else lo = hi = mid; } return lo; } /* Register use in asm below: %eax = lo %rdi = a %esi = hi %edx = find_v %ecx = mid %r9d = (lo + hi) /2 or mid */ /* .file "bin.c" .text .globl search .type search, @function search: .LFB0: .cfi_startproc movl $0, %eax jmp .L2 .L4: leal (%rax,%rsi), %ecx movl %ecx, %r8d shrl $31, %r8d # hint: biasing addl %r8d, %ecx # hint: biasing sarl %ecx movl %ecx, %r9d movslq %ecx, %r8 movl (%rdi,%r8,4), %r8d cmpl %edx, %r8d jl .L3 jle .L5 leal 1(%rcx), %eax movl %esi, %r9d # prep to jump .L3 jmp .L3 .L5: movl %ecx, %eax .L3: movl %r9d, %esi .L2: cmpl %esi, %eax jl .L4 rep ret .cfi_endproc .LFE0: .size search, .-search .ident "GCC: (GNU) 4.8.5 20150623 (Red Hat 4.8.5-4)" .section .note.GNU-stack,"",@progbits */