void tr_convert_pcm16_float(signed short int *pPCMData, float *pOutput,
                            unsigned int pNumSamples) {
  const double gain = 1.0 / 32768.0;
  unsigned int remainder = pNumSamples % 8;
  pNumSamples -= remainder;
  while (pNumSamples > 0) {
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    *pOutput++ = (*pPCMData++) * gain;
    pNumSamples -= 8;
  }
  switch (remainder) {
  case 7:
    *pOutput++ = (*pPCMData++) * gain;
  case 6:
    *pOutput++ = (*pPCMData++) * gain;
  case 5:
    *pOutput++ = (*pPCMData++) * gain;
  case 4:
    *pOutput++ = (*pPCMData++) * gain;
  case 3:
    *pOutput++ = (*pPCMData++) * gain;
  case 2:
    *pOutput++ = (*pPCMData++) * gain;
  case 1:
    *pOutput++ = (*pPCMData++) * gain;
  }
}


x86 assembly (clang, -O0):
<tr_convert_pcm16_float>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movsd  0xee9(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x14(%rbp),%eax
and    $0x7,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%ecx
mov    -0x14(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
jbe    1310 <tr_convert_pcm16_float+0x210>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xea8(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe6f(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe36(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xdfd(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xdc4(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xd8b(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xd52(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xd19(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x14(%rbp),%eax
sub    $0x8,%eax
mov    %eax,-0x14(%rbp)
jmp    1130 <tr_convert_pcm16_float+0x30>
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x30(%rbp)
sub    $0x6,%eax
ja     14c8 <tr_convert_pcm16_float+0x3c8>
mov    -0x30(%rbp),%rax
lea    0xcd8(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xca9(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xc70(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xc37(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xbfe(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xbc5(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xb8c(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x8(%rbp)
movswl (%rax),%eax
cvtsi2sd %eax,%xmm0
movsd  0xb53(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<tr_convert_pcm16_float>:
push   %rbx
mov    %edx,%r8d
and    $0x7,%r8d
and    $0xfffffff8,%edx
je     1280 <tr_convert_pcm16_float+0x180>
mov    %edx,%r9d
add    $0xfffffff8,%r9d
je     128b <tr_convert_pcm16_float+0x18b>
shr    $0x3,%r9d
add    $0x1,%r9d
mov    %r9d,%r10d
and    $0xfffffffe,%r10d
mov    %r10,%rcx
shl    $0x4,%rcx
add    %rdi,%rcx
mov    %r10,%r11
shl    $0x5,%r11
add    %rsi,%r11
lea    0x0(,%r10,8),%eax
sub    %eax,%edx
xor    %eax,%eax
movapd 0xeab(%rip),%xmm0
mov    %r10,%rbx
nopl   0x0(%rax,%rax,1)
movdqu (%rdi,%rax,1),%xmm2
movdqu 0x10(%rdi,%rax,1),%xmm4
movdqa %xmm2,%xmm3
punpcklwd %xmm4,%xmm3
pshuflw $0x60,%xmm3,%xmm1
psrad  $0x10,%xmm1
cvtdq2pd %xmm1,%xmm1
mulpd  %xmm0,%xmm1
cvtpd2ps %xmm1,%xmm1
movdqa %xmm2,%xmm5
punpckldq %xmm4,%xmm5
pshufd $0xee,%xmm5,%xmm6
psrad  $0x10,%xmm5
cvtdq2pd %xmm5,%xmm5
mulpd  %xmm0,%xmm5
cvtpd2ps %xmm5,%xmm8
punpckhwd %xmm3,%xmm3
psrad  $0x10,%xmm3
cvtdq2pd %xmm3,%xmm3
mulpd  %xmm0,%xmm3
cvtpd2ps %xmm3,%xmm3
psrad  $0x10,%xmm6
cvtdq2pd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
cvtpd2ps %xmm6,%xmm7
movdqa %xmm2,%xmm5
punpckhwd %xmm4,%xmm5
pshuflw $0x60,%xmm5,%xmm6
psrad  $0x10,%xmm6
cvtdq2pd %xmm6,%xmm6
mulpd  %xmm0,%xmm6
cvtpd2ps %xmm6,%xmm6
punpckhdq %xmm4,%xmm2
pshufd $0xee,%xmm2,%xmm4
psrad  $0x10,%xmm2
cvtdq2pd %xmm2,%xmm2
mulpd  %xmm0,%xmm2
cvtpd2ps %xmm2,%xmm2
punpckhwd %xmm5,%xmm5
psrad  $0x10,%xmm5
cvtdq2pd %xmm5,%xmm5
mulpd  %xmm0,%xmm5
cvtpd2ps %xmm5,%xmm5
unpcklpd %xmm8,%xmm1
psrad  $0x10,%xmm4
cvtdq2pd %xmm4,%xmm4
unpcklpd %xmm7,%xmm3
mulpd  %xmm0,%xmm4
cvtpd2ps %xmm4,%xmm4
unpcklpd %xmm2,%xmm6
unpcklpd %xmm4,%xmm5
movapd %xmm1,%xmm2
shufps $0x88,%xmm3,%xmm2
movapd %xmm6,%xmm4
shufps $0x88,%xmm5,%xmm4
shufps $0xdd,%xmm3,%xmm1
shufps $0xdd,%xmm5,%xmm6
movups %xmm6,0x30(%rsi,%rax,2)
movups %xmm1,0x20(%rsi,%rax,2)
movups %xmm4,0x10(%rsi,%rax,2)
movups %xmm2,(%rsi,%rax,2)
add    $0x20,%rax
add    $0xfffffffffffffffe,%rbx
jne    1160 <tr_convert_pcm16_float+0x60>
cmp    %r9,%r10
jne    1291 <tr_convert_pcm16_float+0x191>
jmp    1315 <tr_convert_pcm16_float+0x215>
mov    %rsi,%r11
mov    %rdi,%rcx
jmp    1315 <tr_convert_pcm16_float+0x215>
mov    %rdi,%rcx
mov    %rsi,%r11
movapd 0xd67(%rip),%xmm0
nopl   0x0(%rax)
movq   (%rcx),%xmm1
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
cvtdq2pd %xmm1,%xmm2
pshufd $0xee,%xmm1,%xmm1
cvtdq2pd %xmm1,%xmm1
mulpd  %xmm0,%xmm2
cvtpd2ps %xmm2,%xmm2
mulpd  %xmm0,%xmm1
cvtpd2ps %xmm1,%xmm1
unpcklpd %xmm1,%xmm2
movupd %xmm2,(%r11)
movq   0x8(%rcx),%xmm1
add    $0x10,%rcx
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
cvtdq2pd %xmm1,%xmm2
pshufd $0xee,%xmm1,%xmm1
cvtdq2pd %xmm1,%xmm1
mulpd  %xmm0,%xmm1
mulpd  %xmm0,%xmm2
cvtpd2ps %xmm2,%xmm2
cvtpd2ps %xmm1,%xmm1
unpcklpd %xmm1,%xmm2
movupd %xmm2,0x10(%r11)
add    $0x20,%r11
add    $0xfffffff8,%edx
jne    12a0 <tr_convert_pcm16_float+0x1a0>
add    $0xffffffff,%r8d
cmp    $0x6,%r8d
ja     1420 <tr_convert_pcm16_float+0x320>
lea    0xcee(%rip),%rax
movslq (%rax,%r8,4),%rdx
add    %rax,%rdx
jmp    *%rdx
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xcc7(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xca4(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc81(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc5e(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc3b(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
add    $0x2,%rcx
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xc18(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
add    $0x4,%r11
movswl (%rcx),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
mulsd  0xbf9(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r11)
pop    %rbx
ret

LLVM IR (-O0):
define void @tr_convert_pcm16_float(i16* %0, float* %1, i32 %2) {
%4 = alloca i16*
%5 = alloca float*
%6 = alloca i32
%7 = alloca double
%8 = alloca i32
store i16* %0, i16** %4
store float* %1, float** %5
store i32 %2, i32* %6
store double 0x3F00000000000000, double* %7
%9 = load i32, i32* %6
%10 = urem i32 %9, 8
store i32 %10, i32* %8
%11 = load i32, i32* %8
%12 = load i32, i32* %6
%13 = sub i32 %12, %11
store i32 %13, i32* %6
br label %14
14: ; preds = %17, %3
%15 = load i32, i32* %6
%16 = icmp ugt i32 %15, 0
br i1 %16, label %17, label %92
17: ; preds = %14
%18 = load i16*, i16** %4
%19 = getelementptr inbounds i16, i16* %18, i32 1
store i16* %19, i16** %4
%20 = load i16, i16* %18
%21 = sext i16 %20 to i32
%22 = sitofp i32 %21 to double
%23 = fmul double %22, 0x3F00000000000000
%24 = fptrunc double %23 to float
%25 = load float*, float** %5
%26 = getelementptr inbounds float, float* %25, i32 1
store float* %26, float** %5
store float %24, float* %25
%27 = load i16*, i16** %4
%28 = getelementptr inbounds i16, i16* %27, i32 1
store i16* %28, i16** %4
%29 = load i16, i16* %27
%30 = sext i16 %29 to i32
%31 = sitofp i32 %30 to double
%32 = fmul double %31, 0x3F00000000000000
%33 = fptrunc double %32 to float
%34 = load float*, float** %5
%35 = getelementptr inbounds float, float* %34, i32 1
store float* %35, float** %5
store float %33, float* %34
%36 = load i16*, i16** %4
%37 = getelementptr inbounds i16, i16* %36, i32 1
store i16* %37, i16** %4
%38 = load i16, i16* %36
%39 = sext i16 %38 to i32
%40 = sitofp i32 %39 to double
%41 = fmul double %40, 0x3F00000000000000
%42 = fptrunc double %41 to float
%43 = load float*, float** %5
%44 = getelementptr inbounds float, float* %43, i32 1
store float* %44, float** %5
store float %42, float* %43
%45 = load i16*, i16** %4
%46 = getelementptr inbounds i16, i16* %45, i32 1
store i16* %46, i16** %4
%47 = load i16, i16* %45
%48 = sext i16 %47 to i32
%49 = sitofp i32 %48 to double
%50 = fmul double %49, 0x3F00000000000000
%51 = fptrunc double %50 to float
%52 = load float*, float** %5
%53 = getelementptr inbounds float, float* %52, i32 1
store float* %53, float** %5
store float %51, float* %52
%54 = load i16*, i16** %4
%55 = getelementptr inbounds i16, i16* %54, i32 1
store i16* %55, i16** %4
%56 = load i16, i16* %54
%57 = sext i16 %56 to i32
%58 = sitofp i32 %57 to double
%59 = fmul double %58, 0x3F00000000000000
%60 = fptrunc double %59 to float
%61 = load float*, float** %5
%62 = getelementptr inbounds float, float* %61, i32 1
store float* %62, float** %5
store float %60, float* %61
%63 = load i16*, i16** %4
%64 = getelementptr inbounds i16, i16* %63, i32 1
store i16* %64, i16** %4
%65 = load i16, i16* %63
%66 = sext i16 %65 to i32
%67 = sitofp i32 %66 to double
%68 = fmul double %67, 0x3F00000000000000
%69 = fptrunc double %68 to float
%70 = load float*, float** %5
%71 = getelementptr inbounds float, float* %70, i32 1
store float* %71, float** %5
store float %69, float* %70
%72 = load i16*, i16** %4
%73 = getelementptr inbounds i16, i16* %72, i32 1
store i16* %73, i16** %4
%74 = load i16, i16* %72
%75 = sext i16 %74 to i32
%76 = sitofp i32 %75 to double
%77 = fmul double %76, 0x3F00000000000000
%78 = fptrunc double %77 to float
%79 = load float*, float** %5
%80 = getelementptr inbounds float, float* %79, i32 1
store float* %80, float** %5
store float %78, float* %79
%81 = load i16*, i16** %4
%82 = getelementptr inbounds i16, i16* %81, i32 1
store i16* %82, i16** %4
%83 = load i16, i16* %81
%84 = sext i16 %83 to i32
%85 = sitofp i32 %84 to double
%86 = fmul double %85, 0x3F00000000000000
%87 = fptrunc double %86 to float
%88 = load float*, float** %5
%89 = getelementptr inbounds float, float* %88, i32 1
store float* %89, float** %5
store float %87, float* %88
%90 = load i32, i32* %6
%91 = sub i32 %90, 8
store i32 %91, i32* %6
br label %14
92: ; preds = %14
%93 = load i32, i32* %8
switch i32 %93, label %164 [
i32 7, label %94
i32 6, label %104
i32 5, label %114
i32 4, label %124
i32 3, label %134
i32 2, label %144
i32 1, label %154
]
94: ; preds = %92
%95 = load i16*, i16** %4
%96 = getelementptr inbounds i16, i16* %95, i32 1
store i16* %96, i16** %4
%97 = load i16, i16* %95
%98 = sext i16 %97 to i32
%99 = sitofp i32 %98 to double
%100 = fmul double %99, 0x3F00000000000000
%101 = fptrunc double %100 to float
%102 = load float*, float** %5
%103 = getelementptr inbounds float, float* %102, i32 1
store float* %103, float** %5
store float %101, float* %102
br label %104
104: ; preds = %92, %94
%105 = load i16*, i16** %4
%106 = getelementptr inbounds i16, i16* %105, i32 1
store i16* %106, i16** %4
%107 = load i16, i16* %105
%108 = sext i16 %107 to i32
%109 = sitofp i32 %108 to double
%110 = fmul double %109, 0x3F00000000000000
%111 = fptrunc double %110 to float
%112 = load float*, float** %5
%113 = getelementptr inbounds float, float* %112, i32 1
store float* %113, float** %5
store float %111, float* %112
br label %114
114: ; preds = %92, %104
%115 = load i16*, i16** %4
%116 = getelementptr inbounds i16, i16* %115, i32 1
store i16* %116, i16** %4
%117 = load i16, i16* %115
%118 = sext i16 %117 to i32
%119 = sitofp i32 %118 to double
%120 = fmul double %119, 0x3F00000000000000
%121 = fptrunc double %120 to float
%122 = load float*, float** %5
%123 = getelementptr inbounds float, float* %122, i32 1
store float* %123, float** %5
store float %121, float* %122
br label %124
124: ; preds = %92, %114
%125 = load i16*, i16** %4
%126 = getelementptr inbounds i16, i16* %125, i32 1
store i16* %126, i16** %4
%127 = load i16, i16* %125
%128 = sext i16 %127 to i32
%129 = sitofp i32 %128 to double
%130 = fmul double %129, 0x3F00000000000000
%131 = fptrunc double %130 to float
%132 = load float*, float** %5
%133 = getelementptr inbounds float, float* %132, i32 1
store float* %133, float** %5
store float %131, float* %132
br label %134
134: ; preds = %92, %124
%135 = load i16*, i16** %4
%136 = getelementptr inbounds i16, i16* %135, i32 1
store i16* %136, i16** %4
%137 = load i16, i16* %135
%138 = sext i16 %137 to i32
%139 = sitofp i32 %138 to double
%140 = fmul double %139, 0x3F00000000000000
%141 = fptrunc double %140 to float
%142 = load float*, float** %5
%143 = getelementptr inbounds float, float* %142, i32 1
store float* %143, float** %5
store float %141, float* %142
br label %144
144: ; preds = %92, %134
%145 = load i16*, i16** %4
%146 = getelementptr inbounds i16, i16* %145, i32 1
store i16* %146, i16** %4
%147 = load i16, i16* %145
%148 = sext i16 %147 to i32
%149 = sitofp i32 %148 to double
%150 = fmul double %149, 0x3F00000000000000
%151 = fptrunc double %150 to float
%152 = load float*, float** %5
%153 = getelementptr inbounds float, float* %152, i32 1
store float* %153, float** %5
store float %151, float* %152
br label %154
154: ; preds = %92, %144
%155 = load i16*, i16** %4
%156 = getelementptr inbounds i16, i16* %155, i32 1
store i16* %156, i16** %4
%157 = load i16, i16* %155
%158 = sext i16 %157 to i32
%159 = sitofp i32 %158 to double
%160 = fmul double %159, 0x3F00000000000000
%161 = fptrunc double %160 to float
%162 = load float*, float** %5
%163 = getelementptr inbounds float, float* %162, i32 1
store float* %163, float** %5
store float %161, float* %162
br label %164
164: ; preds = %154, %92
ret void
}

LLVM IR (-O2):
define void @tr_convert_pcm16_float(i16* nocapture %0, float* nocapture writeonly %1, i32 %2) {
%4 = and i32 %2, 7
%5 = and i32 %2, -8
%6 = icmp eq i32 %5, 0
br i1 %6, label %100, label %7
7: ; preds = %3
%8 = add i32 %5, -8
%9 = lshr exact i32 %8, 3
%10 = add nuw nsw i32 %9, 1
%11 = zext i32 %10 to i64
%12 = icmp eq i32 %8, 0
br i1 %12, label %74, label %13
13: ; preds = %7
%14 = and i64 %11, 1073741822
%15 = shl nuw nsw i64 %14, 3
%16 = getelementptr i16, i16* %0, i64 %15
%17 = shl nuw nsw i64 %14, 3
%18 = getelementptr float, float* %1, i64 %17
%19 = trunc i64 %14 to i32
%20 = mul i32 %19, -8
%21 = add i32 %5, %20
br label %22
22: ; preds = %22, %13
%23 = phi i64 [ 0, %13 ], [ %70, %22 ]
%24 = shl i64 %23, 3
%25 = getelementptr i16, i16* %0, i64 %24
%26 = shl i64 %23, 3
%27 = bitcast i16* %25 to <16 x i16>*
%28 = load <16 x i16>, <16 x i16>* %27
%29 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 0, i32 8>
%30 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 1, i32 9>
%31 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 2, i32 10>
%32 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 3, i32 11>
%33 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 4, i32 12>
%34 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 5, i32 13>
%35 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 6, i32 14>
%36 = shufflevector <16 x i16> %28, <16 x i16> poison, <2 x i32> <i32 7, i32 15>
%37 = sitofp <2 x i16> %29 to <2 x double>
%38 = fmul <2 x double> %37, <double 0x3F00000000000000, double 0x3F00000000000000>
%39 = fptrunc <2 x double> %38 to <2 x float>
%40 = sitofp <2 x i16> %30 to <2 x double>
%41 = fmul <2 x double> %40, <double 0x3F00000000000000, double 0x3F00000000000000>
%42 = fptrunc <2 x double> %41 to <2 x float>
%43 = sitofp <2 x i16> %31 to <2 x double>
%44 = fmul <2 x double> %43, <double 0x3F00000000000000, double 0x3F00000000000000>
%45 = fptrunc <2 x double> %44 to <2 x float>
%46 = sitofp <2 x i16> %32 to <2 x double>
%47 = fmul <2 x double> %46, <double 0x3F00000000000000, double 0x3F00000000000000>
%48 = fptrunc <2 x double> %47 to <2 x float>
%49 = sitofp <2 x i16> %33 to <2 x double>
%50 = fmul <2 x double> %49, <double 0x3F00000000000000, double 0x3F00000000000000>
%51 = fptrunc <2 x double> %50 to <2 x float>
%52 = sitofp <2 x i16> %34 to <2 x double>
%53 = fmul <2 x double> %52, <double 0x3F00000000000000, double 0x3F00000000000000>
%54 = fptrunc <2 x double> %53 to <2 x float>
%55 = sitofp <2 x i16> %35 to <2 x double>
%56 = fmul <2 x double> %55, <double 0x3F00000000000000, double 0x3F00000000000000>
%57 = fptrunc <2 x double> %56 to <2 x float>
%58 = sitofp <2 x i16> %36 to <2 x double>
%59 = fmul <2 x double> %58, <double 0x3F00000000000000, double 0x3F00000000000000>
%60 = fptrunc <2 x double> %59 to <2 x float>
%61 = getelementptr inbounds float, float* %1, i64 %26
%62 = bitcast float* %61 to <16 x float>*
%63 = shufflevector <2 x float> %39, <2 x float> %42, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%64 = shufflevector <2 x float> %45, <2 x float> %48, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%65 = shufflevector <2 x float> %51, <2 x float> %54, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%66 = shufflevector <2 x float> %57, <2 x float> %60, <4 x i32> <i32 0, i32 1, i32 2, i32 3>
%67 = shufflevector <4 x float> %63, <4 x float> %64, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
%68 = shufflevector <4 x float> %65, <4 x float> %66, <8 x i32> <i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7>
%69 = shufflevector <8 x float> %67, <8 x float> %68, <16 x i32> <i32 0, i32 2, i32 4, i32 6, i32 8, i32 10, i32 12, i32 14, i32 1, i32 3, i32 5, i32 7, i32 9, i32 11, i32 13, i32 15>
store <16 x float> %69, <16 x float>* %62
%70 = add nuw i64 %23, 2
%71 = icmp eq i64 %70, %14
br i1 %71, label %72, label %22
72: ; preds = %22
%73 = icmp eq i64 %14, %11
br i1 %73, label %100, label %74
74: ; preds = %7, %72
%75 = phi i16* [ %0, %7 ], [ %16, %72 ]
%76 = phi float* [ %1, %7 ], [ %18, %72 ]
%77 = phi i32 [ %5, %7 ], [ %21, %72 ]
br label %78
78: ; preds = %74, %78
%79 = phi i16* [ %90, %78 ], [ %75, %74 ]
%80 = phi float* [ %96, %78 ], [ %76, %74 ]
%81 = phi i32 [ %98, %78 ], [ %77, %74 ]
%82 = getelementptr inbounds i16, i16* %79, i64 4
%83 = bitcast i16* %79 to <4 x i16>*
%84 = load <4 x i16>, <4 x i16>* %83
%85 = sitofp <4 x i16> %84 to <4 x double>
%86 = fmul <4 x double> %85, <double 0x3F00000000000000, double 0x3F00000000000000, double 0x3F00000000000000, double 0x3F00000000000000>
%87 = fptrunc <4 x double> %86 to <4 x float>
%88 = getelementptr inbounds float, float* %80, i64 4
%89 = bitcast float* %80 to <4 x float>*
store <4 x float> %87, <4 x float>* %89
%90 = getelementptr inbounds i16, i16* %79, i64 8
%91 = bitcast i16* %82 to <4 x i16>*
%92 = load <4 x i16>, <4 x i16>* %91
%93 = sitofp <4 x i16> %92 to <4 x double>
%94 = fmul <4 x double> %93, <double 0x3F00000000000000, double 0x3F00000000000000, double 0x3F00000000000000, double 0x3F00000000000000>
%95 = fptrunc <4 x double> %94 to <4 x float>
%96 = getelementptr inbounds float, float* %80, i64 8
%97 = bitcast float* %88 to <4 x float>*
store <4 x float> %95, <4 x float>* %97
%98 = add i32 %81, -8
%99 = icmp eq i32 %98, 0
br i1 %99, label %100, label %78
100: ; preds = %78, %72, %3
%101 = phi float* [ %1, %3 ], [ %18, %72 ], [ %96, %78 ]
%102 = phi i16* [ %0, %3 ], [ %16, %72 ], [ %90, %78 ]
switch i32 %4, label %162 [
i32 7, label %103
i32 6, label %110
i32 5, label %119
i32 4, label %128
i32 3, label %137
i32 2, label %146
i32 1, label %155
]
103: ; preds = %100
%104 = getelementptr inbounds i16, i16* %102, i64 1
%105 = load i16, i16* %102
%106 = sitofp i16 %105 to double
%107 = fmul double %106, 0x3F00000000000000
%108 = fptrunc double %107 to float
%109 = getelementptr inbounds float, float* %101, i64 1
store float %108, float* %101
br label %110
110: ; preds = %100, %103
%111 = phi float* [ %101, %100 ], [ %109, %103 ]
%112 = phi i16* [ %102, %100 ], [ %104, %103 ]
%113 = getelementptr inbounds i16, i16* %112, i64 1
%114 = load i16, i16* %112
%115 = sitofp i16 %114 to double
%116 = fmul double %115, 0x3F00000000000000
%117 = fptrunc double %116 to float
%118 = getelementptr inbounds float, float* %111, i64 1
store float %117, float* %111
br label %119
119: ; preds = %100, %110
%120 = phi float* [ %101, %100 ], [ %118, %110 ]
%121 = phi i16* [ %102, %100 ], [ %113, %110 ]
%122 = getelementptr inbounds i16, i16* %121, i64 1
%123 = load i16, i16* %121
%124 = sitofp i16 %123 to double
%125 = fmul double %124, 0x3F00000000000000
%126 = fptrunc double %125 to float
%127 = getelementptr inbounds float, float* %120, i64 1
store float %126, float* %120
br label %128
128: ; preds = %100, %119
%129 = phi float* [ %101, %100 ], [ %127, %119 ]
%130 = phi i16* [ %102, %100 ], [ %122, %119 ]
%131 = getelementptr inbounds i16, i16* %130, i64 1
%132 = load i16, i16* %130
%133 = sitofp i16 %132 to double
%134 = fmul double %133, 0x3F00000000000000
%135 = fptrunc double %134 to float
%136 = getelementptr inbounds float, float* %129, i64 1
store float %135, float* %129
br label %137
137: ; preds = %100, %128
%138 = phi float* [ %101, %100 ], [ %136, %128 ]
%139 = phi i16* [ %102, %100 ], [ %131, %128 ]
%140 = getelementptr inbounds i16, i16* %139, i64 1
%141 = load i16, i16* %139
%142 = sitofp i16 %141 to double
%143 = fmul double %142, 0x3F00000000000000
%144 = fptrunc double %143 to float
%145 = getelementptr inbounds float, float* %138, i64 1
store float %144, float* %138
br label %146
146: ; preds = %100, %137
%147 = phi float* [ %101, %100 ], [ %145, %137 ]
%148 = phi i16* [ %102, %100 ], [ %140, %137 ]
%149 = getelementptr inbounds i16, i16* %148, i64 1
%150 = load i16, i16* %148
%151 = sitofp i16 %150 to double
%152 = fmul double %151, 0x3F00000000000000
%153 = fptrunc double %152 to float
%154 = getelementptr inbounds float, float* %147, i64 1
store float %153, float* %147
br label %155
155: ; preds = %100, %146
%156 = phi float* [ %101, %100 ], [ %154, %146 ]
%157 = phi i16* [ %102, %100 ], [ %149, %146 ]
%158 = load i16, i16* %157
%159 = sitofp i16 %158 to double
%160 = fmul double %159, 0x3F00000000000000
%161 = fptrunc double %160 to float
store float %161, float* %156
br label %162
162: ; preds = %155, %100
ret void
}