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

```asm
<pointy_tower>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  movsd  %xmm0,-0x18(%rbp)
  movsd  %xmm1,-0x20(%rbp)
  movsd  %xmm2,-0x28(%rbp)
  movsd  %xmm3,-0x30(%rbp)
  mov    %edi,-0x34(%rbp)
  movsd  %xmm4,-0x40(%rbp)
  movsd  D304(%rip),%xmm0
  mov    D236(%rip),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <perturbup@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  movsd  -0x30(%rbp),%xmm1
  movsd  D129(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x28(%rbp),%xmm0
  comisd %xmm1,%xmm0
  jbe    L32
  movl   $0x0,-0x34(%rbp)
L32:
  movsd  -0x30(%rbp),%xmm1
  movsd  D365(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  comisd -0x28(%rbp),%xmm0
  jbe    L31
  mov    $0x64,%edi
  call   <irandomn@plt>
  cmp    $0x27,%eax
  jg     L31
  mov    $0x1,%eax
  jmp    L80
L31:
  mov    $0x0,%eax
L80:
  mov    %eax,-0xc(%rbp)
  movsd  -0x20(%rbp),%xmm0
  mov    -0x18(%rbp),%rax
  pxor   %xmm2,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <xlate@plt>
  mov    $0x0,%eax
  call   <diff@plt>
  mov    $0x0,%eax
  call   <onion@plt>
  cmpl   $0x0,-0x34(%rbp)
  je     L45
  movsd  -0x28(%rbp),%xmm1
  movsd  D51(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D51(%rip),%xmm0
  movapd %xmm1,%xmm4
  mulsd  %xmm0,%xmm4
  movsd  -0x30(%rbp),%xmm1
  movsd  D143(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  movapd %xmm4,%xmm1
  movq   %rax,%xmm0
  call   <hollow_angular_cylinder@plt>
  movsd  -0x30(%rbp),%xmm1
  movsd  D304(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D267(%rip),%xmm0
  movapd %xmm1,%xmm4
  mulsd  %xmm0,%xmm4
  movsd  -0x30(%rbp),%xmm1
  movsd  D297(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  movapd %xmm4,%xmm1
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  movsd  -0x30(%rbp),%xmm1
  movsd  D297(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm4
  mulsd  %xmm0,%xmm4
  movsd  -0x28(%rbp),%xmm1
  movsd  D31(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  movapd %xmm4,%xmm1
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D31(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x8(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  pxor   %xmm2,%xmm2
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  cmpl   $0x0,-0xc(%rbp)
  je     L27
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x8(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  pxor   %xmm2,%xmm2
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  jmp    L27
L45:
  movsd  -0x28(%rbp),%xmm1
  movsd  D159(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x40(%rbp),%xmm2
  movsd  -0x28(%rbp),%xmm0
  mov    -0x30(%rbp),%rax
  movapd %xmm2,%xmm3
  movapd %xmm1,%xmm2
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <hollow_angular_cylinder@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm0
  subsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D109(%rip),%xmm0
  movapd %xmm1,%xmm4
  mulsd  %xmm0,%xmm4
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  movapd %xmm4,%xmm1
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm2
  mulsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  movapd %xmm1,%xmm4
  mulsd  %xmm0,%xmm4
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  movapd %xmm4,%xmm1
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x8(%rbp),%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  pxor   %xmm2,%xmm2
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
  cmpl   $0x0,-0xc(%rbp)
  je     L27
  movsd  -0x28(%rbp),%xmm1
  movsd  D395(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movsd  -0x8(%rbp),%xmm0
  addsd  %xmm0,%xmm0
  mulsd  -0x28(%rbp),%xmm0
  movq   %xmm0,%rax
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm3
  pxor   %xmm2,%xmm2
  movq   %rax,%xmm0
  call   <angular_cylinder@plt>
L27:
  mov    $0x0,%eax
  call   <endxlate@plt>
  mov    $0x0,%eax
  call   <endxlate@plt>
  mov    $0x0,%eax
  call   <endxlate@plt>
  mov    $0x0,%eax
  call   <endonion@plt>
  cmpl   $0x0,-0x34(%rbp)
  jne    L46
  movsd  -0x30(%rbp),%xmm0
  mov    -0x28(%rbp),%rax
  movapd %xmm0,%xmm1
  movq   %rax,%xmm0
  call   <add_windows@plt>
L46:
  cmpl   $0x0,-0x34(%rbp)
  jne    L93
  movsd  -0x30(%rbp),%xmm1
  movsd  D119(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
  jmp    L42
L93:
  movsd  -0x30(%rbp),%xmm1
  movsd  D42(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movapd %xmm0,%xmm2
  pxor   %xmm1,%xmm1
  mov    D393(%rip),%rax
  movq   %rax,%xmm0
  call   <xlate@plt>
L42:
  movsd  -0x28(%rbp),%xmm0
  movapd %xmm0,%xmm2
  addsd  %xmm0,%xmm2
  movsd  -0x28(%rbp),%xmm1
  movsd  D108(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movapd %xmm2,%xmm1
  movq   %rax,%xmm0
  call   <crenelation@plt>
  mov    $0x0,%eax
  call   <endxlate@plt>
  mov    $0x0,%eax
  call   <enddiff@plt>
  mov    $0x0,%eax
  call   <endxlate@plt>
  nop
  leave
  ret
```

tool_calls: name: read_data
arguments: label: D304
type_infered: f64
name: read_data
arguments: label: D236
type_infered: f64
name: read_data
arguments: label: D129
type_infered: f64
name: read_data
arguments: label: D365
type_infered: f64
name: read_data
arguments: label: D51
type_infered: f64
name: read_data
arguments: label: D143
type_infered: f64
name: read_data
arguments: label: D393
type_infered: byte[8]
name: read_data
arguments: label: D108
type_infered: f64
name: read_data
arguments: label: D267
type_infered: f64
name: read_data
arguments: label: D297
type_infered: f64
name: read_data
arguments: label: D31
type_infered: f64
name: read_data
arguments: label: D395
type_infered: f64
name: read_data
arguments: label: D159
type_infered: f64
name: read_data
arguments: label: D109
type_infered: f64
name: read_data
arguments: label: D119
type_infered: byte[8]
name: read_data
arguments: label: D42
type_infered: f64

tool: D304: 0.5

tool: D236: 1.4

tool: D129: 0.2

tool: D365: 0.3

tool: D51: 0.15

tool: D143: 0.75

tool: {"D393": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00]}

tool: D108: 1.2

tool: D267: 0.1

tool: D297: 0.25

tool: D31: 1.6

tool: D395: 0.6

tool: D159: 0.8

tool: D109: 0.81

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

tool: D42: 0.85

assistant: ```c
void pointy_tower(double x, double y, double r, double h, int flying, double fa) {
  double pointiness;
  pointiness = perturbup(1.4, 0.5);
  int extra_pointy;
  if (r > h * 0.20)
    flying = 0;
  extra_pointy = (r < h * 0.30 && irandomn(100) < 40);
  xlate(x, y, 0);
  diff();
  onion();
  if (flying) {
    hollow_angular_cylinder(h * 0.75, 0.15 * r, 0.15 * r, fa);
    xlate(0, 0, h * 0.5);
    angular_cylinder(h * 0.25, 0.10 * r, r * 1.2, fa);
    xlate(0, 0, h * 0.25);
    angular_cylinder(1.6 * r, 1.2 * r, r * 1.2, fa);
    xlate(0, 0, r * 1.6);
    angular_cylinder(pointiness * r, 1.2 * r, 0, fa);
    if (extra_pointy)
      angular_cylinder(pointiness * 2 * r, 0.6 * r, 0, fa);
  } else {
    hollow_angular_cylinder(h, r, 0.80 * r, fa);
    xlate(0, 0, h - 0.6 * r);
    angular_cylinder(0.6 * r, 0.81 * r, r * 1.2, fa);
    xlate(0, 0, r * 0.6);
    angular_cylinder(0.6 * r, 1.2 * r, r * 1.2, fa);
    xlate(0, 0, r * 0.6);
    angular_cylinder(pointiness * r, 1.2 * r, 0, fa);
    if (extra_pointy)
      angular_cylinder(pointiness * 2 * r, 0.6 * r, 0, fa);
  }
  endxlate();
  endxlate();
  endxlate();
  endonion();
  if (!flying) {
    add_windows(r, h);
  }
  if (!flying)
    xlate(0, 0, h + 3);
  else
    xlate(0, 0, h * 0.85);
  crenelation(r * 1.2, r * 2);
  endxlate();
  enddiff();
  endxlate();
}
```