user: 下面的汇编指令对应的C源代码是什么:

```asm
<goodSuffix>:
  endbr64
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x20,%rsp
  mov    %fs:0x28,%rax
  mov    %rax,0x18(%rsp)
  xor    %eax,%eax
  test   %rdi,%rdi
  je     L165
  mov    %esi,%ebx
  test   %esi,%esi
  jle    L165
  lea    0x8(%rsp),%rbp
  mov    %rdi,%r12
  mov    %rbp,%rdi
  call   <applyArr@plt>
  cmpq   $0x0,0x8(%rsp)
  je     L165
  mov    %r12,%rdi
  mov    %ebx,%esi
  call   <upfrontGoodSuffix@plt>
  mov    %rax,0x10(%rsp)
  mov    %rax,%r12
  test   %rax,%rax
  je     L76
  test   %ebx,%ebx
  mov    $0x1,%ecx
  mov    0x8(%rsp),%rsi
  cmovg  %ebx,%ecx
  cmp    $0x3,%ebx
  jle    L0
  mov    %ecx,%edx
  movd   %ebx,%xmm1
  mov    %rsi,%rax
  shr    $0x2,%edx
  pshufd $0x0,%xmm1,%xmm0
  sub    $0x1,%edx
  shl    $0x4,%rdx
  lea    0x10(%rsi,%rdx,1),%rdx
  nopl   0x0(%rax,%rax,1)
L139:
  movups %xmm0,(%rax)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L139
  mov    %ecx,%eax
  and    $0xfffffffc,%eax
  and    $0x3,%ecx
  je     L143
L84:
  movslq %eax,%rdx
  mov    %ebx,(%rsi,%rdx,4)
  lea    0x0(,%rdx,4),%rcx
  lea    0x1(%rax),%edx
  cmp    %ebx,%edx
  jge    L143
  add    $0x2,%eax
  mov    %ebx,0x4(%rsi,%rcx,1)
  cmp    %eax,%ebx
  jle    L143
  mov    %ebx,0x8(%rsi,%rcx,1)
L143:
  lea    -0x1(%rbx),%edi
  xor    %edx,%edx
  lea    0x4(%rsi),%r11
  xor    %r9d,%r9d
  movslq %edi,%rax
  lea    (%r12,%rax,4),%rcx
  jmp    L189
  nop
L20:
  add    $0x1,%edx
  sub    $0x4,%rcx
  cmp    %edx,%ebx
  je     L18
L189:
  mov    %ebx,%eax
  sub    %edx,%eax
  cmp    %eax,(%rcx)
  jne    L20
  cmp    %r9d,%edx
  jle    L20
  lea    -0x1(%rdx),%r8d
  movslq %r9d,%r10
  sub    %r9d,%r8d
  lea    (%rsi,%r10,4),%rax
  add    %r10,%r8
  lea    (%r11,%r8,4),%r8
  nopl   (%rax)
L101:
  cmp    %ebx,(%rax)
  jne    L75
  mov    %edx,(%rax)
L75:
  add    $0x4,%rax
  cmp    %r8,%rax
  jne    L101
  mov    %edx,%r9d
  add    $0x1,%edx
  sub    $0x4,%rcx
  cmp    %edx,%ebx
  jne    L189
  nopl   (%rax)
L18:
  test   %edi,%edi
  je     L109
  mov    %r12,%rcx
  mov    %edi,%eax
  nopl   0x0(%rax)
L72:
  mov    %edi,%edx
  sub    (%rcx),%edx
  add    $0x4,%rcx
  movslq %edx,%rdx
  mov    %eax,(%rsi,%rdx,4)
  sub    $0x1,%eax
  jne    L72
L109:
  lea    0x10(%rsp),%rdi
  call   <freeArr@plt>
  mov    0x8(%rsp),%r12
L112:
  mov    0x18(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L37
  add    $0x20,%rsp
  mov    %r12,%rax
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  xchg   %ax,%ax
L165:
  xor    %r12d,%r12d
  jmp    L112
L0:
  xor    %eax,%eax
  jmp    L84
L76:
  mov    %rbp,%rdi
  call   <freeArr@plt>
  jmp    L112
L37:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
int *goodSuffix(char *pattern, int len) {
  if (!pattern || 0 >= len) {
    return NULL;
  }
  int *arr, *suffixArr;
  applyArr(&arr, len);
  if (!arr) {
    return NULL;
  }
  suffixArr = upfrontGoodSuffix(pattern, len);
  if (!suffixArr) {
    freeArr(&arr);
    return NULL;
  }
  int i = 0;
  while (i < len) {
    arr[i++] = len;
  }
  int j = 0;
  for (i = len - 1; i >= 0; i--) {
    if (i + 1 == suffixArr[i]) {
      while (j < len - 1 - i) {
        if (len == arr[j]) {
          arr[j] = len - 1 - i;
        }
        j++;
      }
    }
  }
  for (i = 0; i < len - 1; i++) {
    arr[len - 1 - suffixArr[i]] = len - 1 - i;
  }
  freeArr(&suffixArr);
  return arr;
}
```