#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */
typedef size_t int16_t;

/* Variables and functions */
void __attribute__((no, noclone))
f_float_16(float *restrict dest, float *restrict src, int16_t stride,
           int16_t n) {
  for (int16_t i = 0; i < n; ++i)
    dest[i * stride] = src[i] + 1;
}


x86 assembly (clang, -O0):
<f_float_16>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x20(%rbp),%rax
jae    1162 <f_float_16+0x62>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  0xec6(%rip),%xmm0
addss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
imul   -0x18(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    111c <f_float_16+0x1c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<f_float_16>:
push   %r14
push   %rbx
test   %rcx,%rcx
je     12ac <f_float_16+0x1ac>
xor    %r9d,%r9d
cmp    $0x8,%rcx
jb     11e0 <f_float_16+0xe0>
cmp    $0x1,%rdx
jne    11e0 <f_float_16+0xe0>
mov    %rcx,%r9
and    $0xfffffffffffffff8,%r9
lea    -0x8(%r9),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     12b0 <f_float_16+0x1b0>
mov    %r8,%r10
and    $0xfffffffffffffffe,%r10
mov    %rdx,%r11
shl    $0x5,%r11
lea    0x10(%rdi),%rbx
mov    %rdx,%r14
shl    $0x6,%r14
xor    %eax,%eax
movaps 0xe9c(%rip),%xmm0
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movups (%rsi,%rax,4),%xmm1
movups 0x10(%rsi,%rax,4),%xmm2
addps  %xmm0,%xmm1
addps  %xmm0,%xmm2
movups %xmm1,-0x10(%rbx)
movups %xmm2,(%rbx)
movups 0x20(%rsi,%rax,4),%xmm1
movups 0x30(%rsi,%rax,4),%xmm2
addps  %xmm0,%xmm1
addps  %xmm0,%xmm2
movups %xmm1,-0x10(%rbx,%r11,1)
movups %xmm2,(%rbx,%r11,1)
add    $0x10,%rax
add    %r14,%rbx
add    $0xfffffffffffffffe,%r10
jne    1170 <f_float_16+0x70>
test   $0x1,%r8b
je     11d7 <f_float_16+0xd7>
movups (%rsi,%rax,4),%xmm0
movups 0x10(%rsi,%rax,4),%xmm1
movaps 0xe3c(%rip),%xmm2
addps  %xmm2,%xmm0
addps  %xmm2,%xmm1
imul   %rdx,%rax
movups %xmm0,(%rdi,%rax,4)
movups %xmm1,0x10(%rdi,%rax,4)
cmp    %rcx,%r9
je     12ac <f_float_16+0x1ac>
mov    %r9,%r8
not    %r8
add    %rcx,%r8
mov    %rcx,%rbx
and    $0x3,%rbx
je     122b <f_float_16+0x12b>
mov    %r9,%rax
imul   %rdx,%rax
lea    (%rdi,%rax,4),%rax
lea    0x0(,%rdx,4),%r10
movss  0xe03(%rip),%xmm0
nopl   (%rax)
movss  (%rsi,%r9,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rax)
add    $0x1,%r9
add    %r10,%rax
add    $0xffffffffffffffff,%rbx
jne    1210 <f_float_16+0x110>
cmp    $0x3,%r8
jb     12ac <f_float_16+0x1ac>
lea    0x3(%r9),%r8
imul   %rdx,%r8
mov    %rdx,%r10
shl    $0x4,%r10
lea    0x2(%r9),%rbx
imul   %rdx,%rbx
lea    0x1(%r9),%rax
imul   %rdx,%rax
imul   %r9,%rdx
movss  0xdb4(%rip),%xmm0
nopl   0x0(%rax)
movss  (%rsi,%r9,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%rdx,4)
movss  0x4(%rsi,%r9,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%rax,4)
movss  0x8(%rsi,%r9,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%rbx,4)
movss  0xc(%rsi,%r9,4),%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,(%rdi,%r8,4)
add    $0x4,%r9
add    %r10,%rdi
cmp    %r9,%rcx
jne    1260 <f_float_16+0x160>
pop    %rbx
pop    %r14
ret
xor    %eax,%eax
test   $0x1,%r8b
jne    11b4 <f_float_16+0xb4>
jmp    11d7 <f_float_16+0xd7>

LLVM IR (-O0):
define void @f_float_16(float* noalias %0, float* noalias %1, i64 %2, i64 %3) {
%5 = alloca float*
%6 = alloca float*
%7 = alloca i64
%8 = alloca i64
%9 = alloca i64
store float* %0, float** %5
store float* %1, float** %6
store i64 %2, i64* %7
store i64 %3, i64* %8
store i64 0, i64* %9
br label %10
10: ; preds = %25, %4
%11 = load i64, i64* %9
%12 = load i64, i64* %8
%13 = icmp ult i64 %11, %12
br i1 %13, label %14, label %28
14: ; preds = %10
%15 = load float*, float** %6
%16 = load i64, i64* %9
%17 = getelementptr inbounds float, float* %15, i64 %16
%18 = load float, float* %17
%19 = fadd float %18, 1.000000e+00
%20 = load float*, float** %5
%21 = load i64, i64* %9
%22 = load i64, i64* %7
%23 = mul i64 %21, %22
%24 = getelementptr inbounds float, float* %20, i64 %23
store float %19, float* %24
br label %25
25: ; preds = %14
%26 = load i64, i64* %9
%27 = add i64 %26, 1
store i64 %27, i64* %9
br label %10
28: ; preds = %10
ret void
}

LLVM IR (-O2):
define void @f_float_16(float* noalias nocapture writeonly %0, float* noalias nocapture %1, i64 %2, i64 %3) {
%5 = icmp eq i64 %3, 0
br i1 %5, label %91, label %6
6: ; preds = %4
%7 = icmp ugt i64 %3, 7
%8 = icmp eq i64 %2, 1
%9 = and i1 %7, %8
br i1 %9, label %10, label %71
10: ; preds = %6
%11 = and i64 %3, -8
%12 = add i64 %11, -8
%13 = lshr exact i64 %12, 3
%14 = add nuw nsw i64 %13, 1
%15 = and i64 %14, 1
%16 = icmp eq i64 %12, 0
br i1 %16, label %52, label %17
17: ; preds = %10
%18 = and i64 %14, 4611686018427387902
br label %19
19: ; preds = %19, %17
%20 = phi i64 [ 0, %17 ], [ %49, %19 ]
%21 = phi i64 [ 0, %17 ], [ %50, %19 ]
%22 = getelementptr inbounds float, float* %1, i64 %20
%23 = bitcast float* %22 to <4 x float>*
%24 = load <4 x float>, <4 x float>* %23
%25 = getelementptr inbounds float, float* %22, i64 4
%26 = bitcast float* %25 to <4 x float>*
%27 = load <4 x float>, <4 x float>* %26
%28 = fadd <4 x float> %24, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%29 = fadd <4 x float> %27, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%30 = mul i64 %20, %2
%31 = getelementptr inbounds float, float* %0, i64 %30
%32 = bitcast float* %31 to <4 x float>*
store <4 x float> %28, <4 x float>* %32
%33 = getelementptr inbounds float, float* %31, i64 4
%34 = bitcast float* %33 to <4 x float>*
store <4 x float> %29, <4 x float>* %34
%35 = or i64 %20, 8
%36 = getelementptr inbounds float, float* %1, i64 %35
%37 = bitcast float* %36 to <4 x float>*
%38 = load <4 x float>, <4 x float>* %37
%39 = getelementptr inbounds float, float* %36, i64 4
%40 = bitcast float* %39 to <4 x float>*
%41 = load <4 x float>, <4 x float>* %40
%42 = fadd <4 x float> %38, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%43 = fadd <4 x float> %41, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%44 = mul i64 %35, %2
%45 = getelementptr inbounds float, float* %0, i64 %44
%46 = bitcast float* %45 to <4 x float>*
store <4 x float> %42, <4 x float>* %46
%47 = getelementptr inbounds float, float* %45, i64 4
%48 = bitcast float* %47 to <4 x float>*
store <4 x float> %43, <4 x float>* %48
%49 = add nuw i64 %20, 16
%50 = add i64 %21, 2
%51 = icmp eq i64 %50, %18
br i1 %51, label %52, label %19
52: ; preds = %19, %10
%53 = phi i64 [ 0, %10 ], [ %49, %19 ]
%54 = icmp eq i64 %15, 0
br i1 %54, label %69, label %55
55: ; preds = %52
%56 = getelementptr inbounds float, float* %1, i64 %53
%57 = bitcast float* %56 to <4 x float>*
%58 = load <4 x float>, <4 x float>* %57
%59 = getelementptr inbounds float, float* %56, i64 4
%60 = bitcast float* %59 to <4 x float>*
%61 = load <4 x float>, <4 x float>* %60
%62 = fadd <4 x float> %58, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%63 = fadd <4 x float> %61, <float 1.000000e+00, float 1.000000e+00, float 1.000000e+00, float 1.000000e+00>
%64 = mul i64 %53, %2
%65 = getelementptr inbounds float, float* %0, i64 %64
%66 = bitcast float* %65 to <4 x float>*
store <4 x float> %62, <4 x float>* %66
%67 = getelementptr inbounds float, float* %65, i64 4
%68 = bitcast float* %67 to <4 x float>*
store <4 x float> %63, <4 x float>* %68
br label %69
69: ; preds = %52, %55
%70 = icmp eq i64 %11, %3
br i1 %70, label %91, label %71
71: ; preds = %6, %69
%72 = phi i64 [ 0, %6 ], [ %11, %69 ]
%73 = xor i64 %72, -1
%74 = add i64 %73, %3
%75 = and i64 %3, 3
%76 = icmp eq i64 %75, 0
br i1 %76, label %88, label %77
77: ; preds = %71, %77
%78 = phi i64 [ %85, %77 ], [ %72, %71 ]
%79 = phi i64 [ %86, %77 ], [ 0, %71 ]
%80 = getelementptr inbounds float, float* %1, i64 %78
%81 = load float, float* %80
%82 = fadd float %81, 1.000000e+00
%83 = mul i64 %78, %2
%84 = getelementptr inbounds float, float* %0, i64 %83
store float %82, float* %84
%85 = add nuw i64 %78, 1
%86 = add i64 %79, 1
%87 = icmp eq i64 %86, %75
br i1 %87, label %88, label %77
88: ; preds = %77, %71
%89 = phi i64 [ %72, %71 ], [ %85, %77 ]
%90 = icmp ult i64 %74, 3
br i1 %90, label %91, label %92
91: ; preds = %88, %92, %69, %4
ret void
92: ; preds = %88, %92
%93 = phi i64 [ %117, %92 ], [ %89, %88 ]
%94 = getelementptr inbounds float, float* %1, i64 %93
%95 = load float, float* %94
%96 = fadd float %95, 1.000000e+00
%97 = mul i64 %93, %2
%98 = getelementptr inbounds float, float* %0, i64 %97
store float %96, float* %98
%99 = add nuw i64 %93, 1
%100 = getelementptr inbounds float, float* %1, i64 %99
%101 = load float, float* %100
%102 = fadd float %101, 1.000000e+00
%103 = mul i64 %99, %2
%104 = getelementptr inbounds float, float* %0, i64 %103
store float %102, float* %104
%105 = add nuw i64 %93, 2
%106 = getelementptr inbounds float, float* %1, i64 %105
%107 = load float, float* %106
%108 = fadd float %107, 1.000000e+00
%109 = mul i64 %105, %2
%110 = getelementptr inbounds float, float* %0, i64 %109
store float %108, float* %110
%111 = add nuw i64 %93, 3
%112 = getelementptr inbounds float, float* %1, i64 %111
%113 = load float, float* %112
%114 = fadd float %113, 1.000000e+00
%115 = mul i64 %111, %2
%116 = getelementptr inbounds float, float* %0, i64 %115
store float %114, float* %116
%117 = add nuw i64 %93, 4
%118 = icmp eq i64 %117, %3
br i1 %118, label %91, label %92
}