void scalebuffer(short int *buf, int length, float factor) {
  int i;
  for (i = 0; i < length; i++) {
    buf[i] = (short int)buf[i] * factor;
  }
}


x86 assembly (clang, -O0):
<scalebuffer>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
movss  %xmm0,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    115d <scalebuffer+0x5d>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm0
movss  -0x10(%rbp),%xmm1
mulss  %xmm1,%xmm0
cvttss2si %xmm0,%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1117 <scalebuffer+0x17>
pop    %rbp
ret

x86 assembly (clang, -O2):
<scalebuffer>:
test   %esi,%esi
jle    12c0 <scalebuffer+0x1c0>
mov    %esi,%eax
cmp    $0x8,%esi
jae    1116 <scalebuffer+0x16>
xor    %ecx,%ecx
jmp    12a0 <scalebuffer+0x1a0>
mov    %eax,%ecx
and    $0xfffffff8,%ecx
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
lea    -0x8(%rcx),%rdx
mov    %rdx,%rsi
shr    $0x3,%rsi
add    $0x1,%rsi
mov    %esi,%r8d
and    $0x3,%r8d
cmp    $0x18,%rdx
jae    1145 <scalebuffer+0x45>
xor    %edx,%edx
jmp    1234 <scalebuffer+0x134>
and    $0xfffffffffffffffc,%rsi
xor    %edx,%edx
nopl   0x0(%rax,%rax,1)
movdqu (%rdi,%rdx,2),%xmm4
movdqu 0x10(%rdi,%rdx,2),%xmm5
movdqu 0x20(%rdi,%rdx,2),%xmm3
movdqu 0x30(%rdi,%rdx,2),%xmm2
punpckhwd %xmm4,%xmm6
psrad  $0x10,%xmm6
cvtdq2ps %xmm6,%xmm6
punpcklwd %xmm4,%xmm4
psrad  $0x10,%xmm4
cvtdq2ps %xmm4,%xmm4
mulps  %xmm1,%xmm4
mulps  %xmm1,%xmm6
cvttps2dq %xmm6,%xmm6
cvttps2dq %xmm4,%xmm4
packssdw %xmm6,%xmm4
movdqu %xmm4,(%rdi,%rdx,2)
punpckhwd %xmm5,%xmm4
psrad  $0x10,%xmm4
cvtdq2ps %xmm4,%xmm4
punpcklwd %xmm5,%xmm5
psrad  $0x10,%xmm5
cvtdq2ps %xmm5,%xmm5
mulps  %xmm1,%xmm5
mulps  %xmm1,%xmm4
cvttps2dq %xmm4,%xmm4
cvttps2dq %xmm5,%xmm5
packssdw %xmm4,%xmm5
movdqu %xmm5,0x10(%rdi,%rdx,2)
punpckhwd %xmm3,%xmm4
psrad  $0x10,%xmm4
cvtdq2ps %xmm4,%xmm4
punpcklwd %xmm3,%xmm3
psrad  $0x10,%xmm3
cvtdq2ps %xmm3,%xmm3
mulps  %xmm1,%xmm3
mulps  %xmm1,%xmm4
cvttps2dq %xmm4,%xmm4
cvttps2dq %xmm3,%xmm3
packssdw %xmm4,%xmm3
movdqu %xmm3,0x20(%rdi,%rdx,2)
punpckhwd %xmm2,%xmm3
psrad  $0x10,%xmm3
cvtdq2ps %xmm3,%xmm3
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
cvtdq2ps %xmm2,%xmm2
mulps  %xmm1,%xmm2
mulps  %xmm1,%xmm3
cvttps2dq %xmm3,%xmm3
cvttps2dq %xmm2,%xmm2
packssdw %xmm3,%xmm2
movdqu %xmm2,0x30(%rdi,%rdx,2)
add    $0x20,%rdx
add    $0xfffffffffffffffc,%rsi
jne    1150 <scalebuffer+0x50>
test   %r8,%r8
je     128d <scalebuffer+0x18d>
lea    (%rdi,%rdx,2),%rdx
shl    $0x4,%r8
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movdqu (%rdx,%rsi,1),%xmm2
punpckhwd %xmm2,%xmm3
psrad  $0x10,%xmm3
cvtdq2ps %xmm3,%xmm3
punpcklwd %xmm2,%xmm2
psrad  $0x10,%xmm2
cvtdq2ps %xmm2,%xmm2
mulps  %xmm1,%xmm2
mulps  %xmm1,%xmm3
cvttps2dq %xmm3,%xmm3
cvttps2dq %xmm2,%xmm2
packssdw %xmm3,%xmm2
movdqu %xmm2,(%rdx,%rsi,1)
add    $0x10,%rsi
cmp    %rsi,%r8
jne    1250 <scalebuffer+0x150>
cmp    %rax,%rcx
je     12c0 <scalebuffer+0x1c0>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movswl (%rdi,%rcx,2),%edx
xorps  %xmm1,%xmm1
cvtsi2ss %edx,%xmm1
mulss  %xmm0,%xmm1
cvttss2si %xmm1,%edx
mov    %dx,(%rdi,%rcx,2)
add    $0x1,%rcx
cmp    %rcx,%rax
jne    12a0 <scalebuffer+0x1a0>
ret

LLVM IR (-O0):
define void @scalebuffer(i16* %0, i32 %1, float %2) {
%4 = alloca i16*
%5 = alloca i32
%6 = alloca float
%7 = alloca i32
store i16* %0, i16** %4
store i32 %1, i32* %5
store float %2, float* %6
store i32 0, i32* %7
br label %8
8: ; preds = %27, %3
%9 = load i32, i32* %7
%10 = load i32, i32* %5
%11 = icmp slt i32 %9, %10
br i1 %11, label %12, label %30
12: ; preds = %8
%13 = load i16*, i16** %4
%14 = load i32, i32* %7
%15 = sext i32 %14 to i64
%16 = getelementptr inbounds i16, i16* %13, i64 %15
%17 = load i16, i16* %16
%18 = sext i16 %17 to i32
%19 = sitofp i32 %18 to float
%20 = load float, float* %6
%21 = fmul float %19, %20
%22 = fptosi float %21 to i16
%23 = load i16*, i16** %4
%24 = load i32, i32* %7
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds i16, i16* %23, i64 %25
store i16 %22, i16* %26
br label %27
27: ; preds = %12
%28 = load i32, i32* %7
%29 = add nsw i32 %28, 1
store i32 %29, i32* %7
br label %8
30: ; preds = %8
ret void
}

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