// File: /workspace/github_cpp_makefile_star2_O3/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 %r14
pushq %rbx
subq $0x10, %rsp
movq %rdi, %rbx
movl 0xb0(%rdi), %eax
movl %eax, %ecx
andl $0x1f, %ecx
cvtss2sd 0x2c(%rdi,%rcx,4), %xmm1
movsd 0x1b08f(%rip), %xmm0    # 0x33ff0
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 0x1b069(%rip), %xmm1    # 0x33ff8
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 0x1b04a(%rip), %xmm2    # 0x34000
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 0x1b02b(%rip), %xmm5    # 0x34008
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 0x1af94(%rip), %xmm0    # 0x34010
cvttss2si %xmm0, %eax
leaq 0x118(%rdi), %r14
movw %ax, -0x12(%rbp)
movq 0x120(%rdi), %rsi
cmpq 0x128(%rdi), %rsi
je 0x190ab
movw %ax, (%rsi)
addq $0x2, %rsi
movq %rsi, 0x120(%rbx)
jmp 0x190be
leaq -0x12(%rbp), %rdx
movq %r14, %rdi
callq 0x19ebe
movq 0x120(%rbx), %rsi
movq (%r14), %rax
subq %rax, %rsi
cmpq $0x40, %rsi
jne 0x190f5
movq 0x108(%rbx), %rdi
movq %rax, %rsi
movl $0x20, %edx
callq 0x19c34
movq 0x118(%rbx), %rax
cmpq %rax, 0x120(%rbx)
je 0x190f5
movq %rax, 0x120(%rbx)
addq $0x10, %rsp
popq %rbx
popq %r14
popq %rbp
retq