void orthog1_float(float *x, int beg, int end) {
  int i;
  float *pntr;
  float sum;
  int len;
  len = end - beg + 1;
  sum = 0.0;
  pntr = x + beg;
  for (i = len; i; i--) {
    sum += *pntr++;
  }
  sum /= len;
  pntr = x + beg;
  for (i = len; i; i--) {
    *pntr++ -= sum;
  }
}


x86 assembly (clang, -O0):
<orthog1_float>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0x10(%rbp),%eax
sub    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     1170 <orthog1_float+0x70>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
addss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    113b <orthog1_float+0x3b>
cvtsi2ssl -0x28(%rbp),%xmm1
movss  -0x24(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0xc(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x20(%rbp)
mov    -0x28(%rbp),%eax
mov    %eax,-0x14(%rbp)
cmpl   $0x0,-0x14(%rbp)
je     11d4 <orthog1_float+0xd4>
movss  -0x24(%rbp),%xmm1
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,(%rax)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x14(%rbp)
jmp    119c <orthog1_float+0x9c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<orthog1_float>:
push   %rbx
sub    %esi,%edx
mov    %edx,%r10d
inc    %r10d
je     1276 <orthog1_float+0x176>
movslq %esi,%r8
lea    (%rdi,%r8,4),%rbx
mov    %r10d,%eax
and    $0x7,%eax
je     114b <orthog1_float+0x4b>
xor    %ecx,%ecx
xorps  %xmm0,%xmm0
mov    %rbx,%rsi
cs nopw 0x0(%rax,%rax,1)
addss  (%rsi),%xmm0
add    $0x4,%rsi
add    $0x1,%ecx
cmp    %ecx,%eax
jne    1130 <orthog1_float+0x30>
mov    %r10d,%eax
sub    %ecx,%eax
cmp    $0x7,%edx
jae    1159 <orthog1_float+0x59>
jmp    1197 <orthog1_float+0x97>
xorps  %xmm0,%xmm0
mov    %r10d,%eax
mov    %rbx,%rsi
cmp    $0x7,%edx
jb     1197 <orthog1_float+0x97>
mov    %eax,%ecx
xor    %eax,%eax
nopl   (%rax)
addss  (%rsi,%rax,4),%xmm0
addss  0x4(%rsi,%rax,4),%xmm0
addss  0x8(%rsi,%rax,4),%xmm0
addss  0xc(%rsi,%rax,4),%xmm0
addss  0x10(%rsi,%rax,4),%xmm0
addss  0x14(%rsi,%rax,4),%xmm0
addss  0x18(%rsi,%rax,4),%xmm0
addss  0x1c(%rsi,%rax,4),%xmm0
add    $0x8,%rax
cmp    %eax,%ecx
jne    1160 <orthog1_float+0x60>
test   %r10d,%r10d
je     1276 <orthog1_float+0x176>
cvtsi2ss %r10d,%xmm1
divss  %xmm1,%xmm0
cmp    $0x7,%edx
jb     1256 <orthog1_float+0x156>
add    $0x1,%rdx
mov    %rdx,%r9
and    $0xfffffffffffffff8,%r9
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
lea    -0x8(%r9),%rax
mov    %rax,%r11
shr    $0x3,%r11
add    $0x1,%r11
test   %rax,%rax
je     1278 <orthog1_float+0x178>
mov    %r11,%rcx
and    $0xfffffffffffffffe,%rcx
lea    (%rdi,%r8,4),%rsi
add    $0x30,%rsi
xor    %edi,%edi
nopl   (%rax)
movups -0x30(%rsi,%rdi,4),%xmm2
movups -0x20(%rsi,%rdi,4),%xmm3
movups -0x10(%rsi,%rdi,4),%xmm4
movups (%rsi,%rdi,4),%xmm5
subps  %xmm1,%xmm2
subps  %xmm1,%xmm3
movups %xmm2,-0x30(%rsi,%rdi,4)
movups %xmm3,-0x20(%rsi,%rdi,4)
subps  %xmm1,%xmm4
subps  %xmm1,%xmm5
movups %xmm4,-0x10(%rsi,%rdi,4)
movups %xmm5,(%rsi,%rdi,4)
add    $0x10,%rdi
add    $0xfffffffffffffffe,%rcx
jne    11f0 <orthog1_float+0xf0>
test   $0x1,%r11b
je     124a <orthog1_float+0x14a>
movups (%rbx,%rdi,4),%xmm2
movups 0x10(%rbx,%rdi,4),%xmm3
subps  %xmm1,%xmm2
subps  %xmm1,%xmm3
movups %xmm2,(%rbx,%rdi,4)
movups %xmm3,0x10(%rbx,%rdi,4)
cmp    %r9,%rdx
je     1276 <orthog1_float+0x176>
sub    %r9d,%r10d
lea    (%rbx,%r9,4),%rbx
mov    %r10d,%eax
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movss  (%rbx,%rcx,4),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,(%rbx,%rcx,4)
add    $0x1,%rcx
cmp    %ecx,%eax
jne    1260 <orthog1_float+0x160>
pop    %rbx
ret
xor    %edi,%edi
test   $0x1,%r11b
jne    1232 <orthog1_float+0x132>
jmp    124a <orthog1_float+0x14a>

LLVM IR (-O0):
define void @orthog1_float(float* %0, i32 %1, i32 %2) {
%4 = alloca float*
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca float*
%9 = alloca float
%10 = alloca i32
store float* %0, float** %4
store i32 %1, i32* %5
store i32 %2, i32* %6
%11 = load i32, i32* %6
%12 = load i32, i32* %5
%13 = sub nsw i32 %11, %12
%14 = add nsw i32 %13, 1
store i32 %14, i32* %10
store float 0.000000e+00, float* %9
%15 = load float*, float** %4
%16 = load i32, i32* %5
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds float, float* %15, i64 %17
store float* %18, float** %8
%19 = load i32, i32* %10
store i32 %19, i32* %7
br label %20
20: ; preds = %29, %3
%21 = load i32, i32* %7
%22 = icmp ne i32 %21, 0
br i1 %22, label %23, label %32
23: ; preds = %20
%24 = load float*, float** %8
%25 = getelementptr inbounds float, float* %24, i32 1
store float* %25, float** %8
%26 = load float, float* %24
%27 = load float, float* %9
%28 = fadd float %27, %26
store float %28, float* %9
br label %29
29: ; preds = %23
%30 = load i32, i32* %7
%31 = add nsw i32 %30, -1
store i32 %31, i32* %7
br label %20
32: ; preds = %20
%33 = load i32, i32* %10
%34 = sitofp i32 %33 to float
%35 = load float, float* %9
%36 = fdiv float %35, %34
store float %36, float* %9
%37 = load float*, float** %4
%38 = load i32, i32* %5
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds float, float* %37, i64 %39
store float* %40, float** %8
%41 = load i32, i32* %10
store i32 %41, i32* %7
br label %42
42: ; preds = %51, %32
%43 = load i32, i32* %7
%44 = icmp ne i32 %43, 0
br i1 %44, label %45, label %54
45: ; preds = %42
%46 = load float, float* %9
%47 = load float*, float** %8
%48 = getelementptr inbounds float, float* %47, i32 1
store float* %48, float** %8
%49 = load float, float* %47
%50 = fsub float %49, %46
store float %50, float* %47
br label %51
51: ; preds = %45
%52 = load i32, i32* %7
%53 = add nsw i32 %52, -1
store i32 %53, i32* %7
br label %42
54: ; preds = %42
ret void
}

LLVM IR (-O2):
define void @orthog1_float(float* nocapture %0, i32 %1, i32 %2) {
%4 = sub nsw i32 %2, %1
%5 = add i32 %4, 1
%6 = sext i32 %1 to i64
%7 = getelementptr inbounds float, float* %0, i64 %6
%8 = icmp eq i32 %5, 0
br i1 %8, label %139, label %9
9: ; preds = %3
%10 = sub i32 %2, %1
%11 = and i32 %5, 7
%12 = icmp eq i32 %11, 0
br i1 %12, label %24, label %13
13: ; preds = %9, %13
%14 = phi i32 [ %21, %13 ], [ %5, %9 ]
%15 = phi float [ %20, %13 ], [ 0.000000e+00, %9 ]
%16 = phi float* [ %18, %13 ], [ %7, %9 ]
%17 = phi i32 [ %22, %13 ], [ 0, %9 ]
%18 = getelementptr inbounds float, float* %16, i64 1
%19 = load float, float* %16
%20 = fadd float %15, %19
%21 = add nsw i32 %14, -1
%22 = add i32 %17, 1
%23 = icmp eq i32 %22, %11
br i1 %23, label %24, label %13
24: ; preds = %13, %9
%25 = phi float [ undef, %9 ], [ %20, %13 ]
%26 = phi i32 [ %5, %9 ], [ %21, %13 ]
%27 = phi float [ 0.000000e+00, %9 ], [ %20, %13 ]
%28 = phi float* [ %7, %9 ], [ %18, %13 ]
%29 = icmp ult i32 %10, 7
br i1 %29, label %60, label %30
30: ; preds = %24, %30
%31 = phi i32 [ %58, %30 ], [ %26, %24 ]
%32 = phi float [ %57, %30 ], [ %27, %24 ]
%33 = phi float* [ %55, %30 ], [ %28, %24 ]
%34 = getelementptr inbounds float, float* %33, i64 1
%35 = load float, float* %33
%36 = fadd float %32, %35
%37 = getelementptr inbounds float, float* %33, i64 2
%38 = load float, float* %34
%39 = fadd float %36, %38
%40 = getelementptr inbounds float, float* %33, i64 3
%41 = load float, float* %37
%42 = fadd float %39, %41
%43 = getelementptr inbounds float, float* %33, i64 4
%44 = load float, float* %40
%45 = fadd float %42, %44
%46 = getelementptr inbounds float, float* %33, i64 5
%47 = load float, float* %43
%48 = fadd float %45, %47
%49 = getelementptr inbounds float, float* %33, i64 6
%50 = load float, float* %46
%51 = fadd float %48, %50
%52 = getelementptr inbounds float, float* %33, i64 7
%53 = load float, float* %49
%54 = fadd float %51, %53
%55 = getelementptr inbounds float, float* %33, i64 8
%56 = load float, float* %52
%57 = fadd float %54, %56
%58 = add nsw i32 %31, -8
%59 = icmp eq i32 %58, 0
br i1 %59, label %60, label %30
60: ; preds = %30, %24
%61 = phi float [ %25, %24 ], [ %57, %30 ]
%62 = sitofp i32 %5 to float
%63 = fdiv float %61, %62
br i1 %8, label %139, label %64
64: ; preds = %60
%65 = sub i32 %2, %1
%66 = zext i32 %65 to i64
%67 = add nuw nsw i64 %66, 1
%68 = icmp ult i32 %65, 7
br i1 %68, label %128, label %69
69: ; preds = %64
%70 = and i64 %67, 8589934584
%71 = trunc i64 %70 to i32
%72 = sub i32 %5, %71
%73 = getelementptr float, float* %7, i64 %70
%74 = insertelement <4 x float> poison, float %63, i64 0
%75 = shufflevector <4 x float> %74, <4 x float> poison, <4 x i32> zeroinitializer
%76 = insertelement <4 x float> poison, float %63, i64 0
%77 = shufflevector <4 x float> %76, <4 x float> poison, <4 x i32> zeroinitializer
%78 = add nsw i64 %70, -8
%79 = lshr exact i64 %78, 3
%80 = add nuw nsw i64 %79, 1
%81 = and i64 %80, 1
%82 = icmp eq i64 %78, 0
br i1 %82, label %112, label %83
83: ; preds = %69
%84 = and i64 %80, 4611686018427387902
br label %85
85: ; preds = %85, %83
%86 = phi i64 [ 0, %83 ], [ %109, %85 ]
%87 = phi i64 [ 0, %83 ], [ %110, %85 ]
%88 = getelementptr float, float* %7, i64 %86
%89 = bitcast float* %88 to <4 x float>*
%90 = load <4 x float>, <4 x float>* %89
%91 = getelementptr float, float* %88, i64 4
%92 = bitcast float* %91 to <4 x float>*
%93 = load <4 x float>, <4 x float>* %92
%94 = fsub <4 x float> %90, %75
%95 = fsub <4 x float> %93, %77
%96 = bitcast float* %88 to <4 x float>*
store <4 x float> %94, <4 x float>* %96
%97 = bitcast float* %91 to <4 x float>*
store <4 x float> %95, <4 x float>* %97
%98 = or i64 %86, 8
%99 = getelementptr float, float* %7, i64 %98
%100 = bitcast float* %99 to <4 x float>*
%101 = load <4 x float>, <4 x float>* %100
%102 = getelementptr float, float* %99, i64 4
%103 = bitcast float* %102 to <4 x float>*
%104 = load <4 x float>, <4 x float>* %103
%105 = fsub <4 x float> %101, %75
%106 = fsub <4 x float> %104, %77
%107 = bitcast float* %99 to <4 x float>*
store <4 x float> %105, <4 x float>* %107
%108 = bitcast float* %102 to <4 x float>*
store <4 x float> %106, <4 x float>* %108
%109 = add nuw i64 %86, 16
%110 = add i64 %87, 2
%111 = icmp eq i64 %110, %84
br i1 %111, label %112, label %85
112: ; preds = %85, %69
%113 = phi i64 [ 0, %69 ], [ %109, %85 ]
%114 = icmp eq i64 %81, 0
br i1 %114, label %126, label %115
115: ; preds = %112
%116 = getelementptr float, float* %7, i64 %113
%117 = bitcast float* %116 to <4 x float>*
%118 = load <4 x float>, <4 x float>* %117
%119 = getelementptr float, float* %116, i64 4
%120 = bitcast float* %119 to <4 x float>*
%121 = load <4 x float>, <4 x float>* %120
%122 = fsub <4 x float> %118, %75
%123 = fsub <4 x float> %121, %77
%124 = bitcast float* %116 to <4 x float>*
store <4 x float> %122, <4 x float>* %124
%125 = bitcast float* %119 to <4 x float>*
store <4 x float> %123, <4 x float>* %125
br label %126
126: ; preds = %112, %115
%127 = icmp eq i64 %67, %70
br i1 %127, label %139, label %128
128: ; preds = %64, %126
%129 = phi i32 [ %5, %64 ], [ %72, %126 ]
%130 = phi float* [ %7, %64 ], [ %73, %126 ]
br label %131
131: ; preds = %128, %131
%132 = phi i32 [ %137, %131 ], [ %129, %128 ]
%133 = phi float* [ %134, %131 ], [ %130, %128 ]
%134 = getelementptr inbounds float, float* %133, i64 1
%135 = load float, float* %133
%136 = fsub float %135, %63
store float %136, float* %133
%137 = add nsw i32 %132, -1
%138 = icmp eq i32 %137, 0
br i1 %138, label %139, label %131
139: ; preds = %131, %126, %3, %60
ret void
}