user: What would the C source look like for the assembly code provided here:

```asm
<psnd_paperplot_grid>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %edi,-0x34(%rbp)
  mov    %esi,-0x38(%rbp)
  mov    %edx,-0x3c(%rbp)
  movss  %xmm0,-0x40(%rbp)
  movss  %xmm1,-0x44(%rbp)
  movss  %xmm2,-0x48(%rbp)
  movss  %xmm3,-0x4c(%rbp)
  movss  %xmm4,-0x50(%rbp)
  movss  %xmm5,-0x54(%rbp)
  cmpl   $0x0,-0x38(%rbp)
  je     L32
  movss  -0x40(%rbp),%xmm0
  subss  -0x44(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x20(%rbp),%eax
  movd   %eax,%xmm0
  call   <get_long_ticks@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x50(%rbp)
L32:
  cmpl   $0x0,-0x3c(%rbp)
  je     L112
  movss  -0x48(%rbp),%xmm0
  subss  -0x4c(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <fabs@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movd   %eax,%xmm0
  call   <get_long_ticks@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x54(%rbp)
L112:
  movss  -0x40(%rbp),%xmm0
  mulss  -0x50(%rbp),%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x44(%rbp),%xmm0
  mulss  -0x50(%rbp),%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x48(%rbp),%xmm0
  mulss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x4c(%rbp),%xmm0
  mulss  -0x54(%rbp),%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0x18(%rbp),%xmm0
  comiss -0x14(%rbp),%xmm0
  jbe    L77
  mov    -0x18(%rbp),%eax
  jmp    L91
L77:
  mov    -0x14(%rbp),%eax
L91:
  movd   %eax,%xmm0
  call   <ceil@plt>
  mov    %eax,-0x8(%rbp)
  movss  -0x14(%rbp),%xmm0
  comiss -0x18(%rbp),%xmm0
  jbe    L31
  mov    -0x18(%rbp),%eax
  jmp    L95
L31:
  mov    -0x14(%rbp),%eax
L95:
  movd   %eax,%xmm0
  call   <floor@plt>
  mov    %eax,-0x4(%rbp)
  movss  -0xc(%rbp),%xmm2
  movss  -0x14(%rbp),%xmm1
  movss  -0x10(%rbp),%xmm0
  mov    -0x18(%rbp),%edx
  mov    -0x34(%rbp),%eax
  movaps %xmm2,%xmm3
  movaps %xmm1,%xmm2
  movaps %xmm0,%xmm1
  movd   %edx,%xmm0
  mov    %eax,%edi
  call   <g_set_world@plt>
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  jmp    L4
L52:
  movss  -0x10(%rbp),%xmm0
  cvttss2si %xmm0,%edx
  pxor   %xmm6,%xmm6
  cvtsi2ssl -0x24(%rbp),%xmm6
  movd   %xmm6,%eax
  mov    %edx,%edi
  movd   %eax,%xmm0
  call   <g_moveto@plt>
  movss  -0xc(%rbp),%xmm0
  cvttss2si %xmm0,%edx
  pxor   %xmm7,%xmm7
  cvtsi2ssl -0x24(%rbp),%xmm7
  movd   %xmm7,%eax
  mov    %edx,%edi
  movd   %eax,%xmm0
  call   <g_lineto@plt>
  subl   $0x1,-0x24(%rbp)
L4:
  mov    -0x24(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jge    L52
  movss  -0x10(%rbp),%xmm0
  comiss -0xc(%rbp),%xmm0
  jbe    L138
  mov    -0x10(%rbp),%eax
  jmp    L108
L138:
  mov    -0xc(%rbp),%eax
L108:
  movd   %eax,%xmm0
  call   <ceil@plt>
  mov    %eax,-0x8(%rbp)
  movss  -0xc(%rbp),%xmm0
  comiss -0x10(%rbp),%xmm0
  jbe    L123
  mov    -0x10(%rbp),%eax
  jmp    L45
L123:
  mov    -0xc(%rbp),%eax
L45:
  movd   %eax,%xmm0
  call   <floor@plt>
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  mov    %eax,-0x24(%rbp)
  jmp    L46
L60:
  mov    -0x24(%rbp),%edx
  mov    -0x18(%rbp),%eax
  mov    %edx,%edi
  movd   %eax,%xmm0
  call   <g_moveto@plt>
  mov    -0x24(%rbp),%edx
  mov    -0x14(%rbp),%eax
  mov    %edx,%edi
  movd   %eax,%xmm0
  call   <g_lineto@plt>
  subl   $0x1,-0x24(%rbp)
L46:
  mov    -0x24(%rbp),%eax
  cmp    -0x4(%rbp),%eax
  jge    L60
  nop
  nop
  leave
  ret
```

assistant: ```c
void psnd_paperplot_grid(int vp, int autoscalex, int autoscaley, float xminp, float xmaxp, float yminp, float ymaxp, float xlines_ppm, float ylines_ppm) {
  float xtmp1, xtmp2, ytmp1, ytmp2;
  int n, start, stop;
  if (autoscalex) {
    float len = fabs(xminp - xmaxp);
    xlines_ppm = get_long_ticks(len);
  }
  if (autoscaley) {
    float len = fabs(yminp - ymaxp);
    ylines_ppm = get_long_ticks(len);
  }
  xtmp1 = xminp * xlines_ppm;
  xtmp2 = xmaxp * xlines_ppm;
  ytmp1 = yminp * ylines_ppm;
  ytmp2 = ymaxp * ylines_ppm;
  start = ceil((((xtmp1) > (xtmp2)) ? (xtmp1) : (xtmp2)));
  stop = floor((((xtmp1) < (xtmp2)) ? (xtmp1) : (xtmp2)));
  g_set_world(vp, xtmp1, ytmp1, xtmp2, ytmp2);
  for (n = start; n >= stop; n--) {
    g_moveto(n, ytmp1);
    g_lineto(n, ytmp2);
  }
  start = ceil((((ytmp1) > (ytmp2)) ? (ytmp1) : (ytmp2)));
  stop = floor((((ytmp1) < (ytmp2)) ? (ytmp1) : (ytmp2)));
  for (n = start; n >= stop; n--) {
    g_moveto(xtmp1, n);
    g_lineto(xtmp2, n);
  }
}
```