void dist_insert_batch(float *train_patt, int train_idx, float *test_patterns,
                       int ntest_patterns, float *d_min, int *idx_min, int dim,
                       unsigned int K) {
  register unsigned int t_idx;
  register unsigned int i;
  register int j;
  register float d;
  register float tmp;
  register unsigned int tmp_idx;
  register float *nearest_dist;
  register int *nearest_idx;
  for (t_idx = ntest_patterns; t_idx--;) {
    d = 0.0;
    for (i = dim; i--;) {
      tmp = (train_patt[i] - test_patterns[t_idx * dim + i]);
      d += tmp * tmp;
    }
    nearest_dist = d_min + K * t_idx;
    nearest_idx = idx_min + K * t_idx;
    j = K - 1;
    if (nearest_dist[j] > d) {
      nearest_dist[j] = d;
      nearest_idx[j] = train_idx;
      for (; j > 0; j--) {
        if (nearest_dist[j] < nearest_dist[j - 1]) {
          tmp = nearest_dist[j];
          nearest_dist[j] = nearest_dist[j - 1];
          nearest_dist[j - 1] = tmp;
          tmp_idx = nearest_idx[j];
          nearest_idx[j] = nearest_idx[j - 1];
          nearest_idx[j - 1] = tmp_idx;
        } else
          break;
      }
    }
  }
}


x86 assembly (clang, -O0):
<dist_insert_batch>:
push   %rbp
mov    %rsp,%rbp
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x34(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x34(%rbp)
cmp    $0x0,%eax
je     12f0 <dist_insert_batch+0x1f0>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    0x10(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
mov    %eax,%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x38(%rbp)
cmp    $0x0,%eax
je     11a3 <dist_insert_batch+0xa3>
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
mov    -0x18(%rbp),%rax
mov    -0x34(%rbp),%ecx
imul   0x10(%rbp),%ecx
add    -0x38(%rbp),%ecx
mov    %ecx,%ecx
subss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
movss  -0x44(%rbp),%xmm2
movss  -0x40(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
jmp    1148 <dist_insert_batch+0x48>
mov    -0x28(%rbp),%rax
mov    0x18(%rbp),%ecx
imul   -0x34(%rbp),%ecx
mov    %ecx,%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x30(%rbp),%rax
mov    0x18(%rbp),%ecx
imul   -0x34(%rbp),%ecx
mov    %ecx,%ecx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    0x18(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x50(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x40(%rbp),%xmm0
jbe    12eb <dist_insert_batch+0x1eb>
movss  -0x40(%rbp),%xmm0
mov    -0x50(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0xc(%rbp),%edx
mov    -0x58(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
cmpl   $0x0,-0x3c(%rbp)
jle    12e6 <dist_insert_batch+0x1e6>
mov    -0x50(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x50(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss %xmm1,%xmm0
jbe    12ce <dist_insert_batch+0x1ce>
mov    -0x50(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x50(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x44(%rbp),%xmm0
mov    -0x50(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x58(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x48(%rbp)
mov    -0x58(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x58(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x48(%rbp),%edx
mov    -0x58(%rbp),%rax
mov    -0x3c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    %edx,(%rax,%rcx,4)
jmp    12d3 <dist_insert_batch+0x1d3>
jmp    12e6 <dist_insert_batch+0x1e6>
jmp    12d8 <dist_insert_batch+0x1d8>
mov    -0x3c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x3c(%rbp)
jmp    1213 <dist_insert_batch+0x113>
jmp    12eb <dist_insert_batch+0x1eb>
jmp    1126 <dist_insert_batch+0x26>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dist_insert_batch>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r9,-0x40(%rsp)
mov    %r8,-0x38(%rsp)
mov    %esi,-0x44(%rsp)
test   %ecx,%ecx
je     12e6 <dist_insert_batch+0x1e6>
mov    0x40(%rsp),%r11d
mov    0x38(%rsp),%ebp
lea    -0x1(%r11),%r8d
movslq %r8d,%rbx
mov    %rbx,-0x30(%rsp)
mov    %ebp,%eax
mov    %ecx,%ebx
mov    %rax,-0x10(%rsp)
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rsp)
mov    %eax,%eax
mov    %rax,-0x28(%rsp)
add    $0xffffffff,%ecx
mov    %ebp,%r9d
imul   %ecx,%r9d
lea    -0x2(%r9),%r12d
mov    %ebp,%eax
neg    %eax
mov    %rax,-0x8(%rsp)
add    $0xffffffff,%r9d
add    $0x1,%r8
mov    %r8,-0x18(%rsp)
imul   %r11d,%ecx
xorps  %xmm0,%xmm0
jmp    11a0 <dist_insert_batch+0xa0>
nopl   0x0(%rax,%rax,1)
mov    -0x8(%rsp),%rax
add    %rax,%r12
add    %rax,%r9
mov    %r15,%r11
sub    %r11d,%ecx
mov    %r10,%rbx
test   %ebx,%ebx
mov    0x38(%rsp),%ebp
je     12e6 <dist_insert_batch+0x1e6>
add    $0xffffffffffffffff,%rbx
xorps  %xmm1,%xmm1
test   %ebp,%ebp
je     1231 <dist_insert_batch+0x131>
xorps  %xmm1,%xmm1
mov    -0x10(%rsp),%r14
test   $0x1,%bpl
je     11e1 <dist_insert_batch+0xe1>
mov    %ebx,%eax
imul   %ebp,%eax
mov    -0x28(%rsp),%rsi
movss  (%rdi,%rsi,4),%xmm1
mov    -0x20(%rsp),%r14
add    %r14d,%eax
subss  (%rdx,%rax,4),%xmm1
mulss  %xmm1,%xmm1
addss  %xmm0,%xmm1
cmp    $0x1,%ebp
je     1231 <dist_insert_batch+0x131>
add    $0xfffffffffffffffe,%r14
nopw   0x0(%rax,%rax,1)
lea    0x1(%r14),%eax
movss  (%rdi,%rax,4),%xmm2
lea    (%r9,%r14,1),%eax
add    $0x2,%eax
subss  (%rdx,%rax,4),%xmm2
mulss  %xmm2,%xmm2
addss  %xmm1,%xmm2
mov    %r14d,%eax
movss  (%rdi,%rax,4),%xmm1
lea    0x2(%r12,%r14,1),%eax
subss  (%rdx,%rax,4),%xmm1
mulss  %xmm1,%xmm1
addss  %xmm2,%xmm1
add    $0xfffffffffffffffe,%r14
cmp    $0xfffffffe,%r14d
jne    11f0 <dist_insert_batch+0xf0>
mov    %rbx,%r10
mov    %ebx,%eax
mov    %r11,%r15
imul   %r11d,%eax
mov    -0x38(%rsp),%rsi
lea    (%rsi,%rax,4),%rsi
mov    -0x30(%rsp),%rbp
movss  (%rsi,%rbp,4),%xmm2
ucomiss %xmm1,%xmm2
jbe    1180 <dist_insert_batch+0x80>
mov    -0x40(%rsp),%rbp
lea    0x0(,%rax,4),%r14
add    %rbp,%r14
mov    -0x30(%rsp),%rbp
movss  %xmm1,(%rsi,%rbp,4)
mov    -0x44(%rsp),%eax
mov    %eax,(%r14,%rbp,4)
test   %ebp,%ebp
jle    1180 <dist_insert_batch+0x80>
mov    %ecx,%ebx
mov    -0x40(%rsp),%rax
lea    (%rax,%rbx,4),%rax
mov    -0x38(%rsp),%rbp
lea    0x0(%rbp,%rbx,4),%rbp
mov    -0x18(%rsp),%rbx
nopl   (%rax)
movss  -0x4(%rbp,%rbx,4),%xmm1
lea    -0x2(%rbx),%r13d
movss  (%rsi,%r13,4),%xmm2
ucomiss %xmm1,%xmm2
jbe    1180 <dist_insert_batch+0x80>
movss  %xmm2,-0x4(%rbp,%rbx,4)
movss  %xmm1,(%rsi,%r13,4)
mov    -0x4(%rax,%rbx,4),%r8d
mov    (%r14,%r13,4),%r11d
mov    %r11d,-0x4(%rax,%rbx,4)
mov    %r8d,(%r14,%r13,4)
add    $0xffffffffffffffff,%rbx
cmp    $0x1,%rbx
jg     12a0 <dist_insert_batch+0x1a0>
jmp    1180 <dist_insert_batch+0x80>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @dist_insert_batch(float* nocapture %0, i32 %1, float* nocapture %2, i32 %3, float* nocapture %4, i32* nocapture %5, i32 %6, i32 %7) {
%9 = icmp eq i32 %3, 0
br i1 %9, label %97, label %10
10: ; preds = %8
%11 = icmp eq i32 %6, 0
%12 = add i32 %7, -1
%13 = sext i32 %12 to i64
%14 = icmp sgt i32 %12, 0
%15 = zext i32 %6 to i64
%16 = zext i32 %12 to i64
%17 = zext i32 %3 to i64
%18 = and i32 %6, 1
%19 = icmp eq i32 %18, 0
%20 = add nsw i64 %15, -1
%21 = trunc i64 %20 to i32
%22 = and i64 %20, 4294967295
%23 = getelementptr inbounds float, float* %0, i64 %22
%24 = icmp eq i32 %6, 1
br label %25
25: ; preds = %10, %95
%26 = phi i64 [ %17, %10 ], [ %27, %95 ]
%27 = add nsw i64 %26, -1
%28 = trunc i64 %27 to i32
br i1 %11, label %69, label %29
29: ; preds = %25
%30 = mul i32 %28, %6
br i1 %19, label %39, label %31
31: ; preds = %29
%32 = load float, float* %23
%33 = add i32 %30, %21
%34 = zext i32 %33 to i64
%35 = getelementptr inbounds float, float* %2, i64 %34
%36 = load float, float* %35
%37 = fsub float %32, %36
%38 = tail call float @llvm.fmuladd.f32(float %37, float %37, float 0.000000e+00)
br label %39
39: ; preds = %31, %29
%40 = phi float [ undef, %29 ], [ %38, %31 ]
%41 = phi i64 [ %15, %29 ], [ %20, %31 ]
%42 = phi float [ 0.000000e+00, %29 ], [ %38, %31 ]
br i1 %24, label %69, label %43
43: ; preds = %39, %43
%44 = phi i64 [ %57, %43 ], [ %41, %39 ]
%45 = phi float [ %67, %43 ], [ %42, %39 ]
%46 = add nsw i64 %44, -1
%47 = trunc i64 %46 to i32
%48 = and i64 %46, 4294967295
%49 = getelementptr inbounds float, float* %0, i64 %48
%50 = load float, float* %49
%51 = add i32 %30, %47
%52 = zext i32 %51 to i64
%53 = getelementptr inbounds float, float* %2, i64 %52
%54 = load float, float* %53
%55 = fsub float %50, %54
%56 = tail call float @llvm.fmuladd.f32(float %55, float %55, float %45)
%57 = add nsw i64 %44, -2
%58 = trunc i64 %57 to i32
%59 = and i64 %57, 4294967295
%60 = getelementptr inbounds float, float* %0, i64 %59
%61 = load float, float* %60
%62 = add i32 %30, %58
%63 = zext i32 %62 to i64
%64 = getelementptr inbounds float, float* %2, i64 %63
%65 = load float, float* %64
%66 = fsub float %61, %65
%67 = tail call float @llvm.fmuladd.f32(float %66, float %66, float %56)
%68 = icmp eq i32 %58, 0
br i1 %68, label %69, label %43
69: ; preds = %39, %43, %25
%70 = phi float [ 0.000000e+00, %25 ], [ %40, %39 ], [ %67, %43 ]
%71 = mul i32 %28, %7
%72 = zext i32 %71 to i64
%73 = getelementptr inbounds float, float* %4, i64 %72
%74 = getelementptr inbounds i32, i32* %5, i64 %72
%75 = getelementptr inbounds float, float* %73, i64 %13
%76 = load float, float* %75
%77 = fcmp ogt float %76, %70
br i1 %77, label %78, label %95
78: ; preds = %69
store float %70, float* %75
%79 = getelementptr inbounds i32, i32* %74, i64 %13
store i32 %1, i32* %79
br i1 %14, label %80, label %95
80: ; preds = %78, %89
%81 = phi i64 [ %84, %89 ], [ %16, %78 ]
%82 = getelementptr inbounds float, float* %73, i64 %81
%83 = load float, float* %82
%84 = add nsw i64 %81, -1
%85 = and i64 %84, 4294967295
%86 = getelementptr inbounds float, float* %73, i64 %85
%87 = load float, float* %86
%88 = fcmp olt float %83, %87
br i1 %88, label %89, label %95
89: ; preds = %80
store float %87, float* %82
store float %83, float* %86
%90 = getelementptr inbounds i32, i32* %74, i64 %81
%91 = load i32, i32* %90
%92 = getelementptr inbounds i32, i32* %74, i64 %85
%93 = load i32, i32* %92
store i32 %93, i32* %90
store i32 %91, i32* %92
%94 = icmp sgt i64 %81, 1
br i1 %94, label %80, label %95
95: ; preds = %80, %89, %78, %69
%96 = icmp eq i32 %28, 0
br i1 %96, label %97, label %25
97: ; preds = %95, %8
ret void
}