user: 请将以下的汇编代码转换成C语言代码：

```asm
<student_t_p_2tail>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  movss  %xmm0,-0x44(%rbp)
  movss  %xmm1,-0x48(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x30(%rbp)
  movl   $0xbd,-0x2c(%rbp)
  lea    -0x34(%rbp),%rcx
  lea    -0x38(%rbp),%rdx
  mov    -0x48(%rbp),%eax
  mov    %rcx,%rsi
  mov    %rdx,%rdi
  movd   %eax,%xmm0
  call   <df_to_index@plt>
  pxor   %xmm0,%xmm0
  comiss -0x44(%rbp),%xmm0
  jbe    L5
  movss  -0x44(%rbp),%xmm0
  movss  D2(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x44(%rbp)
L5:
  mov    -0x34(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  movd   %ecx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <get_t@plt>
  movss  -0x44(%rbp),%xmm1
  comiss %xmm0,%xmm1
  jbe    L78
  mov    D23(%rip),%eax
  jmp    L15
L78:
  mov    -0x34(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  movd   %ecx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <get_t@plt>
  movd   %xmm0,%eax
  movd   %eax,%xmm3
  comiss -0x44(%rbp),%xmm3
  jbe    L85
  mov    D5(%rip),%eax
  jmp    L15
L85:
  jmp    L93
L73:
  mov    -0x30(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  add    %edx,%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  mov    %eax,-0x20(%rbp)
  mov    -0x34(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x20(%rbp),%eax
  movd   %ecx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <get_t@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x1c(%rbp)
  movss  -0x1c(%rbp),%xmm0
  comiss -0x44(%rbp),%xmm0
  jb     L101
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x30(%rbp)
L101:
  movss  -0x44(%rbp),%xmm0
  comiss -0x1c(%rbp),%xmm0
  jae    L53
  jmp    L93
L53:
  mov    -0x20(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
L93:
  mov    -0x2c(%rbp),%eax
  sub    -0x30(%rbp),%eax
  cmp    $0x1,%eax
  jg     L73
  mov    -0x34(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  movd   %ecx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <get_t@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0x34(%rbp),%ecx
  mov    -0x38(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  movd   %ecx,%xmm0
  mov    %edx,%esi
  mov    %eax,%edi
  call   <get_t@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x24(%rbp)
  movss  -0x44(%rbp),%xmm0
  comiss -0x24(%rbp),%xmm0
  setae  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  movss  -0x28(%rbp),%xmm0
  comiss -0x44(%rbp),%xmm0
  setae  %al
  movzbl %al,%eax
  mov    %eax,%edi
  call   <assert@plt>
  mov    -0x2c(%rbp),%eax
  mov    %eax,%edi
  call   <index_to_p@plt>
  mov    %eax,%ebx
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <index_to_p@plt>
  mov    %eax,%edx
  movss  -0x24(%rbp),%xmm1
  movss  -0x28(%rbp),%xmm0
  mov    -0x44(%rbp),%eax
  mov    %ebx,%esi
  movaps %xmm1,%xmm2
  mov    %edx,%edi
  movaps %xmm0,%xmm1
  movd   %eax,%xmm0
  call   <linear@plt>
  movd   %xmm0,%eax
L15:
  movd   %eax,%xmm0
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L86
  call   <__stack_chk_fail@plt>
L86:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D2
type: byte[4]
name: disassemble_data
arguments: data_tag: D23
type: f64
name: disassemble_data
arguments: data_tag: D5
type: f32

tool: {"D2": [0x00,0x00,0x00,0x80]}

tool: D23: 0

tool: D5: 1

assistant: ```c
float student_t_p_2tail(float t, float df) {
  int df_index1, p_index_min, p_index_mid, p_index_max;
  float df_weight1, t_max, t_mid, t_min;
  p_index_min = 0;
  p_index_max = 189;
  df_to_index(df, &df_index1, &df_weight1);
  if (t < 0)
    t = -t;
  if (t > get_t(p_index_min, df_index1, df_weight1))
    return 0.000;
  if (t < get_t(p_index_max, df_index1, df_weight1))
    return 1.000;
  while (p_index_max - p_index_min > 1) {
    p_index_mid = (p_index_min + p_index_max) / 2;
    t_mid = get_t(p_index_mid, df_index1, df_weight1);
    if (t_mid >= t)
      p_index_min = p_index_mid;
    if (t_mid <= t)
      p_index_max = p_index_mid;
  }
  t_max = get_t(p_index_min, df_index1, df_weight1);
  t_min = get_t(p_index_max, df_index1, df_weight1);
  assert(t >= t_min);
  assert(t <= t_max);
  return linear(t, t_max, index_to_p(p_index_min), t_min, index_to_p(p_index_max));
}
```