void avg_pixels(float *p, const float *q0, const float *q1, const float *q2,
                const float *q3, int c) {
  switch (c) {
  case 4:
    p[3] = (q0[3] + q1[3] + q2[3] + q3[3]) / 4.f;
  case 3:
    p[2] = (q0[2] + q1[2] + q2[2] + q3[2]) / 4.f;
  case 2:
    p[1] = (q0[1] + q1[1] + q2[1] + q3[1]) / 4.f;
  case 1:
    p[0] = (q0[0] + q1[0] + q2[0] + q3[0]) / 4.f;
  }
}


x86 assembly (clang, -O0):
<avg_pixels>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x38(%rbp)
sub    $0x3,%eax
ja     1224 <avg_pixels+0x124>
mov    -0x38(%rbp),%rax
lea    0xec8(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm0
mov    -0x18(%rbp),%rax
addss  0xc(%rax),%xmm0
mov    -0x20(%rbp),%rax
addss  0xc(%rax),%xmm0
mov    -0x28(%rbp),%rax
addss  0xc(%rax),%xmm0
movss  0xe8f(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x18(%rbp),%rax
addss  0x8(%rax),%xmm0
mov    -0x20(%rbp),%rax
addss  0x8(%rax),%xmm0
mov    -0x28(%rbp),%rax
addss  0x8(%rax),%xmm0
movss  0xe56(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
addss  0x4(%rax),%xmm0
mov    -0x20(%rbp),%rax
addss  0x4(%rax),%xmm0
mov    -0x28(%rbp),%rax
addss  0x4(%rax),%xmm0
movss  0xe1d(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
addss  (%rax),%xmm0
mov    -0x20(%rbp),%rax
addss  (%rax),%xmm0
mov    -0x28(%rbp),%rax
addss  (%rax),%xmm0
movss  0xde8(%rip),%xmm1
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<avg_pixels>:
add    $0xffffffff,%r9d
cmp    $0x3,%r9d
ja     11a1 <avg_pixels+0xa1>
lea    0xeef(%rip),%r10
movslq (%r10,%r9,4),%rax
add    %r10,%rax
jmp    *%rax
movss  0xc(%rsi),%xmm0
addss  0xc(%rdx),%xmm0
addss  0xc(%rcx),%xmm0
addss  0xc(%r8),%xmm0
mulss  0xec5(%rip),%xmm0
movss  %xmm0,0xc(%rdi)
movss  0x8(%rsi),%xmm0
addss  0x8(%rdx),%xmm0
addss  0x8(%rcx),%xmm0
addss  0x8(%r8),%xmm0
mulss  0xea3(%rip),%xmm0
movss  %xmm0,0x8(%rdi)
movss  0x4(%rsi),%xmm0
addss  0x4(%rdx),%xmm0
addss  0x4(%rcx),%xmm0
addss  0x4(%r8),%xmm0
mulss  0xe81(%rip),%xmm0
movss  %xmm0,0x4(%rdi)
movss  (%rsi),%xmm0
addss  (%rdx),%xmm0
addss  (%rcx),%xmm0
addss  (%r8),%xmm0
mulss  0xe63(%rip),%xmm0
movss  %xmm0,(%rdi)
ret

LLVM IR (-O0):
define void @avg_pixels(float* %0, float* %1, float* %2, float* %3, float* %4, i32 %5) {
%7 = alloca float*
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca float*
%12 = alloca i32
store float* %0, float** %7
store float* %1, float** %8
store float* %2, float** %9
store float* %3, float** %10
store float* %4, float** %11
store i32 %5, i32* %12
%13 = load i32, i32* %12
switch i32 %13, label %90 [
i32 4, label %14
i32 3, label %33
i32 2, label %52
i32 1, label %71
]
14: ; preds = %6
%15 = load float*, float** %8
%16 = getelementptr inbounds float, float* %15, i64 3
%17 = load float, float* %16
%18 = load float*, float** %9
%19 = getelementptr inbounds float, float* %18, i64 3
%20 = load float, float* %19
%21 = fadd float %17, %20
%22 = load float*, float** %10
%23 = getelementptr inbounds float, float* %22, i64 3
%24 = load float, float* %23
%25 = fadd float %21, %24
%26 = load float*, float** %11
%27 = getelementptr inbounds float, float* %26, i64 3
%28 = load float, float* %27
%29 = fadd float %25, %28
%30 = fdiv float %29, 4.000000e+00
%31 = load float*, float** %7
%32 = getelementptr inbounds float, float* %31, i64 3
store float %30, float* %32
br label %33
33: ; preds = %6, %14
%34 = load float*, float** %8
%35 = getelementptr inbounds float, float* %34, i64 2
%36 = load float, float* %35
%37 = load float*, float** %9
%38 = getelementptr inbounds float, float* %37, i64 2
%39 = load float, float* %38
%40 = fadd float %36, %39
%41 = load float*, float** %10
%42 = getelementptr inbounds float, float* %41, i64 2
%43 = load float, float* %42
%44 = fadd float %40, %43
%45 = load float*, float** %11
%46 = getelementptr inbounds float, float* %45, i64 2
%47 = load float, float* %46
%48 = fadd float %44, %47
%49 = fdiv float %48, 4.000000e+00
%50 = load float*, float** %7
%51 = getelementptr inbounds float, float* %50, i64 2
store float %49, float* %51
br label %52
52: ; preds = %6, %33
%53 = load float*, float** %8
%54 = getelementptr inbounds float, float* %53, i64 1
%55 = load float, float* %54
%56 = load float*, float** %9
%57 = getelementptr inbounds float, float* %56, i64 1
%58 = load float, float* %57
%59 = fadd float %55, %58
%60 = load float*, float** %10
%61 = getelementptr inbounds float, float* %60, i64 1
%62 = load float, float* %61
%63 = fadd float %59, %62
%64 = load float*, float** %11
%65 = getelementptr inbounds float, float* %64, i64 1
%66 = load float, float* %65
%67 = fadd float %63, %66
%68 = fdiv float %67, 4.000000e+00
%69 = load float*, float** %7
%70 = getelementptr inbounds float, float* %69, i64 1
store float %68, float* %70
br label %71
71: ; preds = %6, %52
%72 = load float*, float** %8
%73 = getelementptr inbounds float, float* %72, i64 0
%74 = load float, float* %73
%75 = load float*, float** %9
%76 = getelementptr inbounds float, float* %75, i64 0
%77 = load float, float* %76
%78 = fadd float %74, %77
%79 = load float*, float** %10
%80 = getelementptr inbounds float, float* %79, i64 0
%81 = load float, float* %80
%82 = fadd float %78, %81
%83 = load float*, float** %11
%84 = getelementptr inbounds float, float* %83, i64 0
%85 = load float, float* %84
%86 = fadd float %82, %85
%87 = fdiv float %86, 4.000000e+00
%88 = load float*, float** %7
%89 = getelementptr inbounds float, float* %88, i64 0
store float %87, float* %89
br label %90
90: ; preds = %71, %6
ret void
}

LLVM IR (-O2):
define void @avg_pixels(float* nocapture writeonly %0, float* nocapture %1, float* nocapture %2, float* nocapture %3, float* nocapture %4, i32 %5) {
switch i32 %5, label %58 [
i32 4, label %7
i32 3, label %21
i32 2, label %35
i32 1, label %49
]
7: ; preds = %6
%8 = getelementptr inbounds float, float* %1, i64 3
%9 = load float, float* %8
%10 = getelementptr inbounds float, float* %2, i64 3
%11 = load float, float* %10
%12 = fadd float %9, %11
%13 = getelementptr inbounds float, float* %3, i64 3
%14 = load float, float* %13
%15 = fadd float %12, %14
%16 = getelementptr inbounds float, float* %4, i64 3
%17 = load float, float* %16
%18 = fadd float %15, %17
%19 = fmul float %18, 2.500000e-01
%20 = getelementptr inbounds float, float* %0, i64 3
store float %19, float* %20
br label %21
21: ; preds = %6, %7
%22 = getelementptr inbounds float, float* %1, i64 2
%23 = load float, float* %22
%24 = getelementptr inbounds float, float* %2, i64 2
%25 = load float, float* %24
%26 = fadd float %23, %25
%27 = getelementptr inbounds float, float* %3, i64 2
%28 = load float, float* %27
%29 = fadd float %26, %28
%30 = getelementptr inbounds float, float* %4, i64 2
%31 = load float, float* %30
%32 = fadd float %29, %31
%33 = fmul float %32, 2.500000e-01
%34 = getelementptr inbounds float, float* %0, i64 2
store float %33, float* %34
br label %35
35: ; preds = %6, %21
%36 = getelementptr inbounds float, float* %1, i64 1
%37 = load float, float* %36
%38 = getelementptr inbounds float, float* %2, i64 1
%39 = load float, float* %38
%40 = fadd float %37, %39
%41 = getelementptr inbounds float, float* %3, i64 1
%42 = load float, float* %41
%43 = fadd float %40, %42
%44 = getelementptr inbounds float, float* %4, i64 1
%45 = load float, float* %44
%46 = fadd float %43, %45
%47 = fmul float %46, 2.500000e-01
%48 = getelementptr inbounds float, float* %0, i64 1
store float %47, float* %48
br label %49
49: ; preds = %6, %35
%50 = load float, float* %1
%51 = load float, float* %2
%52 = fadd float %50, %51
%53 = load float, float* %3
%54 = fadd float %52, %53
%55 = load float, float* %4
%56 = fadd float %54, %55
%57 = fmul float %56, 2.500000e-01
store float %57, float* %0
br label %58
58: ; preds = %49, %6
ret void
}