#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
float sin(float);
void add_sinewave(short *buffer, int buffer_length, float frequency,
                  float sampling_ratio, float amplitude) {
  int i;
  for (i = 0; i < buffer_length; i++) {
    float theta = ((float)i / sampling_ratio) * 3.14159265358979323846;
    buffer[i] += (short)(sin(theta * frequency) * 32767.0f * amplitude);
  }
}


x86 assembly (clang, -O0):
<add_sinewave>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movss  %xmm1,-0x14(%rbp)
movss  %xmm2,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    11b7 <add_sinewave+0xa7>
cvtsi2ssl -0x1c(%rbp),%xmm0
movss  -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xea5(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x20(%rbp),%xmm0
movss  -0x10(%rbp),%xmm1
mulss  %xmm1,%xmm0
call   1030 <sin@plt>
movss  0xe85(%rip),%xmm1
mulss  %xmm1,%xmm0
movss  -0x18(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
movswl %ax,%esi
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movswl (%rax,%rcx,2),%edx
add    %esi,%edx
mov    %dx,(%rax,%rcx,2)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1135 <add_sinewave+0x25>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<add_sinewave>:
push   %r15
push   %r14
push   %rbx
sub    $0x10,%rsp
test   %esi,%esi
jle    1194 <add_sinewave+0x84>
movaps %xmm0,%xmm3
mov    %rdi,%r14
mov    %esi,%r15d
xor    %ebx,%ebx
movss  %xmm2,0xc(%rsp)
movss  %xmm1,0x8(%rsp)
movss  %xmm0,0x4(%rsp)
nopw   0x0(%rax,%rax,1)
xorps  %xmm0,%xmm0
cvtsi2ss %ebx,%xmm0
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0xea9(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
mulss  %xmm3,%xmm0
call   1030 <sin@plt>
movss  0x4(%rsp),%xmm3
movss  0x8(%rsp),%xmm1
movss  0xc(%rsp),%xmm2
mulss  0xe8a(%rip),%xmm0
mulss  %xmm2,%xmm0
cvttss2si %xmm0,%eax
add    %ax,(%r14,%rbx,2)
add    $0x1,%rbx
cmp    %rbx,%r15
jne    1140 <add_sinewave+0x30>
add    $0x10,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret

LLVM IR (-O0):
define void @add_sinewave(i16* %0, i32 %1, float %2, float %3, float %4) {
%6 = alloca i16*
%7 = alloca i32
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca i32
%12 = alloca float
store i16* %0, i16** %6
store i32 %1, i32* %7
store float %2, float* %8
store float %3, float* %9
store float %4, float* %10
store i32 0, i32* %11
br label %13
13: ; preds = %42, %5
%14 = load i32, i32* %11
%15 = load i32, i32* %7
%16 = icmp slt i32 %14, %15
br i1 %16, label %17, label %45
17: ; preds = %13
%18 = load i32, i32* %11
%19 = sitofp i32 %18 to float
%20 = load float, float* %9
%21 = fdiv float %19, %20
%22 = fpext float %21 to double
%23 = fmul double %22, 0x400921FB54442D18
%24 = fptrunc double %23 to float
store float %24, float* %12
%25 = load float, float* %12
%26 = load float, float* %8
%27 = fmul float %25, %26
%28 = call float @sin(float %27)
%29 = fmul float %28, 3.276700e+04
%30 = load float, float* %10
%31 = fmul float %29, %30
%32 = fptosi float %31 to i16
%33 = sext i16 %32 to i32
%34 = load i16*, i16** %6
%35 = load i32, i32* %11
%36 = sext i32 %35 to i64
%37 = getelementptr inbounds i16, i16* %34, i64 %36
%38 = load i16, i16* %37
%39 = sext i16 %38 to i32
%40 = add nsw i32 %39, %33
%41 = trunc i32 %40 to i16
store i16 %41, i16* %37
br label %42
42: ; preds = %17
%43 = load i32, i32* %11
%44 = add nsw i32 %43, 1
store i32 %44, i32* %11
br label %13
45: ; preds = %13
ret void
}

LLVM IR (-O2):
define void @add_sinewave(i16* nocapture %0, i32 %1, float %2, float %3, float %4) {
%6 = icmp sgt i32 %1, 0
br i1 %6, label %7, label %27
7: ; preds = %5
%8 = zext i32 %1 to i64
br label %9
9: ; preds = %7, %9
%10 = phi i64 [ 0, %7 ], [ %25, %9 ]
%11 = trunc i64 %10 to i32
%12 = sitofp i32 %11 to float
%13 = fdiv float %12, %3
%14 = fpext float %13 to double
%15 = fmul double %14, 0x400921FB54442D18
%16 = fptrunc double %15 to float
%17 = fmul float %16, %2
%18 = tail call float @sin(float %17)
%19 = fmul float %18, 3.276700e+04
%20 = fmul float %19, %4
%21 = fptosi float %20 to i16
%22 = getelementptr inbounds i16, i16* %0, i64 %10
%23 = load i16, i16* %22
%24 = add i16 %23, %21
store i16 %24, i16* %22
%25 = add nuw nsw i64 %10, 1
%26 = icmp eq i64 %25, %8
br i1 %26, label %27, label %9
27: ; preds = %9, %5
ret void
}