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

```asm
<odruv>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    (%rdi),%ecx
  mov    0x4(%rdi),%r14d
  mov    0x8(%rdi),%ebx
  mov    0xc(%rdi),%r15d
  mov    %rdx,-0x10(%rsp)
  mov    (%rsi),%edx
  mov    $0x80,%esi
  mov    %rdi,-0x8(%rsp)
  cmp    %esi,%edx
  cmovle %edx,%esi
  mov    %esi,-0x14(%rsp)
  test   %edx,%edx
  jle    L50
  lea    D13(%rip),%rax
  mov    %ecx,%r10d
  mov    %ebx,%ecx
  movq   $0x1,-0x28(%rsp)
  mov    %rax,-0x20(%rsp)
  mov    $0x142,%eax
  mov    %r15d,%edx
  movsd  D27(%rip),%xmm1
  movsd  D10(%rip),%xmm3
  mov    %eax,%ebx
  mov    $0x9f5,%edi
  mov    $0x1ee,%r9d
  mov    $0x9cc,%r8d
  mov    %r14d,%eax
  nopl   (%rax)
L12:
  mov    %ecx,%r14d
  mov    %edx,%esi
  lea    (%rbx,%rbx,1),%ebp
  mov    %ecx,%r12d
  imul   %edi,%r14d
  mov    %ebp,-0x40(%rsp)
  mov    %edx,%ebp
  mov    %eax,%r13d
  imul   %edi,%esi
  lea    (%r8,%r8,1),%r15d
  imul   %r8d,%r12d
  lea    (%rdi,%rdi,1),%r11d
  mov    %r14d,-0x50(%rsp)
  mov    %edx,%r14d
  imul   %ebx,%ebp
  mov    %esi,-0x4c(%rsp)
  imul   %r8d,%r14d
  lea    (%r9,%r9,1),%esi
  imul   %eax,%r8d
  sub    %r10d,%eax
  mov    %esi,-0x44(%rsp)
  mov    -0x4c(%rsp),%esi
  imul   %ecx,%ebx
  sub    %r10d,%ecx
  mov    %eax,-0x34(%rsp)
  imul   %edx,%r9d
  sub    %r10d,%edx
  mov    %ecx,-0x38(%rsp)
  imul   %edi,%r13d
  mov    %edx,-0x3c(%rsp)
  imul   %r10d,%edi
  jmp    L32
  nopl   0x0(%rax,%rax,1)
L54:
  add    $0x2,%r10d
L32:
  mov    -0x3c(%rsp),%eax
  lea    0xfff(%rsi),%edx
  mov    %esi,%ecx
  pxor   %xmm0,%xmm0
  pxor   %xmm2,%xmm2
  add    %r10d,%eax
  mov    %eax,-0x30(%rsp)
  mov    -0x38(%rsp),%eax
  add    %r10d,%eax
  mov    %eax,-0x2c(%rsp)
  mov    -0x34(%rsp),%eax
  add    %r10d,%eax
  test   %esi,%esi
  cmovns %esi,%edx
  mov    %eax,-0x18(%rsp)
  mov    %edx,%eax
  and    $0xfffff000,%edx
  sar    $0xc,%eax
  add    -0x50(%rsp),%eax
  sub    %edx,%ecx
  add    %r14d,%eax
  mov    %ecx,-0x4c(%rsp)
  lea    0xfff(%rax),%ecx
  cmovns %eax,%ecx
  cvtsi2sdl -0x4c(%rsp),%xmm0
  mov    %ecx,%edx
  and    $0xfffff000,%ecx
  sub    %ecx,%eax
  sar    $0xc,%edx
  mov    %eax,-0x48(%rsp)
  add    %r13d,%edx
  mulsd  %xmm1,%xmm0
  add    %r12d,%edx
  add    %ebp,%edx
  cvtsi2sdl -0x48(%rsp),%xmm2
  lea    0xfff(%rdx),%ecx
  cmovns %edx,%ecx
  add    %r11d,-0x50(%rsp)
  add    %r11d,%esi
  add    %r15d,%r14d
  add    %r11d,%r13d
  add    %r15d,%r12d
  mov    %ecx,%eax
  and    $0xfffff000,%ecx
  addsd  %xmm2,%xmm0
  sar    $0xc,%eax
  pxor   %xmm2,%xmm2
  sub    %ecx,%edx
  add    %edi,%eax
  cvtsi2sd %edx,%xmm2
  add    %r11d,%edi
  add    %r8d,%eax
  add    %r15d,%r8d
  mulsd  %xmm1,%xmm0
  add    %ebx,%eax
  add    %r9d,%eax
  add    -0x44(%rsp),%r9d
  mov    %eax,%ecx
  sar    $0x1f,%ecx
  shr    $0x14,%ecx
  addsd  %xmm2,%xmm0
  add    %ecx,%eax
  pxor   %xmm2,%xmm2
  and    $0xfff,%eax
  sub    %ecx,%eax
  mov    -0x40(%rsp),%ecx
  mulsd  %xmm1,%xmm0
  cvtsi2sd %eax,%xmm2
  add    %ecx,%ebp
  add    %ecx,%ebx
  addsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  ucomisd %xmm3,%xmm0
  jp     L45
  je     L54
L45:
  mov    -0x10(%rsp),%rbx
  mov    %edx,%r9d
  mov    %eax,%edx
  mov    -0x28(%rsp),%rax
  movsd  %xmm0,-0x8(%rbx,%rax,8)
  add    $0x1,%rax
  mov    %rax,-0x28(%rsp)
  cmp    %eax,-0x14(%rsp)
  jl     L24
  mov    -0x20(%rsp),%rax
  mov    -0x30(%rsp),%edx
  mov    -0x2c(%rsp),%ecx
  mov    0x600(%rax),%edi
  mov    0x400(%rax),%r8d
  add    $0x4,%rax
  mov    0x1fc(%rax),%ebx
  mov    -0x4(%rax),%r9d
  mov    %rax,-0x20(%rsp)
  mov    -0x18(%rsp),%eax
  jmp    L12
  nopw   0x0(%rax,%rax,1)
L24:
  mov    %edx,%eax
L50:
  mov    -0x8(%rsp),%rbx
  mov    -0x4c(%rsp),%edi
  mov    %eax,(%rbx)
  mov    %rbx,%rax
  mov    %r9d,0x4(%rbx)
  mov    -0x48(%rsp),%ebx
  mov    %edi,0xc(%rax)
  mov    %ebx,0x8(%rax)
  xor    %eax,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: unpack_data
arguments: label: D13
type_guessed: string
name: unpack_data
arguments: label: D27
type_guessed: byte[8]
name: unpack_data
arguments: label: D10
type_guessed: f64

tool: D13: M


tool: {"D27": [0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x3f]}

tool: D10: 1

assistant: ```c
int odruv(int *iseed, int *n, double *x) {
  static int mm[512] = {494, 2637, 255, 2008, 1253, 3344, 4084, 1739, 3143, 3468, 688, 1657, 1238, 3166, 1292, 3422, 1270, 2016, 154, 2862, 697, 1706, 491, 931, 1444, 444, 3577, 3944, 2184, 1661, 3482, 657, 3023, 3618, 1267, 1828, 164, 3798, 3087, 2400, 2870, 3876, 1905, 1593, 1797, 1234, 3460, 328, 2861, 1950, 617, 2070, 3331, 769, 1558, 2412, 2800, 189, 287, 2045, 1227, 2838, 209, 2770, 3654, 3993, 192, 2253, 3491, 2889, 2857, 2094, 1818, 688, 1407, 634, 3231, 815, 3524, 1914, 516, 164, 303, 2144, 3480, 119, 3357, 837, 2826, 2332, 2089, 3780, 1700, 3712, 150, 2000, 3375, 1621, 3090, 3765, 1149, 3146, 33, 3082, 2741, 359, 3316, 1749, 185, 2784, 2202, 2199, 1364, 1244, 2020, 3160, 2785, 2772, 1217, 1822, 1245, 2252, 3904, 2774, 997, 2573, 1148, 545, 322, 789, 1440, 752, 2859, 123, 1848, 643, 2405, 2638, 2344, 46, 3814, 913, 3649, 339, 3808, 822, 2832, 3078, 3633, 2970, 637, 2249, 2081, 4019, 1478, 242, 481, 2075, 4058, 622, 3376, 812, 234, 641, 4005, 1122, 3135, 2640, 2302, 40, 1832, 2247, 2034, 2637, 1287, 1691, 496, 1597, 2394, 2584, 1843, 336, 1472, 2407, 433, 2096, 1761, 2810, 566, 442, 41, 1238, 1086, 603, 840, 3168, 1499, 1084, 3438, 2408, 1589, 2391, 288, 26, 512, 1456, 171, 1677, 2657, 2270, 2587, 2961, 1970, 1817, 676, 1410, 3723, 2803, 3185, 184, 663, 499, 3784, 1631, 1925, 3912, 1398, 1349, 1441, 2224, 2411, 1907, 3192, 2786, 382, 37, 759, 2948, 1862, 3802, 2423, 2051, 2295, 1332, 1832, 2405, 3638, 3661, 327, 3660, 716, 1842, 3987, 1368, 1848, 2366, 2508, 3754, 1766, 3572, 2893, 307, 1297, 3966, 758, 2598, 3406, 2922, 1038, 2934, 2091, 2451, 1580, 1958, 2055, 1507, 1078, 3273, 17, 854, 2916, 3971, 2889, 3831, 2621, 1541, 893, 736, 3992, 787, 2125, 2364, 2460, 257, 1574, 3912, 1216, 3248, 3401, 2124, 2762, 149, 2245, 166, 466, 4018, 1399, 190, 2879, 153, 2320, 18, 712, 2159, 2318, 2091, 3443, 1510, 449, 1956, 2201, 3137, 3399, 1321, 2271, 3667, 2703, 629, 2365, 2431, 1113, 3922, 2554, 184, 2099, 3228, 4012, 1921, 3452, 3901, 572, 3309, 3171, 817, 3039, 1696, 1256, 3715, 2077, 3019, 1497, 1101, 717, 51, 981, 1978, 1813, 3881, 76, 3846, 3694, 1682, 124, 1660, 3997, 479, 1141, 886, 3514, 1301, 3604, 1888, 1836, 1990, 2058, 692, 1194, 20, 3285, 2046, 2107, 3508, 3525, 3801, 2549, 1145, 2253, 305, 3301, 1065, 3133, 2913, 3285, 1241, 1197, 3729, 2501, 1673, 541, 2753, 949, 2361, 1165, 4081, 2725, 3305, 3069, 3617, 3733, 409, 2157, 1361, 3973, 1865, 2525, 1409, 3445, 3577, 77, 3761, 2149, 1449, 3005, 225, 85, 3673, 3117, 3089, 1349, 2057, 413, 65, 1845, 697, 3085, 3441, 1573, 3689, 2941, 929, 533, 2841, 4077, 721, 2821, 2249, 2397, 2817, 245, 1913, 1997, 3121, 997, 1833, 2877, 1633, 981, 2009, 941, 2449, 197, 2441, 285, 1473, 2741, 3129, 909, 2801, 421, 4073, 2813, 2337, 1429, 1177, 1901, 81, 1669, 2633, 2269, 129, 1141, 249, 3917, 2481, 3941, 2217, 2749, 3041, 1877, 345, 2861, 1809, 3141, 2825, 157, 2881, 3637, 1465, 2829, 2161, 3365, 361, 2685, 3745, 2325, 3609, 3821, 3537, 517, 3017, 2141, 1537};
  int i__1;
  int i__, i1, i2, i3, i4, it1, it2, it3, it4;
  --iseed;
  --x;
  i1 = iseed[1];
  i2 = iseed[2];
  i3 = iseed[3];
  i4 = iseed[4];
  i__1 = ((*n) < (128) ? (*n) : (128));
  for (i__ = 1; i__ <= i__1; ++i__) {
  L20:
    it4 = i4 * mm[i__ + 383];
    it3 = it4 / 4096;
    it4 -= it3 << 12;
    it3 = it3 + i3 * mm[i__ + 383] + i4 * mm[i__ + 255];
    it2 = it3 / 4096;
    it3 -= it2 << 12;
    it2 = it2 + i2 * mm[i__ + 383] + i3 * mm[i__ + 255] + i4 * mm[i__ + 127];
    it1 = it2 / 4096;
    it2 -= it1 << 12;
    it1 = it1 + i1 * mm[i__ + 383] + i2 * mm[i__ + 255] + i3 * mm[i__ + 127] + i4 * mm[i__ - 1];
    it1 %= 4096;
    x[i__] = ((double)it1 + ((double)it2 + ((double)it3 + (double)it4 * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4) * 2.44140625e-4;
    if (x[i__] == 1.) {
      i1 += 2;
      i2 += 2;
      i3 += 2;
      i4 += 2;
      goto L20;
    }
  }
  iseed[1] = it1;
  iseed[2] = it2;
  iseed[3] = it3;
  iseed[4] = it4;
  return 0;
}
```