- uint16_t offset = pool_offset(addr);
- int i;
-
- for (i = chunk_first; i < chunk_last; i++) {
- if (ao_lisp_chunk[i].old_addr == offset) {
- MDBG_MOVE("move %d -> %d\n",
- ao_lisp_chunk[i].old_addr,
- ao_lisp_chunk[i].new_addr);
- return ao_lisp_pool + ao_lisp_chunk[i].new_addr;
- }
+ int l, r;
+
+ if (offset < chunk_low || chunk_high <= offset)
+ return offset;
+
+ /* Binary search for the location */
+ l = chunk_first;
+ r = chunk_busy - 1;
+ while (l <= r) {
+ int m = (l + r) >> 1;
+ if (ao_lisp_chunk[m].old_offset < offset)
+ l = m + 1;
+ else
+ r = m - 1;