user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<catmullrom_interp>:
  endbr64
  push   %r15
  mov    %rcx,%r15
  push   %r14
  push   %r13
  mov    %rdx,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdi,%rbp
  push   %rbx
  sub    $0x58,%rsp
  movss  D10(%rip),%xmm2
  movss  D3(%rip),%xmm6
  subss  %xmm2,%xmm0
  subss  %xmm2,%xmm1
  movss  D77(%rip),%xmm2
  movaps %xmm0,%xmm3
  movaps %xmm0,%xmm4
  andps  %xmm2,%xmm3
  ucomiss %xmm3,%xmm6
  jbe    L23
  cvttss2si %xmm0,%eax
  pxor   %xmm3,%xmm3
  movss  D59(%rip),%xmm7
  movaps %xmm2,%xmm5
  andnps %xmm0,%xmm5
  cvtsi2ss %eax,%xmm3
  movaps %xmm3,%xmm4
  cmpnless %xmm0,%xmm4
  andps  %xmm7,%xmm4
  subss  %xmm4,%xmm3
  movaps %xmm3,%xmm4
  orps   %xmm5,%xmm4
L23:
  movaps %xmm1,%xmm5
  movaps %xmm1,%xmm3
  andps  %xmm2,%xmm5
  ucomiss %xmm5,%xmm6
  jbe    L36
  cvttss2si %xmm1,%eax
  pxor   %xmm5,%xmm5
  movss  D59(%rip),%xmm6
  andnps %xmm1,%xmm2
  cvtsi2ss %eax,%xmm5
  movaps %xmm5,%xmm3
  cmpnless %xmm1,%xmm3
  andps  %xmm6,%xmm3
  subss  %xmm3,%xmm5
  orps   %xmm2,%xmm5
  movaps %xmm5,%xmm3
L36:
  subss  %xmm4,%xmm0
  comiss D57(%rip),%xmm4
  movaps %xmm1,%xmm5
  subss  %xmm3,%xmm5
  movss  %xmm0,0xc(%rsp)
  jae    L21
  comiss D57(%rip),%xmm3
  cvttss2si %xmm4,%r14
  jae    L48
L56:
  cvttss2si %xmm3,%rbx
L26:
  lea    0x2(%r14),%rax
  lea    0x2(%rbx),%r8
  mov    %r15,%r9
  mov    %r13,%rdx
  mov    %rax,%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm5,0x4c(%rsp)
  mov    %rax,0x38(%rsp)
  mov    %r8,0x10(%rsp)
  call   <clamp2d@plt>
  lea    0x1(%r14),%r11
  mov    %r15,%r9
  mov    %r13,%rdx
  mov    0x10(%rsp),%r8
  mov    %r11,%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %r11,0x28(%rsp)
  movss  %xmm0,0x30(%rsp)
  call   <clamp2d@plt>
  mov    0x10(%rsp),%r8
  mov    %r15,%r9
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x40(%rsp)
  mov    %r8,0x18(%rsp)
  call   <clamp2d@plt>
  lea    -0x1(%r14),%r10
  mov    %r15,%r9
  mov    %r13,%rdx
  mov    0x18(%rsp),%r8
  mov    %r10,%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  mov    %r10,0x20(%rsp)
  movss  %xmm0,0x10(%rsp)
  call   <clamp2d@plt>
  movss  0x30(%rsp),%xmm4
  movss  0x40(%rsp),%xmm3
  movss  0x10(%rsp),%xmm2
  movaps %xmm0,%xmm1
  movss  0xc(%rsp),%xmm0
  call   <catmullrom_filter@plt>
  mov    0x38(%rsp),%rcx
  mov    %r15,%r9
  mov    %r13,%rdx
  lea    0x1(%rbx),%r8
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x48(%rsp)
  mov    %r8,0x10(%rsp)
  call   <clamp2d@plt>
  mov    0x10(%rsp),%r8
  mov    %r15,%r9
  mov    %r13,%rdx
  mov    0x28(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x30(%rsp)
  call   <clamp2d@plt>
  mov    0x10(%rsp),%r8
  mov    %r15,%r9
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x40(%rsp)
  mov    %r8,0x18(%rsp)
  call   <clamp2d@plt>
  mov    0x18(%rsp),%r8
  mov    %r15,%r9
  mov    %r13,%rdx
  mov    0x20(%rsp),%rcx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x10(%rsp)
  call   <clamp2d@plt>
  movss  0x30(%rsp),%xmm4
  movss  0x40(%rsp),%xmm3
  movss  0x10(%rsp),%xmm2
  movaps %xmm0,%xmm1
  movss  0xc(%rsp),%xmm0
  call   <catmullrom_filter@plt>
  mov    0x38(%rsp),%rcx
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x44(%rsp)
  call   <clamp2d@plt>
  mov    0x28(%rsp),%r11
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x40(%rsp)
  mov    %r11,%rcx
  mov    %r11,0x30(%rsp)
  call   <clamp2d@plt>
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x18(%rsp)
  call   <clamp2d@plt>
  mov    0x20(%rsp),%r10
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x10(%rsp)
  mov    %r10,%rcx
  mov    %r10,0x28(%rsp)
  sub    $0x1,%rbx
  call   <clamp2d@plt>
  movss  0x40(%rsp),%xmm4
  movss  0x18(%rsp),%xmm3
  movss  0x10(%rsp),%xmm2
  movaps %xmm0,%xmm1
  movss  0xc(%rsp),%xmm0
  call   <catmullrom_filter@plt>
  mov    0x38(%rsp),%rcx
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x20(%rsp)
  call   <clamp2d@plt>
  mov    0x30(%rsp),%rcx
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x40(%rsp)
  call   <clamp2d@plt>
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r14,%rcx
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x18(%rsp)
  call   <clamp2d@plt>
  mov    0x28(%rsp),%rcx
  mov    %r15,%r9
  mov    %rbx,%r8
  mov    %r13,%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movss  %xmm0,0x10(%rsp)
  call   <clamp2d@plt>
  movss  0x40(%rsp),%xmm4
  movss  0x18(%rsp),%xmm3
  movss  0x10(%rsp),%xmm2
  movaps %xmm0,%xmm1
  movss  0xc(%rsp),%xmm0
  call   <catmullrom_filter@plt>
  movss  0x48(%rsp),%xmm8
  movss  0x44(%rsp),%xmm7
  movss  0x20(%rsp),%xmm6
  movss  0x4c(%rsp),%xmm5
  add    $0x58,%rsp
  movaps %xmm0,%xmm1
  pop    %rbx
  movaps %xmm8,%xmm4
  movaps %xmm7,%xmm3
  pop    %rbp
  movaps %xmm6,%xmm2
  pop    %r12
  movaps %xmm5,%xmm0
  pop    %r13
  pop    %r14
  pop    %r15
  jmp    1060 <catmullrom_filter@plt>
  nopl   0x0(%rax)
L21:
  subss  D57(%rip),%xmm4
  cvttss2si %xmm4,%r14
  btc    $0x3f,%r14
  comiss D57(%rip),%xmm3
  jb     L56
L48:
  subss  D57(%rip),%xmm3
  cvttss2si %xmm3,%rbx
  btc    $0x3f,%rbx
  jmp    L26
```

tool_calls: name: extract_symbolic_data
arguments: tag: D10
type_infered: byte[4]
name: extract_symbolic_data
arguments: tag: D3
type_infered: byte[4]
name: extract_symbolic_data
arguments: tag: D77
type_infered: byte[4]
name: extract_symbolic_data
arguments: tag: D59
type_infered: byte[4]
name: extract_symbolic_data
arguments: tag: D57
type_infered: byte[4]

tool: {"D10": [0x00,0x00,0x00,0x3f]}

tool: {"D3": [0x00,0x00,0x00,0x4b]}

tool: {"D77": [0xff,0xff,0xff,0x7f]}

tool: {"D59": [0x00,0x00,0x80,0x3f]}

tool: {"D57": [0x00,0x00,0x00,0x5f]}

assistant: ```c
float catmullrom_interp(const float *pixels, size_t width, size_t height, float u, float v, size_t a) {
  u -= 0.5f;
  v -= 0.5f;
  float px = floorf(u);
  float py = floorf(v);
  float fx = u - px;
  float fy = v - py;
  size_t ipx = (size_t)px;
  size_t ipy = (size_t)py;
  return catmullrom_filter(fy, catmullrom_filter(fx, clamp2d(pixels, width, height, ipx - 1, ipy - 1, a), clamp2d(pixels, width, height, ipx, ipy - 1, a), clamp2d(pixels, width, height, ipx + 1, ipy - 1, a), clamp2d(pixels, width, height, ipx + 2, ipy - 1, a)), catmullrom_filter(fx, clamp2d(pixels, width, height, ipx - 1, ipy, a), clamp2d(pixels, width, height, ipx, ipy, a), clamp2d(pixels, width, height, ipx + 1, ipy, a), clamp2d(pixels, width, height, ipx + 2, ipy, a)), catmullrom_filter(fx, clamp2d(pixels, width, height, ipx - 1, ipy + 1, a), clamp2d(pixels, width, height, ipx, ipy + 1, a), clamp2d(pixels, width, height, ipx + 1, ipy + 1, a), clamp2d(pixels, width, height, ipx + 2, ipy + 1, a)), catmullrom_filter(fx, clamp2d(pixels, width, height, ipx - 1, ipy + 2, a), clamp2d(pixels, width, height, ipx, ipy + 2, a), clamp2d(pixels, width, height, ipx + 1, ipy + 2, a), clamp2d(pixels, width, height, ipx + 2, ipy + 2, a)));
}
```