void rgba8_to_RGBA(unsigned char *row, float *R, float *G, float *B, float *A,
                   int w) {
  while (w--) {
    *R++ = *row++ * .0039215686f;
    *G++ = *row++ * .0039215686f;
    *B++ = *row++ * .0039215686f;
    *A++ = *row++ * .0039215686f;
  }
}


x86 assembly (clang, -O0):
<rgba8_to_RGBA>:
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
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x2c(%rbp)
cmp    $0x0,%eax
je     1209 <rgba8_to_RGBA+0x109>
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
cvtsi2ss %eax,%xmm0
movss  0xeb2(%rip),%xmm1
mulss  %xmm1,%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    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
cvtsi2ss %eax,%xmm0
movss  0xe7d(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x18(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
cvtsi2ss %eax,%xmm0
movss  0xe48(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x8(%rbp)
movzbl (%rax),%eax
cvtsi2ss %eax,%xmm0
movss  0xe13(%rip),%xmm1
mulss  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  %xmm0,(%rax)
jmp    111c <rgba8_to_RGBA+0x1c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<rgba8_to_RGBA>:
test   %r9d,%r9d
je     1184 <rgba8_to_RGBA+0x84>
mov    %r9d,%r9d
xor    %r10d,%r10d
movss  0xeed(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%rdi,%r10,4),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rsi,%r10,4)
movzbl 0x1(%rdi,%r10,4),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rdx,%r10,4)
movzbl 0x2(%rdi,%r10,4),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%rcx,%r10,4)
movzbl 0x3(%rdi,%r10,4),%eax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
mulss  %xmm0,%xmm1
movss  %xmm1,(%r8,%r10,4)
add    $0x1,%r10
cmp    %r10d,%r9d
jne    1120 <rgba8_to_RGBA+0x20>
ret

LLVM IR (-O0):
define void @rgba8_to_RGBA(i8* %0, float* %1, float* %2, float* %3, float* %4, i32 %5) {
%7 = alloca i8*
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca float*
%12 = alloca i32
store i8* %0, i8** %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
br label %13
13: ; preds = %17, %6
%14 = load i32, i32* %12
%15 = add nsw i32 %14, -1
store i32 %15, i32* %12
%16 = icmp ne i32 %14, 0
br i1 %16, label %17, label %50
17: ; preds = %13
%18 = load i8*, i8** %7
%19 = getelementptr inbounds i8, i8* %18, i32 1
store i8* %19, i8** %7
%20 = load i8, i8* %18
%21 = zext i8 %20 to i32
%22 = sitofp i32 %21 to float
%23 = fmul float %22, 0x3F70101000000000
%24 = load float*, float** %8
%25 = getelementptr inbounds float, float* %24, i32 1
store float* %25, float** %8
store float %23, float* %24
%26 = load i8*, i8** %7
%27 = getelementptr inbounds i8, i8* %26, i32 1
store i8* %27, i8** %7
%28 = load i8, i8* %26
%29 = zext i8 %28 to i32
%30 = sitofp i32 %29 to float
%31 = fmul float %30, 0x3F70101000000000
%32 = load float*, float** %9
%33 = getelementptr inbounds float, float* %32, i32 1
store float* %33, float** %9
store float %31, float* %32
%34 = load i8*, i8** %7
%35 = getelementptr inbounds i8, i8* %34, i32 1
store i8* %35, i8** %7
%36 = load i8, i8* %34
%37 = zext i8 %36 to i32
%38 = sitofp i32 %37 to float
%39 = fmul float %38, 0x3F70101000000000
%40 = load float*, float** %10
%41 = getelementptr inbounds float, float* %40, i32 1
store float* %41, float** %10
store float %39, float* %40
%42 = load i8*, i8** %7
%43 = getelementptr inbounds i8, i8* %42, i32 1
store i8* %43, i8** %7
%44 = load i8, i8* %42
%45 = zext i8 %44 to i32
%46 = sitofp i32 %45 to float
%47 = fmul float %46, 0x3F70101000000000
%48 = load float*, float** %11
%49 = getelementptr inbounds float, float* %48, i32 1
store float* %49, float** %11
store float %47, float* %48
br label %13
50: ; preds = %13
ret void
}

LLVM IR (-O2):
define void @rgba8_to_RGBA(i8* nocapture %0, float* nocapture writeonly %1, float* nocapture writeonly %2, float* nocapture writeonly %3, float* nocapture writeonly %4, i32 %5) {
%7 = icmp eq i32 %5, 0
br i1 %7, label %37, label %8
8: ; preds = %6, %8
%9 = phi i32 [ %15, %8 ], [ %5, %6 ]
%10 = phi float* [ %35, %8 ], [ %4, %6 ]
%11 = phi float* [ %30, %8 ], [ %3, %6 ]
%12 = phi float* [ %25, %8 ], [ %2, %6 ]
%13 = phi float* [ %20, %8 ], [ %1, %6 ]
%14 = phi i8* [ %31, %8 ], [ %0, %6 ]
%15 = add nsw i32 %9, -1
%16 = getelementptr inbounds i8, i8* %14, i64 1
%17 = load i8, i8* %14
%18 = uitofp i8 %17 to float
%19 = fmul float %18, 0x3F70101000000000
%20 = getelementptr inbounds float, float* %13, i64 1
store float %19, float* %13
%21 = getelementptr inbounds i8, i8* %14, i64 2
%22 = load i8, i8* %16
%23 = uitofp i8 %22 to float
%24 = fmul float %23, 0x3F70101000000000
%25 = getelementptr inbounds float, float* %12, i64 1
store float %24, float* %12
%26 = getelementptr inbounds i8, i8* %14, i64 3
%27 = load i8, i8* %21
%28 = uitofp i8 %27 to float
%29 = fmul float %28, 0x3F70101000000000
%30 = getelementptr inbounds float, float* %11, i64 1
store float %29, float* %11
%31 = getelementptr inbounds i8, i8* %14, i64 4
%32 = load i8, i8* %26
%33 = uitofp i8 %32 to float
%34 = fmul float %33, 0x3F70101000000000
%35 = getelementptr inbounds float, float* %10, i64 1
store float %34, float* %10
%36 = icmp eq i32 %15, 0
br i1 %36, label %37, label %8
37: ; preds = %8, %6
ret void
}