user: 请从给定的汇编指令推导出C源代码：

```asm
<__gen_ocl_internal_sinpi>:
  endbr64
  push   %r12
  mov    $0x7fffffff,%r12d
  push   %rbp
  push   %rbx
  movd   %xmm0,%ebx
  and    %ebx,%r12d
  sub    $0x10,%rsp
  cmp    $0x3e7fffff,%r12d
  jle    L45
  movaps %xmm0,%xmm1
  xorps  D145(%rip),%xmm1
  movaps %xmm1,%xmm0
  movss  %xmm1,0xc(%rsp)
  call   <__gen_ocl_rndd@plt>
  movss  0xc(%rsp),%xmm1
  ucomiss %xmm1,%xmm0
  jp     L17
  jne    L17
  cmp    $0x4b7fffff,%r12d
  jg     L57
  cmp    $0x4affffff,%r12d
  jg     L98
  movss  D148(%rip),%xmm0
  movd   %ebx,%xmm2
  subss  %xmm2,%xmm0
L98:
  movd   %xmm0,%eax
  pxor   %xmm1,%xmm1
  and    $0x1,%eax
  cvtsi2ss %eax,%xmm1
  cmp    $0x4,%ebp
  jle    L31
L21:
  sub    $0x5,%ebp
  cmp    $0x1,%ebp
  ja     L22
  subss  D46(%rip),%xmm1
  mulss  D87(%rip),%xmm1
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  movaps %xmm1,%xmm0
  jmp    1080 <__gen_ocl_cos@plt>
  nopl   (%rax)
L17:
  mulss  D53(%rip),%xmm1
  movaps %xmm1,%xmm0
  movss  %xmm1,0xc(%rsp)
  call   <__gen_ocl_rndd@plt>
  movss  0xc(%rsp),%xmm1
  subss  %xmm0,%xmm1
  movss  D139(%rip),%xmm0
  addss  %xmm1,%xmm1
  mulss  %xmm1,%xmm0
  cvttss2si %xmm0,%ebp
  cmp    $0x4,%ebp
  jg     L21
L31:
  cmp    $0x2,%ebp
  jg     L125
  test   %ebp,%ebp
  je     L4
  sub    $0x1,%ebp
  cmp    $0x1,%ebp
  jbe    L3
L22:
  subss  D66(%rip),%xmm1
L4:
  mulss  D87(%rip),%xmm1
  movaps %xmm1,%xmm0
  jmp    L87
  nopl   0x0(%rax,%rax,1)
L3:
  movss  D53(%rip),%xmm0
  subss  %xmm1,%xmm0
  mulss  D87(%rip),%xmm0
  call   <__gen_ocl_cos@plt>
  xorps  D145(%rip),%xmm0
L106:
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L45:
  mulss  D87(%rip),%xmm0
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  jmp    1070 <__gen_ocl_sin@plt>
  nopl   (%rax)
L57:
  pxor   %xmm0,%xmm0
L87:
  call   <__gen_ocl_sin@plt>
  xorps  D145(%rip),%xmm0
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L125:
  movss  D102(%rip),%xmm0
  subss  %xmm1,%xmm0
  mulss  D87(%rip),%xmm0
  call   <__gen_ocl_sin@plt>
  xorps  D145(%rip),%xmm0
  jmp    L106
```

tool_calls: name: unpack_data
arguments: label: D145
type_guessed: byte[16]
name: unpack_data
arguments: label: D148
type_guessed: byte[4]
name: unpack_data
arguments: label: D46
type_guessed: byte[4]
name: unpack_data
arguments: label: D87
type_guessed: byte[4]
name: unpack_data
arguments: label: D53
type_guessed: byte[4]
name: unpack_data
arguments: label: D139
type_guessed: byte[4]
name: unpack_data
arguments: label: D66
type_guessed: byte[4]
name: unpack_data
arguments: label: D102
type_guessed: byte[4]

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

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

tool: {"D46": [0x00,0x00,0xc0,0x3f]}

tool: {"D87": [0xdb,0x0f,0x49,0x40]}

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

tool: {"D139": [0x00,0x00,0x80,0x40]}

tool: {"D66": [0x00,0x00,0x00,0x40]}

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

assistant: ```c
__attribute__((overloadable, always_)) float __gen_ocl_internal_sinpi(float x) {
  float y, z;
  int n, ix;
  ix = *(int *)(&x) & 0x7fffffff;
  if (ix < 0x3e800000)
    return __gen_ocl_sin(3.141592653589793F * x);
  y = -x;
  z = __gen_ocl_rndd(y);
  if (z != y) {
    y *= 0.5f;
    y = 2.f * (y - __gen_ocl_rndd(y));
    n = y * 4.f;
  } else {
    if (ix >= 0x4b800000) {
      y = 0;
      n = 0;
    } else {
      if (ix < 0x4b000000)
        z = y + 8.3886080000e+06f;
      int n = *(int *)(&z);
      n &= 1;
      y = n;
      n <<= 2;
    }
  }
  switch (n) {
  case 0:
    y = __gen_ocl_sin(3.141592653589793F * y);
    break;
  case 1:
  case 2:
    y = __gen_ocl_cos(3.141592653589793F * (0.5f - y));
    break;
  case 3:
  case 4:
    y = __gen_ocl_sin(3.141592653589793F * (1.f - y));
    break;
  case 5:
  case 6:
    y = -__gen_ocl_cos(3.141592653589793F * (y - 1.5f));
    break;
  default:
    y = __gen_ocl_sin(3.141592653589793F * (y - 2.f));
    break;
  }
  return -y;
}
```