user: 请将以下的汇编代码转换成C语言代码：

```asm
<GoLGrid_evolve_strip_keep_bit_0>:
  endbr64
  lea    0x0(,%rdx,8),%r10
  mov    %rdi,%rax
  push   %r13
  mov    %rsi,%r8
  push   %r12
  sub    %r10,%rax
  mov    %ecx,%r9d
  xor    %r11d,%r11d
  push   %rbp
  push   %rbx
  mov    (%rdi),%rsi
  add    %r10,%rdi
  mov    (%rax),%rax
  mov    (%rdi),%rcx
  jmp    L19
  nop
L6:
  add    %r10,%rdi
  mov    %rsi,%rax
  mov    %rcx,%rsi
  mov    (%rdi),%rcx
L19:
  mov    %rax,%rdx
  mov    %rax,%rbp
  shr    %rdx
  and    %rdx,%rbp
  xor    %rax,%rdx
  add    %rax,%rax
  mov    %rdx,%rbx
  xor    %rax,%rdx
  and    %rax,%rbx
  mov    %rsi,%rax
  or     %rbp,%rbx
  shr    %rax
  mov    %rdx,%rbp
  and    %rax,%rbp
  xor    %rax,%rdx
  lea    (%rsi,%rsi,1),%rax
  mov    %rbx,%r13
  mov    %rdx,%r12
  xor    %rbp,%rbx
  and    %rbp,%r13
  xor    %rax,%rdx
  and    %rax,%r12
  mov    %rbx,%rbp
  and    %r12,%rbp
  xor    %r12,%rbx
  mov    %rcx,%r12
  or     %r13,%rbp
  shr    %r12
  mov    %rdx,%r13
  mov    %rbx,%rax
  and    %r12,%r13
  xor    %r12,%rdx
  mov    %rcx,%r12
  xor    %r13,%rbx
  and    %r13,%rax
  and    %rdx,%r12
  xor    %rcx,%rdx
  or     %rbp,%rax
  mov    %rbx,%rbp
  xor    %r12,%rbx
  and    %r12,%rbp
  mov    %rdx,%r12
  or     %rax,%rbp
  lea    (%rcx,%rcx,1),%rax
  and    %rax,%r12
  xor    %rdx,%rax
  mov    %rbx,%rdx
  xor    %r12,%rdx
  or     %rsi,%rax
  and    %rdx,%rax
  and    %r12,%rbx
  mov    (%r8),%rdx
  sub    $0x1,%r9d
  or     %rbp,%rbx
  not    %rbx
  and    $0x1,%edx
  and    %rbx,%rax
  and    $0xfffffffffffffffe,%rax
  or     %rax,%r11
  or     %rdx,%rax
  mov    %rax,(%r8)
  add    %r10,%r8
  test   %r9d,%r9d
  jg     L6
  pop    %rbx
  mov    %r11,%rax
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
```

assistant: ```c
unsigned long long int GoLGrid_evolve_strip_keep_bit_0(const unsigned long long int *in_entry, unsigned long long int *out_entry, unsigned long long int row_offset, int row_count) {
  unsigned long long int upper_word = *(in_entry - row_offset);
  unsigned long long int mid_word = *in_entry;
  in_entry += row_offset;
  unsigned long long int lower_word = *in_entry;
  unsigned long long int or_of_out_words = 0;
  while (1) {
    unsigned long long int nb_to_add = (upper_word >> 1);
    unsigned long long int nb_sum_bit_0 = nb_to_add;
    nb_to_add = upper_word;
    unsigned long long int nb_sum_bit_1 = nb_sum_bit_0 & nb_to_add;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = (upper_word << 1);
    unsigned long long int carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    nb_sum_bit_1 = nb_sum_bit_1 | carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = (mid_word >> 1);
    carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    unsigned long long int nb_sum_overflow = nb_sum_bit_1 & carry_0_to_1;
    nb_sum_bit_1 = nb_sum_bit_1 ^ carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = (mid_word << 1);
    carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    unsigned long long int carry_1_to_2 = nb_sum_bit_1 & carry_0_to_1;
    nb_sum_overflow = nb_sum_overflow | carry_1_to_2;
    nb_sum_bit_1 = nb_sum_bit_1 ^ carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = (lower_word >> 1);
    carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    carry_1_to_2 = nb_sum_bit_1 & carry_0_to_1;
    nb_sum_overflow = nb_sum_overflow | carry_1_to_2;
    nb_sum_bit_1 = nb_sum_bit_1 ^ carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = lower_word;
    carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    carry_1_to_2 = nb_sum_bit_1 & carry_0_to_1;
    nb_sum_overflow = nb_sum_overflow | carry_1_to_2;
    nb_sum_bit_1 = nb_sum_bit_1 ^ carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    nb_to_add = (lower_word << 1);
    carry_0_to_1 = nb_sum_bit_0 & nb_to_add;
    carry_1_to_2 = nb_sum_bit_1 & carry_0_to_1;
    nb_sum_overflow = nb_sum_overflow | carry_1_to_2;
    nb_sum_bit_1 = nb_sum_bit_1 ^ carry_0_to_1;
    nb_sum_bit_0 = nb_sum_bit_0 ^ nb_to_add;
    unsigned long long int out_word = (~(nb_sum_overflow)&nb_sum_bit_1 & (nb_sum_bit_0 | mid_word)) & 0xfffffffffffffffeULL;
    or_of_out_words |= out_word;
    *out_entry = (*out_entry & 0x0000000000000001ULL) | out_word;
    out_entry += row_offset;
    row_count--;
    if (row_count <= 0)
      break;
    upper_word = mid_word;
    mid_word = lower_word;
    in_entry += row_offset;
    lower_word = *in_entry;
  }
  return or_of_out_words;
}
```