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

```asm
<X360GammaToLinear>:
  endbr64
  sub    $0x18,%rsp
  call   <saturate@plt>
  movss  D111(%rip),%xmm1
  comiss %xmm0,%xmm1
  jbe    L56
  movss  D82(%rip),%xmm1
  comiss %xmm0,%xmm1
  jbe    L27
  mulss  D122(%rip),%xmm0
L28:
  mulss  D136(%rip),%xmm0
  add    $0x18,%rsp
  jmp    1070 <saturate@plt>
  nopl   0x0(%rax)
L56:
  movss  D20(%rip),%xmm1
  comiss %xmm0,%xmm1
  jbe    L21
  mulss  D106(%rip),%xmm0
  movaps %xmm0,%xmm1
  subss  D109(%rip),%xmm1
  movaps %xmm1,%xmm0
  movss  %xmm1,0xc(%rsp)
  mulss  D85(%rip),%xmm0
  call   <floor@plt>
  pxor   %xmm0,%xmm0
  movss  0xc(%rsp),%xmm1
  cvtsi2ss %rax,%xmm0
  addss  %xmm1,%xmm0
  jmp    L28
  nopl   0x0(%rax,%rax,1)
L21:
  mulss  D41(%rip),%xmm0
  movaps %xmm0,%xmm1
  subss  D34(%rip),%xmm1
  movaps %xmm1,%xmm0
  movss  %xmm1,0xc(%rsp)
  mulss  D104(%rip),%xmm0
  call   <floor@plt>
  pxor   %xmm0,%xmm0
  movss  0xc(%rsp),%xmm1
  cvtsi2ss %rax,%xmm0
  addss  %xmm1,%xmm0
  jmp    L28
  nopl   0x0(%rax)
L27:
  mulss  D87(%rip),%xmm0
  movaps %xmm0,%xmm1
  subss  D1(%rip),%xmm1
  movaps %xmm1,%xmm0
  movss  %xmm1,0xc(%rsp)
  mulss  D40(%rip),%xmm0
  call   <floor@plt>
  pxor   %xmm0,%xmm0
  movss  0xc(%rsp),%xmm1
  cvtsi2ss %rax,%xmm0
  addss  %xmm1,%xmm0
  jmp    L28
```

tool_calls: name: read_data
arguments: tag: D111
type: byte[4]
name: read_data
arguments: tag: D82
type: byte[4]
name: read_data
arguments: tag: D122
type: byte[4]
name: read_data
arguments: tag: D136
type: byte[4]
name: read_data
arguments: tag: D20
type: byte[4]
name: read_data
arguments: tag: D106
type: byte[4]
name: read_data
arguments: tag: D109
type: byte[4]
name: read_data
arguments: tag: D85
type: byte[4]
name: read_data
arguments: tag: D41
type: byte[4]
name: read_data
arguments: tag: D34
type: byte[4]
name: read_data
arguments: tag: D104
type: byte[4]
name: read_data
arguments: tag: D87
type: byte[4]
name: read_data
arguments: tag: D1
type: byte[4]
name: read_data
arguments: tag: D40
type: byte[4]

tool: {"D111": [0xc1,0xc0,0xc0,0x3e]}

tool: {"D82": [0x81,0x80,0x80,0x3e]}

tool: {"D122": [0x00,0x00,0x7f,0x43]}

tool: {"D136": [0x08,0x20,0x80,0x3a]}

tool: {"D20": [0xc1,0xc0,0x40,0x3f]}

tool: {"D106": [0x00,0x00,0x7f,0x44]}

tool: {"D109": [0x00,0x00,0x80,0x43]}

tool: {"D85": [0x00,0x00,0x80,0x3b]}

tool: {"D41": [0x00,0x00,0xff,0x44]}

tool: {"D34": [0x00,0x00,0x80,0x44]}

tool: {"D104": [0x00,0x00,0x00,0x3c]}

tool: {"D87": [0x00,0x00,0xff,0x43]}

tool: {"D1": [0x00,0x00,0x80,0x42]}

tool: {"D40": [0x00,0x00,0x00,0x3b]}

assistant: ```c
float X360GammaToLinear(float fl360GammaValue) {
  float flLinearValue;
  fl360GammaValue = saturate(fl360GammaValue);
  if (fl360GammaValue < (96.0f / 255.0f)) {
    if (fl360GammaValue < (64.0f / 255.0f)) {
      flLinearValue = fl360GammaValue * 255.0f;
    } else {
      flLinearValue = fl360GammaValue * (255.0f * 2.0f) - 64.0f;
      flLinearValue += floor(flLinearValue * (1.0f / 512.0f));
    }
  } else {
    if (fl360GammaValue < (192.0f / 255.0f)) {
      flLinearValue = fl360GammaValue * (255.0f * 4.0f) - 256.0f;
      flLinearValue += floor(flLinearValue * (1.0f / 256.0f));
    } else {
      flLinearValue = fl360GammaValue * (255.0f * 8.0f) - 1024.0f;
      flLinearValue += floor(flLinearValue * (1.0f / 128.0f));
    }
  }
  flLinearValue *= 1.0f / 1023.0f;
  flLinearValue = saturate(flLinearValue);
  return flLinearValue;
}
```