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

```asm
<random_walk>:
  endbr64
  push   %r14
  push   %r13
  mov    %rsi,%r13
  push   %r12
  push   %rbp
  push   %rbx
  test   %edi,%edi
  jle    L63
  mov    %edi,%r12d
  xor    %r14d,%r14d
  xor    %ebp,%ebp
  xor    %ebx,%ebx
  jmp    L73
  nop
L54:
  add    $0x1,%ebx
L31:
  add    $0x1,%r14d
  cmp    %r14d,%r12d
  je     L3
L73:
  xor    %eax,%eax
  call   <get_rn@plt>
  comisd D22(%rip),%xmm0
  ja     L54
  comisd D52(%rip),%xmm0
  jbe    L83
  add    $0x1,%r14d
  sub    $0x1,%ebx
  cmp    %r14d,%r12d
  jne    L73
L3:
  mov    %ebx,%eax
  or     %ebp,%eax
  jne    L71
L63:
  movsd  D76(%rip),%xmm0
  movsd  0x0(%r13),%xmm1
  pop    %rbx
  pop    %rbp
  addsd  %xmm0,%xmm1
  pop    %r12
  movsd  %xmm1,0x0(%r13)
  movsd  0x8(%r13),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%r13)
  movsd  0x10(%r13),%xmm1
  addsd  %xmm0,%xmm1
  addsd  0x18(%r13),%xmm0
  movsd  %xmm1,0x10(%r13)
  movsd  %xmm0,0x18(%r13)
  pop    %r13
  pop    %r14
  ret
  cs nopw 0x0(%rax,%rax,1)
L83:
  lea    -0x1(%rbp),%eax
  add    $0x1,%ebp
  comisd D76(%rip),%xmm0
  cmovbe %eax,%ebp
  jmp    L31
  cs nopw 0x0(%rax,%rax,1)
L71:
  test   %ebx,%ebx
  je     L106
  mov    %ebx,%eax
  not    %eax
  shr    $0x1f,%eax
  test   %ebp,%ebp
  jne    L105
  movzbl %al,%eax
  movsd  D52(%rip),%xmm0
  movslq %ebx,%rbx
  shl    $0x4,%rax
  sar    $0x3f,%rbx
  add    %r13,%rax
  and    $0xfffffffffffffff0,%rbx
  movsd  (%rax),%xmm1
  addsd  %xmm0,%xmm1
  movsd  %xmm1,(%rax)
  lea    0x18(%r13,%rbx,1),%rax
  addsd  (%rax),%xmm0
  movsd  %xmm0,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  xchg   %ax,%ax
L106:
  test   %ebp,%ebp
  js     L109
  movsd  0x8(%r13),%xmm1
  movsd  D52(%rip),%xmm0
  mov    $0x18,%eax
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x8(%r13)
L42:
  add    %r13,%rax
  addsd  (%rax),%xmm0
  movsd  %xmm0,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L105:
  not    %ebp
  movsd  D18(%rip),%xmm0
  shr    $0x1f,%ebp
  lea    0x0(%rbp,%rax,2),%eax
  cltq
  lea    0x0(%r13,%rax,8),%rax
  addsd  (%rax),%xmm0
  movsd  %xmm0,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   0x0(%rax)
L109:
  movsd  0x0(%r13),%xmm1
  movsd  D52(%rip),%xmm0
  mov    $0x10,%eax
  addsd  %xmm0,%xmm1
  movsd  %xmm1,0x0(%r13)
  jmp    L42
```

tool_calls: name: read_data
arguments: tag: D22
type: f64[2]
name: read_data
arguments: tag: D52
type: f64[2]
name: read_data
arguments: tag: D76
type: f64[2]
name: read_data
arguments: tag: D18
type: f64

tool: {"D22": [0.75,0.5]}

tool: {"D52": [0.5,1.0]}

tool: {"D76": [0.25,0.75]}

tool: D18: 1

assistant: ```c
void random_walk(int walk_length, double *quadrant) {
  int x, y, i, j;
  double rn;
  x = y = 0;
  for (i = 0; i < walk_length; i++) {
    rn = get_rn();
    if (rn > 0.75)
      x++;
    else if (rn > 0.5)
      x--;
    else if (rn > 0.25)
      y++;
    else
      y--;
  }
  if (x == 0 && y == 0) {
    quadrant[0] += 0.25;
    quadrant[1] += 0.25;
    quadrant[2] += 0.25;
    quadrant[3] += 0.25;
  } else if (x == 0) {
    quadrant[((y < 0) ? 0 : 1)] += 0.5;
    quadrant[2 + ((y < 0) ? 0 : 1)] += 0.5;
  } else if (y == 0) {
    quadrant[2 * ((x < 0) ? 0 : 1)] += 0.5;
    quadrant[2 * ((x < 0) ? 0 : 1) + 1] += 0.5;
  } else
    quadrant[2 * ((x < 0) ? 0 : 1) + ((y < 0) ? 0 : 1)] += 1.0;
}
```