int pre_proc(unsigned int *test_images, float *outputs) {
  unsigned int current_input;
  float normalized;
  unsigned int row, col;
  for (row = 0; row < 28; row++) {
    for (col = 0; col < 28; col++) {
      current_input = ((unsigned int *)test_images)[row * 28 + col];
      normalized = (float)current_input / 255.0;
      ((float *)outputs)[(row * 28 + col)] = normalized;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<pre_proc>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x1c(%rbp)
cmpl   $0x1c,-0x1c(%rbp)
jae    11a5 <pre_proc+0xa5>
movl   $0x0,-0x20(%rbp)
cmpl   $0x1c,-0x20(%rbp)
jae    1192 <pre_proc+0x92>
mov    -0x8(%rbp),%rax
mov    -0x1c(%rbp),%edx
mov    %edx,%ecx
lea    (%rcx,%rcx,8),%esi
mov    %esi,%ecx
lea    (%rcx,%rcx,2),%ecx
add    %edx,%ecx
mov    -0x20(%rbp),%edx
add    %edx,%ecx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cvtsi2ss %rax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xea0(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
mov    -0x10(%rbp),%rax
imul   $0x1c,-0x1c(%rbp),%ecx
add    -0x20(%rbp),%ecx
mov    %ecx,%ecx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1124 <pre_proc+0x24>
jmp    1197 <pre_proc+0x97>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    1113 <pre_proc+0x13>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<pre_proc>:
mov    $0x60,%eax
movdqa 0xef3(%rip),%xmm0
movdqa 0xefb(%rip),%xmm1
movdqa 0xf03(%rip),%xmm2
movaps 0xf0c(%rip),%xmm3
movaps 0xf15(%rip),%xmm4
nopl   0x0(%rax,%rax,1)
movdqu -0x60(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x60(%rsi,%rax,1)
movdqu -0x50(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x50(%rsi,%rax,1)
movdqu -0x40(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x40(%rsi,%rax,1)
movdqu -0x30(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x30(%rsi,%rax,1)
movdqu -0x20(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x20(%rsi,%rax,1)
movdqu -0x10(%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,-0x10(%rsi,%rax,1)
movdqu (%rdi,%rax,1),%xmm5
movdqa %xmm5,%xmm6
pand   %xmm0,%xmm6
por    %xmm1,%xmm6
psrld  $0x10,%xmm5
por    %xmm2,%xmm5
subps  %xmm3,%xmm5
addps  %xmm6,%xmm5
divps  %xmm4,%xmm5
movups %xmm5,(%rsi,%rax,1)
add    $0x70,%rax
cmp    $0xca0,%rax
jne    1130 <pre_proc+0x30>
xor    %eax,%eax
ret

LLVM IR (-O0):
define i32 @pre_proc(i32* %0, float* %1) {
%3 = alloca i32*
%4 = alloca float*
%5 = alloca i32
%6 = alloca float
%7 = alloca i32
%8 = alloca i32
store i32* %0, i32** %3
store float* %1, float** %4
store i32 0, i32* %7
br label %9
9: ; preds = %42, %2
%10 = load i32, i32* %7
%11 = icmp ult i32 %10, 28
br i1 %11, label %12, label %45
12: ; preds = %9
store i32 0, i32* %8
br label %13
13: ; preds = %38, %12
%14 = load i32, i32* %8
%15 = icmp ult i32 %14, 28
br i1 %15, label %16, label %41
16: ; preds = %13
%17 = load i32*, i32** %3
%18 = load i32, i32* %7
%19 = mul i32 %18, 28
%20 = load i32, i32* %8
%21 = add i32 %19, %20
%22 = zext i32 %21 to i64
%23 = getelementptr inbounds i32, i32* %17, i64 %22
%24 = load i32, i32* %23
store i32 %24, i32* %5
%25 = load i32, i32* %5
%26 = uitofp i32 %25 to float
%27 = fpext float %26 to double
%28 = fdiv double %27, 2.550000e+02
%29 = fptrunc double %28 to float
store float %29, float* %6
%30 = load float, float* %6
%31 = load float*, float** %4
%32 = load i32, i32* %7
%33 = mul i32 %32, 28
%34 = load i32, i32* %8
%35 = add i32 %33, %34
%36 = zext i32 %35 to i64
%37 = getelementptr inbounds float, float* %31, i64 %36
store float %30, float* %37
br label %38
38: ; preds = %16
%39 = load i32, i32* %8
%40 = add i32 %39, 1
store i32 %40, i32* %8
br label %13
41: ; preds = %13
br label %42
42: ; preds = %41
%43 = load i32, i32* %7
%44 = add i32 %43, 1
store i32 %44, i32* %7
br label %9
45: ; preds = %9
ret i32 0
}

LLVM IR (-O2):
define i32 @pre_proc(i32* nocapture %0, float* nocapture writeonly %1) {
br label %3
3: ; preds = %2, %3
%4 = phi i64 [ 0, %2 ], [ %61, %3 ]
%5 = mul nuw nsw i64 %4, 28
%6 = getelementptr inbounds i32, i32* %0, i64 %5
%7 = bitcast i32* %6 to <4 x i32>*
%8 = load <4 x i32>, <4 x i32>* %7
%9 = uitofp <4 x i32> %8 to <4 x float>
%10 = fdiv <4 x float> %9, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%11 = getelementptr inbounds float, float* %1, i64 %5
%12 = bitcast float* %11 to <4 x float>*
store <4 x float> %10, <4 x float>* %12
%13 = add nuw nsw i64 %5, 4
%14 = getelementptr inbounds i32, i32* %0, i64 %13
%15 = bitcast i32* %14 to <4 x i32>*
%16 = load <4 x i32>, <4 x i32>* %15
%17 = uitofp <4 x i32> %16 to <4 x float>
%18 = fdiv <4 x float> %17, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%19 = getelementptr inbounds float, float* %1, i64 %13
%20 = bitcast float* %19 to <4 x float>*
store <4 x float> %18, <4 x float>* %20
%21 = add nuw nsw i64 %5, 8
%22 = getelementptr inbounds i32, i32* %0, i64 %21
%23 = bitcast i32* %22 to <4 x i32>*
%24 = load <4 x i32>, <4 x i32>* %23
%25 = uitofp <4 x i32> %24 to <4 x float>
%26 = fdiv <4 x float> %25, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%27 = getelementptr inbounds float, float* %1, i64 %21
%28 = bitcast float* %27 to <4 x float>*
store <4 x float> %26, <4 x float>* %28
%29 = add nuw nsw i64 %5, 12
%30 = getelementptr inbounds i32, i32* %0, i64 %29
%31 = bitcast i32* %30 to <4 x i32>*
%32 = load <4 x i32>, <4 x i32>* %31
%33 = uitofp <4 x i32> %32 to <4 x float>
%34 = fdiv <4 x float> %33, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%35 = getelementptr inbounds float, float* %1, i64 %29
%36 = bitcast float* %35 to <4 x float>*
store <4 x float> %34, <4 x float>* %36
%37 = add nuw nsw i64 %5, 16
%38 = getelementptr inbounds i32, i32* %0, i64 %37
%39 = bitcast i32* %38 to <4 x i32>*
%40 = load <4 x i32>, <4 x i32>* %39
%41 = uitofp <4 x i32> %40 to <4 x float>
%42 = fdiv <4 x float> %41, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%43 = getelementptr inbounds float, float* %1, i64 %37
%44 = bitcast float* %43 to <4 x float>*
store <4 x float> %42, <4 x float>* %44
%45 = add nuw nsw i64 %5, 20
%46 = getelementptr inbounds i32, i32* %0, i64 %45
%47 = bitcast i32* %46 to <4 x i32>*
%48 = load <4 x i32>, <4 x i32>* %47
%49 = uitofp <4 x i32> %48 to <4 x float>
%50 = fdiv <4 x float> %49, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%51 = getelementptr inbounds float, float* %1, i64 %45
%52 = bitcast float* %51 to <4 x float>*
store <4 x float> %50, <4 x float>* %52
%53 = add nuw nsw i64 %5, 24
%54 = getelementptr inbounds i32, i32* %0, i64 %53
%55 = bitcast i32* %54 to <4 x i32>*
%56 = load <4 x i32>, <4 x i32>* %55
%57 = uitofp <4 x i32> %56 to <4 x float>
%58 = fdiv <4 x float> %57, <float 2.550000e+02, float 2.550000e+02, float 2.550000e+02, float 2.550000e+02>
%59 = getelementptr inbounds float, float* %1, i64 %53
%60 = bitcast float* %59 to <4 x float>*
store <4 x float> %58, <4 x float>* %60
%61 = add nuw nsw i64 %4, 1
%62 = icmp eq i64 %61, 28
br i1 %62, label %63, label %3
63: ; preds = %3
ret i32 0
}