user: 下面的汇编指令对应的C源代码是什么：

```asm
<translateRules>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0x10,%rsp
  mov    %rdi,%r10
  mov    %rsi,%r11
  mov    %edx,%r8d
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movslq %edx,%rax
  lea    (%rax,%rax,8),%rax
  lea    0xf(,%rax,8),%rax
  mov    %rax,%rcx
  and    $0xfffffffffffffff0,%rcx
  and    $0xfffffffffffff000,%rax
  mov    %rsp,%rdx
  sub    %rax,%rdx
L38:
  cmp    %rdx,%rsp
  je     L49
  sub    $0x1000,%rsp
  orq    $0x0,0xff8(%rsp)
  jmp    L38
L49:
  mov    %rcx,%rax
  and    $0xfff,%eax
  sub    %rax,%rsp
  test   %rax,%rax
  je     L41
  orq    $0x0,-0x8(%rsp,%rax,1)
L41:
  lea    0x7(%rsp),%rdi
  mov    %rdi,%rax
  shr    $0x3,%rax
  and    $0xfffffffffffffff8,%rdi
  movsd  D54(%rip),%xmm1
  movsd  %xmm1,0x0(,%rax,8)
  movsd  D45(%rip),%xmm0
  movsd  %xmm0,0x8(,%rax,8)
  movq   $0x0,0x10(,%rax,8)
  movsd  %xmm0,0x18(,%rax,8)
  movsd  %xmm1,0x48(,%rax,8)
  movsd  %xmm0,0x50(,%rax,8)
  movsd  %xmm1,0x58(,%rax,8)
  movsd  %xmm0,0x60(,%rax,8)
  movsd  %xmm1,0x90(,%rax,8)
  movq   $0x0,0x98(,%rax,8)
  mov    D17(%rip),%rbx
  mov    %rbx,0xa0(,%rax,8)
  movsd  %xmm0,0xa8(,%rax,8)
  mov    D27(%rip),%rbx
  mov    %rbx,0xd8(,%rax,8)
  movq   $0x0,0xe0(,%rax,8)
  movsd  D92(%rip),%xmm2
  movsd  %xmm2,0xe8(,%rax,8)
  mov    D41(%rip),%rbx
  mov    %rbx,0xf0(,%rax,8)
  movsd  %xmm1,0xf8(,%rax,8)
  movsd  %xmm2,0x100(,%rax,8)
  movsd  %xmm0,0x108(,%rax,8)
  movsd  %xmm1,0x120(,%rax,8)
  movq   $0x0,0x128(,%rax,8)
  mov    D52(%rip),%rbx
  mov    %rbx,0x130(,%rax,8)
  movsd  %xmm0,0x138(,%rax,8)
  mov    D91(%rip),%rbx
  mov    %rbx,0x168(,%rax,8)
  movq   $0x0,0x170(,%rax,8)
  movq   $0x0,0x178(,%rax,8)
  mov    D81(%rip),%rbx
  mov    %rbx,0x180(,%rax,8)
  movsd  %xmm1,0x188(,%rax,8)
  movq   $0x0,0x190(,%rax,8)
  movsd  %xmm0,0x198(,%rax,8)
  test   %r8d,%r8d
  jle    L66
  mov    $0x0,%ebx
  mov    $0x0,%r9d
  mov    $0x0,%eax
  mov    $0x0,%edx
  movsd  D45(%rip),%xmm1
  movapd %xmm1,%xmm2
  movapd %xmm1,%xmm3
  movapd %xmm1,%xmm4
L0:
  movslq %edx,%rsi
  movslq %eax,%rcx
  lea    (%rsi,%rsi,2),%rsi
  lea    (%rcx,%rcx,8),%rcx
  shl    $0x3,%rcx
  lea    (%rcx,%rsi,8),%rcx
  movsd  0x8(%rdi,%rcx,1),%xmm0
  ucomisd %xmm1,%xmm0
  jp     L18
  ucomisd %xmm2,%xmm0
  jne    L18
  movslq %r9d,%rcx
  lea    (%r11,%rcx,8),%rsi
  mov    %eax,(%rsi)
  movslq %edx,%r12
  movslq %eax,%rcx
  lea    (%r12,%r12,2),%r12
  lea    (%rcx,%rcx,8),%rcx
  shl    $0x3,%rcx
  lea    (%rcx,%r12,8),%rcx
  cvttsd2si 0x10(%rdi,%rcx,1),%ecx
  mov    %ecx,0x4(%rsi)
  add    $0x1,%r9d
  add    $0x1,%edx
L84:
  cmp    %r8d,%eax
  jge    L66
  movslq %edx,%rsi
  movslq %eax,%rcx
  lea    (%rsi,%rsi,2),%rsi
  lea    (%rcx,%rcx,8),%rcx
  shl    $0x3,%rcx
  lea    (%rcx,%rsi,8),%rcx
  add    %rdi,%rcx
  ucomisd (%rcx),%xmm3
  jp     L0
  ucomisd (%rcx),%xmm4
  jne    L0
  add    $0x1,%eax
  cmp    %eax,%r8d
  jle    L66
  mov    $0x0,%edx
  jmp    L0
L18:
  movslq %ebx,%rcx
  lea    (%rcx,%rcx,2),%rcx
  lea    (%r10,%rcx,4),%rsi
  mov    %eax,(%rsi)
  cvttsd2si %xmm0,%ecx
  mov    %ecx,0x4(%rsi)
  movslq %edx,%r12
  movslq %eax,%rcx
  lea    (%r12,%r12,2),%r12
  lea    (%rcx,%rcx,8),%rcx
  shl    $0x3,%rcx
  lea    (%rcx,%r12,8),%rcx
  cvttsd2si 0x10(%rdi,%rcx,1),%ecx
  mov    %ecx,0x8(%rsi)
  add    $0x1,%ebx
  add    $0x1,%edx
  jmp    L84
L66:
  mov    -0x18(%rbp),%rax
  sub    %fs:0x28,%rax
  jne    L70
  lea    -0x10(%rbp),%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
L70:
  call   <__stack_chk_fail@plt>
```

tool_calls: name: read_data
arguments: label: D54
type: byte[8]
name: read_data
arguments: label: D45
type: byte[8]
name: read_data
arguments: label: D17
type: byte[8]
name: read_data
arguments: label: D27
type: f64
name: read_data
arguments: label: D92
type: byte[8]
name: read_data
arguments: label: D41
type: f64
name: read_data
arguments: label: D52
type: byte[8]
name: read_data
arguments: label: D91
type: f64
name: read_data
arguments: label: D81
type: f64

tool: {"D54": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0x3f]}

tool: {"D45": [0x00,0x00,0x00,0x00,0x00,0x00,0xf0,0xbf]}

tool: {"D17": [0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x40]}

tool: D27: 0.9

tool: {"D92": [0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x40]}

tool: D41: 0.1

tool: {"D52": [0x00,0x00,0x00,0x00,0x00,0x00,0x14,0x40]}

tool: D91: 0.7

tool: D81: 0.3

assistant: ```c
void translateRules(int nonRules[][3], int termRules[][2], int nonTerm) {
  int maxRuleCount = 2;
  double rules[nonTerm][maxRuleCount + 1][3];
  rules[0][0][0] = 1;
  rules[0][0][1] = -1;
  rules[0][0][2] = 0;
  rules[0][1][0] = -1;
  rules[1][0][0] = 1;
  rules[1][0][1] = -1;
  rules[1][0][2] = 1;
  rules[1][1][0] = -1;
  rules[2][0][0] = 1;
  rules[2][0][1] = 0;
  rules[2][0][2] = 3;
  rules[2][1][0] = -1;
  rules[3][0][0] = 0.9;
  rules[3][0][1] = 0;
  rules[3][0][2] = 4;
  rules[3][1][0] = 0.1;
  rules[3][1][1] = 1;
  rules[3][1][2] = 4;
  rules[3][2][0] = -1;
  rules[4][0][0] = 1;
  rules[4][0][1] = 0;
  rules[4][0][2] = 5;
  rules[4][1][0] = -1;
  rules[5][0][0] = 0.7;
  rules[5][0][1] = 0;
  rules[5][0][2] = 0;
  rules[5][1][0] = 0.3;
  rules[5][1][1] = 1;
  rules[5][1][2] = 0;
  rules[5][2][0] = -1;
  int termRuleOut = 0;
  int nonRule = 0;
  int nonTermNum = 0;
  int nonRuleOut = 0;
  while (nonTermNum < nonTerm) {
    if (rules[nonTermNum][nonRule][0] == -1) {
      nonTermNum++;
      nonRule = 0;
      if (nonTermNum >= nonTerm)
        break;
    }
    if (rules[nonTermNum][nonRule][1] == -1) {
      termRules[termRuleOut][0] = nonTermNum;
      termRules[termRuleOut][1] = rules[nonTermNum][nonRule][2];
      termRuleOut++;
      nonRule++;
    } else {
      nonRules[nonRuleOut][0] = nonTermNum;
      nonRules[nonRuleOut][1] = rules[nonTermNum][nonRule][1];
      nonRules[nonRuleOut][2] = rules[nonTermNum][nonRule][2];
      nonRuleOut++;
      nonRule++;
    }
  }
}
```