// File: /workspace/github_c_makefile_star2_O2/google[P]multichase/multichase.c
// Function: chase_work
static void chase_work(per_thread_t *t) {
  void *p = t->x.cycle[0];
  size_t extra_work = strtoul(t->x.extra_args, 0, 0);
  size_t work = 0;
  size_t i;

  // the extra work is intended to be overlapped with a dereference,
  // but we don't want it to skip past the next dereference.  so
  // we fold in the value of the pointer, and launch the deref then
  // go into a loop performing extra work, hopefully while the
  // deref occurs.
  do {
    x25(work += (uintptr_t)p; p = *(void **)p;
        for (i = 0; i < extra_work; ++i) { work ^= i; })
  } while (__sync_add_and_fetch(&t->x.count, 25));

  // we never actually reach here, but the compiler doesn't know that
  t->x.cycle[0] = p;
  t->x.dummy = work;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rdi, %rbx
movq 0x8(%rdi), %r15
movq 0x58(%rdi), %rdi
xorl %r14d, %r14d
xorl %esi, %esi
xorl %edx, %edx
callq 0x4125e0
addq %r15, %r14
movq (%r15), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4030c0
xorq %rdx, %r14
incq %rdx
jmp 0x4030b3
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4030d5
xorq %rdx, %r14
incq %rdx
jmp 0x4030c8
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4030ea
xorq %rdx, %r14
incq %rdx
jmp 0x4030dd
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4030ff
xorq %rdx, %r14
incq %rdx
jmp 0x4030f2
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403114
xorq %rdx, %r14
incq %rdx
jmp 0x403107
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403129
xorq %rdx, %r14
incq %rdx
jmp 0x40311c
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x40313e
xorq %rdx, %r14
incq %rdx
jmp 0x403131
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403153
xorq %rdx, %r14
incq %rdx
jmp 0x403146
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403168
xorq %rdx, %r14
incq %rdx
jmp 0x40315b
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x40317d
xorq %rdx, %r14
incq %rdx
jmp 0x403170
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403192
xorq %rdx, %r14
incq %rdx
jmp 0x403185
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4031a7
xorq %rdx, %r14
incq %rdx
jmp 0x40319a
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4031bc
xorq %rdx, %r14
incq %rdx
jmp 0x4031af
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4031d1
xorq %rdx, %r14
incq %rdx
jmp 0x4031c4
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4031e6
xorq %rdx, %r14
incq %rdx
jmp 0x4031d9
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4031fb
xorq %rdx, %r14
incq %rdx
jmp 0x4031ee
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403210
xorq %rdx, %r14
incq %rdx
jmp 0x403203
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403225
xorq %rdx, %r14
incq %rdx
jmp 0x403218
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x40323a
xorq %rdx, %r14
incq %rdx
jmp 0x40322d
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x40324f
xorq %rdx, %r14
incq %rdx
jmp 0x403242
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403264
xorq %rdx, %r14
incq %rdx
jmp 0x403257
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x403279
xorq %rdx, %r14
incq %rdx
jmp 0x40326c
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x40328e
xorq %rdx, %r14
incq %rdx
jmp 0x403281
addq %rcx, %r14
movq (%rcx), %rcx
xorl %edx, %edx
cmpq %rdx, %rax
je 0x4032a3
xorq %rdx, %r14
incq %rdx
jmp 0x403296
addq %rcx, %r14
movq (%rcx), %r15
xorl %ecx, %ecx
cmpq %rcx, %rax
je 0x4032b8
xorq %rcx, %r14
incq %rcx
jmp 0x4032ab
lock
subl $-0x19, 0x4(%rbx)
jne 0x4030ab
movq %r15, 0x8(%rbx)
movl %r14d, 0x60(%rbx)
popq %rbx
popq %r14
popq %r15
retq