user: Translate the below assembly code into C programming language:

```asm
<omp_quiesce_overhead>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %edi,-0x34(%rbp)
  movl   $0x3e8,-0x2c(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x20(%rbp)
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L8
L18:
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  mov    $0x0,%eax
  call   <omp_quiesce@plt>
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  subsd  -0x8(%rbp),%xmm0
  movsd  -0x28(%rbp),%xmm1
  addsd  %xmm1,%xmm0
  movsd  %xmm0,-0x28(%rbp)
  addl   $0x1,-0x30(%rbp)
L8:
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jl     L18
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  subsd  -0x18(%rbp),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x30(%rbp)
  jmp    L24
L37:
  addl   $0x1,-0x30(%rbp)
L24:
  mov    -0x30(%rbp),%eax
  cmp    -0x2c(%rbp),%eax
  jl     L37
  mov    $0x0,%eax
  call   <read_timer@plt>
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  subsd  -0x10(%rbp),%xmm0
  movsd  %xmm0,-0x10(%rbp)
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x2c(%rbp),%xmm1
  movsd  -0x28(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  lea    D5(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  movsd  -0x18(%rbp),%xmm0
  subsd  -0x10(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x2c(%rbp),%xmm1
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  pxor   %xmm1,%xmm1
  cvtsi2sdl -0x2c(%rbp),%xmm1
  movsd  -0x18(%rbp),%xmm0
  divsd  %xmm1,%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  lea    D8(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  nop
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D5
type: string
name: disassemble_data
arguments: data_label: D25
type: string
name: disassemble_data
arguments: data_label: D8
type: string

tool: D5: quiesce overhead      : %f


tool: D25: quiesce_start overhead: %f


tool: D8: Total cost:             %f


assistant: ```c
void omp_quiesce_overhead(int nthreads) {
  int i;
  int NUM_ITERATIONS = 1000;
  double quiesce_ov = 0.0;
  double quiesce_start_ov = 0.0;
  double cost_all = read_timer();
  for (i = 0; i < NUM_ITERATIONS; i++) {
#pragma omp parallel num_threads(nthreads)
    {}
    double temp2 = read_timer();
    omp_quiesce();
    quiesce_ov += read_timer() - temp2;
  }
  cost_all = read_timer() - cost_all;
  double parallel_overhead = read_timer();
  for (i = 0; i < NUM_ITERATIONS; i++) {
#pragma omp parallel num_threads(nthreads)
    {}
  }
  parallel_overhead = read_timer() - parallel_overhead;
  printf("quiesce overhead      : %f\n", quiesce_ov / NUM_ITERATIONS);
  printf("quiesce_start overhead: %f\n", (cost_all - parallel_overhead) / NUM_ITERATIONS);
  printf("Total cost:             %f\n", cost_all / NUM_ITERATIONS);
  return;
}
```