void scaleSamples(short *samples, int numSamples, float volume) {
  int fixedPointVolume = volume * 4096.0f;
  int value;
  while (numSamples--) {
    value = (*samples * fixedPointVolume) >> 12;
    if (value > 32767) {
      value = 32767;
    } else if (value < -32767) {
      value = -32767;
    }
    *samples++ = value;
  }
}


x86 assembly (clang, -O0):
<scaleSamples>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movss  0xee8(%rip),%xmm0
mulss  -0x10(%rbp),%xmm0
cvttss2si %xmm0,%eax
mov    %eax,-0x14(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0xc(%rbp)
cmp    $0x0,%eax
je     1198 <scaleSamples+0x98>
mov    -0x8(%rbp),%rax
movswl (%rax),%eax
imul   -0x14(%rbp),%eax
sar    $0xc,%eax
mov    %eax,-0x18(%rbp)
cmpl   $0x7fff,-0x18(%rbp)
jle    1162 <scaleSamples+0x62>
movl   $0x7fff,-0x18(%rbp)
jmp    117b <scaleSamples+0x7b>
cmpl   $0xffff8001,-0x18(%rbp)
jge    1176 <scaleSamples+0x76>
movl   $0xffff8001,-0x18(%rbp)
jmp    117b <scaleSamples+0x7b>
mov    -0x18(%rbp),%eax
mov    %ax,%cx
mov    -0x8(%rbp),%rax
mov    %rax,%rdx
add    $0x2,%rdx
mov    %rdx,-0x8(%rbp)
mov    %cx,(%rax)
jmp    1124 <scaleSamples+0x24>
pop    %rbp
ret

x86 assembly (clang, -O2):
<scaleSamples>:
test   %esi,%esi
je     144c <scaleSamples+0x34c>
mulss  0xef0(%rip),%xmm0
cvttss2si %xmm0,%r11d
lea    -0x1(%rsi),%r9d
cmp    $0x7,%r9d
jb     1401 <scaleSamples+0x301>
add    $0x1,%r9
mov    %r9,%r8
and    $0xfffffffffffffff8,%r8
movd   %r11d,%xmm0
pshufd $0x0,%xmm0,%xmm0
lea    -0x8(%r8),%rax
mov    %rax,%r10
shr    $0x3,%r10
add    $0x1,%r10
pshufd $0xf5,%xmm0,%xmm1
test   %rax,%rax
je     144d <scaleSamples+0x34d>
mov    %r10,%rcx
and    $0xfffffffffffffffe,%rcx
xor    %edx,%edx
movdqa 0xea9(%rip),%xmm8
movdqa 0xeb1(%rip),%xmm3
nop
movdqu (%rdi,%rdx,2),%xmm5
movdqu 0x10(%rdi,%rdx,2),%xmm4
punpckhwd %xmm5,%xmm6
psrad  $0x10,%xmm6
punpcklwd %xmm5,%xmm7
psrad  $0x10,%xmm7
movdqa %xmm0,%xmm5
pmuludq %xmm7,%xmm5
pshufd $0xe8,%xmm5,%xmm2
pshufd $0xf5,%xmm7,%xmm7
pmuludq %xmm1,%xmm7
pshufd $0xe8,%xmm7,%xmm7
punpckldq %xmm7,%xmm2
movdqa %xmm0,%xmm7
pmuludq %xmm6,%xmm7
pshufd $0xe8,%xmm7,%xmm7
pshufd $0xf5,%xmm6,%xmm6
pmuludq %xmm1,%xmm6
pshufd $0xe8,%xmm6,%xmm6
punpckldq %xmm6,%xmm7
movdqa %xmm7,%xmm6
psrad  $0xc,%xmm6
movdqa %xmm2,%xmm5
psrad  $0xc,%xmm5
pcmpgtd %xmm8,%xmm7
pcmpgtd %xmm8,%xmm2
packssdw %xmm7,%xmm2
movdqa %xmm5,%xmm7
pcmpgtd %xmm3,%xmm7
pand   %xmm7,%xmm5
pandn  %xmm3,%xmm7
por    %xmm5,%xmm7
movdqa %xmm6,%xmm5
pcmpgtd %xmm3,%xmm5
pand   %xmm5,%xmm6
pandn  %xmm3,%xmm5
por    %xmm6,%xmm5
pslld  $0x10,%xmm5
psrad  $0x10,%xmm5
pslld  $0x10,%xmm7
psrad  $0x10,%xmm7
packssdw %xmm5,%xmm7
movdqa %xmm2,%xmm5
pandn  %xmm7,%xmm5
psrlw  $0x1,%xmm2
por    %xmm5,%xmm2
movdqu %xmm2,(%rdi,%rdx,2)
punpckhwd %xmm4,%xmm2
psrad  $0x10,%xmm2
punpcklwd %xmm4,%xmm5
psrad  $0x10,%xmm5
movdqa %xmm0,%xmm4
pmuludq %xmm5,%xmm4
pshufd $0xe8,%xmm4,%xmm4
pshufd $0xf5,%xmm5,%xmm5
pmuludq %xmm1,%xmm5
pshufd $0xe8,%xmm5,%xmm5
punpckldq %xmm5,%xmm4
movdqa %xmm0,%xmm5
pmuludq %xmm2,%xmm5
pshufd $0xe8,%xmm5,%xmm5
pshufd $0xf5,%xmm2,%xmm2
pmuludq %xmm1,%xmm2
pshufd $0xe8,%xmm2,%xmm2
punpckldq %xmm2,%xmm5
movdqa %xmm5,%xmm2
psrad  $0xc,%xmm2
movdqa %xmm4,%xmm6
psrad  $0xc,%xmm6
pcmpgtd %xmm8,%xmm5
pcmpgtd %xmm8,%xmm4
packssdw %xmm5,%xmm4
movdqa %xmm6,%xmm5
pcmpgtd %xmm3,%xmm5
pand   %xmm5,%xmm6
pandn  %xmm3,%xmm5
por    %xmm6,%xmm5
movdqa %xmm2,%xmm6
pcmpgtd %xmm3,%xmm6
pand   %xmm6,%xmm2
pandn  %xmm3,%xmm6
por    %xmm2,%xmm6
pslld  $0x10,%xmm6
psrad  $0x10,%xmm6
pslld  $0x10,%xmm5
psrad  $0x10,%xmm5
packssdw %xmm6,%xmm5
movdqa %xmm4,%xmm2
pandn  %xmm5,%xmm2
psrlw  $0x1,%xmm4
por    %xmm2,%xmm4
movdqu %xmm4,0x10(%rdi,%rdx,2)
add    $0x10,%rdx
add    $0xfffffffffffffffe,%rcx
jne    1170 <scaleSamples+0x70>
test   $0x1,%r10b
je     13f5 <scaleSamples+0x2f5>
movdqu (%rdi,%rdx,2),%xmm2
punpckhwd %xmm2,%xmm3
psrad  $0x10,%xmm3
punpcklwd %xmm2,%xmm4
psrad  $0x10,%xmm4
movdqa %xmm0,%xmm2
pmuludq %xmm4,%xmm2
pshufd $0xe8,%xmm2,%xmm2
pshufd $0xf5,%xmm4,%xmm4
pmuludq %xmm1,%xmm4
pshufd $0xe8,%xmm4,%xmm4
punpckldq %xmm4,%xmm2
pmuludq %xmm3,%xmm0
pshufd $0xe8,%xmm0,%xmm0
pshufd $0xf5,%xmm3,%xmm3
pmuludq %xmm1,%xmm3
pshufd $0xe8,%xmm3,%xmm1
punpckldq %xmm1,%xmm0
movdqa %xmm0,%xmm1
psrad  $0xc,%xmm1
movdqa %xmm2,%xmm3
psrad  $0xc,%xmm3
movdqa 0xc85(%rip),%xmm4
pcmpgtd %xmm4,%xmm0
pcmpgtd %xmm4,%xmm2
packssdw %xmm0,%xmm2
movdqa 0xc81(%rip),%xmm0
movdqa %xmm3,%xmm4
pcmpgtd %xmm0,%xmm4
pand   %xmm4,%xmm3
pandn  %xmm0,%xmm4
por    %xmm3,%xmm4
movdqa %xmm1,%xmm3
pcmpgtd %xmm0,%xmm3
pand   %xmm3,%xmm1
pandn  %xmm0,%xmm3
por    %xmm1,%xmm3
pslld  $0x10,%xmm3
psrad  $0x10,%xmm3
pslld  $0x10,%xmm4
psrad  $0x10,%xmm4
packssdw %xmm3,%xmm4
movdqa %xmm2,%xmm0
pandn  %xmm4,%xmm0
psrlw  $0x1,%xmm2
por    %xmm0,%xmm2
movdqu %xmm2,(%rdi,%rdx,2)
cmp    %r8,%r9
je     144c <scaleSamples+0x34c>
lea    (%rdi,%r8,2),%rdi
sub    %r8d,%esi
mov    %esi,%ecx
xor    %edx,%edx
mov    $0x8001,%r8d
mov    $0x7fff,%r9d
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movswl (%rdi,%rdx,2),%eax
imul   %r11d,%eax
mov    %eax,%esi
sar    $0xc,%esi
cmp    $0xffff8002,%esi
cmovl  %r8d,%esi
cmp    $0x8000000,%eax
cmovge %r9d,%esi
mov    %si,(%rdi,%rdx,2)
add    $0x1,%rdx
cmp    %edx,%ecx
jne    1420 <scaleSamples+0x320>
ret
xor    %edx,%edx
test   $0x1,%r10b
jne    1320 <scaleSamples+0x220>
jmp    13f5 <scaleSamples+0x2f5>

LLVM IR (-O0):
define void @scaleSamples(i16* %0, i32 %1, float %2) {
%4 = alloca i16*
%5 = alloca i32
%6 = alloca float
%7 = alloca i32
%8 = alloca i32
store i16* %0, i16** %4
store i32 %1, i32* %5
store float %2, float* %6
%9 = load float, float* %6
%10 = fmul float %9, 4.096000e+03
%11 = fptosi float %10 to i32
store i32 %11, i32* %7
br label %12
12: ; preds = %31, %3
%13 = load i32, i32* %5
%14 = add nsw i32 %13, -1
store i32 %14, i32* %5
%15 = icmp ne i32 %13, 0
br i1 %15, label %16, label %36
16: ; preds = %12
%17 = load i16*, i16** %4
%18 = load i16, i16* %17
%19 = sext i16 %18 to i32
%20 = load i32, i32* %7
%21 = mul nsw i32 %19, %20
%22 = ashr i32 %21, 12
store i32 %22, i32* %8
%23 = load i32, i32* %8
%24 = icmp sgt i32 %23, 32767
br i1 %24, label %25, label %26
25: ; preds = %16
store i32 32767, i32* %8
br label %31
26: ; preds = %16
%27 = load i32, i32* %8
%28 = icmp slt i32 %27, -32767
br i1 %28, label %29, label %30
29: ; preds = %26
store i32 -32767, i32* %8
br label %30
30: ; preds = %29, %26
br label %31
31: ; preds = %30, %25
%32 = load i32, i32* %8
%33 = trunc i32 %32 to i16
%34 = load i16*, i16** %4
%35 = getelementptr inbounds i16, i16* %34, i32 1
store i16* %35, i16** %4
store i16 %33, i16* %34
br label %12
36: ; preds = %12
ret void
}

LLVM IR (-O2):
define void @scaleSamples(i16* nocapture %0, i32 %1, float %2) {
%4 = fmul float %2, 4.096000e+03
%5 = fptosi float %4 to i32
%6 = icmp eq i32 %1, 0
br i1 %6, label %93, label %7
7: ; preds = %3
%8 = add i32 %1, -1
%9 = zext i32 %8 to i64
%10 = add nuw nsw i64 %9, 1
%11 = icmp ult i32 %8, 7
br i1 %11, label %75, label %12
12: ; preds = %7
%13 = and i64 %10, 8589934584
%14 = getelementptr i16, i16* %0, i64 %13
%15 = trunc i64 %13 to i32
%16 = sub i32 %1, %15
%17 = insertelement <8 x i32> poison, i32 %5, i64 0
%18 = shufflevector <8 x i32> %17, <8 x i32> poison, <8 x i32> zeroinitializer
%19 = add nsw i64 %13, -8
%20 = lshr exact i64 %19, 3
%21 = add nuw nsw i64 %20, 1
%22 = and i64 %21, 1
%23 = icmp eq i64 %19, 0
br i1 %23, label %57, label %24
24: ; preds = %12
%25 = and i64 %21, 4611686018427387902
br label %26
26: ; preds = %26, %24
%27 = phi i64 [ 0, %24 ], [ %54, %26 ]
%28 = phi i64 [ 0, %24 ], [ %55, %26 ]
%29 = getelementptr i16, i16* %0, i64 %27
%30 = bitcast i16* %29 to <8 x i16>*
%31 = load <8 x i16>, <8 x i16>* %30
%32 = sext <8 x i16> %31 to <8 x i32>
%33 = mul nsw <8 x i32> %18, %32
%34 = ashr <8 x i32> %33, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
%35 = icmp sgt <8 x i32> %33, <i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727>
%36 = icmp sgt <8 x i32> %34, <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%37 = select <8 x i1> %36, <8 x i32> %34, <8 x i32> <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%38 = trunc <8 x i32> %37 to <8 x i16>
%39 = select <8 x i1> %35, <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>, <8 x i16> %38
%40 = bitcast i16* %29 to <8 x i16>*
store <8 x i16> %39, <8 x i16>* %40
%41 = or i64 %27, 8
%42 = getelementptr i16, i16* %0, i64 %41
%43 = bitcast i16* %42 to <8 x i16>*
%44 = load <8 x i16>, <8 x i16>* %43
%45 = sext <8 x i16> %44 to <8 x i32>
%46 = mul nsw <8 x i32> %18, %45
%47 = ashr <8 x i32> %46, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
%48 = icmp sgt <8 x i32> %46, <i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727>
%49 = icmp sgt <8 x i32> %47, <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%50 = select <8 x i1> %49, <8 x i32> %47, <8 x i32> <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%51 = trunc <8 x i32> %50 to <8 x i16>
%52 = select <8 x i1> %48, <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>, <8 x i16> %51
%53 = bitcast i16* %42 to <8 x i16>*
store <8 x i16> %52, <8 x i16>* %53
%54 = add nuw i64 %27, 16
%55 = add i64 %28, 2
%56 = icmp eq i64 %55, %25
br i1 %56, label %57, label %26
57: ; preds = %26, %12
%58 = phi i64 [ 0, %12 ], [ %54, %26 ]
%59 = icmp eq i64 %22, 0
br i1 %59, label %73, label %60
60: ; preds = %57
%61 = getelementptr i16, i16* %0, i64 %58
%62 = bitcast i16* %61 to <8 x i16>*
%63 = load <8 x i16>, <8 x i16>* %62
%64 = sext <8 x i16> %63 to <8 x i32>
%65 = mul nsw <8 x i32> %18, %64
%66 = ashr <8 x i32> %65, <i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12, i32 12>
%67 = icmp sgt <8 x i32> %65, <i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727, i32 134217727>
%68 = icmp sgt <8 x i32> %66, <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%69 = select <8 x i1> %68, <8 x i32> %66, <8 x i32> <i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767, i32 -32767>
%70 = trunc <8 x i32> %69 to <8 x i16>
%71 = select <8 x i1> %67, <8 x i16> <i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767, i16 32767>, <8 x i16> %70
%72 = bitcast i16* %61 to <8 x i16>*
store <8 x i16> %71, <8 x i16>* %72
br label %73
73: ; preds = %57, %60
%74 = icmp eq i64 %10, %13
br i1 %74, label %93, label %75
75: ; preds = %7, %73
%76 = phi i16* [ %0, %7 ], [ %14, %73 ]
%77 = phi i32 [ %1, %7 ], [ %16, %73 ]
br label %78
78: ; preds = %75, %78
%79 = phi i16* [ %91, %78 ], [ %76, %75 ]
%80 = phi i32 [ %81, %78 ], [ %77, %75 ]
%81 = add nsw i32 %80, -1
%82 = load i16, i16* %79
%83 = sext i16 %82 to i32
%84 = mul nsw i32 %83, %5
%85 = ashr i32 %84, 12
%86 = icmp sgt i32 %84, 134217727
%87 = icmp sgt i32 %85, -32767
%88 = select i1 %87, i32 %85, i32 -32767
%89 = trunc i32 %88 to i16
%90 = select i1 %86, i16 32767, i16 %89
%91 = getelementptr inbounds i16, i16* %79, i64 1
store i16 %90, i16* %79
%92 = icmp eq i32 %81, 0
br i1 %92, label %93, label %78
93: ; preds = %78, %73, %3
ret void
}