// File: /workspace/github_cpp_makefile_star2_O1/mindbeast[P]rnes/apu.cpp
// Function: Rnes::Apu::generateSample()
void Apu::generateSample() {
  // float sample = (samples[sampleOffset % sampleBufferSize] + samples[(sampleOffset - 32) %
  // sampleBufferSize]) / 2;
  float sample = 0.0f;
  sample += 0.02051777 * (samples[sampleOffset % sampleBufferSize]);
  sample += 0.06532911 * (samples[(sampleOffset - 1) % sampleBufferSize]);
  sample += 0.16640572 * (samples[(sampleOffset - 2) % sampleBufferSize]);
  sample += 0.2477474 * (samples[(sampleOffset - 3) % sampleBufferSize]);
  sample += 0.2477474 * (samples[(sampleOffset - 4) % sampleBufferSize]);
  sample += 0.16640572 * (samples[(sampleOffset - 5) % sampleBufferSize]);
  sample += 0.06532911 * (samples[(sampleOffset - 6) % sampleBufferSize]);
  sample += 0.02051777 * (samples[(sampleOffset - 7) % sampleBufferSize]);

  int16_t truncSample = (int16_t)((sample) * (1 << 14));

  const unsigned int bufferedSamples = 32;
  sampleBuffer.push_back(truncSample);
  if (sampleBuffer.size() == bufferedSamples) {
    rb->putData(sampleBuffer.data(), bufferedSamples);
    sampleBuffer.clear();
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rbx
pushq %rax
movq %rdi, %rbx
movl 0xb0(%rdi), %eax
movl %eax, %ecx
andl $0x1f, %ecx
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm1
movsd 0x1b050(%rip), %xmm0    # 0x34ff0
mulsd %xmm0, %xmm1
xorpd %xmm2, %xmm2
addsd %xmm1, %xmm2
xorps %xmm1, %xmm1
cvtsd2ss %xmm2, %xmm1
leal -0x1(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm2, %xmm2
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm2
cvtss2sd %xmm1, %xmm3
movsd 0x1b02a(%rip), %xmm1    # 0x34ff8
mulsd %xmm1, %xmm2
addsd %xmm3, %xmm2
cvtsd2ss %xmm2, %xmm2
leal 0x1e(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm3, %xmm3
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm3
cvtss2sd %xmm2, %xmm4
movsd 0x1b00b(%rip), %xmm2    # 0x35000
mulsd %xmm2, %xmm3
addsd %xmm4, %xmm3
cvtsd2ss %xmm3, %xmm3
leal 0x1d(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm4, %xmm4
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm4
cvtss2sd %xmm3, %xmm3
movsd 0x1afec(%rip), %xmm5    # 0x35008
mulsd %xmm5, %xmm4
addsd %xmm3, %xmm4
xorps %xmm3, %xmm3
cvtsd2ss %xmm4, %xmm3
leal 0x1c(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm4, %xmm4
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm4
cvtss2sd %xmm3, %xmm3
mulsd %xmm5, %xmm4
addsd %xmm3, %xmm4
xorps %xmm3, %xmm3
cvtsd2ss %xmm4, %xmm3
leal 0x1b(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm4, %xmm4
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm4
cvtss2sd %xmm3, %xmm3
mulsd %xmm2, %xmm4
addsd %xmm3, %xmm4
xorps %xmm2, %xmm2
cvtsd2ss %xmm4, %xmm2
leal 0x1a(%rax), %ecx
andl $0x1f, %ecx
xorps %xmm3, %xmm3
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm3
cvtss2sd %xmm2, %xmm2
mulsd %xmm1, %xmm3
addsd %xmm2, %xmm3
xorps %xmm1, %xmm1
cvtsd2ss %xmm3, %xmm1
addl $0x19, %eax
andl $0x1f, %eax
xorps %xmm2, %xmm2
cvtss2sd 0x2c(%rdi,%rax,4), %xmm2
cvtss2sd %xmm1, %xmm1
mulsd %xmm0, %xmm2
addsd %xmm1, %xmm2
xorps %xmm0, %xmm0
cvtsd2ss %xmm2, %xmm0
mulss 0x1af55(%rip), %xmm0    # 0x35010
cvttss2si %xmm0, %eax
movw %ax, -0xa(%rbp)
movq 0x120(%rdi), %rsi
cmpq 0x128(%rdi), %rsi
je 0x1a0e3
movw %ax, (%rsi)
addq $0x2, %rsi
movq %rsi, 0x120(%rbx)
jmp 0x1a0f3
leaq 0x118(%rbx), %rdi
leaq -0xa(%rbp), %rdx
callq 0x1aefa
movq 0x118(%rbx), %rsi
movq 0x120(%rbx), %rax
subq %rsi, %rax
cmpq $0x40, %rax
jne 0x1a132
movq 0x108(%rbx), %rdi
movl $0x20, %edx
callq 0x1ac7e
movq 0x118(%rbx), %rax
cmpq %rax, 0x120(%rbx)
je 0x1a132
movq %rax, 0x120(%rbx)
addq $0x8, %rsp
popq %rbx
popq %rbp
retq
nop