user: Translate the below assembly code into C programming language:

```asm
<transitive_closure>:
  endbr64
  mov    %esi,%eax
  lea    0x3e(%rsi),%edx
  push   %r15
  add    $0x1f,%eax
  push   %r14
  cmovns %eax,%edx
  push   %r13
  push   %r12
  sar    $0x5,%edx
  push   %rbp
  imul   %edx,%esi
  push   %rbx
  movslq %esi,%rax
  mov    %rdi,-0x10(%rsp)
  lea    (%rdi,%rax,4),%rbx
  cmp    %rbx,%rdi
  jae    L102
  movslq %edx,%rdx
  mov    %rdi,-0x18(%rsp)
  mov    %rdi,%r8
  mov    $0x1,%r10d
  lea    0x0(,%rdx,4),%rsi
  lea    -0x1(%rsi),%rbp
  mov    %rbp,%r13
  shr    $0x2,%r13
  lea    0x4(,%r13,4),%r14
L7:
  mov    -0x18(%rsp),%rdx
  mov    -0x10(%rsp),%rax
  lea    0x4(%r8),%r12
  jmp    L69
L46:
  mov    %rcx,%rax
L64:
  add    %rsi,%rdx
  cmp    %rbx,%rax
  jae    L41
L69:
  mov    %r10d,%edi
  and    (%rdx),%edi
  lea    (%rax,%rsi,1),%rcx
  je     L46
  cmp    %rcx,%rax
  jae    L64
  mov    %rax,%rdi
  sub    %r12,%rdi
  cmp    $0x8,%rdi
  jbe    L170
  cmp    $0x3,%rbp
  jbe    L170
  lea    0x1(%r13),%r9
  cmp    $0xb,%rbp
  jbe    L143
  mov    %r9,%rdi
  xor    %ecx,%ecx
  shr    $0x2,%rdi
  shl    $0x4,%rdi
  nopl   0x0(%rax)
L6:
  movdqu (%r8,%rcx,1),%xmm0
  movdqu (%rax,%rcx,1),%xmm2
  por    %xmm2,%xmm0
  movups %xmm0,(%rax,%rcx,1)
  add    $0x10,%rcx
  cmp    %rcx,%rdi
  jne    L6
  mov    %r9,%r11
  and    $0xfffffffffffffffc,%r11
  lea    0x0(,%r11,4),%rdi
  lea    (%rax,%rdi,1),%rcx
  add    %r8,%rdi
  cmp    %r11,%r9
  je     L135
  sub    %r11,%r9
  cmp    %r11,%r13
  je     L155
L151:
  lea    (%rax,%r11,4),%r15
  movq   (%r8,%r11,4),%xmm0
  mov    %r9,%r11
  movq   (%r15),%xmm1
  and    $0xfffffffffffffffe,%r11
  por    %xmm1,%xmm0
  movq   %xmm0,(%r15)
  lea    0x0(,%r11,4),%r15
  add    %r15,%rcx
  add    %r15,%rdi
  cmp    %r11,%r9
  je     L135
L155:
  mov    (%rdi),%edi
  or     %edi,(%rcx)
L135:
  add    %r14,%rax
  add    %rsi,%rdx
  cmp    %rbx,%rax
  jb     L69
L41:
  add    %r10d,%r10d
  jne    L94
  addq   $0x4,-0x18(%rsp)
  mov    $0x1,%r10d
L94:
  add    %rsi,%r8
  cmp    %r8,%rbx
  ja     L7
L102:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
L170:
  mov    %r8,%r9
  mov    %rax,%rdi
  xchg   %ax,%ax
L129:
  add    $0x4,%rdi
  add    $0x4,%r9
  mov    -0x4(%r9),%r11d
  or     %r11d,-0x4(%rdi)
  cmp    %rcx,%rdi
  jb     L129
  jmp    L135
L143:
  mov    %r8,%rdi
  mov    %rax,%rcx
  xor    %r11d,%r11d
  jmp    L151
```

assistant: ```c
void transitive_closure(R, n) unsigned *R;
int n;
{
  register int rowsize;
  register unsigned mask;
  register unsigned *rowj;
  register unsigned *rp;
  register unsigned *rend;
  register unsigned *ccol;
  register unsigned *relend;
  register unsigned *cword;
  register unsigned *rowi;
  rowsize = (((n) + (32 - 1)) / 32);
  relend = R + n * rowsize;
  cword = R;
  mask = 1;
  rowi = R;
  while (rowi < relend) {
    ccol = cword;
    rowj = R;
    while (rowj < relend) {
      if (*ccol & mask) {
        rp = rowi;
        rend = rowj + rowsize;
        while (rowj < rend)
          *rowj++ |= *rp++;
      } else {
        rowj += rowsize;
      }
      ccol += rowsize;
    }
    mask <<= 1;
    if (mask == 0) {
      mask = 1;
      cword++;
    }
    rowi += rowsize;
  }
}
```