user: Please show me the C implementation that matches the assembly code listed below:

```asm
<fail2>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  mov    %rcx,-0x30(%rbp)
  lea    D4(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  lea    D71(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x10(%rbp)
  jmp    L95
L55:
  mov    -0x10(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  shl    $0x2,%rax
  add    %rdx,%rax
  add    %rax,%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,%rsi
  lea    D70(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  addl   $0x1,-0x10(%rbp)
L95:
  cmpl   $0x4,-0x10(%rbp)
  jle    L55
  lea    D9(%rip),%rax
  mov    %rax,%rdi
  call   <puts@plt>
  movl   $0x0,-0x10(%rbp)
  jmp    L64
L86:
  movl   $0x0,-0x4(%rbp)
  movl   $0x0,-0xc(%rbp)
  jmp    L7
L33:
  mov    -0x10(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0xc(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm1
  movss  D1(%rip),%xmm0
  comiss %xmm1,%xmm0
  jbe    L24
  addl   $0x1,-0x4(%rbp)
L24:
  addl   $0x1,-0xc(%rbp)
L7:
  cmpl   $0x4,-0xc(%rbp)
  jle    L33
  cmpl   $0x1,-0x4(%rbp)
  jle    L83
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,%esi
  lea    D38(%rip),%rax
  mov    %rax,%rdi
  mov    $0x0,%eax
  call   <printf@plt>
  movl   $0x0,-0x8(%rbp)
  jmp    L63
L28:
  mov    -0x10(%rbp),%edx
  mov    %edx,%eax
  shl    $0x2,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x8(%rbp),%eax
  cltq
  add    %rdx,%rax
  lea    0x0(,%rax,4),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  pxor   %xmm2,%xmm2
  cvtss2sd %xmm0,%xmm2
  movq   %xmm2,%rax
  movq   %rax,%xmm0
  lea    D29(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  addl   $0x1,-0x8(%rbp)
L63:
  cmpl   $0x4,-0x8(%rbp)
  jle    L28
  mov    -0x10(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movss  (%rax),%xmm0
  pxor   %xmm3,%xmm3
  cvtss2sd %xmm0,%xmm3
  movq   %xmm3,%rax
  movq   %rax,%xmm0
  lea    D65(%rip),%rax
  mov    %rax,%rdi
  mov    $0x1,%eax
  call   <printf@plt>
L83:
  addl   $0x1,-0x10(%rbp)
L64:
  cmpl   $0x3,-0x10(%rbp)
  jle    L86
  nop
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D4
datatype: string
name: disassemble_data
arguments: data_tag: D71
datatype: string
name: disassemble_data
arguments: data_tag: D70
datatype: string
name: disassemble_data
arguments: data_tag: D9
datatype: string
name: disassemble_data
arguments: data_tag: D1
datatype: f32
name: disassemble_data
arguments: data_tag: D38
datatype: string
name: disassemble_data
arguments: data_tag: D29
datatype: string
name: disassemble_data
arguments: data_tag: D65
datatype: string

tool: D4:       =======Student who is failed======  

tool: D71: NO.

tool: D70: %11s

tool: D9:    average

tool: D1: 60

tool: D38: %d

tool: D29: %11.2f

tool: D65: %11.2f


assistant: ```c
void fail2(float *pscore, int *pnum, float *paver, char (*pcourse)[10]) {
  int i, j, k, label;
  printf("      =======Student who is failed======  \n");
  printf("NO.");
  for (i = 0; i < 5; i++)
    printf("%11s", *(pcourse + i));
  printf("   average\n");
  for (i = 0; i < 4; i++) {
    label = 0;
    for (j = 0; j < 5; j++) {
      if (*(pscore + 5 * i + j) < 60.0)
        label++;
    }
    if (label >= 2) {
      printf("%d", *(pnum + i));
      for (k = 0; k < 5; k++)
        printf("%11.2f", *(pscore + 5 * i + k));
      printf("%11.2f\n", *(paver + i));
    }
  }
}
```