void clip(float *ein, unsigned int *uent, float *eout, int d) {
  int i;
  for (i = 0; i < d; i++) {
    float e = ein[i];
    int r = (uent[i] >> (15)) & 7;
    e = r - e;
    if (e > 4.)
      e = 4.;
    else if (e < 0.)
      e = 0.;
    eout[i] = r - e;
  }
}


x86 assembly (clang, -O0):
<clip>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jge    11d0 <clip+0xd0>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
shr    $0xf,%eax
and    $0x7,%eax
mov    %eax,-0x28(%rbp)
cvtsi2ssl -0x28(%rbp),%xmm0
subss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe94(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1188 <clip+0x88>
movss  0xe8a(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    11ab <clip+0xab>
movss  -0x24(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    11a6 <clip+0xa6>
xorps  %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
jmp    11ab <clip+0xab>
cvtsi2ssl -0x28(%rbp),%xmm0
subss  -0x24(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    111a <clip+0x1a>
pop    %rbp
ret

x86 assembly (clang, -O2):
<clip>:
test   %ecx,%ecx
jle    1204 <clip+0x104>
mov    %ecx,%r9d
cmp    $0x4,%ecx
jb     1122 <clip+0x22>
lea    (%rdi,%r9,4),%rax
cmp    %rdx,%rax
jbe    1183 <clip+0x83>
lea    (%rdx,%r9,4),%rax
cmp    %rdi,%rax
jbe    1183 <clip+0x83>
xor    %ecx,%ecx
movss  0xef4(%rip),%xmm0
xorps  %xmm1,%xmm1
jmp    1156 <clip+0x56>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
subss  %xmm3,%xmm2
movss  %xmm2,(%rdx,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%r9
je     1204 <clip+0x104>
mov    (%rsi,%rcx,4),%eax
shr    $0xf,%eax
and    $0x7,%eax
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
movaps %xmm2,%xmm4
subss  (%rdi,%rcx,4),%xmm4
ucomiss %xmm0,%xmm4
movaps %xmm0,%xmm3
ja     1140 <clip+0x40>
ucomiss %xmm4,%xmm1
movaps %xmm4,%xmm3
jbe    1140 <clip+0x40>
xorps  %xmm3,%xmm3
jmp    1140 <clip+0x40>
mov    %r9d,%ecx
and    $0xfffffffc,%ecx
lea    0x0(,%r9,4),%r8
and    $0xfffffffffffffff0,%r8
xor    %eax,%eax
movdqa 0xe61(%rip),%xmm0
movaps 0xe6a(%rip),%xmm1
xorps  %xmm2,%xmm2
nopl   0x0(%rax)
movups (%rdi,%rax,1),%xmm3
movdqu (%rsi,%rax,1),%xmm4
psrld  $0xf,%xmm4
pand   %xmm0,%xmm4
cvtdq2ps %xmm4,%xmm4
movaps %xmm4,%xmm5
subps  %xmm3,%xmm5
movaps %xmm1,%xmm3
cmpltps %xmm5,%xmm3
movaps %xmm5,%xmm6
cmpltps %xmm2,%xmm6
orps   %xmm3,%xmm6
andnps %xmm5,%xmm6
movaps %xmm1,%xmm5
andps  %xmm3,%xmm5
andnps %xmm6,%xmm3
orps   %xmm5,%xmm3
subps  %xmm3,%xmm4
movups %xmm4,(%rdx,%rax,1)
add    $0x10,%rax
cmp    %rax,%r8
jne    11b0 <clip+0xb0>
cmp    %r9,%rcx
jne    1124 <clip+0x24>
ret

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

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