user: Demonstrate the C code that generates the assembly output below:

```asm
<sum_num_down>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  movl   $0x0,-0xc(%rbp)
  jmp    L74
L104:
  movl   $0x3,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  jmp    L45
L100:
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  test   %eax,%eax
  je     L96
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  movl   $0x0,(%rdx,%rax,4)
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc(%rbp),%eax
  cltq
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rcx,%rax,4)
  subl   $0x1,-0x8(%rbp)
L96:
  subl   $0x1,-0x10(%rbp)
L45:
  cmpl   $0x0,-0x10(%rbp)
  jns    L100
  movl   $0x3,-0x10(%rbp)
  jmp    L20
L79:
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%edx
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  lea    -0x10(%rax),%rcx
  mov    -0x18(%rbp),%rax
  add    %rax,%rcx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rcx,%rax,4),%eax
  cmp    %eax,%edx
  jne    L67
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  mov    -0x10(%rbp),%edx
  movslq %edx,%rdx
  mov    %rdx,%rcx
  shl    $0x4,%rcx
  mov    -0x18(%rbp),%rdx
  add    %rcx,%rdx
  lea    (%rax,%rax,1),%ecx
  mov    -0xc(%rbp),%eax
  cltq
  mov    %ecx,(%rdx,%rax,4)
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  lea    -0x10(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  movl   $0x0,(%rdx,%rax,4)
  subl   $0x1,-0x10(%rbp)
L67:
  subl   $0x1,-0x10(%rbp)
L20:
  cmpl   $0x0,-0x10(%rbp)
  jg     L79
  movl   $0x3,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  mov    %eax,-0x8(%rbp)
  jmp    L99
L62:
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  test   %eax,%eax
  je     L77
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  mov    (%rdx,%rax,4),%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x10(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  movl   $0x0,(%rdx,%rax,4)
  mov    -0x8(%rbp),%eax
  cltq
  shl    $0x4,%rax
  mov    %rax,%rdx
  mov    -0x18(%rbp),%rax
  lea    (%rdx,%rax,1),%rcx
  mov    -0xc(%rbp),%eax
  cltq
  mov    -0x4(%rbp),%edx
  mov    %edx,(%rcx,%rax,4)
  subl   $0x1,-0x8(%rbp)
L77:
  subl   $0x1,-0x10(%rbp)
L99:
  cmpl   $0x0,-0x10(%rbp)
  jg     L62
  addl   $0x1,-0xc(%rbp)
L74:
  cmpl   $0x3,-0xc(%rbp)
  jle    L104
  nop
  nop
  pop    %rbp
  ret
```

assistant: ```c
void sum_num_down(int num[4][4]) {
  int i;
  int j;
  int p;
  int temp;
  for (j = 0; j < 4; j++) {
    for (p = i = 4 - 1; i >= 0; i--) {
      if (num[i][j] != 0) {
        temp = num[i][j];
        num[i][j] = 0;
        num[p][j] = temp;
        p--;
      }
    }
    for (i = 4 - 1; i > 0; i--) {
      if (num[i][j] == num[i - 1][j]) {
        num[i][j] = num[i][j] * 2;
        num[i - 1][j] = 0;
        i--;
      }
    }
    for (p = i = 4 - 1; i > 0; i--) {
      if (num[i][j] != 0) {
        temp = num[i][j];
        num[i][j] = 0;
        num[p][j] = temp;
        p--;
      }
    }
  }
}
```