user: 请从给定的汇编指令推导出C源代码：

```asm
<predict_4x4_ddl>:
  endbr64
  mov    %esi,%r9d
  push   %r14
  mov    %rdx,%rax
  movslq %ecx,%rdx
  neg    %r9d
  push   %r13
  lea    (%rdx,%rdx,1),%ecx
  push   %r12
  push   %rbp
  lea    (%rdx,%rcx,1),%ebp
  push   %rbx
  movzbl (%rdi,%r9,1),%r14d
  mov    $0x1,%r9d
  sub    %esi,%r9d
  movzbl (%rdi,%r9,1),%r13d
  mov    $0x2,%r9d
  sub    %esi,%r9d
  movzbl (%rdi,%r9,1),%r12d
  mov    $0x3,%r9d
  sub    %esi,%r9d
  movzbl (%rdi,%r9,1),%ebx
  mov    %r8d,%r9d
  and    $0x110,%r9d
  cmp    $0x110,%r9d
  je     L16
  mov    %r8d,%r9d
  and    $0x230,%r9d
  cmp    $0x230,%r9d
  je     L16
  and    $0x34,%r8d
  cmp    $0x30,%r8d
  je     L16
  mov    $0x4,%r8d
  mov    $0x7,%r10d
  sub    %esi,%r8d
  sub    %esi,%r10d
  movzbl (%rdi,%r8,1),%r11d
  mov    $0x5,%r8d
  movzbl (%rdi,%r10,1),%r10d
  sub    %esi,%r8d
  movzbl (%rdi,%r8,1),%r9d
  mov    $0x6,%r8d
  sub    %esi,%r8d
  movzbl (%rdi,%r8,1),%r8d
  jmp    L19
  nopw   0x0(%rax,%rax,1)
L16:
  mov    %ebx,%r10d
  mov    %ebx,%r8d
  mov    %ebx,%r9d
  mov    %ebx,%r11d
L19:
  lea    (%r14,%r13,2),%esi
  movslq %ecx,%rcx
  movslq %ebp,%rdi
  lea    0x2(%r12,%rsi,1),%esi
  sar    $0x2,%esi
  mov    %sil,(%rax)
  lea    0x0(%r13,%r12,2),%esi
  lea    0x2(%rbx,%rsi,1),%esi
  sar    $0x2,%esi
  mov    %sil,(%rax,%rdx,1)
  mov    %sil,0x1(%rax)
  lea    (%r12,%rbx,2),%esi
  lea    0x2(%r11,%rsi,1),%esi
  sar    $0x2,%esi
  mov    %sil,(%rax,%rcx,1)
  mov    %sil,0x1(%rax,%rdx,1)
  mov    %sil,0x2(%rax)
  lea    (%rbx,%r11,2),%esi
  lea    0x2(%r9,%rsi,1),%esi
  sar    $0x2,%esi
  mov    %sil,(%rax,%rdi,1)
  mov    %sil,0x1(%rax,%rcx,1)
  mov    %sil,0x2(%rax,%rdx,1)
  mov    %sil,0x3(%rax)
  lea    (%r11,%r9,2),%esi
  lea    0x2(%r8,%rsi,1),%esi
  sar    $0x2,%esi
  mov    %sil,0x1(%rax,%rdi,1)
  mov    %sil,0x2(%rax,%rcx,1)
  mov    %sil,0x3(%rax,%rdx,1)
  lea    (%r9,%r8,2),%edx
  lea    0x2(%r10,%rdx,1),%edx
  sar    $0x2,%edx
  mov    %dl,0x2(%rax,%rdi,1)
  mov    %dl,0x3(%rax,%rcx,1)
  lea    (%r10,%r10,2),%edx
  lea    0x2(%r8,%rdx,1),%edx
  sar    $0x2,%edx
  mov    %dl,0x3(%rax,%rdi,1)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
```

assistant: ```c
void predict_4x4_ddl(unsigned char *src, unsigned int src_stride, unsigned char *dst, unsigned int dst_stride, int neighbour) {
  const int dst_row_0 = 0;
  const int dst_row_1 = dst_stride;
  const int dst_row_2 = dst_stride * 2;
  const int dst_row_3 = dst_row_1 + dst_row_2;
  const int t0 = src[0 - 1 * src_stride];
  const int t1 = src[1 - 1 * src_stride];
  const int t2 = src[2 - 1 * src_stride];
  const int t3 = src[3 - 1 * src_stride];
  int t4, t5, t6, t7;
  const int emulate = ((neighbour & 0x110) == 0x110) || ((neighbour & 0x230) == 0x230) || (((neighbour & 4) != 4) && ((neighbour & 0x030) == 0x030));
  if (!emulate) {
    t4 = src[4 - 1 * src_stride];
    t5 = src[5 - 1 * src_stride];
    t6 = src[6 - 1 * src_stride];
    t7 = src[7 - 1 * src_stride];
  } else {
    t4 = t5 = t6 = t7 = t3;
  }
  dst[dst_row_0 + 0] = (t0 + 2 * t1 + t2 + 2) >> 2;
  dst[dst_row_0 + 1] = dst[dst_row_1 + 0] = (t1 + 2 * t2 + t3 + 2) >> 2;
  dst[dst_row_0 + 2] = dst[dst_row_1 + 1] = dst[dst_row_2 + 0] = (t2 + 2 * t3 + t4 + 2) >> 2;
  dst[dst_row_0 + 3] = dst[dst_row_1 + 2] = dst[dst_row_2 + 1] = dst[dst_row_3 + 0] = (t3 + 2 * t4 + t5 + 2) >> 2;
  dst[dst_row_1 + 3] = dst[dst_row_2 + 2] = dst[dst_row_3 + 1] = (t4 + 2 * t5 + t6 + 2) >> 2;
  dst[dst_row_2 + 3] = dst[dst_row_3 + 2] = (t5 + 2 * t6 + t7 + 2) >> 2;
  dst[dst_row_3 + 3] = (t6 + 3 * t7 + 2) >> 2;
}
```