user: What is the c source code of the assembly code below?

```asm
<UARTConfigSet>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  cmpq   $0x40013800,-0x28(%rbp)
  jne    L37
  mov    $0x10004000,%edi
  call   <SysCtlPeripheralReset@plt>
  jmp    L53
L37:
  cmpq   $0x40004400,-0x28(%rbp)
  jne    L31
  mov    $0x20100002,%edi
  call   <SysCtlPeripheralReset@plt>
  jmp    L53
L31:
  cmpq   $0x40004800,-0x28(%rbp)
  jne    L17
  mov    $0x20100004,%edi
  call   <SysCtlPeripheralReset@plt>
  jmp    L53
L17:
  cmpq   $0x40004c00,-0x28(%rbp)
  jne    L33
  mov    $0x20100008,%edi
  call   <SysCtlPeripheralReset@plt>
  jmp    L53
L33:
  mov    $0x20100010,%edi
  call   <SysCtlPeripheralReset@plt>
L53:
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%rdx
  add    $0x10,%rdx
  and    $0xcf,%ah
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  and    $0x3000,%eax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%rax
  mov    -0x28(%rbp),%rdx
  add    $0xc,%rdx
  and    $0xffffffffffffe9f3,%rax
  mov    %rax,(%rdx)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    %rax,%rdx
  mov    -0x38(%rbp),%rax
  and    $0x1600,%eax
  mov    %rax,(%rdx)
  cmpq   $0x40013800,-0x28(%rbp)
  jne    L89
  mov    $0x0,%eax
  call   <SysCtlAPB2ClockGet@plt>
  mov    %rax,-0x18(%rbp)
  jmp    L52
L89:
  mov    $0x0,%eax
  call   <SysCtlAPB1ClockGet@plt>
  mov    %rax,-0x18(%rbp)
L52:
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%rax
  mov    -0x18(%rbp),%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  mov    -0x30(%rbp),%rdx
  lea    0x0(,%rdx,4),%rcx
  mov    $0x0,%edx
  div    %rcx
  mov    %rax,-0x10(%rbp)
  mov    -0x10(%rbp),%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x2,%rax
  shl    $0x4,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  shr    $0x4,%rax
  mov    %rax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  add    %rdx,%rax
  shl    $0x2,%rax
  sub    %rax,-0x10(%rbp)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%rax
  mov    -0x10(%rbp),%rax
  shl    $0x4,%rax
  add    $0x32,%rax
  shr    $0x2,%rax
  movabs $0x28f5c28f5c28f5c3,%rdx
  mul    %rdx
  mov    %rdx,%rax
  shr    $0x2,%rax
  and    $0xf,%eax
  or     %rax,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  nop
  leave
  ret
```

assistant: ```c
void UARTConfigSet(unsigned long ulBase, unsigned long ulBaud, unsigned long ulConfig) {
  unsigned long ulExtClk, ultemp, uldiv;
  ;
  ;
  if (ulBase == 0x40013800) {
    SysCtlPeripheralReset(0x10004000);
  } else if (ulBase == 0x40004400) {
    SysCtlPeripheralReset(0x20100002);
  } else if (ulBase == 0x40004800) {
    SysCtlPeripheralReset(0x20100004);
  } else if (ulBase == 0x40004C00) {
    SysCtlPeripheralReset(0x20100008);
  } else {
    SysCtlPeripheralReset(0x20100010);
  }
  (*((volatile unsigned long *)(ulBase + 0x00000010))) &= ~0x00003000;
  (*((volatile unsigned long *)(ulBase + 0x00000010))) = ulConfig & 0x00003000;
  (*((volatile unsigned long *)(ulBase + 0x0000000C))) &= ~(0x00001000 | 0x00000400 | 0x00000200 | 0x00000008 | 0x00000004);
  (*((volatile unsigned long *)(ulBase + 0x0000000C))) = ulConfig & (0x00001000 | 0x00000600);
  if (ulBase == 0x40013800) {
    ulExtClk = SysCtlAPB2ClockGet();
  } else {
    ulExtClk = SysCtlAPB1ClockGet();
  }
  if (((*((volatile unsigned long *)(ulBase + 0x0000000C))) & 0) != 0) {
    ultemp = ((25 * ulExtClk) / (2 * (ulBaud)));
  } else {
    ultemp = ((25 * ulExtClk) / (4 * (ulBaud)));
  }
  uldiv = (ultemp / 100) << 4;
  ultemp = ultemp - (100 * (uldiv >> 4));
  if (((*((volatile unsigned long *)(ulBase + 0x0000000C))) & 0) != 0) {
    uldiv |= ((((ultemp * 8) + 50) / 100)) & ((unsigned char)0x07);
  } else {
    uldiv |= ((((ultemp * 16) + 50) / 100)) & ((unsigned char)0x0F);
  }
  (*((volatile unsigned long *)(ulBase + 0x00000008))) = uldiv;
}
```