void nelly_util_floats2shorts(float audio[256], short shorts[256]) {
  int i;
  for (i = 0; i < 256; i++) {
    if (audio[i] >= 32767.0)
      shorts[i] = 32767;
    else if (audio[i] <= -32768.0)
      shorts[i] = -32768;
    else
      shorts[i] = (short)audio[i];
  }
}


x86 assembly (clang, -O0):
<nelly_util_floats2shorts>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
cmpl   $0x100,-0x14(%rbp)
jge    11c4 <nelly_util_floats2shorts+0xc4>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec7(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1156 <nelly_util_floats2shorts+0x56>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movw   $0x7fff,(%rax,%rcx,2)
jmp    11b1 <nelly_util_floats2shorts+0xb1>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xe99(%rip),%xmm0
ucomisd %xmm1,%xmm0
jb     118c <nelly_util_floats2shorts+0x8c>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movw   $0x8000,(%rax,%rcx,2)
jmp    11ac <nelly_util_floats2shorts+0xac>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvttss2si %xmm0,%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    11b1 <nelly_util_floats2shorts+0xb1>
jmp    11b6 <nelly_util_floats2shorts+0xb6>
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1113 <nelly_util_floats2shorts+0x13>
pop    %rbp
ret

x86 assembly (clang, -O2):
<nelly_util_floats2shorts>:
xor    %eax,%eax
movaps 0xef7(%rip),%xmm2
movaps 0xeff(%rip),%xmm8
movdqa 0xf06(%rip),%xmm9
nopw   0x0(%rax,%rax,1)
movups (%rdi,%rax,4),%xmm4
movups 0x10(%rdi,%rax,4),%xmm3
movaps %xmm2,%xmm5
cmpnleps %xmm4,%xmm5
movaps %xmm2,%xmm6
cmpnleps %xmm3,%xmm6
movaps %xmm2,%xmm7
cmpleps %xmm4,%xmm7
movaps %xmm2,%xmm0
andps  %xmm7,%xmm0
andnps %xmm4,%xmm7
cmpleps %xmm8,%xmm4
andps  %xmm5,%xmm4
movaps %xmm2,%xmm5
cmpleps %xmm3,%xmm5
movaps %xmm2,%xmm1
andps  %xmm5,%xmm1
andnps %xmm3,%xmm5
cmpleps %xmm8,%xmm3
andps  %xmm6,%xmm3
packssdw %xmm4,%xmm4
packssdw %xmm3,%xmm3
orps   %xmm0,%xmm7
cvttps2dq %xmm7,%xmm0
packssdw %xmm0,%xmm0
orps   %xmm1,%xmm5
cvttps2dq %xmm5,%xmm1
packssdw %xmm1,%xmm1
movdqa %xmm4,%xmm5
pandn  %xmm0,%xmm5
pand   %xmm9,%xmm4
por    %xmm5,%xmm4
movdqa %xmm3,%xmm0
pandn  %xmm1,%xmm0
pand   %xmm9,%xmm3
por    %xmm0,%xmm3
punpcklqdq %xmm3,%xmm4
movdqu %xmm4,(%rsi,%rax,2)
add    $0x8,%rax
cmp    $0x100,%rax
jne    1120 <nelly_util_floats2shorts+0x20>
ret

LLVM IR (-O0):
define void @nelly_util_floats2shorts(float* %0, i16* %1) {
%3 = alloca float*
%4 = alloca i16*
%5 = alloca i32
store float* %0, float** %3
store i16* %1, i16** %4
store i32 0, i32* %5
br label %6
6: ; preds = %48, %2
%7 = load i32, i32* %5
%8 = icmp slt i32 %7, 256
br i1 %8, label %9, label %51
9: ; preds = %6
%10 = load float*, float** %3
%11 = load i32, i32* %5
%12 = sext i32 %11 to i64
%13 = getelementptr inbounds float, float* %10, i64 %12
%14 = load float, float* %13
%15 = fpext float %14 to double
%16 = fcmp oge double %15, 3.276700e+04
br i1 %16, label %17, label %22
17: ; preds = %9
%18 = load i16*, i16** %4
%19 = load i32, i32* %5
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds i16, i16* %18, i64 %20
store i16 32767, i16* %21
br label %47
22: ; preds = %9
%23 = load float*, float** %3
%24 = load i32, i32* %5
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds float, float* %23, i64 %25
%27 = load float, float* %26
%28 = fpext float %27 to double
%29 = fcmp ole double %28, -3.276800e+04
br i1 %29, label %30, label %35
30: ; preds = %22
%31 = load i16*, i16** %4
%32 = load i32, i32* %5
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds i16, i16* %31, i64 %33
store i16 -32768, i16* %34
br label %46
35: ; preds = %22
%36 = load float*, float** %3
%37 = load i32, i32* %5
%38 = sext i32 %37 to i64
%39 = getelementptr inbounds float, float* %36, i64 %38
%40 = load float, float* %39
%41 = fptosi float %40 to i16
%42 = load i16*, i16** %4
%43 = load i32, i32* %5
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds i16, i16* %42, i64 %44
store i16 %41, i16* %45
br label %46
46: ; preds = %35, %30
br label %47
47: ; preds = %46, %17
br label %48
48: ; preds = %47
%49 = load i32, i32* %5
%50 = add nsw i32 %49, 1
store i32 %50, i32* %5
br label %6
51: ; preds = %6
ret void
}

LLVM IR (-O2):
define void @nelly_util_floats2shorts(float* nocapture %0, i16* nocapture writeonly %1) {
br label %3
3: ; preds = %3, %2
%4 = phi i64 [ 0, %2 ], [ %29, %3 ]
%5 = getelementptr inbounds float, float* %0, i64 %4
%6 = bitcast float* %5 to <4 x float>*
%7 = load <4 x float>, <4 x float>* %6
%8 = getelementptr inbounds float, float* %5, i64 4
%9 = bitcast float* %8 to <4 x float>*
%10 = load <4 x float>, <4 x float>* %9
%11 = fcmp ult <4 x float> %7, <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>
%12 = fcmp ult <4 x float> %10, <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>
%13 = fcmp ole <4 x float> %7, <float -3.276800e+04, float -3.276800e+04, float -3.276800e+04, float -3.276800e+04>
%14 = fcmp ole <4 x float> %10, <float -3.276800e+04, float -3.276800e+04, float -3.276800e+04, float -3.276800e+04>
%15 = and <4 x i1> %11, %13
%16 = and <4 x i1> %12, %14
%17 = fcmp oge <4 x float> %7, <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>
%18 = select <4 x i1> %17, <4 x float> <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>, <4 x float> %7
%19 = fptosi <4 x float> %18 to <4 x i16>
%20 = fcmp oge <4 x float> %10, <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>
%21 = select <4 x i1> %20, <4 x float> <float 3.276700e+04, float 3.276700e+04, float 3.276700e+04, float 3.276700e+04>, <4 x float> %10
%22 = fptosi <4 x float> %21 to <4 x i16>
%23 = select <4 x i1> %15, <4 x i16> <i16 -32768, i16 -32768, i16 -32768, i16 -32768>, <4 x i16> %19
%24 = select <4 x i1> %16, <4 x i16> <i16 -32768, i16 -32768, i16 -32768, i16 -32768>, <4 x i16> %22
%25 = getelementptr inbounds i16, i16* %1, i64 %4
%26 = bitcast i16* %25 to <4 x i16>*
store <4 x i16> %23, <4 x i16>* %26
%27 = getelementptr inbounds i16, i16* %25, i64 4
%28 = bitcast i16* %27 to <4 x i16>*
store <4 x i16> %24, <4 x i16>* %28
%29 = add nuw i64 %4, 8
%30 = icmp eq i64 %29, 256
br i1 %30, label %31, label %3
31: ; preds = %3
ret void
}